diff --git a/epochStart/bootstrap/disabled/disabledAccountsAdapter.go b/epochStart/bootstrap/disabled/disabledAccountsAdapter.go index 56c50ea8daf..7b23375745c 100644 --- a/epochStart/bootstrap/disabled/disabledAccountsAdapter.go +++ b/epochStart/bootstrap/disabled/disabledAccountsAdapter.go @@ -2,8 +2,8 @@ package disabled import ( "context" - - "github.com/multiversx/mx-chain-core-go/data/transaction" + + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/state" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -130,7 +130,7 @@ func (a *accountsAdapter) GetStackDebugFirstEntry() []byte { } // SetTxHashForLatestStateChanges - -func (a *accountsAdapter) SetTxHashForLatestStateChanges(_ []byte, _ *transaction.Transaction) { +func (a *accountsAdapter) SetTxHashForLatestStateChanges(_ []byte, _ data.TransactionHandler) { } // Close - diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index 31c44fb0d30..ebed26d37a6 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -274,6 +274,8 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( pcf.state.AccountsAdapter(), pcf.coreData.AddressPubKeyConverter(), pcf.bootstrapComponents.ShardCoordinator(), + pcf.coreData.InternalMarshalizer(), + pcf.coreData.Hasher(), ) if err != nil { return nil, err diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index 2347632d2d5..3a19663643b 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -539,6 +539,8 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo arg.Accounts, arg.Core.AddressPubKeyConverter(), arg.ShardCoordinator, + arg.Core.InternalMarshalizer(), + arg.Core.Hasher(), ) if err != nil { return nil, err diff --git a/go.mod b/go.mod index 4fdb9c91d59..c4088e6ea34 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/klauspost/cpuid/v2 v2.2.5 github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-communication-go v1.1.1 - github.com/multiversx/mx-chain-core-go v1.2.25-0.20250206084405-a19e65762bf4 + github.com/multiversx/mx-chain-core-go v1.2.25-0.20250218140156-ae1c6ad7aca1 github.com/multiversx/mx-chain-crypto-go v1.2.12 github.com/multiversx/mx-chain-es-indexer-go v1.7.14 github.com/multiversx/mx-chain-logger-go v1.0.15 diff --git a/go.sum b/go.sum index 78b5375793c..3eea68d27c5 100644 --- a/go.sum +++ b/go.sum @@ -387,8 +387,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.1.1 h1:y4DoQeQOJTaSUsRzczQFazf8JYQmInddypApqA3AkwM= github.com/multiversx/mx-chain-communication-go v1.1.1/go.mod h1:WK6bP4pGEHGDDna/AYRIMtl6G9OA0NByI1Lw8PmOnRM= -github.com/multiversx/mx-chain-core-go v1.2.25-0.20250206084405-a19e65762bf4 h1:k8s4I2FeCocES/musoetqYEL1VQY5Mtk6bmxiXbsE3w= -github.com/multiversx/mx-chain-core-go v1.2.25-0.20250206084405-a19e65762bf4/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= +github.com/multiversx/mx-chain-core-go v1.2.25-0.20250218140156-ae1c6ad7aca1 h1:1E0UgHQzijZ9abzQqCR4S/OCuGFmRr4etExbWH7jSLE= +github.com/multiversx/mx-chain-core-go v1.2.25-0.20250218140156-ae1c6ad7aca1/go.mod h1:B5zU4MFyJezmEzCsAHE9YNULmGCm2zbPHvl9hazNxmE= github.com/multiversx/mx-chain-crypto-go v1.2.12 h1:zWip7rpUS4CGthJxfKn5MZfMfYPjVjIiCID6uX5BSOk= github.com/multiversx/mx-chain-crypto-go v1.2.12/go.mod h1:HzcPpCm1zanNct/6h2rIh+MFrlXbjA5C8+uMyXj3LI4= github.com/multiversx/mx-chain-es-indexer-go v1.7.14 h1:V4fuubEUYskWCLQIkbuoB0WHoKyldLQRq/fllIzW1CU= diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index a73a129c7c4..f2cac0bc509 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1591,6 +1591,8 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u tpn.AccntState, TestAddressPubkeyConverter, tpn.ShardCoordinator, + TestMarshalizer, + TestHasher, ) mapDNSAddresses := make(map[string]struct{}) diff --git a/integrationTests/vm/wasm/utils.go b/integrationTests/vm/wasm/utils.go index bfe7b4b7ca9..75b60ee2067 100644 --- a/integrationTests/vm/wasm/utils.go +++ b/integrationTests/vm/wasm/utils.go @@ -186,7 +186,13 @@ func SetupTestContextWithGasSchedule(t *testing.T, gasSchedule map[string]map[st } context.QueryService, _ = smartContract.NewSCQueryService(argsNewSCQueryService) - context.RewardsProcessor, err = rewardTransaction.NewRewardTxProcessor(context.Accounts, pkConverter, oneShardCoordinator) + context.RewardsProcessor, err = rewardTransaction.NewRewardTxProcessor( + context.Accounts, + pkConverter, + oneShardCoordinator, + integrationTests.TestMarshalizer, + integrationTests.TestHasher, + ) require.Nil(t, err) require.NotNil(t, context.TxProcessor) diff --git a/process/rewardTransaction/process.go b/process/rewardTransaction/process.go index e641ef5d0cd..ba7140dc81f 100644 --- a/process/rewardTransaction/process.go +++ b/process/rewardTransaction/process.go @@ -6,19 +6,26 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data/rewardTx" + "github.com/multiversx/mx-chain-core-go/hashing" + "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/state" + logger "github.com/multiversx/mx-chain-logger-go" ) var _ process.RewardTransactionProcessor = (*rewardTxProcessor)(nil) +var log = logger.GetOrCreate("process/reward") + const rewardKey = "reward" type rewardTxProcessor struct { accounts state.AccountsAdapter pubkeyConv core.PubkeyConverter shardCoordinator sharding.Coordinator + marshaller marshal.Marshalizer + hasher hashing.Hasher } // NewRewardTxProcessor creates a rewardTxProcessor instance @@ -26,6 +33,8 @@ func NewRewardTxProcessor( accountsDB state.AccountsAdapter, pubkeyConv core.PubkeyConverter, coordinator sharding.Coordinator, + marshaller marshal.Marshalizer, + hasher hashing.Hasher, ) (*rewardTxProcessor, error) { if check.IfNil(accountsDB) { return nil, process.ErrNilAccountsAdapter @@ -36,11 +45,19 @@ func NewRewardTxProcessor( if check.IfNil(coordinator) { return nil, process.ErrNilShardCoordinator } + if check.IfNil(marshaller) { + return nil, process.ErrNilMarshalizer + } + if check.IfNil(hasher) { + return nil, process.ErrNilHasher + } return &rewardTxProcessor{ accounts: accountsDB, pubkeyConv: pubkeyConv, shardCoordinator: coordinator, + marshaller: marshaller, + hasher: hasher, }, nil } @@ -91,6 +108,18 @@ func (rtp *rewardTxProcessor) ProcessRewardTransaction(rTx *rewardTx.RewardTx) e rtp.pubkeyConv, ) + txHash, err := core.CalculateHash(rtp.marshaller, rtp.hasher, rTx) + if err != nil { + log.Debug("CalculateHash error", "error", err) + return err + } + + // TODO refactor to set the tx hash for the following state changes before the processing occurs + defer func() { + rtp.accounts.SetTxHashForLatestStateChanges(txHash, rTx) + log.Debug("SetTxHashForLatestStateChanges", "txHash", txHash) + }() + err = accHandler.AddToBalance(rTx.Value) if err != nil { return err diff --git a/process/rewardTransaction/process_test.go b/process/rewardTransaction/process_test.go index 13b546213ab..e2ad99f5fb5 100644 --- a/process/rewardTransaction/process_test.go +++ b/process/rewardTransaction/process_test.go @@ -29,6 +29,8 @@ func TestNewRewardTxProcessor_NilAccountsDbShouldErr(t *testing.T) { nil, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) assert.Nil(t, rtp) @@ -42,6 +44,8 @@ func TestNewRewardTxProcessor_NilPubkeyConverterShouldErr(t *testing.T) { &stateMock.AccountsStub{}, nil, mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) assert.Nil(t, rtp) @@ -55,12 +59,43 @@ func TestNewRewardTxProcessor_NilShardCoordinatorShouldErr(t *testing.T) { &stateMock.AccountsStub{}, createMockPubkeyConverter(), nil, + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) assert.Nil(t, rtp) assert.Equal(t, process.ErrNilShardCoordinator, err) } +func TestNewRewardTxProcessor_NilMarshallerShouldErr(t *testing.T) { + t.Parallel() + + rtp, err := rewardTransaction.NewRewardTxProcessor( + &stateMock.AccountsStub{}, + createMockPubkeyConverter(), + mock.NewMultiShardsCoordinatorMock(3), + nil, + &hashingMocks.HasherMock{}, + ) + + assert.Nil(t, rtp) + assert.Equal(t, process.ErrNilMarshalizer, err) +} +func TestNewRewardTxProcessor_NilHasherShouldErr(t *testing.T) { + t.Parallel() + + rtp, err := rewardTransaction.NewRewardTxProcessor( + &stateMock.AccountsStub{}, + createMockPubkeyConverter(), + mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + nil, + ) + + assert.Nil(t, rtp) + assert.Equal(t, process.ErrNilHasher, err) +} + func TestNewRewardTxProcessor_OkValsShouldWork(t *testing.T) { t.Parallel() @@ -68,6 +103,8 @@ func TestNewRewardTxProcessor_OkValsShouldWork(t *testing.T) { &stateMock.AccountsStub{}, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) assert.NotNil(t, rtp) @@ -82,6 +119,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionNilTxShouldErr(t *testing.T) &stateMock.AccountsStub{}, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) err := rtp.ProcessRewardTransaction(nil) @@ -95,6 +134,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionNilTxValueShouldErr(t *testin &stateMock.AccountsStub{}, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) rwdTx := rewardTx.RewardTx{Value: nil} @@ -119,6 +160,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionAddressNotInNodesShardShouldN }, createMockPubkeyConverter(), shardCoord, + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) rwdTx := rewardTx.RewardTx{ @@ -146,6 +189,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionCannotGetAccountShouldErr(t * }, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) rwdTx := rewardTx.RewardTx{ @@ -172,6 +217,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionWrongTypeAssertionAccountHold accountsDb, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) rwdTx := rewardTx.RewardTx{ @@ -204,6 +251,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionShouldWork(t *testing.T) { accountsDb, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) rwdTx := rewardTx.RewardTx{ @@ -240,6 +289,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionMissingTrieNode(t *testing.T) accountsDb, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) rwdTx := rewardTx.RewardTx{ @@ -282,6 +333,8 @@ func TestRewardTxProcessor_ProcessRewardTransactionToASmartContractShouldWork(t accountsDb, createMockPubkeyConverter(), mock.NewMultiShardsCoordinatorMock(3), + &marshallerMock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, ) rwdTx := rewardTx.RewardTx{ diff --git a/process/smartContract/process.go b/process/smartContract/process.go index 8fbabd38df3..b54cf97b1f4 100644 --- a/process/smartContract/process.go +++ b/process/smartContract/process.go @@ -2806,6 +2806,12 @@ func (sc *scProcessor) ProcessSmartContractResult(scr *smartContractResult.Smart sc.pubkeyConv, ) + // TODO refactor to set the tx hash for the following state changes before the processing occurs + defer func() { + sc.accounts.SetTxHashForLatestStateChanges(txHash, scr) + log.Debug("SetTxHashForLatestStateChanges", "txHash", txHash) + }() + gasLocked := sc.getGasLockedFromSCR(scr) txType, _, _ := sc.txTypeHandler.ComputeTransactionType(scr) diff --git a/process/smartContract/processorV2/processV2.go b/process/smartContract/processorV2/processV2.go index e0d88916a52..08713a700d4 100644 --- a/process/smartContract/processorV2/processV2.go +++ b/process/smartContract/processorV2/processV2.go @@ -2803,6 +2803,11 @@ func (sc *scProcessor) ProcessSmartContractResult(scr *smartContractResult.Smart txHash, sc.pubkeyConv, ) + // TODO refactor to set the tx hash for the following state changes before the processing occurs + defer func() { + sc.accounts.SetTxHashForLatestStateChanges(txHash, scr) + log.Debug("SetTxHashForLatestStateChanges", "txHash", txHash) + }() gasLocked := sc.getGasLockedFromSCR(scr) diff --git a/process/transactionEvaluator/simulationAccountsDB.go b/process/transactionEvaluator/simulationAccountsDB.go index 85d8c05fa41..4c040b49543 100644 --- a/process/transactionEvaluator/simulationAccountsDB.go +++ b/process/transactionEvaluator/simulationAccountsDB.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/state" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -169,7 +169,7 @@ func (r *simulationAccountsDB) GetStackDebugFirstEntry() []byte { } // SetTxHashForLatestStateChanges - -func (r *simulationAccountsDB) SetTxHashForLatestStateChanges(txHash []byte, tx *transaction.Transaction) { +func (r *simulationAccountsDB) SetTxHashForLatestStateChanges(txHash []byte, tx data.TransactionHandler) { r.originalAccounts.SetTxHashForLatestStateChanges(txHash, tx) } diff --git a/state/accountsDB.go b/state/accountsDB.go index 0c9ab046e1c..fdb83da3025 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -13,8 +13,8 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/stateChange" - "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-core-go/hashing" "github.com/multiversx/mx-chain-core-go/marshal" logger "github.com/multiversx/mx-chain-logger-go" @@ -854,12 +854,7 @@ func (adb *AccountsDB) RevertToSnapshot(snapshot int) error { adb.entries = adb.entries[:snapshot] - err := adb.stateChangesCollector.RevertToIndex(snapshot) - if err != nil { - return err - } - - return nil + return adb.stateChangesCollector.RevertToIndex(snapshot) } // JournalLen will return the number of entries @@ -1301,7 +1296,7 @@ func collectStats( } // SetTxHashForLatestStateChanges will return the state changes since the last call of this method -func (adb *AccountsDB) SetTxHashForLatestStateChanges(txHash []byte, tx *transaction.Transaction) { +func (adb *AccountsDB) SetTxHashForLatestStateChanges(txHash []byte, tx data.TransactionHandler) { adb.stateChangesCollector.AddTxHashToCollectedStateChanges(txHash, tx) } diff --git a/state/accountsDBApi.go b/state/accountsDBApi.go index ef2f7e26e9f..331f24be82c 100644 --- a/state/accountsDBApi.go +++ b/state/accountsDBApi.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-core-go/data" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-go/common" @@ -235,7 +235,7 @@ func (accountsDB *accountsDBApi) GetStackDebugFirstEntry() []byte { } // SetTxHashForLatestStateChanges will call the inner accountsAdapter method -func (accountsDB *accountsDBApi) SetTxHashForLatestStateChanges(txHash []byte, tx *transaction.Transaction) { +func (accountsDB *accountsDBApi) SetTxHashForLatestStateChanges(txHash []byte, tx data.TransactionHandler) { accountsDB.innerAccountsAdapter.SetTxHashForLatestStateChanges(txHash, tx) } diff --git a/state/accountsDBApiWithHistory.go b/state/accountsDBApiWithHistory.go index c0fd5213e56..a66a87ae5c9 100644 --- a/state/accountsDBApiWithHistory.go +++ b/state/accountsDBApiWithHistory.go @@ -6,7 +6,7 @@ import ( "sync" "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-core-go/data" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-go/common" @@ -138,7 +138,7 @@ func (accountsDB *accountsDBApiWithHistory) GetStackDebugFirstEntry() []byte { } // SetTxHashForLatestStateChanges returns nil -func (accountsDB *accountsDBApiWithHistory) SetTxHashForLatestStateChanges(_ []byte, _ *transaction.Transaction) { +func (accountsDB *accountsDBApiWithHistory) SetTxHashForLatestStateChanges(_ []byte, _ data.TransactionHandler) { } // Close will handle the closing of the underlying components diff --git a/state/disabled/disabledStateChangesCollector.go b/state/disabled/disabledStateChangesCollector.go index 00027bac2cb..b9e28106b94 100644 --- a/state/disabled/disabledStateChangesCollector.go +++ b/state/disabled/disabledStateChangesCollector.go @@ -1,8 +1,8 @@ package disabled import ( + coreData "github.com/multiversx/mx-chain-core-go/data" data "github.com/multiversx/mx-chain-core-go/data/stateChange" - "github.com/multiversx/mx-chain-core-go/data/transaction" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-go/state" @@ -18,7 +18,7 @@ func NewDisabledStateChangesCollector() state.StateChangesCollector { } // AddSaveAccountStateChange - -func (d *disabledStateChangesCollector) AddSaveAccountStateChange(oldAccount, account vmcommon.AccountHandler, stateChange state.StateChange) { +func (d *disabledStateChangesCollector) AddSaveAccountStateChange(_, _ vmcommon.AccountHandler, stateChange state.StateChange) { } // AddStateChange does nothing @@ -30,16 +30,16 @@ func (d *disabledStateChangesCollector) Reset() { } // AddTxHashToCollectedStateChanges does nothing -func (d *disabledStateChangesCollector) AddTxHashToCollectedStateChanges(_ []byte, _ *transaction.Transaction) { +func (d *disabledStateChangesCollector) AddTxHashToCollectedStateChanges(_ []byte, _ coreData.TransactionHandler) { } // SetIndexToLastStateChange - -func (d *disabledStateChangesCollector) SetIndexToLastStateChange(index int) error { +func (d *disabledStateChangesCollector) SetIndexToLastStateChange(_ int) error { return nil } // RevertToIndex - -func (d *disabledStateChangesCollector) RevertToIndex(index int) error { +func (d *disabledStateChangesCollector) RevertToIndex(_ int) error { return nil } diff --git a/state/interface.go b/state/interface.go index 154ac92917c..3e9c714285f 100644 --- a/state/interface.go +++ b/state/interface.go @@ -5,9 +5,9 @@ import ( "math/big" "github.com/multiversx/mx-chain-core-go/core" + coreData "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/api" data "github.com/multiversx/mx-chain-core-go/data/stateChange" - "github.com/multiversx/mx-chain-core-go/data/transaction" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-go/common" @@ -92,7 +92,7 @@ type AccountsAdapter interface { GetStackDebugFirstEntry() []byte SetSyncer(syncer AccountsDBSyncer) error StartSnapshotIfNeeded() error - SetTxHashForLatestStateChanges(txHash []byte, tx *transaction.Transaction) + SetTxHashForLatestStateChanges(txHash []byte, tx coreData.TransactionHandler) Close() error IsInterfaceNil() bool } @@ -364,7 +364,7 @@ type StateChangesCollector interface { Reset() Publish() (map[string]*data.StateChanges, error) Store() error - AddTxHashToCollectedStateChanges(txHash []byte, tx *transaction.Transaction) + AddTxHashToCollectedStateChanges(txHash []byte, tx coreData.TransactionHandler) SetIndexToLastStateChange(index int) error RevertToIndex(index int) error IsInterfaceNil() bool diff --git a/state/stateChanges/collector.go b/state/stateChanges/collector.go index 58562fd7d9f..0156071c899 100644 --- a/state/stateChanges/collector.go +++ b/state/stateChanges/collector.go @@ -2,13 +2,15 @@ package stateChanges import ( "bytes" + "encoding/hex" "encoding/json" "fmt" + "strings" "sync" "github.com/multiversx/mx-chain-core-go/core/check" + coreData "github.com/multiversx/mx-chain-core-go/data" data "github.com/multiversx/mx-chain-core-go/data/stateChange" - "github.com/multiversx/mx-chain-core-go/data/transaction" logger "github.com/multiversx/mx-chain-logger-go" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -29,7 +31,7 @@ type collector struct { collectWrite bool stateChanges []state.StateChange stateChangesMut sync.RWMutex - cachedTxs map[string]*transaction.Transaction + cachedTxs map[string]coreData.TransactionHandler storer storage.Persister } @@ -41,7 +43,7 @@ func NewCollector(opts ...CollectorOption) *collector { } if c.storer != nil { - c.cachedTxs = make(map[string]*transaction.Transaction) + c.cachedTxs = make(map[string]coreData.TransactionHandler) } log.Debug("created new state changes collector", @@ -59,10 +61,12 @@ func (c *collector) AddStateChange(stateChange state.StateChange) { if stateChange.GetType() == data.Write && c.collectWrite { c.stateChanges = append(c.stateChanges, stateChange) + log.Trace("added WRITE state change to collector", "operation", stateChange.GetOperation()) } if stateChange.GetType() == data.Read && c.collectRead { c.stateChanges = append(c.stateChanges, stateChange) + log.Trace("added READ state change to collector", "operation", stateChange.GetOperation()) } } @@ -89,8 +93,9 @@ func (c *collector) Reset() { c.stateChanges = make([]state.StateChange, 0) if c.storer != nil { - c.cachedTxs = make(map[string]*transaction.Transaction) + c.cachedTxs = make(map[string]coreData.TransactionHandler) } + log.Trace("reset state changes collector") } // Publish will export state changes @@ -101,25 +106,48 @@ func (c *collector) Publish() (map[string]*data.StateChanges, error) { stateChangesForTxs := make(map[string]*data.StateChanges) for _, stateChange := range c.stateChanges { txHash := string(stateChange.GetTxHash()) + if len(txHash) == 0 { + log.Warn("empty tx hash, state change event not associated to a transaction", "stateChange", stateChangeToString(stateChange)) + continue + } st, ok := stateChange.(*data.StateChange) if !ok { + log.Warn("failed to cast state change to data.StateChange", "stateChange", stateChangeToString(stateChange)) continue } _, ok = stateChangesForTxs[txHash] if !ok { + log.Trace("created new state changes for tx", "txHash", txHash) stateChangesForTxs[txHash] = &data.StateChanges{ StateChanges: []*data.StateChange{st}, } } else { + log.Trace("appended state change to existing state changes for tx", "txHash", txHash) stateChangesForTxs[txHash].StateChanges = append(stateChangesForTxs[txHash].StateChanges, st) } } + log.Trace("published state changes", "numTxs", len(stateChangesForTxs)) return stateChangesForTxs, nil } +func stateChangeToString(stateChange state.StateChange) string { + dataTrieChanges := make([]string, len(stateChange.GetDataTrieChanges())) + for i, dataTrieChange := range stateChange.GetDataTrieChanges() { + dataTrieChanges[i] = fmt.Sprintf("key: %v, val: %v, type: %v", hex.EncodeToString(dataTrieChange.Key), hex.EncodeToString(dataTrieChange.Val), dataTrieChange.Type) + } + return fmt.Sprintf("type: %v, operation: %v, mainTrieKey: %v, mainTrieVal: %v, index: %v, dataTrieChanges: %v", + stateChange.GetType(), + stateChange.GetOperation(), + hex.EncodeToString(stateChange.GetMainTrieKey()), + hex.EncodeToString(stateChange.GetMainTrieVal()), + stateChange.GetIndex(), + strings.Join(dataTrieChanges, ", "), + ) +} + // Store will store the collected state changes if it has been configured with a storer func (c *collector) Store() error { // TODO: evaluate adding a more explicit field check here @@ -149,7 +177,7 @@ func (c *collector) Store() error { // AddTxHashToCollectedStateChanges will try to set txHash field to each state change // if the field is not already set -func (c *collector) AddTxHashToCollectedStateChanges(txHash []byte, tx *transaction.Transaction) { +func (c *collector) AddTxHashToCollectedStateChanges(txHash []byte, tx coreData.TransactionHandler) { c.stateChangesMut.Lock() defer c.stateChangesMut.Unlock() @@ -162,6 +190,7 @@ func (c *collector) AddTxHashToCollectedStateChanges(txHash []byte, tx *transact break } + log.Trace("added tx hash to state change", "txHash", txHash, "index", c.stateChanges[i].GetIndex()) c.stateChanges[i].SetTxHash(txHash) } } @@ -172,13 +201,14 @@ func (c *collector) SetIndexToLastStateChange(index int) error { defer c.stateChangesMut.Unlock() if index > len(c.stateChanges) || index < 0 { - return state.ErrStateChangesIndexOutOfBounds + return fmt.Errorf("SetIndexToLastStateChange: %w for index %v, num state changes %v", state.ErrStateChangesIndexOutOfBounds, index, len(c.stateChanges)) } if len(c.stateChanges) == 0 { return nil } + log.Trace("set index to last state change", "index", index) c.stateChanges[len(c.stateChanges)-1].SetIndex(int32(index)) return nil @@ -187,7 +217,7 @@ func (c *collector) SetIndexToLastStateChange(index int) error { // RevertToIndex will revert to index func (c *collector) RevertToIndex(index int) error { if index > len(c.stateChanges) || index < 0 { - return state.ErrStateChangesIndexOutOfBounds + return fmt.Errorf("RevertToIndex: %w for index %v, num state changes %v", state.ErrStateChangesIndexOutOfBounds, index, len(c.stateChanges)) } if index == 0 { @@ -198,9 +228,11 @@ func (c *collector) RevertToIndex(index int) error { c.stateChangesMut.Lock() defer c.stateChangesMut.Unlock() + log.Trace("num state changes before revert", "num", len(c.stateChanges)) for i := len(c.stateChanges) - 1; i >= 0; i-- { if c.stateChanges[i].GetIndex() == int32(index) { c.stateChanges = c.stateChanges[:i] + log.Trace("reverted to index", "index", index, "num state changes after revert", len(c.stateChanges)) break } } diff --git a/state/stateChanges/collector_test.go b/state/stateChanges/collector_test.go index 2e24e853c4b..f277f5af725 100644 --- a/state/stateChanges/collector_test.go +++ b/state/stateChanges/collector_test.go @@ -1,6 +1,7 @@ package stateChanges import ( + "errors" "fmt" "math/big" "strconv" @@ -201,10 +202,10 @@ func TestStateChangesCollector_RevertToIndex_FailIfWrongIndex(t *testing.T) { numStateChanges := len(c.stateChanges) err := c.RevertToIndex(-1) - require.Equal(t, state.ErrStateChangesIndexOutOfBounds, err) + require.True(t, errors.Is(err, state.ErrStateChangesIndexOutOfBounds)) err = c.RevertToIndex(numStateChanges + 1) - require.Equal(t, state.ErrStateChangesIndexOutOfBounds, err) + require.True(t, errors.Is(err, state.ErrStateChangesIndexOutOfBounds)) } func TestStateChangesCollector_RevertToIndex(t *testing.T) { @@ -259,11 +260,11 @@ func TestStateChangesCollector_SetIndexToLastStateChange(t *testing.T) { c := NewCollector(WithCollectWrite()) err := c.SetIndexToLastStateChange(-1) - require.Equal(t, state.ErrStateChangesIndexOutOfBounds, err) + require.True(t, errors.Is(err, state.ErrStateChangesIndexOutOfBounds)) numStateChanges := len(c.stateChanges) err = c.SetIndexToLastStateChange(numStateChanges + 1) - require.Equal(t, state.ErrStateChangesIndexOutOfBounds, err) + require.True(t, errors.Is(err, state.ErrStateChangesIndexOutOfBounds)) }) t.Run("should work", func(t *testing.T) { diff --git a/state/stateChanges/dataAnalysisCollector.go b/state/stateChanges/dataAnalysisCollector.go index 233242ec795..703c0a1d6d9 100644 --- a/state/stateChanges/dataAnalysisCollector.go +++ b/state/stateChanges/dataAnalysisCollector.go @@ -4,10 +4,9 @@ import ( "bytes" "math/big" - "github.com/multiversx/mx-chain-core-go/data/transaction" - vmcommon "github.com/multiversx/mx-chain-vm-common-go" - + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-go/state" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) type dataAnalysisStateChangeDTO struct { @@ -25,7 +24,7 @@ type dataAnalysisStateChangeDTO struct { type dataAnalysisStateChangesForTx struct { StateChangesForTx - Tx *transaction.Transaction `json:"tx"` + Tx data.TransactionHandler `json:"tx"` } type userAccountHandler interface { diff --git a/state/trackableDataTrie/trackableDataTrie.go b/state/trackableDataTrie/trackableDataTrie.go index 8c4196ae263..c95f189442c 100644 --- a/state/trackableDataTrie/trackableDataTrie.go +++ b/state/trackableDataTrie/trackableDataTrie.go @@ -113,9 +113,10 @@ func (tdt *trackableDataTrie) RetrieveValue(key []byte) ([]byte, uint32, error) MainTrieVal: nil, DataTrieChanges: []*stateChange.DataTrieChange{ { - Type: stateChange.Read, - Key: key, - Val: val, + Type: stateChange.Read, + Key: key, + Val: val, + Version: uint32(trieValue.Version), }, }, } @@ -292,9 +293,10 @@ func (tdt *trackableDataTrie) updateTrie(dtr state.DataTrie) ([]*stateChange.Dat if wasDeleted { deletedKeys = append(deletedKeys, &stateChange.DataTrieChange{ - Type: stateChange.Write, - Key: []byte(key), - Val: nil, + Type: stateChange.Write, + Key: []byte(key), + Val: nil, + Version: 0, }, ) } @@ -323,9 +325,10 @@ func (tdt *trackableDataTrie) updateTrie(dtr state.DataTrie) ([]*stateChange.Dat } newData[dataEntry.index] = &stateChange.DataTrieChange{ - Type: stateChange.Write, - Key: dataTrieKey, - Val: dataTrieVal, + Type: stateChange.Write, + Key: dataTrieKey, + Val: dataTrieVal, + Version: uint32(dataEntry.newVersion), } } diff --git a/testscommon/state/accountsAdapterStub.go b/testscommon/state/accountsAdapterStub.go index bbce8ef6dd8..06b0a1cb137 100644 --- a/testscommon/state/accountsAdapterStub.go +++ b/testscommon/state/accountsAdapterStub.go @@ -4,7 +4,7 @@ import ( "context" "errors" - "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/state" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -26,7 +26,7 @@ type AccountsStub struct { JournalLenCalled func() int RevertToSnapshotCalled func(snapshot int) error RootHashCalled func() ([]byte, error) - RecreateTrieCalled func(options common.RootHashHolder) error + RecreateTrieCalled func(options common.RootHashHolder) error PruneTrieCalled func(rootHash []byte, identifier state.TriePruningIdentifier, handler state.PruningHandler) CancelPruneCalled func(rootHash []byte, identifier state.TriePruningIdentifier) SnapshotStateCalled func(rootHash []byte, epoch uint32) @@ -41,7 +41,7 @@ type AccountsStub struct { CloseCalled func() error SetSyncerCalled func(syncer state.AccountsDBSyncer) error StartSnapshotIfNeededCalled func() error - SetTxHashForLatestStateChangesCalled func(txHash []byte, tx *transaction.Transaction) + SetTxHashForLatestStateChangesCalled func(txHash []byte, tx data.TransactionHandler) } // CleanCache - @@ -252,7 +252,7 @@ func (as *AccountsStub) GetCodeWithBlockInfo(codeHash []byte, options common.Roo } // SetTxHashForLatestStateChanges - -func (as *AccountsStub) SetTxHashForLatestStateChanges(txHash []byte, tx *transaction.Transaction) { +func (as *AccountsStub) SetTxHashForLatestStateChanges(txHash []byte, tx data.TransactionHandler) { if as.SetTxHashForLatestStateChangesCalled != nil { as.SetTxHashForLatestStateChangesCalled(txHash, tx) } diff --git a/testscommon/state/stateChangesCollectorStub.go b/testscommon/state/stateChangesCollectorStub.go index a62e5d7ab8d..70df1c5526e 100644 --- a/testscommon/state/stateChangesCollectorStub.go +++ b/testscommon/state/stateChangesCollectorStub.go @@ -1,8 +1,8 @@ package state import ( + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/stateChange" - "github.com/multiversx/mx-chain-core-go/data/transaction" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-go/state" @@ -13,7 +13,7 @@ type StateChangesCollectorStub struct { AddStateChangeCalled func(stateChange state.StateChange) AddSaveAccountStateChangeCalled func(oldAccount, account vmcommon.AccountHandler, stateChange state.StateChange) ResetCalled func() - AddTxHashToCollectedStateChangesCalled func(txHash []byte, tx *transaction.Transaction) + AddTxHashToCollectedStateChangesCalled func(txHash []byte, tx data.TransactionHandler) SetIndexToLastStateChangeCalled func(index int) error RevertToIndexCalled func(index int) error PublishCalled func() (map[string]*stateChange.StateChanges, error) @@ -43,7 +43,7 @@ func (s *StateChangesCollectorStub) Reset() { } // AddTxHashToCollectedStateChanges - -func (s *StateChangesCollectorStub) AddTxHashToCollectedStateChanges(txHash []byte, tx *transaction.Transaction) { +func (s *StateChangesCollectorStub) AddTxHashToCollectedStateChanges(txHash []byte, tx data.TransactionHandler) { if s.AddTxHashToCollectedStateChangesCalled != nil { s.AddTxHashToCollectedStateChangesCalled(txHash, tx) }