Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ require (
github.com/libp2p/go-libp2p-pubsub v0.13.0
github.com/mitchellh/mapstructure v1.5.0
github.com/multiversx/mx-chain-communication-go v1.3.0
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250715072713-eaece6359e1c
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250909083829-29b085e7de01
github.com/multiversx/mx-chain-crypto-go v1.3.0
github.com/multiversx/mx-chain-es-indexer-go v1.9.1
github.com/multiversx/mx-chain-logger-go v1.1.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,8 @@ github.com/multiversx/concurrent-map v0.1.4 h1:hdnbM8VE4b0KYJaGY5yJS2aNIW9TFFsUY
github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7eFQ4U2vKMOp4A/9+o=
github.com/multiversx/mx-chain-communication-go v1.3.0 h1:ziNM1dRuiR/7al2L/jGEA/a/hjurtJ/HEqgazHNt9P8=
github.com/multiversx/mx-chain-communication-go v1.3.0/go.mod h1:gDVWn6zUW6aCN1YOm/FbbT5MUmhgn/L1Rmpl8EoH3Yg=
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250715072713-eaece6359e1c h1:MMRPxVcxpHfe9g1DIWiz7s+QUEA68Xb+oJALJukHbgA=
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250715072713-eaece6359e1c/go.mod h1:IO+vspNan+gT0WOHnJ95uvWygiziHZvfXpff6KnxV7g=
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250909083829-29b085e7de01 h1:QtVyxssZLi/88v6q7utvcLwTDrFI06aqimFfR4oRFcQ=
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250909083829-29b085e7de01/go.mod h1:IO+vspNan+gT0WOHnJ95uvWygiziHZvfXpff6KnxV7g=
github.com/multiversx/mx-chain-crypto-go v1.3.0 h1:0eK2bkDOMi8VbSPrB1/vGJSYT81IBtfL4zw+C4sWe/k=
github.com/multiversx/mx-chain-crypto-go v1.3.0/go.mod h1:nPIkxxzyTP8IquWKds+22Q2OJ9W7LtusC7cAosz7ojM=
github.com/multiversx/mx-chain-es-indexer-go v1.9.1 h1:Jg/4CLzIiwyrjuy+ZccEJ4TcvlHXnBUr5o3pclVitGo=
Expand Down
6 changes: 3 additions & 3 deletions state/disabled/disabledStateChangesCollector.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ func NewDisabledStateAccessesCollector() state.StateAccessesCollector {
return &disabledStateAccessesCollector{}
}

// GetAccountChanges returns nil
func (d *disabledStateAccessesCollector) GetAccountChanges(_, _ vmcommon.AccountHandler) *data.AccountChanges {
return nil
// GetAccountChanges returns the constant marking NoChange
func (d *disabledStateAccessesCollector) GetAccountChanges(_, _ vmcommon.AccountHandler) uint32 {
return data.NoChange
}

// AddStateAccess does nothing
Expand Down
2 changes: 1 addition & 1 deletion state/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -359,7 +359,7 @@ type ValidatorInfoHandler interface {
// StateAccessesCollector defines the methods needed for an StateAccessesCollector implementation
type StateAccessesCollector interface {
AddStateAccess(stateAccess *data.StateAccess)
GetAccountChanges(oldAccount, account vmcommon.AccountHandler) *data.AccountChanges
GetAccountChanges(oldAccount, account vmcommon.AccountHandler) uint32
Reset()
GetCollectedAccesses() map[string]*data.StateAccesses
Store() error
Expand Down
24 changes: 12 additions & 12 deletions state/stateAccesses/accountChanges.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,48 +19,48 @@ type userAccountHandler interface {
vmcommon.AccountHandler
}

func getAccountChanges(oldAcc, newAcc vmcommon.AccountHandler) *stateChange.AccountChanges {
func getAccountChanges(oldAcc, newAcc vmcommon.AccountHandler) uint32 {
baseNewAcc, newAccOk := newAcc.(userAccountHandler)
if !newAccOk {
return nil
return stateChange.NoChange
}
baseOldAccount, oldAccOk := oldAcc.(userAccountHandler)
if !oldAccOk {
return nil
return stateChange.NoChange
}

accountChanges := &stateChange.AccountChanges{}
accountChanges := stateChange.NoChange

if baseNewAcc.GetNonce() != baseOldAccount.GetNonce() {
accountChanges.Nonce = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.NonceChanged)
}

if baseNewAcc.GetBalance().Uint64() != baseOldAccount.GetBalance().Uint64() {
accountChanges.Balance = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.BalanceChanged)
}

if !bytes.Equal(baseNewAcc.GetCodeHash(), baseOldAccount.GetCodeHash()) {
accountChanges.CodeHash = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.CodeHashChanged)
}

if !bytes.Equal(baseNewAcc.GetRootHash(), baseOldAccount.GetRootHash()) {
accountChanges.RootHash = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.RootHashChanged)
}

if !bytes.Equal(baseNewAcc.GetDeveloperReward().Bytes(), baseOldAccount.GetDeveloperReward().Bytes()) {
accountChanges.DeveloperReward = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.DeveloperRewardChanged)
}

if !bytes.Equal(baseNewAcc.GetOwnerAddress(), baseOldAccount.GetOwnerAddress()) {
accountChanges.OwnerAddress = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.OwnerAddressChanged)
}

if !bytes.Equal(baseNewAcc.GetUserName(), baseOldAccount.GetUserName()) {
accountChanges.UserName = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.UserNameChanged)
}

if !bytes.Equal(baseNewAcc.GetCodeMetadata(), baseOldAccount.GetCodeMetadata()) {
accountChanges.CodeMetadata = true
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.CodeMetadataChanged)
}

return accountChanges
Expand Down
26 changes: 3 additions & 23 deletions state/stateAccesses/collector.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,12 @@ func (c *collector) AddStateAccess(stateAccess *data.StateAccess) {
}

// GetAccountChanges will return the account changes
func (c *collector) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) *data.AccountChanges {
func (c *collector) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) uint32 {
if c.withAccountChanges {
return getAccountChanges(oldAccount, account)
}

return nil
return data.NoChange
}

// Reset resets the state accesses collector
Expand Down Expand Up @@ -147,34 +147,14 @@ func (c *collector) mergeStateAccessesIfSameAccount(txHash string, stateAccess *
stateAccesses[i].Operation = data.MergeOperations(stateAccesses[i].Operation, stateAccess.Operation)
stateAccesses[i].DataTrieChanges = data.MergeDataTrieChanges(stateAccesses[i].DataTrieChanges, stateAccess.DataTrieChanges)
if c.withAccountChanges {
stateAccesses[i].AccountChanges = mergeAccountChanges(stateAccesses[i].AccountChanges, stateAccess.AccountChanges)
stateAccesses[i].AccountChanges = stateAccesses[i].AccountChanges | stateAccess.AccountChanges
}
}
if !wasMerged {
c.stateAccessesForTxs[txHash].StateAccess = append(c.stateAccessesForTxs[txHash].StateAccess, stateAccess)
}
}

func mergeAccountChanges(accountChanges1, accountChanges2 *data.AccountChanges) *data.AccountChanges {
if accountChanges1 == nil {
return accountChanges2
}
if accountChanges2 == nil {
return accountChanges1
}

accountChanges1.Nonce = accountChanges1.Nonce || accountChanges2.Nonce
accountChanges1.Balance = accountChanges1.Balance || accountChanges2.Balance
accountChanges1.CodeHash = accountChanges1.CodeHash || accountChanges2.CodeHash
accountChanges1.RootHash = accountChanges1.RootHash || accountChanges2.RootHash
accountChanges1.DeveloperReward = accountChanges1.DeveloperReward || accountChanges2.DeveloperReward
accountChanges1.OwnerAddress = accountChanges1.OwnerAddress || accountChanges2.OwnerAddress
accountChanges1.UserName = accountChanges1.UserName || accountChanges2.UserName
accountChanges1.CodeMetadata = accountChanges1.CodeMetadata || accountChanges2.CodeMetadata

return accountChanges1
}

func logCollectedStateAccesses(message string, stateAccessesForTx map[string]*data.StateAccesses) {
if log.GetLevel() != logger.LogTrace {
return
Expand Down
108 changes: 24 additions & 84 deletions state/stateAccesses/collector_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -539,22 +539,13 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
})
})

t.Run("merging nil account changes should return one account change", func(t *testing.T) {
t.Run("merging no account changes should not set any changes in the account", func(t *testing.T) {
t.Parallel()

c, _ := NewCollector(disabled.NewDisabledStateAccessesStorer(), WithCollectRead(), WithCollectWrite(), WithAccountChanges())
assert.Equal(t, 0, len(c.stateAccesses))

defaultAccChanges := &data.AccountChanges{
Nonce: false,
Balance: false,
CodeHash: false,
RootHash: false,
DeveloperReward: false,
OwnerAddress: false,
UserName: false,
CodeMetadata: false,
}
defaultAccChanges := data.NoChange

c.AddStateAccess(&data.StateAccess{
Type: data.Write,
Expand All @@ -570,7 +561,7 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
TxHash: []byte("hash"),
MainTrieKey: []byte("account1"),
MainTrieVal: []byte("mainTrieVal2"),
AccountChanges: nil,
AccountChanges: defaultAccChanges,
})

stateChangesForTx := c.GetCollectedAccesses()
Expand Down Expand Up @@ -598,61 +589,36 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
assert.Equal(t, 0, len(c.stateAccesses))

c.AddStateAccess(&data.StateAccess{
Type: data.Write,
TxHash: []byte("hash"),
MainTrieKey: []byte("account1"),
MainTrieVal: []byte("mainTrieVal1"),
AccountChanges: &data.AccountChanges{
Nonce: false,
Balance: true,
CodeHash: false,
RootHash: true,
DeveloperReward: false,
OwnerAddress: true,
UserName: false,
CodeMetadata: true,
},
Type: data.Write,
TxHash: []byte("hash"),
MainTrieKey: []byte("account1"),
MainTrieVal: []byte("mainTrieVal1"),
AccountChanges: data.BalanceChanged | data.RootHashChanged | data.OwnerAddressChanged | data.CodeMetadataChanged,
})

c.AddStateAccess(&data.StateAccess{
Type: data.Write,
Index: 0,
TxHash: []byte("hash"),
MainTrieKey: []byte("account1"),
MainTrieVal: []byte("mainTrieVal2"),
AccountChanges: &data.AccountChanges{
Nonce: true,
Balance: false,
CodeHash: true,
RootHash: false,
DeveloperReward: true,
OwnerAddress: false,
UserName: true,
CodeMetadata: false,
},
Type: data.Write,
Index: 0,
TxHash: []byte("hash"),
MainTrieKey: []byte("account1"),
MainTrieVal: []byte("mainTrieVal2"),
AccountChanges: data.NonceChanged | data.CodeHashChanged | data.DeveloperRewardChanged | data.UserNameChanged,
})

stateChangesForTx := c.GetCollectedAccesses()

require.Len(t, stateChangesForTx, 1)
require.Len(t, stateChangesForTx["hash"].StateAccess, 1)

allFieldsChanged := uint32(255)

require.Equal(t, stateChangesForTx, map[string]*data.StateAccesses{
"hash": {
StateAccess: []*data.StateAccess{
{
MainTrieKey: []byte("account1"), Type: data.Write,
TxHash: []byte("hash"), MainTrieVal: []byte("mainTrieVal2"),
AccountChanges: &data.AccountChanges{
Nonce: true,
Balance: true,
CodeHash: true,
RootHash: true,
DeveloperReward: true,
OwnerAddress: true,
UserName: true,
CodeMetadata: true,
},
AccountChanges: allFieldsChanged,
},
},
},
Expand All @@ -665,27 +631,9 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
c, _ := NewCollector(disabled.NewDisabledStateAccessesStorer(), WithCollectRead(), WithCollectWrite(), WithAccountChanges())
assert.Equal(t, 0, len(c.stateAccesses))

defaultAccChanges := &data.AccountChanges{
Nonce: false,
Balance: false,
CodeHash: false,
RootHash: false,
DeveloperReward: false,
OwnerAddress: false,
UserName: false,
CodeMetadata: false,
}
defaultAccChanges := data.NoChange

modifiedAccChanges := &data.AccountChanges{
Nonce: false,
Balance: true,
CodeHash: false,
RootHash: true,
DeveloperReward: false,
OwnerAddress: true,
UserName: false,
CodeMetadata: true,
}
modifiedAccChanges := data.BalanceChanged | data.RootHashChanged | data.OwnerAddressChanged | data.CodeMetadataChanged

operations := []uint32{
data.NotSet,
Expand All @@ -697,7 +645,6 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
data.GetDataTrieValue,
}

var accChanges *data.AccountChanges
numStateChanges := 20
for i := 0; i < numStateChanges; i++ {
if i%2 == 0 {
Expand All @@ -711,10 +658,9 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
Operation: operations[i%len(operations)],
})
} else {
accChanges := defaultAccChanges
if i == 19 {
accChanges = modifiedAccChanges
} else {
accChanges = defaultAccChanges
}
c.AddStateAccess(&data.StateAccess{
MainTrieKey: []byte("key"),
Expand Down Expand Up @@ -765,7 +711,7 @@ func TestCollector_GetAccountChanges(t *testing.T) {
nil,
&mockState.UserAccountStub{},
)
assert.Nil(t, accountChanges)
assert.Equal(t, data.NoChange, accountChanges)
})

t.Run("nil new account should return early", func(t *testing.T) {
Expand All @@ -778,7 +724,7 @@ func TestCollector_GetAccountChanges(t *testing.T) {
&mockState.UserAccountStub{},
nil,
)
assert.Nil(t, accountChanges)
assert.Equal(t, data.NoChange, accountChanges)
})

t.Run("should work", func(t *testing.T) {
Expand Down Expand Up @@ -816,14 +762,8 @@ func TestCollector_GetAccountChanges(t *testing.T) {
},
)

require.True(t, accountChanges.Nonce)
require.True(t, accountChanges.Balance)
require.True(t, accountChanges.CodeHash)
require.True(t, accountChanges.RootHash)
require.True(t, accountChanges.DeveloperReward)
require.True(t, accountChanges.OwnerAddress)
require.True(t, accountChanges.UserName)
require.True(t, accountChanges.CodeMetadata)
allFieldsChanged := uint32(255)
require.Equal(t, allFieldsChanged, accountChanges)
})
}

Expand Down
1 change: 1 addition & 0 deletions state/stateAccesses/stateAccessesStorer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package stateAccesses

import (
"fmt"

"github.com/multiversx/mx-chain-core-go/core/check"
data "github.com/multiversx/mx-chain-core-go/data/stateChange"
"github.com/multiversx/mx-chain-core-go/marshal"
Expand Down
8 changes: 4 additions & 4 deletions testscommon/state/stateChangesCollectorStub.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
// StateAccessesCollectorStub represents a mock for the StateAccessesCollector interface
type StateAccessesCollectorStub struct {
AddStateChangeCalled func(stateAccess *stateChange.StateAccess)
GetAccountChangesCalled func(oldAccount, account vmcommon.AccountHandler) *stateChange.AccountChanges
GetAccountChangesCalled func(oldAccount, account vmcommon.AccountHandler) uint32
ResetCalled func()
AddTxHashToCollectedStateAccessesCalled func(txHash []byte)
SetIndexToLatestStateAccessesCalled func(index int) error
Expand All @@ -26,11 +26,11 @@ func (s *StateAccessesCollectorStub) AddStateAccess(stateChange *stateChange.Sta
}

// GetAccountChanges -
func (s *StateAccessesCollectorStub) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) *stateChange.AccountChanges {
func (s *StateAccessesCollectorStub) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) uint32 {
if s.GetAccountChangesCalled != nil {
s.GetAccountChangesCalled(oldAccount, account)
return s.GetAccountChangesCalled(oldAccount, account)
}
return nil
return stateChange.NoChange
}

// Reset -
Expand Down
Loading