Skip to content
Open
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f7452d8
add root hash for state accesses event
ssd04 Sep 30, 2025
d182636
fix scheduled root hash
BeniaminDrasovean Sep 30, 2025
625139a
update logging
BeniaminDrasovean Oct 7, 2025
456819d
update logging
BeniaminDrasovean Oct 7, 2025
885db03
remove duplicates from txsWithOrder
BeniaminDrasovean Oct 7, 2025
23fb34f
Merge branch 'rc/supernova' into state-accesses-roothash
ssd04 Oct 10, 2025
d2d0ae1
fixes after merge
ssd04 Oct 10, 2025
e269c11
cleanup logs
ssd04 Oct 30, 2025
f3b5eab
add state accesses in unit tests
ssd04 Oct 30, 2025
e282c87
adapt to use header and metablock v3
ssd04 Nov 11, 2025
c0f9f20
handle logs events from execution results
ssd04 Nov 11, 2025
e1c209c
refactor to handle block data for v3
ssd04 Nov 12, 2025
640c394
add unit tests
ssd04 Nov 12, 2025
5a79367
small renamings
ssd04 Nov 12, 2025
1f62faf
fixes after review
ssd04 Nov 17, 2025
6adae9a
Merge pull request #127 from multiversx/integrate-header-v3-execution…
ssd04 Nov 17, 2025
7471e4a
fix tx pool nil checks
ssd04 Nov 17, 2025
c0f5d4f
add test data for v3
ssd04 Nov 17, 2025
9784855
add TODO for integration tests updates for v3
ssd04 Nov 17, 2025
a2baa42
add error logging
ssd04 Nov 18, 2025
b98eddf
adapt integrationt test for v3
ssd04 Nov 18, 2025
ce9be57
added more integration tests for v3
ssd04 Nov 19, 2025
76638e2
Merge pull request #128 from multiversx/fix-tx-pool-check
ssd04 Nov 19, 2025
c5cb0c7
Merge pull request #130 from multiversx/adapt-integration-tests-v3
ssd04 Nov 27, 2025
c3b7e1c
adapt stateAccesses for supernova
BeniaminDrasovean Nov 27, 2025
c54dcea
Merge remote-tracking branch 'origin/rc/supernova' into stateAccesses…
BeniaminDrasovean Nov 27, 2025
7df9814
fix after merge
BeniaminDrasovean Nov 27, 2025
3903d68
Merge remote-tracking branch 'origin/stateAccesses-for-supernova' int…
BeniaminDrasovean Dec 4, 2025
fb6626a
fix after merge
BeniaminDrasovean Dec 4, 2025
fca6452
update for headerV3
BeniaminDrasovean Dec 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions data/outport.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ type BlockStateAccesses struct {
ShardID uint32 `json:"shardID"`
TimeStampMs uint64 `json:"timestampMs"`
Nonce uint64 `json:"nonce"`
RootHash []byte `json:"rootHash"`
ScheduledRootHash []byte `json:"scheduledRootHash"`
StateAccessesPerAccounts map[string]*stateChange.StateAccesses `json:"stateAccessesPerAccounts"`
}

Expand Down
7 changes: 7 additions & 0 deletions process/eventsHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,11 +130,18 @@ func (eh *eventsHandler) HandleSaveBlockEvents(allEvents data.ArgsSaveBlockData)
}
eh.handleBlockEventsWithOrder(txsWithOrder)

var scheduledRootHash []byte
if eventsData.Header.GetAdditionalData() != nil {
scheduledRootHash = eventsData.Header.GetAdditionalData().GetScheduledRootHash()
}

stateAccesses := data.BlockStateAccesses{
Hash: eventsData.Hash,
ShardID: eventsData.Header.GetShardID(),
TimeStampMs: headerTimeStampMs,
Nonce: eventsData.Header.GetNonce(),
RootHash: eventsData.Header.GetRootHash(),
ScheduledRootHash: scheduledRootHash,
StateAccessesPerAccounts: eventsData.StateAccessesPerAccounts,
}
eh.handleStateAccesses(stateAccesses)
Expand Down
98 changes: 81 additions & 17 deletions process/eventsHandler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package process_test

import (
"context"
"encoding/hex"
"errors"
"testing"

"github.com/multiversx/mx-chain-core-go/core/check"
"github.com/multiversx/mx-chain-core-go/data/block"
"github.com/multiversx/mx-chain-core-go/data/outport"
"github.com/multiversx/mx-chain-core-go/data/smartContractResult"
"github.com/multiversx/mx-chain-core-go/data/stateChange"
"github.com/multiversx/mx-chain-core-go/data/transaction"
"github.com/multiversx/mx-chain-notifier-go/common"
"github.com/multiversx/mx-chain-notifier-go/data"
Expand Down Expand Up @@ -181,9 +183,31 @@ func TestHandleSaveBlockEvents(t *testing.T) {
},
}

stateAccesses := make(map[string]*stateChange.StateAccesses)
stateAccesses["txHash1"] = &stateChange.StateAccesses{
StateAccess: []*stateChange.StateAccess{
&stateChange.StateAccess{
Type: stateChange.Write,
MainTrieKey: []byte("mainTrieKey1"),
MainTrieVal: []byte("mainTrieVal1"),
},
&stateChange.StateAccess{
Type: stateChange.Write,
MainTrieKey: []byte("mainTrieKey2"),
MainTrieVal: []byte("mainTrieVal2"),
},
},
}
stateAccesses["txHash2"] = &stateChange.StateAccesses{}

rootHash := []byte("rootHash1")
timeStamp := uint64(123)
timeStampMs := uint64(1234)
header := &block.HeaderV2{
Header: &block.Header{
ShardID: 2,
ShardID: 2,
TimeStamp: timeStamp,
RootHash: rootHash,
},
}
blockData := data.ArgsSaveBlockData{
Expand All @@ -193,7 +217,9 @@ func TestHandleSaveBlockEvents(t *testing.T) {
SmartContractResults: scrs,
Logs: logData,
},
Header: &block.HeaderV2{},
Header: &block.HeaderV2{},
StateAccesses: stateAccesses,
HeaderTimeStampMs: timeStampMs,
}

expTxs := map[string]*transaction.Transaction{
Expand All @@ -216,9 +242,11 @@ func TestHandleSaveBlockEvents(t *testing.T) {
Scrs: expScrs,
}
expLogEvents := data.BlockEvents{
Hash: blockHash,
Events: logEvents,
ShardID: 2,
Hash: blockHash,
TimeStamp: timeStamp,
TimeStampMs: timeStampMs,
Events: logEvents,
ShardID: 2,
}

expTxsWithOrder := map[string]*outport.TxInfo{
Expand All @@ -237,30 +265,61 @@ func TestHandleSaveBlockEvents(t *testing.T) {
},
}
expTxsWithOrderData := data.BlockEventsWithOrder{
Hash: blockHash,
ShardID: 2,
Txs: expTxsWithOrder,
Scrs: expScrsWithOrder,
Events: logEvents,
Hash: blockHash,
TimeStamp: timeStamp,
TimeStampMs: timeStampMs,
ShardID: 2,
Txs: expTxsWithOrder,
Scrs: expScrsWithOrder,
Events: logEvents,
}

expStateAccessesPerAccounts := make(map[string]*stateChange.StateAccesses)
expStateAccessesPerAccounts[hex.EncodeToString([]byte("mainTrieKey1"))] = &stateChange.StateAccesses{
StateAccess: []*stateChange.StateAccess{
&stateChange.StateAccess{
Type: stateChange.Write,
MainTrieKey: []byte("mainTrieKey1"),
MainTrieVal: []byte("mainTrieVal1"),
},
},
}
expStateAccessesPerAccounts[hex.EncodeToString([]byte("mainTrieKey2"))] = &stateChange.StateAccesses{
StateAccess: []*stateChange.StateAccess{
&stateChange.StateAccess{
Type: stateChange.Write,
MainTrieKey: []byte("mainTrieKey2"),
MainTrieVal: []byte("mainTrieVal2"),
},
},
}
expStateAccesses := data.BlockStateAccesses{
Hash: blockHash,
ShardID: 2,
TimeStampMs: 1234,
RootHash: rootHash,
StateAccessesPerAccounts: expStateAccessesPerAccounts,
}

pushWasCalled := false
txsWasCalled := false
scrsWasCalled := false
blockEventsWithOrderWasCalled := false
stateAccessesWasCalled := false

args := createMockEventsHandlerArgs()

args.EventsInterceptor = &mocks.EventsInterceptorStub{
ProcessBlockEventsCalled: func(eventsData *data.ArgsSaveBlockData) (*data.InterceptorBlockData, error) {
return &data.InterceptorBlockData{
Hash: blockHash,
Header: header,
Txs: expTxs,
Scrs: expScrs,
LogEvents: logEvents,
TxsWithOrder: expTxsWithOrder,
ScrsWithOrder: expScrsWithOrder,
Hash: blockHash,
Header: header,
Txs: expTxs,
Scrs: expScrs,
LogEvents: logEvents,
TxsWithOrder: expTxsWithOrder,
ScrsWithOrder: expScrsWithOrder,
StateAccessesPerAccounts: expStateAccessesPerAccounts,
}, nil
},
}
Expand All @@ -282,6 +341,10 @@ func TestHandleSaveBlockEvents(t *testing.T) {
blockEventsWithOrderWasCalled = true
assert.Equal(t, expTxsWithOrderData, event)
},
BroadcastStateAccessesCalled: func(event data.BlockStateAccesses) {
stateAccessesWasCalled = true
assert.Equal(t, expStateAccesses, event)
},
}

eventsHandler, err := process.NewEventsHandler(args)
Expand All @@ -294,6 +357,7 @@ func TestHandleSaveBlockEvents(t *testing.T) {
assert.True(t, txsWasCalled)
assert.True(t, scrsWasCalled)
assert.True(t, blockEventsWithOrderWasCalled)
assert.True(t, stateAccessesWasCalled)
})
}

Expand Down
49 changes: 41 additions & 8 deletions process/eventsInterceptor.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package process

import (
"encoding/hex"
"fmt"
"sort"
"strings"

"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/core/check"
Expand Down Expand Up @@ -173,19 +175,37 @@ func (ei *eventsInterceptor) getStateAccessesPerAccounts(eventsData *data.ArgsSa
}
}

log.Trace("getStateAccessesPerAccounts",
"num stateAccessesPerAccounts", len(stateAccessesPerAccounts),
)
logStateAccessesPerAccounts(stateAccessesPerAccounts)

return stateAccessesPerAccounts
}

func logStateAccessesPerAccounts(stateAccesses map[string]*stateChange.StateAccesses) {
if log.GetLevel() > logger.LogTrace {
return
}

log.Trace("state accesses per accounts",
"num stateAccessesPerAccounts", len(stateAccesses),
)

for accKey, sts := range stateAccesses {
log.Trace("stateAccessesPerAccount",
"account", accKey,
"num stateAccesses", len(sts.StateAccess),
)
for _, st := range sts.StateAccess {
log.Trace("state access", "stateChange", stateAccessToString(st))
}
}
}

func logStateAccessesPerTxs(stateAccesses map[string]*stateChange.StateAccesses) {
if log.GetLevel() > logger.LogTrace {
return
}

log.Trace("getStateAccessesPerAccounts",
log.Trace("state accesses per transaction",
"num stateAccessesPerTxs", len(stateAccesses),
)

Expand All @@ -195,14 +215,27 @@ func logStateAccessesPerTxs(stateAccesses map[string]*stateChange.StateAccesses)
)

for _, st := range sts.StateAccess {
log.Trace("st",
"actionType", st.GetType(),
"operation", st.GetOperation(),
)
log.Trace("state access", "stateChange", stateAccessToString(st))
}
}
}

func stateAccessToString(stateAccess *stateChange.StateAccess) string {
dataTrieChanges := make([]string, len(stateAccess.GetDataTrieChanges()))
for i, dataTrieChange := range stateAccess.GetDataTrieChanges() {
dataTrieChanges[i] = fmt.Sprintf("key: %v, val: %v, type: %v, operation %v, version %v", hex.EncodeToString(dataTrieChange.Key), hex.EncodeToString(dataTrieChange.Val), dataTrieChange.Type, dataTrieChange.Operation, dataTrieChange.Version)
}
return fmt.Sprintf("type: %v, operation: %v, mainTrieKey: %v, mainTrieVal: %v, index: %v, dataTrieChanges: %v, accountChanges %v",
stateAccess.GetType(),
stateAccess.GetOperation(),
hex.EncodeToString(stateAccess.GetMainTrieKey()),
hex.EncodeToString(stateAccess.GetMainTrieVal()),
stateAccess.GetIndex(),
strings.Join(dataTrieChanges, ", "),
stateAccess.GetAccountChanges(),
)
}

func (ei *eventsInterceptor) getLogEventsFromTransactionsPool(logs []*outport.LogData) []data.Event {
var logEvents []*logEvent
for _, logData := range logs {
Expand Down
Loading