@@ -13,6 +13,7 @@ import (
1313 "github.com/oasisprotocol/oasis-core/go/consensus/cometbft/api"
1414 cmtcrypto "github.com/oasisprotocol/oasis-core/go/consensus/cometbft/crypto"
1515 "github.com/oasisprotocol/oasis-core/go/consensus/cometbft/crypto/merkle"
16+ "github.com/oasisprotocol/oasis-core/go/upgrade/migrations"
1617)
1718
1819// prepareSystemTxs prepares a list of system transactions to be included in a proposed block in
@@ -28,9 +29,9 @@ func (mux *abciMux) prepareSystemTxs() ([][]byte, []*types.ResponseDeliverTx, er
2829 if err != nil {
2930 return nil , nil , fmt .Errorf ("failed to compute working state root: %w" , err )
3031 }
31- eventsRoot , err := mux .computeProvableEventsRoot ()
32+ eventsRoot , err := mux .computeEventsRoot ()
3233 if err != nil {
33- return nil , nil , fmt .Errorf ("failed to compute provable events root: %w" , err )
34+ return nil , nil , fmt .Errorf ("failed to compute events root: %w" , err )
3435 }
3536
3637 blockMeta := consensus .NewBlockMetadataTx (& consensus.BlockMetadata {
@@ -119,10 +120,10 @@ func (mux *abciMux) validateSystemTxs() error {
119120 return fmt .Errorf ("invalid state root in block metadata (expected: %s got: %s)" , stateRoot , meta .StateRoot )
120121 }
121122
122- // Verify provable events root.
123- eventsRoot , err := mux .computeProvableEventsRoot ()
123+ // Verify events root.
124+ eventsRoot , err := mux .computeEventsRoot ()
124125 if err != nil {
125- return fmt .Errorf ("failed to compute provable events root: %w" , err )
126+ return fmt .Errorf ("failed to compute events root: %w" , err )
126127 }
127128 if ! bytes .Equal (eventsRoot , meta .EventsRoot ) {
128129 return fmt .Errorf ("invalid events root in block metadata (expected: %x got: %x)" , eventsRoot , meta .EventsRoot )
@@ -143,11 +144,30 @@ func (mux *abciMux) validateSystemTxs() error {
143144 return nil
144145}
145146
146- func (mux * abciMux ) computeProvableEventsRoot () ([]byte , error ) {
147- provable := mux .state .blockCtx .ProvableEvents
148- provableEvents := make ([][]byte , len (provable ))
149- for i , pe := range provable {
150- provableEvents [i ] = cbor .Marshal (pe .ProvableRepresentation ())
147+ func (mux * abciMux ) computeEventsRoot () ([]byte , error ) {
148+ if ! mux .state .ConsensusParameters ().IsFeatureVersion (migrations .Version256 ) {
149+ // Events root used to be computed only from provable events.
150+ provable := mux .state .blockCtx .ProvableEvents
151+ provableEvents := make ([][]byte , len (provable ))
152+ for i , pe := range provable {
153+ provableEvents [i ] = cbor .Marshal (pe .ProvableRepresentation ())
154+ }
155+ return merkle .RootHash (provableEvents ), nil
156+ }
157+
158+ // Events root is now computed from all emitted events.
159+ var events [][]byte
160+ for _ , ev := range mux .state .proposal .resultsBeginBlock .Events {
161+ events = append (events , cbor .Marshal (ev ))
151162 }
152- return merkle .RootHash (provableEvents ), nil
163+ for _ , res := range mux .state .proposal .resultsDeliverTx {
164+ for _ , ev := range res .Events {
165+ events = append (events , cbor .Marshal (ev ))
166+ }
167+ }
168+ for _ , ev := range mux .state .proposal .resultsEndBlock .Events {
169+ events = append (events , cbor .Marshal (ev ))
170+ }
171+
172+ return merkle .RootHash (events ), nil
153173}
0 commit comments