From e8cef64dfa4ebe39a3722087c2135cae2fc803dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Fri, 10 Feb 2023 23:47:27 +0000 Subject: [PATCH] events: adapt events when under nv20. --- chain/types/legacy/event.go | 30 +++++++++++++++++++++++++----- chain/vm/fvm.go | 7 ++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/chain/types/legacy/event.go b/chain/types/legacy/event.go index d2ae2dc74..58130240c 100644 --- a/chain/types/legacy/event.go +++ b/chain/types/legacy/event.go @@ -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 } diff --git a/chain/vm/fvm.go b/chain/vm/fvm.go index 8e78e58d9..1b5a0cd7b 100644 --- a/chain/vm/fvm.go +++ b/chain/vm/fvm.go @@ -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) }