Skip to content

Commit f6c6f55

Browse files
Merge pull request #7232 from multiversx/refactor-account-changes
use account changes as int
2 parents ed98e40 + 14f09f0 commit f6c6f55

File tree

9 files changed

+51
-130
lines changed

9 files changed

+51
-130
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ require (
1717
github.com/libp2p/go-libp2p-pubsub v0.13.0
1818
github.com/mitchellh/mapstructure v1.5.0
1919
github.com/multiversx/mx-chain-communication-go v1.3.0
20-
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250715072713-eaece6359e1c
20+
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250909083829-29b085e7de01
2121
github.com/multiversx/mx-chain-crypto-go v1.3.0
2222
github.com/multiversx/mx-chain-es-indexer-go v1.9.1
2323
github.com/multiversx/mx-chain-logger-go v1.1.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -401,8 +401,8 @@ github.com/multiversx/concurrent-map v0.1.4 h1:hdnbM8VE4b0KYJaGY5yJS2aNIW9TFFsUY
401401
github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7eFQ4U2vKMOp4A/9+o=
402402
github.com/multiversx/mx-chain-communication-go v1.3.0 h1:ziNM1dRuiR/7al2L/jGEA/a/hjurtJ/HEqgazHNt9P8=
403403
github.com/multiversx/mx-chain-communication-go v1.3.0/go.mod h1:gDVWn6zUW6aCN1YOm/FbbT5MUmhgn/L1Rmpl8EoH3Yg=
404-
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250715072713-eaece6359e1c h1:MMRPxVcxpHfe9g1DIWiz7s+QUEA68Xb+oJALJukHbgA=
405-
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250715072713-eaece6359e1c/go.mod h1:IO+vspNan+gT0WOHnJ95uvWygiziHZvfXpff6KnxV7g=
404+
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250909083829-29b085e7de01 h1:QtVyxssZLi/88v6q7utvcLwTDrFI06aqimFfR4oRFcQ=
405+
github.com/multiversx/mx-chain-core-go v1.4.1-0.20250909083829-29b085e7de01/go.mod h1:IO+vspNan+gT0WOHnJ95uvWygiziHZvfXpff6KnxV7g=
406406
github.com/multiversx/mx-chain-crypto-go v1.3.0 h1:0eK2bkDOMi8VbSPrB1/vGJSYT81IBtfL4zw+C4sWe/k=
407407
github.com/multiversx/mx-chain-crypto-go v1.3.0/go.mod h1:nPIkxxzyTP8IquWKds+22Q2OJ9W7LtusC7cAosz7ojM=
408408
github.com/multiversx/mx-chain-es-indexer-go v1.9.1 h1:Jg/4CLzIiwyrjuy+ZccEJ4TcvlHXnBUr5o3pclVitGo=

state/disabled/disabledStateChangesCollector.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ func NewDisabledStateAccessesCollector() state.StateAccessesCollector {
1616
return &disabledStateAccessesCollector{}
1717
}
1818

19-
// GetAccountChanges returns nil
20-
func (d *disabledStateAccessesCollector) GetAccountChanges(_, _ vmcommon.AccountHandler) *data.AccountChanges {
21-
return nil
19+
// GetAccountChanges returns the constant marking NoChange
20+
func (d *disabledStateAccessesCollector) GetAccountChanges(_, _ vmcommon.AccountHandler) uint32 {
21+
return data.NoChange
2222
}
2323

2424
// AddStateAccess does nothing

state/interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ type ValidatorInfoHandler interface {
359359
// StateAccessesCollector defines the methods needed for an StateAccessesCollector implementation
360360
type StateAccessesCollector interface {
361361
AddStateAccess(stateAccess *data.StateAccess)
362-
GetAccountChanges(oldAccount, account vmcommon.AccountHandler) *data.AccountChanges
362+
GetAccountChanges(oldAccount, account vmcommon.AccountHandler) uint32
363363
Reset()
364364
GetCollectedAccesses() map[string]*data.StateAccesses
365365
Store() error

state/stateAccesses/accountChanges.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,48 +19,48 @@ type userAccountHandler interface {
1919
vmcommon.AccountHandler
2020
}
2121

22-
func getAccountChanges(oldAcc, newAcc vmcommon.AccountHandler) *stateChange.AccountChanges {
22+
func getAccountChanges(oldAcc, newAcc vmcommon.AccountHandler) uint32 {
2323
baseNewAcc, newAccOk := newAcc.(userAccountHandler)
2424
if !newAccOk {
25-
return nil
25+
return stateChange.NoChange
2626
}
2727
baseOldAccount, oldAccOk := oldAcc.(userAccountHandler)
2828
if !oldAccOk {
29-
return nil
29+
return stateChange.NoChange
3030
}
3131

32-
accountChanges := &stateChange.AccountChanges{}
32+
accountChanges := stateChange.NoChange
3333

3434
if baseNewAcc.GetNonce() != baseOldAccount.GetNonce() {
35-
accountChanges.Nonce = true
35+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.NonceChanged)
3636
}
3737

3838
if baseNewAcc.GetBalance().Uint64() != baseOldAccount.GetBalance().Uint64() {
39-
accountChanges.Balance = true
39+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.BalanceChanged)
4040
}
4141

4242
if !bytes.Equal(baseNewAcc.GetCodeHash(), baseOldAccount.GetCodeHash()) {
43-
accountChanges.CodeHash = true
43+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.CodeHashChanged)
4444
}
4545

4646
if !bytes.Equal(baseNewAcc.GetRootHash(), baseOldAccount.GetRootHash()) {
47-
accountChanges.RootHash = true
47+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.RootHashChanged)
4848
}
4949

5050
if !bytes.Equal(baseNewAcc.GetDeveloperReward().Bytes(), baseOldAccount.GetDeveloperReward().Bytes()) {
51-
accountChanges.DeveloperReward = true
51+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.DeveloperRewardChanged)
5252
}
5353

5454
if !bytes.Equal(baseNewAcc.GetOwnerAddress(), baseOldAccount.GetOwnerAddress()) {
55-
accountChanges.OwnerAddress = true
55+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.OwnerAddressChanged)
5656
}
5757

5858
if !bytes.Equal(baseNewAcc.GetUserName(), baseOldAccount.GetUserName()) {
59-
accountChanges.UserName = true
59+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.UserNameChanged)
6060
}
6161

6262
if !bytes.Equal(baseNewAcc.GetCodeMetadata(), baseOldAccount.GetCodeMetadata()) {
63-
accountChanges.CodeMetadata = true
63+
accountChanges = stateChange.AddAccountChange(accountChanges, stateChange.CodeMetadataChanged)
6464
}
6565

6666
return accountChanges

state/stateAccesses/collector.go

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ func (c *collector) AddStateAccess(stateAccess *data.StateAccess) {
6666
}
6767

6868
// GetAccountChanges will return the account changes
69-
func (c *collector) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) *data.AccountChanges {
69+
func (c *collector) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) uint32 {
7070
if c.withAccountChanges {
7171
return getAccountChanges(oldAccount, account)
7272
}
7373

74-
return nil
74+
return data.NoChange
7575
}
7676

7777
// Reset resets the state accesses collector
@@ -147,34 +147,14 @@ func (c *collector) mergeStateAccessesIfSameAccount(txHash string, stateAccess *
147147
stateAccesses[i].Operation = data.MergeOperations(stateAccesses[i].Operation, stateAccess.Operation)
148148
stateAccesses[i].DataTrieChanges = data.MergeDataTrieChanges(stateAccesses[i].DataTrieChanges, stateAccess.DataTrieChanges)
149149
if c.withAccountChanges {
150-
stateAccesses[i].AccountChanges = mergeAccountChanges(stateAccesses[i].AccountChanges, stateAccess.AccountChanges)
150+
stateAccesses[i].AccountChanges = stateAccesses[i].AccountChanges | stateAccess.AccountChanges
151151
}
152152
}
153153
if !wasMerged {
154154
c.stateAccessesForTxs[txHash].StateAccess = append(c.stateAccessesForTxs[txHash].StateAccess, stateAccess)
155155
}
156156
}
157157

158-
func mergeAccountChanges(accountChanges1, accountChanges2 *data.AccountChanges) *data.AccountChanges {
159-
if accountChanges1 == nil {
160-
return accountChanges2
161-
}
162-
if accountChanges2 == nil {
163-
return accountChanges1
164-
}
165-
166-
accountChanges1.Nonce = accountChanges1.Nonce || accountChanges2.Nonce
167-
accountChanges1.Balance = accountChanges1.Balance || accountChanges2.Balance
168-
accountChanges1.CodeHash = accountChanges1.CodeHash || accountChanges2.CodeHash
169-
accountChanges1.RootHash = accountChanges1.RootHash || accountChanges2.RootHash
170-
accountChanges1.DeveloperReward = accountChanges1.DeveloperReward || accountChanges2.DeveloperReward
171-
accountChanges1.OwnerAddress = accountChanges1.OwnerAddress || accountChanges2.OwnerAddress
172-
accountChanges1.UserName = accountChanges1.UserName || accountChanges2.UserName
173-
accountChanges1.CodeMetadata = accountChanges1.CodeMetadata || accountChanges2.CodeMetadata
174-
175-
return accountChanges1
176-
}
177-
178158
func logCollectedStateAccesses(message string, stateAccessesForTx map[string]*data.StateAccesses) {
179159
if log.GetLevel() != logger.LogTrace {
180160
return

state/stateAccesses/collector_test.go

Lines changed: 24 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -539,22 +539,13 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
539539
})
540540
})
541541

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

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

548-
defaultAccChanges := &data.AccountChanges{
549-
Nonce: false,
550-
Balance: false,
551-
CodeHash: false,
552-
RootHash: false,
553-
DeveloperReward: false,
554-
OwnerAddress: false,
555-
UserName: false,
556-
CodeMetadata: false,
557-
}
548+
defaultAccChanges := data.NoChange
558549

559550
c.AddStateAccess(&data.StateAccess{
560551
Type: data.Write,
@@ -570,7 +561,7 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
570561
TxHash: []byte("hash"),
571562
MainTrieKey: []byte("account1"),
572563
MainTrieVal: []byte("mainTrieVal2"),
573-
AccountChanges: nil,
564+
AccountChanges: defaultAccChanges,
574565
})
575566

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

600591
c.AddStateAccess(&data.StateAccess{
601-
Type: data.Write,
602-
TxHash: []byte("hash"),
603-
MainTrieKey: []byte("account1"),
604-
MainTrieVal: []byte("mainTrieVal1"),
605-
AccountChanges: &data.AccountChanges{
606-
Nonce: false,
607-
Balance: true,
608-
CodeHash: false,
609-
RootHash: true,
610-
DeveloperReward: false,
611-
OwnerAddress: true,
612-
UserName: false,
613-
CodeMetadata: true,
614-
},
592+
Type: data.Write,
593+
TxHash: []byte("hash"),
594+
MainTrieKey: []byte("account1"),
595+
MainTrieVal: []byte("mainTrieVal1"),
596+
AccountChanges: data.BalanceChanged | data.RootHashChanged | data.OwnerAddressChanged | data.CodeMetadataChanged,
615597
})
616598

617599
c.AddStateAccess(&data.StateAccess{
618-
Type: data.Write,
619-
Index: 0,
620-
TxHash: []byte("hash"),
621-
MainTrieKey: []byte("account1"),
622-
MainTrieVal: []byte("mainTrieVal2"),
623-
AccountChanges: &data.AccountChanges{
624-
Nonce: true,
625-
Balance: false,
626-
CodeHash: true,
627-
RootHash: false,
628-
DeveloperReward: true,
629-
OwnerAddress: false,
630-
UserName: true,
631-
CodeMetadata: false,
632-
},
600+
Type: data.Write,
601+
Index: 0,
602+
TxHash: []byte("hash"),
603+
MainTrieKey: []byte("account1"),
604+
MainTrieVal: []byte("mainTrieVal2"),
605+
AccountChanges: data.NonceChanged | data.CodeHashChanged | data.DeveloperRewardChanged | data.UserNameChanged,
633606
})
634607

635608
stateChangesForTx := c.GetCollectedAccesses()
636609

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

613+
allFieldsChanged := uint32(255)
614+
640615
require.Equal(t, stateChangesForTx, map[string]*data.StateAccesses{
641616
"hash": {
642617
StateAccess: []*data.StateAccess{
643618
{
644619
MainTrieKey: []byte("account1"), Type: data.Write,
645620
TxHash: []byte("hash"), MainTrieVal: []byte("mainTrieVal2"),
646-
AccountChanges: &data.AccountChanges{
647-
Nonce: true,
648-
Balance: true,
649-
CodeHash: true,
650-
RootHash: true,
651-
DeveloperReward: true,
652-
OwnerAddress: true,
653-
UserName: true,
654-
CodeMetadata: true,
655-
},
621+
AccountChanges: allFieldsChanged,
656622
},
657623
},
658624
},
@@ -665,27 +631,9 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
665631
c, _ := NewCollector(disabled.NewDisabledStateAccessesStorer(), WithCollectRead(), WithCollectWrite(), WithAccountChanges())
666632
assert.Equal(t, 0, len(c.stateAccesses))
667633

668-
defaultAccChanges := &data.AccountChanges{
669-
Nonce: false,
670-
Balance: false,
671-
CodeHash: false,
672-
RootHash: false,
673-
DeveloperReward: false,
674-
OwnerAddress: false,
675-
UserName: false,
676-
CodeMetadata: false,
677-
}
634+
defaultAccChanges := data.NoChange
678635

679-
modifiedAccChanges := &data.AccountChanges{
680-
Nonce: false,
681-
Balance: true,
682-
CodeHash: false,
683-
RootHash: true,
684-
DeveloperReward: false,
685-
OwnerAddress: true,
686-
UserName: false,
687-
CodeMetadata: true,
688-
}
636+
modifiedAccChanges := data.BalanceChanged | data.RootHashChanged | data.OwnerAddressChanged | data.CodeMetadataChanged
689637

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

700-
var accChanges *data.AccountChanges
701648
numStateChanges := 20
702649
for i := 0; i < numStateChanges; i++ {
703650
if i%2 == 0 {
@@ -711,10 +658,9 @@ func TestStateAccessesCollector_GetCollectedAccesses(t *testing.T) {
711658
Operation: operations[i%len(operations)],
712659
})
713660
} else {
661+
accChanges := defaultAccChanges
714662
if i == 19 {
715663
accChanges = modifiedAccChanges
716-
} else {
717-
accChanges = defaultAccChanges
718664
}
719665
c.AddStateAccess(&data.StateAccess{
720666
MainTrieKey: []byte("key"),
@@ -765,7 +711,7 @@ func TestCollector_GetAccountChanges(t *testing.T) {
765711
nil,
766712
&mockState.UserAccountStub{},
767713
)
768-
assert.Nil(t, accountChanges)
714+
assert.Equal(t, data.NoChange, accountChanges)
769715
})
770716

771717
t.Run("nil new account should return early", func(t *testing.T) {
@@ -778,7 +724,7 @@ func TestCollector_GetAccountChanges(t *testing.T) {
778724
&mockState.UserAccountStub{},
779725
nil,
780726
)
781-
assert.Nil(t, accountChanges)
727+
assert.Equal(t, data.NoChange, accountChanges)
782728
})
783729

784730
t.Run("should work", func(t *testing.T) {
@@ -816,14 +762,8 @@ func TestCollector_GetAccountChanges(t *testing.T) {
816762
},
817763
)
818764

819-
require.True(t, accountChanges.Nonce)
820-
require.True(t, accountChanges.Balance)
821-
require.True(t, accountChanges.CodeHash)
822-
require.True(t, accountChanges.RootHash)
823-
require.True(t, accountChanges.DeveloperReward)
824-
require.True(t, accountChanges.OwnerAddress)
825-
require.True(t, accountChanges.UserName)
826-
require.True(t, accountChanges.CodeMetadata)
765+
allFieldsChanged := uint32(255)
766+
require.Equal(t, allFieldsChanged, accountChanges)
827767
})
828768
}
829769

state/stateAccesses/stateAccessesStorer.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package stateAccesses
22

33
import (
44
"fmt"
5+
56
"github.com/multiversx/mx-chain-core-go/core/check"
67
data "github.com/multiversx/mx-chain-core-go/data/stateChange"
78
"github.com/multiversx/mx-chain-core-go/marshal"

testscommon/state/stateChangesCollectorStub.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
// StateAccessesCollectorStub represents a mock for the StateAccessesCollector interface
99
type StateAccessesCollectorStub struct {
1010
AddStateChangeCalled func(stateAccess *stateChange.StateAccess)
11-
GetAccountChangesCalled func(oldAccount, account vmcommon.AccountHandler) *stateChange.AccountChanges
11+
GetAccountChangesCalled func(oldAccount, account vmcommon.AccountHandler) uint32
1212
ResetCalled func()
1313
AddTxHashToCollectedStateAccessesCalled func(txHash []byte)
1414
SetIndexToLatestStateAccessesCalled func(index int) error
@@ -26,11 +26,11 @@ func (s *StateAccessesCollectorStub) AddStateAccess(stateChange *stateChange.Sta
2626
}
2727

2828
// GetAccountChanges -
29-
func (s *StateAccessesCollectorStub) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) *stateChange.AccountChanges {
29+
func (s *StateAccessesCollectorStub) GetAccountChanges(oldAccount, account vmcommon.AccountHandler) uint32 {
3030
if s.GetAccountChangesCalled != nil {
31-
s.GetAccountChangesCalled(oldAccount, account)
31+
return s.GetAccountChangesCalled(oldAccount, account)
3232
}
33-
return nil
33+
return stateChange.NoChange
3434
}
3535

3636
// Reset -

0 commit comments

Comments
 (0)