From 29827ddd254f84a490d35ca8d4effde20af4de3b Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Fri, 3 Nov 2023 13:50:07 +0200 Subject: [PATCH 1/4] switch to current block randomness for ordering transactions --- cmd/node/config/enableEpochs.toml | 3 +++ common/constants.go | 1 + common/enablers/enableEpochsHandler.go | 6 ++++++ config/epochConfig.go | 1 + integrationTests/factory/componentsHelper.go | 9 ++++++--- .../executingRewardMiniblocks_test.go | 3 +++ process/block/metablock.go | 7 ++++++- process/block/preprocess/transactions.go | 6 +++++- process/block/shardblock.go | 7 ++++++- 9 files changed, 37 insertions(+), 6 deletions(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index c291679b181..ce90e45b197 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -281,6 +281,9 @@ # NFTStopCreateEnableEpoch represents the epoch when NFT stop create feature is enabled NFTStopCreateEnableEpoch = 3 + # CurrentRandomnessOnSortingEnableEpoch represents the epoch when the current randomness on sorting is enabled + CurrentRandomnessOnSortingEnableEpoch = 4 + # BLSMultiSignerEnableEpoch represents the activation epoch for different types of BLS multi-signers BLSMultiSignerEnableEpoch = [ { EnableEpoch = 0, Type = "no-KOSK" }, diff --git a/common/constants.go b/common/constants.go index 2d41dd873b5..221dd1ff86a 100644 --- a/common/constants.go +++ b/common/constants.go @@ -994,5 +994,6 @@ const ( BalanceWaitingListsFlag core.EnableEpochFlag = "BalanceWaitingListsFlag" WaitingListFixFlag core.EnableEpochFlag = "WaitingListFixFlag" NFTStopCreateFlag core.EnableEpochFlag = "NFTStopCreateFlag" + CurrentRandomnessOnSortingFlag core.EnableEpochFlag = "CurrentRandomnessOnSortingFlag" // all new flags must be added to createAllFlagsMap method, as part of enableEpochsHandler allFlagsDefined ) diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index 234f1076f2c..57d543a4561 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -683,6 +683,12 @@ func (handler *enableEpochsHandler) createAllFlagsMap() { }, activationEpoch: handler.enableEpochsConfig.NFTStopCreateEnableEpoch, }, + common.CurrentRandomnessOnSortingFlag: { + isActiveInEpoch: func(epoch uint32) bool { + return epoch >= handler.enableEpochsConfig.CurrentRandomnessOnSortingEnableEpoch + }, + activationEpoch: handler.enableEpochsConfig.CurrentRandomnessOnSortingEnableEpoch, + }, } } diff --git a/config/epochConfig.go b/config/epochConfig.go index 649966b5a6c..aa56d6151db 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -106,6 +106,7 @@ type EnableEpochs struct { FixDelegationChangeOwnerOnAccountEnableEpoch uint32 DynamicGasCostForDataTrieStorageLoadEnableEpoch uint32 NFTStopCreateEnableEpoch uint32 + CurrentRandomnessOnSortingEnableEpoch uint32 BLSMultiSignerEnableEpoch []MultiSignerConfig } diff --git a/integrationTests/factory/componentsHelper.go b/integrationTests/factory/componentsHelper.go index 6238243659e..6ad6c5910bf 100644 --- a/integrationTests/factory/componentsHelper.go +++ b/integrationTests/factory/componentsHelper.go @@ -56,10 +56,13 @@ func CreateDefaultConfig(tb testing.TB) *config.Configs { configs.ExternalConfig = externalConfig configs.EpochConfig = epochConfig configs.RoundConfig = roundConfig + workingDir := tb.TempDir() + dbDir := tb.TempDir() + logsDir := tb.TempDir() configs.FlagsConfig = &config.ContextFlagsConfig{ - WorkingDir: tb.TempDir(), - DbDir: "dbDir", - LogsDir: "logsDir", + WorkingDir: workingDir, + DbDir: dbDir, + LogsDir: logsDir, UseLogView: true, BaseVersion: BaseVersion, Version: Version, diff --git a/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go b/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go index 645448af81a..554fcdee9c9 100644 --- a/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go +++ b/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go @@ -14,6 +14,7 @@ import ( testBlock "github.com/multiversx/mx-chain-go/integrationTests/multiShard/block" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/state" + logger "github.com/multiversx/mx-chain-logger-go" "github.com/stretchr/testify/assert" ) @@ -26,6 +27,8 @@ func TestExecuteBlocksWithTransactionsAndCheckRewards(t *testing.T) { t.Skip("this is not a short test") } + _ = logger.SetLogLevel("process:TRACE") + nodesPerShard := 4 nbMetaNodes := 2 nbShards := 2 diff --git a/process/block/metablock.go b/process/block/metablock.go index 903c580d0af..a455a904095 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -928,7 +928,12 @@ func (mp *metaProcessor) createBlockBody(metaBlock data.HeaderHandler, haveTime "nonce", metaBlock.GetNonce(), ) - miniBlocks, err := mp.createMiniBlocks(haveTime, metaBlock.GetPrevRandSeed()) + randomness := metaBlock.GetPrevRandSeed() + if mp.enableEpochsHandler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag) { + randomness = metaBlock.GetRandSeed() + } + + miniBlocks, err := mp.createMiniBlocks(haveTime, randomness) if err != nil { return nil, err } diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index 1a52524048e..dcae3d4f410 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -332,7 +332,11 @@ func (txs *transactions) ProcessBlockTransactions( } if txs.isBodyFromMe(body) { - return txs.processTxsFromMe(body, haveTime, header.GetPrevRandSeed()) + randomness := header.GetPrevRandSeed() + if txs.enableEpochsHandler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag) { + randomness = header.GetRandSeed() + } + return txs.processTxsFromMe(body, haveTime, randomness) } return process.ErrInvalidBody diff --git a/process/block/shardblock.go b/process/block/shardblock.go index 4d30c64020b..3d026fa1ac9 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -875,7 +875,12 @@ func (sp *shardProcessor) createBlockBody(shardHdr data.HeaderHandler, haveTime "nonce", shardHdr.GetNonce(), ) - miniBlocks, processedMiniBlocksDestMeInfo, err := sp.createMiniBlocks(haveTime, shardHdr.GetPrevRandSeed()) + randomness := shardHdr.GetPrevRandSeed() + if sp.enableEpochsHandler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag) { + randomness = shardHdr.GetRandSeed() + } + + miniBlocks, processedMiniBlocksDestMeInfo, err := sp.createMiniBlocks(haveTime, randomness) if err != nil { return nil, nil, err } From 5590959c3bff5c739417a75da9d6a8c5049e423d Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Mon, 27 Nov 2023 17:26:06 +0200 Subject: [PATCH 2/4] fixes after review - extract common function & add some unit tests --- common/enablers/enableEpochsHandler_test.go | 3 ++ config/tomlConfig_test.go | 4 +++ process/block/baseProcess.go | 1 + process/block/helpers/txsorting.go | 15 ++++++++ process/block/helpers/txsorting_test.go | 40 +++++++++++++++++++++ process/block/metablock.go | 7 ++-- process/block/preprocess/transactions.go | 7 ++-- process/block/shardblock.go | 7 ++-- 8 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 process/block/helpers/txsorting.go create mode 100644 process/block/helpers/txsorting_test.go diff --git a/common/enablers/enableEpochsHandler_test.go b/common/enablers/enableEpochsHandler_test.go index 0c4910c9116..a9a5addbe8c 100644 --- a/common/enablers/enableEpochsHandler_test.go +++ b/common/enablers/enableEpochsHandler_test.go @@ -108,6 +108,7 @@ func createEnableEpochsConfig() config.EnableEpochs { DynamicGasCostForDataTrieStorageLoadEnableEpoch: 90, ScToScLogEventEnableEpoch: 91, NFTStopCreateEnableEpoch: 92, + CurrentRandomnessOnSortingEnableEpoch: 93, } } @@ -293,6 +294,7 @@ func TestEnableEpochsHandler_IsFlagEnabled(t *testing.T) { require.True(t, handler.IsFlagEnabled(common.BalanceWaitingListsFlag)) require.True(t, handler.IsFlagEnabled(common.WaitingListFixFlag)) require.True(t, handler.IsFlagEnabled(common.NFTStopCreateFlag)) + require.True(t, handler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag)) } func TestEnableEpochsHandler_GetActivationEpoch(t *testing.T) { @@ -401,6 +403,7 @@ func TestEnableEpochsHandler_GetActivationEpoch(t *testing.T) { require.Equal(t, cfg.BalanceWaitingListsEnableEpoch, handler.GetActivationEpoch(common.BalanceWaitingListsFlag)) require.Equal(t, cfg.WaitingListFixEnableEpoch, handler.GetActivationEpoch(common.WaitingListFixFlag)) require.Equal(t, cfg.NFTStopCreateEnableEpoch, handler.GetActivationEpoch(common.NFTStopCreateFlag)) + require.Equal(t, cfg.CurrentRandomnessOnSortingEnableEpoch, handler.GetActivationEpoch(common.CurrentRandomnessOnSortingFlag)) } func TestEnableEpochsHandler_IsInterfaceNil(t *testing.T) { diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 387d6155071..e6650fbadea 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -824,6 +824,9 @@ func TestEnableEpochConfig(t *testing.T) { # NFTStopCreateEnableEpoch represents the epoch when NFT stop create feature is enabled NFTStopCreateEnableEpoch = 89 + # CurrentRandomnessOnSortingEnableEpoch represents the epoch when the current randomness on sorting is enabled + CurrentRandomnessOnSortingEnableEpoch = 90 + # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ { EpochEnable = 44, MaxNumNodes = 2169, NodesToShufflePerShard = 80 }, @@ -933,6 +936,7 @@ func TestEnableEpochConfig(t *testing.T) { FixDelegationChangeOwnerOnAccountEnableEpoch: 87, ScToScLogEventEnableEpoch: 88, NFTStopCreateEnableEpoch: 89, + CurrentRandomnessOnSortingEnableEpoch: 90, MaxNodesChangeEnableEpoch: []MaxNodesChangeConfig{ { EpochEnable: 44, diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 1a8e501ee07..5049cece729 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -515,6 +515,7 @@ func checkProcessorParameters(arguments ArgBaseProcessor) error { err := core.CheckHandlerCompatibility(enableEpochsHandler, []core.EnableEpochFlag{ common.ScheduledMiniBlocksFlag, common.StakingV2Flag, + common.CurrentRandomnessOnSortingFlag, }) if err != nil { return err diff --git a/process/block/helpers/txsorting.go b/process/block/helpers/txsorting.go new file mode 100644 index 00000000000..19de2427dfe --- /dev/null +++ b/process/block/helpers/txsorting.go @@ -0,0 +1,15 @@ +package helpers + +import ( + "github.com/multiversx/mx-chain-core-go/data" + "github.com/multiversx/mx-chain-go/common" +) + +// ComputeRandomnessForTxSorting returns the randomness for transactions sorting +func ComputeRandomnessForTxSorting(header data.HeaderHandler, enableEpochsHandler common.EnableEpochsHandler) []byte { + if enableEpochsHandler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag) { + return header.GetRandSeed() + } + + return header.GetPrevRandSeed() +} diff --git a/process/block/helpers/txsorting_test.go b/process/block/helpers/txsorting_test.go new file mode 100644 index 00000000000..b4bcf500d5e --- /dev/null +++ b/process/block/helpers/txsorting_test.go @@ -0,0 +1,40 @@ +package helpers + +import ( + "testing" + + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/block" + "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" + "github.com/stretchr/testify/require" +) + +func TestComputeRandomnessForTxSorting(t *testing.T) { + t.Parallel() + + header := &block.Header{ + RandSeed: []byte{0x01}, + PrevRandSeed: []byte{0x02}, + } + + t.Run("flag not active should return previous randomness", func(t *testing.T) { + t.Parallel() + + enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{ + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return false + }, + } + require.Equal(t, header.PrevRandSeed, ComputeRandomnessForTxSorting(header, enableEpochsHandler)) + }) + t.Run("flag active should return current randomness", func(t *testing.T) { + t.Parallel() + + enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{ + IsFlagEnabledCalled: func(flag core.EnableEpochFlag) bool { + return true + }, + } + require.Equal(t, header.RandSeed, ComputeRandomnessForTxSorting(header, enableEpochsHandler)) + }) +} diff --git a/process/block/metablock.go b/process/block/metablock.go index a455a904095..643aa80a239 100644 --- a/process/block/metablock.go +++ b/process/block/metablock.go @@ -18,6 +18,7 @@ import ( processOutport "github.com/multiversx/mx-chain-go/outport/process" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/block/bootstrapStorage" + "github.com/multiversx/mx-chain-go/process/block/helpers" "github.com/multiversx/mx-chain-go/process/block/processedMb" "github.com/multiversx/mx-chain-go/state" logger "github.com/multiversx/mx-chain-logger-go" @@ -928,11 +929,7 @@ func (mp *metaProcessor) createBlockBody(metaBlock data.HeaderHandler, haveTime "nonce", metaBlock.GetNonce(), ) - randomness := metaBlock.GetPrevRandSeed() - if mp.enableEpochsHandler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag) { - randomness = metaBlock.GetRandSeed() - } - + randomness := helpers.ComputeRandomnessForTxSorting(metaBlock, mp.enableEpochsHandler) miniBlocks, err := mp.createMiniBlocks(haveTime, randomness) if err != nil { return nil, err diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index dcae3d4f410..fd53f95aad5 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -18,6 +18,7 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/process/block/helpers" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/storage" @@ -140,6 +141,7 @@ func NewTransactionPreprocessor( common.OptimizeGasUsedInCrossMiniBlocksFlag, common.ScheduledMiniBlocksFlag, common.FrontRunningProtectionFlag, + common.CurrentRandomnessOnSortingFlag, }) if err != nil { return nil, err @@ -332,10 +334,7 @@ func (txs *transactions) ProcessBlockTransactions( } if txs.isBodyFromMe(body) { - randomness := header.GetPrevRandSeed() - if txs.enableEpochsHandler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag) { - randomness = header.GetRandSeed() - } + randomness := helpers.ComputeRandomnessForTxSorting(header, txs.enableEpochsHandler) return txs.processTxsFromMe(body, haveTime, randomness) } diff --git a/process/block/shardblock.go b/process/block/shardblock.go index 3d026fa1ac9..db07e35787e 100644 --- a/process/block/shardblock.go +++ b/process/block/shardblock.go @@ -16,6 +16,7 @@ import ( processOutport "github.com/multiversx/mx-chain-go/outport/process" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/block/bootstrapStorage" + "github.com/multiversx/mx-chain-go/process/block/helpers" "github.com/multiversx/mx-chain-go/process/block/processedMb" "github.com/multiversx/mx-chain-go/state" logger "github.com/multiversx/mx-chain-logger-go" @@ -875,11 +876,7 @@ func (sp *shardProcessor) createBlockBody(shardHdr data.HeaderHandler, haveTime "nonce", shardHdr.GetNonce(), ) - randomness := shardHdr.GetPrevRandSeed() - if sp.enableEpochsHandler.IsFlagEnabled(common.CurrentRandomnessOnSortingFlag) { - randomness = shardHdr.GetRandSeed() - } - + randomness := helpers.ComputeRandomnessForTxSorting(shardHdr, sp.enableEpochsHandler) miniBlocks, processedMiniBlocksDestMeInfo, err := sp.createMiniBlocks(haveTime, randomness) if err != nil { return nil, nil, err From 4308f17d42f102318c1ec7e97a77d3f448a7dbfd Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Tue, 28 Nov 2023 11:55:42 +0200 Subject: [PATCH 3/4] fixes after review --- config/tomlConfig_test.go | 2 +- .../executingRewardMiniblocks_test.go | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index e6650fbadea..831f22c9629 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -825,7 +825,7 @@ func TestEnableEpochConfig(t *testing.T) { NFTStopCreateEnableEpoch = 89 # CurrentRandomnessOnSortingEnableEpoch represents the epoch when the current randomness on sorting is enabled - CurrentRandomnessOnSortingEnableEpoch = 90 + CurrentRandomnessOnSortingEnableEpoch = 90 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ diff --git a/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go b/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go index 554fcdee9c9..645448af81a 100644 --- a/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go +++ b/integrationTests/multiShard/block/executingRewardMiniblocks/executingRewardMiniblocks_test.go @@ -14,7 +14,6 @@ import ( testBlock "github.com/multiversx/mx-chain-go/integrationTests/multiShard/block" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/state" - logger "github.com/multiversx/mx-chain-logger-go" "github.com/stretchr/testify/assert" ) @@ -27,8 +26,6 @@ func TestExecuteBlocksWithTransactionsAndCheckRewards(t *testing.T) { t.Skip("this is not a short test") } - _ = logger.SetLogLevel("process:TRACE") - nodesPerShard := 4 nbMetaNodes := 2 nbShards := 2 From 5809526a1262a71bb635ecec44889f8626e21472 Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Tue, 28 Nov 2023 12:31:47 +0200 Subject: [PATCH 4/4] fix alignment --- config/tomlConfig_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 4949664f467..a6e9f5c2086 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -839,7 +839,7 @@ func TestEnableEpochConfig(t *testing.T) { # FixGasRemainingForSaveKeyValueBuiltinFunctionEnableEpoch represents the epoch when the fix for the remaining gas in the SaveKeyValue builtin function is enabled FixGasRemainingForSaveKeyValueBuiltinFunctionEnableEpoch = 91 - # CurrentRandomnessOnSortingEnableEpoch represents the epoch when the current randomness on sorting is enabled + # CurrentRandomnessOnSortingEnableEpoch represents the epoch when the current randomness on sorting is enabled CurrentRandomnessOnSortingEnableEpoch = 92 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch