diff --git a/go.mod b/go.mod index fd5b55b37b7..99cca3cf6a6 100644 --- a/go.mod +++ b/go.mod @@ -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 diff --git a/go.sum b/go.sum index 439f7ab5239..f6f5a842cb1 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/state/disabled/disabledStateChangesCollector.go b/state/disabled/disabledStateChangesCollector.go index db1a5d374fd..ac9615d2cf8 100644 --- a/state/disabled/disabledStateChangesCollector.go +++ b/state/disabled/disabledStateChangesCollector.go @@ -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 diff --git a/state/interface.go b/state/interface.go index 9c627cfd634..b52d27c09d7 100644 --- a/state/interface.go +++ b/state/interface.go @@ -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 diff --git a/state/stateAccesses/accountChanges.go b/state/stateAccesses/accountChanges.go index c26da28c80c..7c0c383e1cc 100644 --- a/state/stateAccesses/accountChanges.go +++ b/state/stateAccesses/accountChanges.go @@ -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 diff --git a/state/stateAccesses/collector.go b/state/stateAccesses/collector.go index 618ae6cca6b..f903a001406 100644 --- a/state/stateAccesses/collector.go +++ b/state/stateAccesses/collector.go @@ -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 @@ -147,7 +147,7 @@ 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 { @@ -155,26 +155,6 @@ func (c *collector) mergeStateAccessesIfSameAccount(txHash string, 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 diff --git a/state/stateAccesses/collector_test.go b/state/stateAccesses/collector_test.go index 7094b4511e9..5fa6516292a 100644 --- a/state/stateAccesses/collector_test.go +++ b/state/stateAccesses/collector_test.go @@ -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, @@ -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() @@ -598,38 +589,20 @@ 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() @@ -637,22 +610,15 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) { 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, }, }, }, @@ -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, @@ -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 { @@ -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"), @@ -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) { @@ -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) { @@ -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) }) } diff --git a/state/stateAccesses/stateAccessesStorer.go b/state/stateAccesses/stateAccessesStorer.go index 885f9583a9f..50879f6415a 100644 --- a/state/stateAccesses/stateAccessesStorer.go +++ b/state/stateAccesses/stateAccessesStorer.go @@ -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" diff --git a/testscommon/state/stateChangesCollectorStub.go b/testscommon/state/stateChangesCollectorStub.go index d000a66051f..bc07e808ce5 100644 --- a/testscommon/state/stateChangesCollectorStub.go +++ b/testscommon/state/stateChangesCollectorStub.go @@ -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 @@ -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 -