events: adapt events when under nv20.

This commit is contained in:
Raúl Kripalani
2023-02-12 21:53:29 +00:00
parent 2302958091
commit e8cef64dfa
2 changed files with 31 additions and 6 deletions
+25 -5
View File
@@ -20,20 +20,36 @@ type Event struct {
Entries []EventEntry
}
func (e *Event) Migrate() types.Event {
// Adapt method assumes that all events are EVM events (which is the case for
// nv<20, the network versions for which this code is active), and performs the
// following adaptations:
// - Upgrades the schema to new Events, setting codec = Raw.
// - Removes the CBOR framing from values.
// - Left pads EVM log topic entry values to 32 bytes.
func (e *Event) Adapt() (types.Event, error) {
entries := make([]types.EventEntry, 0, len(e.Entries))
for _, ee := range e.Entries {
entries = append(entries, types.EventEntry{
entry := types.EventEntry{
Flags: ee.Flags,
Key: ee.Key,
Codec: uint64(multicodec.Raw),
Value: ee.Value,
})
}
value, err := cbg.ReadByteArray(bytes.NewReader(ee.Value), 64)
if err != nil {
return types.Event{}, fmt.Errorf("failed to decode event value while adapting: %w", err)
}
if l := len(value); l < 32 {
pvalue := make([]byte, 32)
copy(pvalue[32-len(value):], value)
value = pvalue
}
entries = append(entries, entry)
}
return types.Event{
Emitter: e.Emitter,
Entries: entries,
}
}, nil
}
type EventEntry struct {
@@ -64,7 +80,11 @@ func DecodeEvents(input []byte) ([]types.Event, error) {
if err := evt.UnmarshalCBOR(r); err != nil {
return nil, fmt.Errorf("failed to parse event: %w", err)
}
events = append(events, evt.Migrate())
adapted, err := evt.Adapt()
if err != nil {
return nil, err
}
events = append(events, adapted)
}
return events, nil
}
+6 -1
View File
@@ -12,6 +12,7 @@ import (
"sync/atomic"
"time"
"github.com/filecoin-project/lotus/chain/types/legacy"
"github.com/ipfs/go-cid"
cbor "github.com/ipfs/go-ipld-cbor"
cbg "github.com/whyrusleeping/cbor-gen"
@@ -519,7 +520,11 @@ func (vm *FVM) ApplyMessage(ctx context.Context, cmsg types.ChainMsg) (*ApplyRet
}
if vm.returnEvents && len(ret.EventsBytes) > 0 {
applyRet.Events, err = types.DecodeEvents(ret.EventsBytes)
if vm.nv < network.Version20 {
applyRet.Events, err = legacy.DecodeEvents(ret.EventsBytes)
} else {
applyRet.Events, err = types.DecodeEvents(ret.EventsBytes)
}
if err != nil {
return nil, fmt.Errorf("failed to decode events returned by the FVM: %w", err)
}