Skip to content

Commit 159af21

Browse files
committed
go/consensus/cometbft/abci: Include all events in the events root
The events root in block metadata system transaction now includes all events, not just provable ones.
1 parent afd018c commit 159af21

5 files changed

Lines changed: 39 additions & 13 deletions

File tree

.changelog/6289.breaking.0.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
go/consensus/cometbft/abci: Include all events in the events root
2+
3+
The events root in block metadata system transaction now includes all events,
4+
not just provable ones.

go/consensus/api/meta.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const BlockMetadataMaxSize = 16_384
2323
type BlockMetadata struct {
2424
// StateRoot is the state root after executing all logic in the block.
2525
StateRoot hash.Hash `json:"state_root"`
26-
// EventsRoot is the provable events root.
26+
// EventsRoot is the root hash of all events emitted in the block.
2727
EventsRoot []byte `json:"events_root"`
2828
}
2929

go/consensus/cometbft/abci/system.go

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

go/upgrade/migrations/consensus_256.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import (
1414
// This upgrade includes:
1515
// - The `MayQuery“ field in the CHURP SGX policy, which defines which enclave identities
1616
// are allowed to query runtime key shares.
17+
// - An updated events root in the block metadata system transaction to capture all events
18+
// emitted in the block.
1719
const Consensus256 = "consensus256"
1820

1921
// Version256 is the Oasis Core 25.6 version.

runtime/src/consensus/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,6 @@ pub enum Event {
4747
pub struct BlockMetadata {
4848
/// State root after executing all logic in the block.
4949
pub state_root: Hash,
50-
// EventsRoot is the provable events root.
50+
// Root hash of all events emitted in the block.
5151
pub events_root: Vec<u8>,
5252
}

0 commit comments

Comments
 (0)