From 759e83fe0410882080d1de8b5ca2288228fed5ec Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 20 Jan 2023 14:32:08 +0200 Subject: [PATCH 001/120] ordered collection --- common/ordering/errors.go | 9 + common/ordering/export_test.go | 5 + common/ordering/orederedCollection.go | 109 ++++++++++++ common/ordering/orederedCollection_test.go | 185 +++++++++++++++++++++ 4 files changed, 308 insertions(+) create mode 100644 common/ordering/errors.go create mode 100644 common/ordering/export_test.go create mode 100644 common/ordering/orederedCollection.go create mode 100644 common/ordering/orederedCollection_test.go diff --git a/common/ordering/errors.go b/common/ordering/errors.go new file mode 100644 index 00000000000..82cbfbacedf --- /dev/null +++ b/common/ordering/errors.go @@ -0,0 +1,9 @@ +package ordering + +import "errors" + +// ErrItemNotFound is returned when an item is not found in the ordered collection +var ErrItemNotFound = errors.New("item not found") + +// ErrIndexOutOfBounds is returned when an index is out of bounds +var ErrIndexOutOfBounds = errors.New("index out of bounds") diff --git a/common/ordering/export_test.go b/common/ordering/export_test.go new file mode 100644 index 00000000000..318151eb394 --- /dev/null +++ b/common/ordering/export_test.go @@ -0,0 +1,5 @@ +package ordering + +func GetNilOrderedCollection() *orderedCollection { + return nil +} diff --git a/common/ordering/orederedCollection.go b/common/ordering/orederedCollection.go new file mode 100644 index 00000000000..c79579e30cc --- /dev/null +++ b/common/ordering/orederedCollection.go @@ -0,0 +1,109 @@ +package ordering + +import "sync" + +type orderedCollection struct { + itemsMap map[string]int + itemsArray []string + mut sync.RWMutex +} + +// NewOrderedCollection creates a new ordered collection +func NewOrderedCollection() *orderedCollection { + return &orderedCollection{ + itemsMap: make(map[string]int), + itemsArray: make([]string, 0, 100), + mut: sync.RWMutex{}, + } +} + +// Add adds a new item to the order collector +func (oc *orderedCollection) Add(item string) { + oc.mut.Lock() + defer oc.mut.Unlock() + _, ok := oc.itemsMap[item] + if ok { + return + } + oc.itemsMap[item] = len(oc.itemsArray) + oc.itemsArray = append(oc.itemsArray, item) +} + +// GetItemAtIndex returns the item at the given index +func (oc *orderedCollection) GetItemAtIndex(index uint32) (string, error) { + oc.mut.RLock() + defer oc.mut.RUnlock() + + if index >= uint32(len(oc.itemsArray)) { + return "", ErrIndexOutOfBounds + } + + return oc.itemsArray[index], nil +} + +// GetOrder returns the order of the item in the ordered collection +func (oc *orderedCollection) GetOrder(item string) (int, error) { + oc.mut.RLock() + defer oc.mut.RUnlock() + order, ok := oc.itemsMap[item] + if !ok { + return 0, ErrItemNotFound + } + + return order, nil +} + +// Remove removes an item from the order collector if it exists, adapting the order of the remaining items +func (oc *orderedCollection) Remove(item string) { + oc.mut.Lock() + defer oc.mut.Unlock() + + index, ok := oc.itemsMap[item] + if !ok { + return + } + + delete(oc.itemsMap, item) + + oc.itemsArray = append(oc.itemsArray[:index], oc.itemsArray[index+1:]...) + for i := index; i < len(oc.itemsArray); i++ { + oc.itemsMap[oc.itemsArray[i]]-- + } +} + +// GetItems returns the items in the order they were added +func (oc *orderedCollection) GetItems() []string { + oc.mut.RLock() + defer oc.mut.RUnlock() + + cpItems := append([]string{}, oc.itemsArray...) + return cpItems +} + +// Contains returns true if the item is in the ordered collection +func (oc *orderedCollection) Contains(item string) bool { + oc.mut.RLock() + defer oc.mut.RUnlock() + _, ok := oc.itemsMap[item] + return ok +} + +// Clear clears the ordered collection +func (oc *orderedCollection) Clear() { + oc.mut.Lock() + defer oc.mut.Unlock() + oc.itemsArray = make([]string, 0, 100) + oc.itemsMap = make(map[string]int) +} + +// Len returns the number of items in the ordered collection +func (oc *orderedCollection) Len() int { + oc.mut.RLock() + defer oc.mut.RUnlock() + return len(oc.itemsArray) +} + +// IsInterfaceNil returns true if there is no value under the interface +func (oc *orderedCollection) IsInterfaceNil() bool { + return oc == nil +} diff --git a/common/ordering/orederedCollection_test.go b/common/ordering/orederedCollection_test.go new file mode 100644 index 00000000000..5b4ec98021a --- /dev/null +++ b/common/ordering/orederedCollection_test.go @@ -0,0 +1,185 @@ +package ordering_test + +import ( + "testing" + + "github.com/multiversx/mx-chain-go/common/ordering" + "github.com/stretchr/testify/require" +) + +func TestNewOrderedCollection(t *testing.T) { + oc := ordering.NewOrderedCollection() + require.NotNil(t, oc) + require.Equal(t, 0, oc.Len()) +} + +func TestOrderedCollection_Add(t *testing.T) { + oc := ordering.NewOrderedCollection() + oc.Add("zero") + require.Equal(t, 1, oc.Len()) + oc.Add("one") + require.Equal(t, 2, oc.Len()) + oc.Add("two") + require.Equal(t, 3, oc.Len()) +} + +func TestOrderedCollection_GetOrder(t *testing.T) { + oc := ordering.NewOrderedCollection() + + order, err := oc.GetOrder("zero") + require.Equal(t, ordering.ErrItemNotFound, err) + require.Zero(t, order) + + oc.Add("zero") + oc.Add("one") + oc.Add("two") + + order, err = oc.GetOrder("zero") + require.Nil(t, err) + require.Equal(t, 0, order) + + order, err = oc.GetOrder("one") + require.Nil(t, err) + require.Equal(t, 1, order) + + order, err = oc.GetOrder("two") + require.Nil(t, err) + require.Equal(t, 2, order) +} + +func TestOrderedCollection_GetItemAtIndex(t *testing.T) { + oc := ordering.NewOrderedCollection() + + item, err := oc.GetItemAtIndex(0) + require.Equal(t, ordering.ErrIndexOutOfBounds, err) + require.Equal(t, "", item) + + oc.Add("zero") + oc.Add("one") + oc.Add("two") + + item, err = oc.GetItemAtIndex(0) + require.Nil(t, err) + require.Equal(t, "zero", item) + + item, err = oc.GetItemAtIndex(1) + require.Nil(t, err) + require.Equal(t, "one", item) + + item, err = oc.GetItemAtIndex(2) + require.Nil(t, err) + require.Equal(t, "two", item) +} + +func TestOrderedCollection_GetItems(t *testing.T) { + oc := ordering.NewOrderedCollection() + + items := oc.GetItems() + require.Equal(t, 0, len(items)) + + oc.Add("zero") + oc.Add("one") + oc.Add("two") + + items = oc.GetItems() + require.Equal(t, 3, len(items)) + require.Equal(t, "zero", items[0]) + require.Equal(t, "one", items[1]) + require.Equal(t, "two", items[2]) +} + +func TestOrderedCollection_Remove(t *testing.T) { + oc := ordering.NewOrderedCollection() + require.Equal(t, 0, oc.Len()) + + oc.Remove("zero") + require.Equal(t, 0, oc.Len()) + + oc.Add("zero") + require.Equal(t, 1, oc.Len()) + // add duplicate should not add + oc.Add("zero") + require.Equal(t, 1, oc.Len()) + + oc.Remove("zero") + require.Equal(t, 0, oc.Len()) + + oc.Add("zero") + oc.Add("one") + oc.Add("two") + require.Equal(t, 3, oc.Len()) + + oc.Remove("one") + require.Equal(t, 2, oc.Len()) + + order, err := oc.GetOrder("zero") + require.Nil(t, err) + require.Equal(t, 0, order) + + elem, err := oc.GetItemAtIndex(uint32(order)) + require.Nil(t, err) + require.Equal(t, "zero", elem) + + _, err = oc.GetOrder("one") + require.Equal(t, ordering.ErrItemNotFound, err) + + order, err = oc.GetOrder("two") + require.Nil(t, err) + require.Equal(t, 1, order) + + elem, err = oc.GetItemAtIndex(uint32(order)) + require.Nil(t, err) + require.Equal(t, "two", elem) + + oc.Remove("zero") + require.Equal(t, 1, oc.Len()) + + oc.Remove("two") + require.Equal(t, 0, oc.Len()) + elem, err = oc.GetItemAtIndex(uint32(0)) + require.Equal(t, ordering.ErrIndexOutOfBounds, err) + require.Empty(t, elem) +} + +func TestOrderedCollection_Clear(t *testing.T) { + oc := ordering.NewOrderedCollection() + require.Equal(t, 0, oc.Len()) + + oc.Add("zero") + oc.Add("one") + oc.Add("two") + require.Equal(t, 3, oc.Len()) + + oc.Clear() + require.Equal(t, 0, oc.Len()) +} + +func TestOrderedCollection_Contains(t *testing.T) { + oc := ordering.NewOrderedCollection() + require.Equal(t, 0, oc.Len()) + + contains := oc.Contains("zero") + require.False(t, contains) + + oc.Add("zero") + oc.Add("one") + oc.Add("two") + require.Equal(t, 3, oc.Len()) + + contains = oc.Contains("zero") + require.True(t, contains) + + contains = oc.Contains("one") + require.True(t, contains) + + contains = oc.Contains("two") + require.True(t, contains) + + contains = oc.Contains("three") + require.False(t, contains) +} + +func TestOrderedCollection_IsInterfaceNil(t *testing.T) { + oc := ordering.GetNilOrderedCollection() + require.True(t, oc.IsInterfaceNil()) +} From 49a9d3dea51640af35c58dd034095047b0c87d7e Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 23 Jan 2023 13:42:35 +0200 Subject: [PATCH 002/120] change argument from string to []byte --- common/interface.go | 14 +++ common/ordering/orederedCollection.go | 50 +++++--- common/ordering/orederedCollection_test.go | 132 +++++++++++++-------- 3 files changed, 129 insertions(+), 67 deletions(-) diff --git a/common/interface.go b/common/interface.go index 597359d4209..d28d1173b62 100644 --- a/common/interface.go +++ b/common/interface.go @@ -339,3 +339,17 @@ type EnableEpochsHandler interface { IsInterfaceNil() bool } + +// TxExecutionOrderHandler is used to collect and provide the order of transactions execution +type TxExecutionOrderHandler interface { + Add(txHash []byte) + GetItemAtIndex(index uint32) ([]byte, error) + GetOrder(txHash []byte) (int, error) + Remove(txHash []byte) + RemoveMultiple(txHashes [][]byte) + GetItems() [][]byte + Contains(txHash []byte) bool + Clear() + Len() int + IsInterfaceNil() bool +} diff --git a/common/ordering/orederedCollection.go b/common/ordering/orederedCollection.go index c79579e30cc..7af8f0e5b05 100644 --- a/common/ordering/orederedCollection.go +++ b/common/ordering/orederedCollection.go @@ -4,7 +4,7 @@ import "sync" type orderedCollection struct { itemsMap map[string]int - itemsArray []string + itemsArray [][]byte mut sync.RWMutex } @@ -12,40 +12,40 @@ type orderedCollection struct { func NewOrderedCollection() *orderedCollection { return &orderedCollection{ itemsMap: make(map[string]int), - itemsArray: make([]string, 0, 100), + itemsArray: make([][]byte, 0, 100), mut: sync.RWMutex{}, } } // Add adds a new item to the order collector -func (oc *orderedCollection) Add(item string) { +func (oc *orderedCollection) Add(item []byte) { oc.mut.Lock() defer oc.mut.Unlock() - _, ok := oc.itemsMap[item] + _, ok := oc.itemsMap[string(item)] if ok { return } - oc.itemsMap[item] = len(oc.itemsArray) + oc.itemsMap[string(item)] = len(oc.itemsArray) oc.itemsArray = append(oc.itemsArray, item) } // GetItemAtIndex returns the item at the given index -func (oc *orderedCollection) GetItemAtIndex(index uint32) (string, error) { +func (oc *orderedCollection) GetItemAtIndex(index uint32) ([]byte, error) { oc.mut.RLock() defer oc.mut.RUnlock() if index >= uint32(len(oc.itemsArray)) { - return "", ErrIndexOutOfBounds + return nil, ErrIndexOutOfBounds } return oc.itemsArray[index], nil } // GetOrder returns the order of the item in the ordered collection -func (oc *orderedCollection) GetOrder(item string) (int, error) { +func (oc *orderedCollection) GetOrder(item []byte) (int, error) { oc.mut.RLock() defer oc.mut.RUnlock() - order, ok := oc.itemsMap[item] + order, ok := oc.itemsMap[string(item)] if !ok { return 0, ErrItemNotFound } @@ -54,37 +54,51 @@ func (oc *orderedCollection) GetOrder(item string) (int, error) { } // Remove removes an item from the order collector if it exists, adapting the order of the remaining items -func (oc *orderedCollection) Remove(item string) { +func (oc *orderedCollection) Remove(item []byte) { oc.mut.Lock() defer oc.mut.Unlock() - index, ok := oc.itemsMap[item] + oc.removeOneUnprotected(item) +} + +func (oc *orderedCollection) removeOneUnprotected(item []byte) { + index, ok := oc.itemsMap[string(item)] if !ok { return } - delete(oc.itemsMap, item) + delete(oc.itemsMap, string(item)) oc.itemsArray = append(oc.itemsArray[:index], oc.itemsArray[index+1:]...) for i := index; i < len(oc.itemsArray); i++ { - oc.itemsMap[oc.itemsArray[i]]-- + oc.itemsMap[string(oc.itemsArray[i])]-- + } +} + +// RemoveMultiple removes multiple items from the order collector if they exist, adapting the order of the remaining items +func (oc *orderedCollection) RemoveMultiple(items [][]byte) { + oc.mut.Lock() + defer oc.mut.Unlock() + + for _, item := range items { + oc.removeOneUnprotected(item) } } // GetItems returns the items in the order they were added -func (oc *orderedCollection) GetItems() []string { +func (oc *orderedCollection) GetItems() [][]byte { oc.mut.RLock() defer oc.mut.RUnlock() - cpItems := append([]string{}, oc.itemsArray...) + cpItems := append([][]byte{}, oc.itemsArray...) return cpItems } // Contains returns true if the item is in the ordered collection -func (oc *orderedCollection) Contains(item string) bool { +func (oc *orderedCollection) Contains(item []byte) bool { oc.mut.RLock() defer oc.mut.RUnlock() - _, ok := oc.itemsMap[item] + _, ok := oc.itemsMap[string(item)] return ok } @@ -92,7 +106,7 @@ func (oc *orderedCollection) Contains(item string) bool { func (oc *orderedCollection) Clear() { oc.mut.Lock() defer oc.mut.Unlock() - oc.itemsArray = make([]string, 0, 100) + oc.itemsArray = make([][]byte, 0, 100) oc.itemsMap = make(map[string]int) } diff --git a/common/ordering/orederedCollection_test.go b/common/ordering/orederedCollection_test.go index 5b4ec98021a..ecda9c74085 100644 --- a/common/ordering/orederedCollection_test.go +++ b/common/ordering/orederedCollection_test.go @@ -7,6 +7,13 @@ import ( "github.com/stretchr/testify/require" ) +var ( + zero = []byte("zero") + one = []byte("one") + two = []byte("two") + three = []byte("three") +) + func TestNewOrderedCollection(t *testing.T) { oc := ordering.NewOrderedCollection() require.NotNil(t, oc) @@ -15,34 +22,34 @@ func TestNewOrderedCollection(t *testing.T) { func TestOrderedCollection_Add(t *testing.T) { oc := ordering.NewOrderedCollection() - oc.Add("zero") + oc.Add(zero) require.Equal(t, 1, oc.Len()) - oc.Add("one") + oc.Add(one) require.Equal(t, 2, oc.Len()) - oc.Add("two") + oc.Add(two) require.Equal(t, 3, oc.Len()) } func TestOrderedCollection_GetOrder(t *testing.T) { oc := ordering.NewOrderedCollection() - order, err := oc.GetOrder("zero") + order, err := oc.GetOrder(zero) require.Equal(t, ordering.ErrItemNotFound, err) require.Zero(t, order) - oc.Add("zero") - oc.Add("one") - oc.Add("two") + oc.Add(zero) + oc.Add(one) + oc.Add(two) - order, err = oc.GetOrder("zero") + order, err = oc.GetOrder(zero) require.Nil(t, err) require.Equal(t, 0, order) - order, err = oc.GetOrder("one") + order, err = oc.GetOrder(one) require.Nil(t, err) require.Equal(t, 1, order) - order, err = oc.GetOrder("two") + order, err = oc.GetOrder(two) require.Nil(t, err) require.Equal(t, 2, order) } @@ -52,23 +59,23 @@ func TestOrderedCollection_GetItemAtIndex(t *testing.T) { item, err := oc.GetItemAtIndex(0) require.Equal(t, ordering.ErrIndexOutOfBounds, err) - require.Equal(t, "", item) + require.Nil(t, item) - oc.Add("zero") - oc.Add("one") - oc.Add("two") + oc.Add(zero) + oc.Add(one) + oc.Add(two) item, err = oc.GetItemAtIndex(0) require.Nil(t, err) - require.Equal(t, "zero", item) + require.Equal(t, zero, item) item, err = oc.GetItemAtIndex(1) require.Nil(t, err) - require.Equal(t, "one", item) + require.Equal(t, one, item) item, err = oc.GetItemAtIndex(2) require.Nil(t, err) - require.Equal(t, "two", item) + require.Equal(t, two, item) } func TestOrderedCollection_GetItems(t *testing.T) { @@ -77,77 +84,104 @@ func TestOrderedCollection_GetItems(t *testing.T) { items := oc.GetItems() require.Equal(t, 0, len(items)) - oc.Add("zero") - oc.Add("one") - oc.Add("two") + oc.Add(zero) + oc.Add(one) + oc.Add(two) items = oc.GetItems() require.Equal(t, 3, len(items)) - require.Equal(t, "zero", items[0]) - require.Equal(t, "one", items[1]) - require.Equal(t, "two", items[2]) + require.Equal(t, zero, items[0]) + require.Equal(t, one, items[1]) + require.Equal(t, two, items[2]) } func TestOrderedCollection_Remove(t *testing.T) { oc := ordering.NewOrderedCollection() require.Equal(t, 0, oc.Len()) - oc.Remove("zero") + oc.Remove(zero) require.Equal(t, 0, oc.Len()) - oc.Add("zero") + oc.Add(zero) require.Equal(t, 1, oc.Len()) // add duplicate should not add - oc.Add("zero") + oc.Add(zero) require.Equal(t, 1, oc.Len()) - oc.Remove("zero") + oc.Remove(zero) require.Equal(t, 0, oc.Len()) - oc.Add("zero") - oc.Add("one") - oc.Add("two") + oc.Add(zero) + oc.Add(one) + oc.Add(two) require.Equal(t, 3, oc.Len()) - oc.Remove("one") + oc.Remove(one) require.Equal(t, 2, oc.Len()) - order, err := oc.GetOrder("zero") + order, err := oc.GetOrder(zero) require.Nil(t, err) require.Equal(t, 0, order) elem, err := oc.GetItemAtIndex(uint32(order)) require.Nil(t, err) - require.Equal(t, "zero", elem) + require.Equal(t, zero, elem) - _, err = oc.GetOrder("one") + _, err = oc.GetOrder(one) require.Equal(t, ordering.ErrItemNotFound, err) - order, err = oc.GetOrder("two") + order, err = oc.GetOrder(two) require.Nil(t, err) require.Equal(t, 1, order) elem, err = oc.GetItemAtIndex(uint32(order)) require.Nil(t, err) - require.Equal(t, "two", elem) + require.Equal(t, two, elem) - oc.Remove("zero") + oc.Remove(zero) require.Equal(t, 1, oc.Len()) - oc.Remove("two") + oc.Remove(two) require.Equal(t, 0, oc.Len()) elem, err = oc.GetItemAtIndex(uint32(0)) require.Equal(t, ordering.ErrIndexOutOfBounds, err) require.Empty(t, elem) } +func TestOrderedCollections_RemoveMultiple(t *testing.T) { + oc := ordering.NewOrderedCollection() + require.Equal(t, 0, oc.Len()) + + oc.RemoveMultiple([][]byte{zero, one, two}) + require.Equal(t, 0, oc.Len()) + + oc.Add(zero) + oc.Add(one) + oc.Add(two) + require.Equal(t, 3, oc.Len()) + + oc.RemoveMultiple([][]byte{zero, one, two}) + require.Equal(t, 0, oc.Len()) + + oc.Add(zero) + oc.Add(one) + oc.Add(two) + require.Equal(t, 3, oc.Len()) + + oc.RemoveMultiple([][]byte{one, two}) + require.Equal(t, 1, oc.Len()) + + oc.RemoveMultiple([][]byte{zero}) + require.Equal(t, 0, oc.Len()) +} + func TestOrderedCollection_Clear(t *testing.T) { oc := ordering.NewOrderedCollection() require.Equal(t, 0, oc.Len()) - oc.Add("zero") - oc.Add("one") - oc.Add("two") + oc.Add(zero) + oc.Add(one) + oc.Add(two) require.Equal(t, 3, oc.Len()) oc.Clear() @@ -158,24 +192,24 @@ func TestOrderedCollection_Contains(t *testing.T) { oc := ordering.NewOrderedCollection() require.Equal(t, 0, oc.Len()) - contains := oc.Contains("zero") + contains := oc.Contains(zero) require.False(t, contains) - oc.Add("zero") - oc.Add("one") - oc.Add("two") + oc.Add(zero) + oc.Add(one) + oc.Add(two) require.Equal(t, 3, oc.Len()) - contains = oc.Contains("zero") + contains = oc.Contains(zero) require.True(t, contains) - contains = oc.Contains("one") + contains = oc.Contains(one) require.True(t, contains) - contains = oc.Contains("two") + contains = oc.Contains(two) require.True(t, contains) - contains = oc.Contains("three") + contains = oc.Contains(three) require.False(t, contains) } From a9908abbe5e3576b36a891b7f08f1a4262ade3e8 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 25 Jan 2023 17:23:09 +0200 Subject: [PATCH 003/120] integrate execution order component with preprocessors and tx coordinator --- process/block/preprocess/basePreProcess.go | 1 + .../block/preprocess/rewardTxPreProcessor.go | 9 ++ .../preprocess/rewardTxPreProcessor_test.go | 53 ++++++++++++ .../block/preprocess/scheduledTxsExecution.go | 47 ++++++---- .../block/preprocess/smartContractResults.go | 9 ++ .../preprocess/smartContractResults_test.go | 67 ++++++++++++++- process/block/preprocess/transactions.go | 9 ++ process/coordinator/process.go | 12 ++- process/errors.go | 3 + testscommon/common/executionOrderStub.go | 86 +++++++++++++++++++ 10 files changed, 277 insertions(+), 19 deletions(-) create mode 100644 testscommon/common/executionOrderStub.go diff --git a/process/block/preprocess/basePreProcess.go b/process/block/preprocess/basePreProcess.go index d6363496de3..0e5a3c2d4dc 100644 --- a/process/block/preprocess/basePreProcess.go +++ b/process/block/preprocess/basePreProcess.go @@ -122,6 +122,7 @@ type basePreProcess struct { pubkeyConverter core.PubkeyConverter processedMiniBlocksTracker process.ProcessedMiniBlocksTracker enableEpochsHandler common.EnableEpochsHandler + txExecutionOrderHandler common.TxExecutionOrderHandler } func (bpp *basePreProcess) removeBlockDataFromPools( diff --git a/process/block/preprocess/rewardTxPreProcessor.go b/process/block/preprocess/rewardTxPreProcessor.go index b563c1deeef..29b4164fdb7 100644 --- a/process/block/preprocess/rewardTxPreProcessor.go +++ b/process/block/preprocess/rewardTxPreProcessor.go @@ -10,6 +10,7 @@ import ( "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/common" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" @@ -45,6 +46,7 @@ func NewRewardTxPreprocessor( blockSizeComputation BlockSizeComputationHandler, balanceComputation BalanceComputationHandler, processedMiniBlocksTracker process.ProcessedMiniBlocksTracker, + TxExecutionOrderHandler common.TxExecutionOrderHandler, ) (*rewardTxPreprocessor, error) { if check.IfNil(hasher) { @@ -86,6 +88,9 @@ func NewRewardTxPreprocessor( if check.IfNil(processedMiniBlocksTracker) { return nil, process.ErrNilProcessedMiniBlocksTracker } + if check.IfNil(TxExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } bpp := &basePreProcess{ hasher: hasher, @@ -100,6 +105,7 @@ func NewRewardTxPreprocessor( accounts: accounts, pubkeyConverter: pubkeyConverter, processedMiniBlocksTracker: processedMiniBlocksTracker, + txExecutionOrderHandler: TxExecutionOrderHandler, } rtp := &rewardTxPreprocessor{ @@ -267,6 +273,7 @@ func (rtp *rewardTxPreprocessor) ProcessBlockTransactions( rtp.saveAccountBalanceForAddress(rTx.GetRcvAddr()) + rtp.txExecutionOrderHandler.Add(txHash) err := rtp.rewardsProcessor.ProcessRewardTransaction(rTx) if err != nil { return err @@ -494,8 +501,10 @@ func (rtp *rewardTxPreprocessor) ProcessMiniBlock( rtp.saveAccountBalanceForAddress(miniBlockRewardTxs[txIndex].GetRcvAddr()) snapshot := rtp.handleProcessTransactionInit(preProcessorExecutionInfoHandler, miniBlockTxHashes[txIndex]) + rtp.txExecutionOrderHandler.Add(miniBlockTxHashes[txIndex]) err = rtp.rewardsProcessor.ProcessRewardTransaction(miniBlockRewardTxs[txIndex]) if err != nil { + rtp.txExecutionOrderHandler.Remove(miniBlockTxHashes[txIndex]) rtp.handleProcessTransactionError(preProcessorExecutionInfoHandler, snapshot, miniBlockTxHashes[txIndex]) break } diff --git a/process/block/preprocess/rewardTxPreProcessor_test.go b/process/block/preprocess/rewardTxPreProcessor_test.go index 325c7a178fd..fe39f6442e2 100644 --- a/process/block/preprocess/rewardTxPreProcessor_test.go +++ b/process/block/preprocess/rewardTxPreProcessor_test.go @@ -13,6 +13,7 @@ import ( "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" @@ -38,6 +39,7 @@ func TestNewRewardTxPreprocessor_NilRewardTxDataPoolShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -62,6 +64,7 @@ func TestNewRewardTxPreprocessor_NilStoreShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -86,6 +89,7 @@ func TestNewRewardTxPreprocessor_NilHasherShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -110,6 +114,7 @@ func TestNewRewardTxPreprocessor_NilMarshalizerShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -134,6 +139,7 @@ func TestNewRewardTxPreprocessor_NilRewardTxProcessorShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -158,6 +164,7 @@ func TestNewRewardTxPreprocessor_NilShardCoordinatorShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -182,6 +189,7 @@ func TestNewRewardTxPreprocessor_NilAccountsShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -206,6 +214,7 @@ func TestNewRewardTxPreprocessor_NilRequestHandlerShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -230,6 +239,7 @@ func TestNewRewardTxPreprocessor_NilGasHandlerShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -254,6 +264,7 @@ func TestNewRewardTxPreprocessor_NilPubkeyConverterShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -278,6 +289,7 @@ func TestNewRewardTxPreprocessor_NilBlockSizeComputationHandlerShouldErr(t *test nil, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -302,6 +314,7 @@ func TestNewRewardTxPreprocessor_NilBalanceComputationHandlerShouldErr(t *testin &testscommon.BlockSizeComputationStub{}, nil, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) @@ -326,12 +339,38 @@ func TestNewRewardTxPreprocessor_NilProcessedMiniBlocksTrackerShouldErr(t *testi &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, nil, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, rtp) assert.Equal(t, process.ErrNilProcessedMiniBlocksTracker, err) } +func TestNewRewardTxPreprocessor_NilTxExecutionOrderHandlerShouldErr(t *testing.T) { + t.Parallel() + + tdp := initDataPool() + rtp, err := NewRewardTxPreprocessor( + tdp.RewardTransactions(), + &storageStubs.ChainStorerStub{}, + &hashingMocks.HasherMock{}, + &mock.MarshalizerMock{}, + &testscommon.RewardTxProcessorMock{}, + mock.NewMultiShardsCoordinatorMock(3), + &stateMock.AccountsStub{}, + func(shardID uint32, txHashes [][]byte) {}, + &testscommon.GasHandlerStub{}, + createMockPubkeyConverter(), + &testscommon.BlockSizeComputationStub{}, + &testscommon.BalanceComputationStub{}, + &testscommon.ProcessedMiniBlocksTrackerStub{}, + nil, + ) + + assert.Nil(t, rtp) + assert.Equal(t, process.ErrNilTxExecutionOrderHandler, err) +} + func TestNewRewardTxPreprocessor_OkValsShouldWork(t *testing.T) { t.Parallel() @@ -350,6 +389,7 @@ func TestNewRewardTxPreprocessor_OkValsShouldWork(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) assert.NotNil(t, rtp) @@ -374,6 +414,7 @@ func TestRewardTxPreprocessor_CreateMarshalizedDataShouldWork(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -405,6 +446,7 @@ func TestRewardTxPreprocessor_ProcessMiniBlockInvalidMiniBlockTypeShouldErr(t *t &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -442,6 +484,7 @@ func TestRewardTxPreprocessor_ProcessMiniBlockShouldWork(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -487,6 +530,7 @@ func TestRewardTxPreprocessor_ProcessMiniBlockNotFromMeta(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -527,6 +571,7 @@ func TestRewardTxPreprocessor_SaveTxsToStorageShouldWork(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -572,6 +617,7 @@ func TestRewardTxPreprocessor_RequestBlockTransactionsNoMissingTxsShouldWork(t * &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -616,6 +662,7 @@ func TestRewardTxPreprocessor_RequestTransactionsForMiniBlockShouldWork(t *testi &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -649,6 +696,7 @@ func TestRewardTxPreprocessor_ProcessBlockTransactions(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} @@ -696,6 +744,7 @@ func TestRewardTxPreprocessor_IsDataPreparedShouldErr(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) err := rtp.IsDataPrepared(1, haveTime) @@ -721,6 +770,7 @@ func TestRewardTxPreprocessor_IsDataPrepared(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) go func() { @@ -767,6 +817,7 @@ func TestRewardTxPreprocessor_RestoreBlockDataIntoPools(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte("tx_hash1")} @@ -812,6 +863,7 @@ func TestRewardTxPreprocessor_CreateAndProcessMiniBlocksShouldWork(t *testing.T) &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) mBlocksSlice, err := rtp.CreateAndProcessMiniBlocks(haveTimeTrue, []byte("randomness")) @@ -837,6 +889,7 @@ func TestRewardTxPreprocessor_CreateBlockStartedShouldCleanMap(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) rtp.CreateBlockStarted() diff --git a/process/block/preprocess/scheduledTxsExecution.go b/process/block/preprocess/scheduledTxsExecution.go index 1fa82dffe2a..c52129c355b 100644 --- a/process/block/preprocess/scheduledTxsExecution.go +++ b/process/block/preprocess/scheduledTxsExecution.go @@ -16,22 +16,25 @@ import ( "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" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/storage" ) -type intermediateTxInfo struct { +type txWithHash struct { txHash []byte txHandler data.TransactionHandler } +type intermediateTxInfo = txWithHash + type scheduledTxsExecution struct { txProcessor process.TransactionProcessor txCoordinator process.TransactionCoordinator mapScheduledTxs map[string]data.TransactionHandler mapScheduledIntermediateTxs map[block.Type][]data.TransactionHandler - scheduledTxs []data.TransactionHandler + scheduledTxs []txWithHash scheduledMbs block.MiniBlockSlice mapScheduledMbHashes map[string]struct{} scheduledRootHash []byte @@ -41,6 +44,7 @@ type scheduledTxsExecution struct { hasher hashing.Hasher mutScheduledTxs sync.RWMutex shardCoordinator sharding.Coordinator + txExecutionOrderHandler common.TxExecutionOrderHandler } // NewScheduledTxsExecution creates a new object which handles the execution of scheduled transactions @@ -51,6 +55,7 @@ func NewScheduledTxsExecution( marshaller marshal.Marshalizer, hasher hashing.Hasher, shardCoordinator sharding.Coordinator, + txExecutionOrderHandler common.TxExecutionOrderHandler, ) (*scheduledTxsExecution, error) { if check.IfNil(txProcessor) { @@ -71,13 +76,16 @@ func NewScheduledTxsExecution( if check.IfNil(shardCoordinator) { return nil, process.ErrNilShardCoordinator } + if check.IfNil(txExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } ste := &scheduledTxsExecution{ txProcessor: txProcessor, txCoordinator: txCoordinator, mapScheduledTxs: make(map[string]data.TransactionHandler), mapScheduledIntermediateTxs: make(map[block.Type][]data.TransactionHandler), - scheduledTxs: make([]data.TransactionHandler, 0), + scheduledTxs: make([]txWithHash, 0), scheduledMbs: make(block.MiniBlockSlice, 0), mapScheduledMbHashes: make(map[string]struct{}), gasAndFees: process.GetZeroGasAndFees(), @@ -86,6 +94,7 @@ func NewScheduledTxsExecution( hasher: hasher, scheduledRootHash: nil, shardCoordinator: shardCoordinator, + txExecutionOrderHandler: txExecutionOrderHandler, } return ste, nil @@ -96,7 +105,7 @@ func (ste *scheduledTxsExecution) Init() { ste.mutScheduledTxs.Lock() log.Debug("scheduledTxsExecution.Init", "num of last scheduled txs", len(ste.scheduledTxs)) ste.mapScheduledTxs = make(map[string]data.TransactionHandler) - ste.scheduledTxs = make([]data.TransactionHandler, 0) + ste.scheduledTxs = make([]txWithHash, 0) ste.mutScheduledTxs.Unlock() } @@ -111,7 +120,10 @@ func (ste *scheduledTxsExecution) AddScheduledTx(txHash []byte, tx data.Transact } ste.mapScheduledTxs[string(txHash)] = tx - ste.scheduledTxs = append(ste.scheduledTxs, tx) + ste.scheduledTxs = append(ste.scheduledTxs, txWithHash{ + txHash: txHash, + txHandler: tx, + }) log.Trace("scheduledTxsExecution.Add", "tx hash", txHash, "num of scheduled txs", len(ste.scheduledTxs)) return true @@ -140,7 +152,7 @@ func (ste *scheduledTxsExecution) Execute(txHash []byte) error { return fmt.Errorf("%w: in scheduledTxsExecution.Execute", process.ErrMissingTransaction) } - err := ste.execute(txHandler) + err := ste.execute(txHash, txHandler) if err != nil && !errors.Is(err, process.ErrFailedTransaction) { return err } @@ -161,21 +173,21 @@ func (ste *scheduledTxsExecution) ExecuteAll(haveTime func() time.Duration) erro mapAllIntermediateTxsBeforeScheduledExecution := ste.txCoordinator.GetAllIntermediateTxs() - for _, txHandler := range ste.scheduledTxs { + for _, txData := range ste.scheduledTxs { if haveTime() <= 0 { return process.ErrTimeIsOut } - err := ste.execute(txHandler) + err := ste.execute(txData.txHash, txData.txHandler) if err != nil { log.Debug("scheduledTxsExecution.ExecuteAll: execute(txHandler)", - "nonce", txHandler.GetNonce(), - "value", txHandler.GetValue(), - "gas limit", txHandler.GetGasLimit(), - "gas price", txHandler.GetGasPrice(), - "sender address", txHandler.GetSndAddr(), - "receiver address", txHandler.GetRcvAddr(), - "data", string(txHandler.GetData()), + "nonce", txData.txHandler.GetNonce(), + "value", txData.txHandler.GetValue(), + "gas limit", txData.txHandler.GetGasLimit(), + "gas price", txData.txHandler.GetGasPrice(), + "sender address", txData.txHandler.GetSndAddr(), + "receiver address", txData.txHandler.GetRcvAddr(), + "data", string(txData.txHandler.GetData()), "error", err.Error()) if !errors.Is(err, process.ErrFailedTransaction) { return err @@ -206,12 +218,13 @@ func (ste *scheduledTxsExecution) setScheduledMiniBlockHashes() error { return nil } -func (ste *scheduledTxsExecution) execute(txHandler data.TransactionHandler) error { +func (ste *scheduledTxsExecution) execute(txHash []byte, txHandler data.TransactionHandler) error { tx, ok := txHandler.(*transaction.Transaction) if !ok { return fmt.Errorf("%w: in scheduledTxsExecution.execute", process.ErrWrongTypeAssertion) } + ste.txExecutionOrderHandler.Add(txHash) _, err := ste.txProcessor.ProcessTransaction(tx) return err } @@ -327,7 +340,7 @@ func (ste *scheduledTxsExecution) GetScheduledTxs() []data.TransactionHandler { scheduledTxs := make([]data.TransactionHandler, len(ste.scheduledTxs)) for index, scheduledTx := range ste.scheduledTxs { - scheduledTxs[index] = scheduledTx + scheduledTxs[index] = scheduledTx.txHandler log.Trace("scheduledTxsExecution.GetScheduledTxs", "sender", scheduledTxs[index].GetSndAddr(), "receiver", scheduledTxs[index].GetRcvAddr()) } diff --git a/process/block/preprocess/smartContractResults.go b/process/block/preprocess/smartContractResults.go index 4a6b313b777..95679183154 100644 --- a/process/block/preprocess/smartContractResults.go +++ b/process/block/preprocess/smartContractResults.go @@ -49,6 +49,7 @@ func NewSmartContractResultPreprocessor( balanceComputation BalanceComputationHandler, enableEpochsHandler common.EnableEpochsHandler, processedMiniBlocksTracker process.ProcessedMiniBlocksTracker, + txExecutionOrderHandler common.TxExecutionOrderHandler, ) (*smartContractResults, error) { if check.IfNil(hasher) { @@ -96,6 +97,9 @@ func NewSmartContractResultPreprocessor( if check.IfNil(processedMiniBlocksTracker) { return nil, process.ErrNilProcessedMiniBlocksTracker } + if check.IfNil(txExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } bpp := &basePreProcess{ hasher: hasher, @@ -111,6 +115,7 @@ func NewSmartContractResultPreprocessor( pubkeyConverter: pubkeyConverter, enableEpochsHandler: enableEpochsHandler, processedMiniBlocksTracker: processedMiniBlocksTracker, + txExecutionOrderHandler: txExecutionOrderHandler, } scr := &smartContractResults{ @@ -331,6 +336,7 @@ func (scr *smartContractResults) ProcessBlockTransactions( scr.saveAccountBalanceForAddress(currScr.GetRcvAddr()) + scr.txExecutionOrderHandler.Add(txHash) _, err := scr.scrProcessor.ProcessSmartContractResult(currScr) if err != nil { return err @@ -614,8 +620,11 @@ func (scr *smartContractResults) ProcessMiniBlock( scr.saveAccountBalanceForAddress(miniBlockScrs[txIndex].GetRcvAddr()) snapshot := scr.handleProcessTransactionInit(preProcessorExecutionInfoHandler, miniBlockTxHashes[txIndex]) + + scr.txExecutionOrderHandler.Add(miniBlockTxHashes[txIndex]) _, err = scr.scrProcessor.ProcessSmartContractResult(miniBlockScrs[txIndex]) if err != nil { + scr.txExecutionOrderHandler.Remove(miniBlockTxHashes[txIndex]) scr.handleProcessTransactionError(preProcessorExecutionInfoHandler, snapshot, miniBlockTxHashes[txIndex]) break } diff --git a/process/block/preprocess/smartContractResults_test.go b/process/block/preprocess/smartContractResults_test.go index 8985c30c105..5671437f958 100644 --- a/process/block/preprocess/smartContractResults_test.go +++ b/process/block/preprocess/smartContractResults_test.go @@ -16,6 +16,7 @@ import ( "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" @@ -71,6 +72,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilPool(t *testing.T &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -98,6 +100,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilStore(t *testing. &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -125,6 +128,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilHasher(t *testing &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -152,6 +156,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilMarsalizer(t *tes &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -179,6 +184,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilTxProce(t *testin &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -206,6 +212,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilShardCoord(t *tes &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -233,6 +240,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilAccounts(t *testi &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -259,6 +267,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilRequestFunc(t *te &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -286,6 +295,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilGasHandler(t *tes &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -313,6 +323,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorShouldWork(t *testin &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) @@ -340,6 +351,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilPubkeyConverter(t &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -367,6 +379,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilBlockSizeComputat &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -394,6 +407,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilBalanceComputatio nil, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -421,6 +435,7 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilEnableEpochsHandl &testscommon.BalanceComputationStub{}, nil, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) @@ -448,12 +463,41 @@ func TestScrsPreprocessor_NewSmartContractResultPreprocessorNilProcessedMiniBloc &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, nil, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, txs) assert.Equal(t, process.ErrNilProcessedMiniBlocksTracker, err) } +func TestNewSmartContractResult_NilTxExecutionOrderHandlerShouldErr(t *testing.T) { + t.Parallel() + + tdp := initDataPool() + requestTransaction := func(shardID uint32, txHashes [][]byte) {} + txs, err := NewSmartContractResultPreprocessor( + tdp.UnsignedTransactions(), + &storageStubs.ChainStorerStub{}, + &hashingMocks.HasherMock{}, + &mock.MarshalizerMock{}, + &testscommon.TxProcessorMock{}, + mock.NewMultiShardsCoordinatorMock(3), + &stateMock.AccountsStub{}, + requestTransaction, + &mock.GasHandlerMock{}, + feeHandlerMock(), + createMockPubkeyConverter(), + &testscommon.BlockSizeComputationStub{}, + &testscommon.BalanceComputationStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &testscommon.ProcessedMiniBlocksTrackerStub{}, + nil, + ) + + assert.Nil(t, txs) + assert.Equal(t, process.ErrNilTxExecutionOrderHandler, err) +} + func TestScrsPreProcessor_GetTransactionFromPool(t *testing.T) { t.Parallel() @@ -475,6 +519,7 @@ func TestScrsPreProcessor_GetTransactionFromPool(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHash := []byte("tx1_hash") @@ -512,6 +557,7 @@ func TestScrsPreprocessor_RequestTransactionNothingToRequestAsGeneratedAtProcess &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) shardId := uint32(1) @@ -551,6 +597,7 @@ func TestScrsPreprocessor_RequestTransactionFromNetwork(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) shardId := uint32(1) @@ -589,6 +636,7 @@ func TestScrsPreprocessor_RequestBlockTransactionFromMiniBlockFromNetwork(t *tes &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) shardId := uint32(1) @@ -638,6 +686,7 @@ func TestScrsPreprocessor_ReceivedTransactionShouldEraseRequested(t *testing.T) &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) // add 3 tx hashes on requested list @@ -713,6 +762,7 @@ func TestScrsPreprocessor_GetAllTxsFromMiniBlockShouldWork(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) mb := &block.MiniBlock{ @@ -801,6 +851,7 @@ func TestScrsPreprocessor_GetAllTxsFromMiniBlockShouldWorkEvenIfScrIsMisplaced(t &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) mb := &block.MiniBlock{ @@ -845,6 +896,7 @@ func TestScrsPreprocessor_RemoveBlockDataFromPoolsNilBlockShouldErr(t *testing.T &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) err := txs.RemoveBlockDataFromPools(nil, tdp.MiniBlocks()) @@ -874,6 +926,7 @@ func TestScrsPreprocessor_RemoveBlockDataFromPoolsOK(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -916,6 +969,7 @@ func TestScrsPreprocessor_IsDataPreparedErr(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) err := txs.IsDataPrepared(1, haveTime) @@ -945,6 +999,7 @@ func TestScrsPreprocessor_IsDataPrepared(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) go func() { @@ -979,6 +1034,7 @@ func TestScrsPreprocessor_SaveTxsToStorage(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -1036,6 +1092,7 @@ func TestScrsPreprocessor_SaveTxsToStorageShouldSaveCorrectly(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -1115,6 +1172,7 @@ func TestScrsPreprocessor_SaveTxsToStorageMissingTransactionsShouldNotErr(t *tes &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -1162,6 +1220,7 @@ func TestScrsPreprocessor_ProcessBlockTransactionsShouldWork(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -1226,6 +1285,7 @@ func TestScrsPreprocessor_ProcessBlockTransactionsShouldErrMaxGasLimitPerBlockIn &testscommon.BalanceComputationStub{}, enableEpochsHandler, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -1302,7 +1362,7 @@ func TestScrsPreprocessor_ProcessMiniBlock(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, - &testscommon.ProcessedMiniBlocksTrackerStub{}, + &testscommon.ProcessedMiniBlocksTrackerStub{}, &common.TxExecutionOrderHandlerStub{}, ) txHash := []byte("tx1_hash") @@ -1347,6 +1407,7 @@ func TestScrsPreprocessor_ProcessMiniBlockWrongTypeMiniblockShouldErr(t *testing &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniblock := block.MiniBlock{ @@ -1410,6 +1471,7 @@ func TestScrsPreprocessor_RestoreBlockDataIntoPools(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -1454,6 +1516,7 @@ func TestScrsPreprocessor_RestoreBlockDataIntoPoolsNilMiniblockPoolShouldErr(t * &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} @@ -1488,6 +1551,7 @@ func TestSmartContractResults_CreateBlockStartedShouldEmptyTxHashAndInfo(t *test &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scr.CreateBlockStarted() @@ -1516,6 +1580,7 @@ func TestSmartContractResults_GetAllCurrentUsedTxs(t *testing.T) { &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txshardInfo := txShardInfo{0, 3} diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index 616638b2216..61c49246455 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -85,6 +85,7 @@ type ArgsTransactionPreProcessor struct { TxTypeHandler process.TxTypeHandler ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler ProcessedMiniBlocksTracker process.ProcessedMiniBlocksTracker + TxExecutionOrderHandler common.TxExecutionOrderHandler } // NewTransactionPreprocessor creates a new transaction preprocessor object @@ -145,6 +146,9 @@ func NewTransactionPreprocessor( if check.IfNil(args.ProcessedMiniBlocksTracker) { return nil, process.ErrNilProcessedMiniBlocksTracker } + if check.IfNil(args.TxExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } bpp := basePreProcess{ hasher: args.Hasher, @@ -160,6 +164,7 @@ func NewTransactionPreprocessor( pubkeyConverter: args.PubkeyConverter, enableEpochsHandler: args.EnableEpochsHandler, processedMiniBlocksTracker: args.ProcessedMiniBlocksTracker, + txExecutionOrderHandler: args.TxExecutionOrderHandler, } txs := &transactions{ @@ -871,6 +876,7 @@ func (txs *transactions) processAndRemoveBadTransaction( dstShardId uint32, ) error { + txs.txExecutionOrderHandler.Add(txHash) _, err := txs.txProcessor.ProcessTransaction(tx) isTxTargetedForDeletion := errors.Is(err, process.ErrLowerNonceInTransaction) || errors.Is(err, process.ErrInsufficientFee) if isTxTargetedForDeletion { @@ -879,6 +885,7 @@ func (txs *transactions) processAndRemoveBadTransaction( } if err != nil && !errors.Is(err, process.ErrFailedTransaction) { + txs.txExecutionOrderHandler.Remove(txHash) return err } @@ -1615,8 +1622,10 @@ func (txs *transactions) processInNormalMode( snapshot := txs.handleProcessTransactionInit(preProcessorExecutionInfoHandler, txHash) + txs.txExecutionOrderHandler.Add(txHash) _, err := txs.txProcessor.ProcessTransaction(tx) if err != nil { + txs.txExecutionOrderHandler.Remove(txHash) txs.handleProcessTransactionError(preProcessorExecutionInfoHandler, snapshot, txHash) return err } diff --git a/process/coordinator/process.go b/process/coordinator/process.go index 1830c602c0a..123851d5b09 100644 --- a/process/coordinator/process.go +++ b/process/coordinator/process.go @@ -65,6 +65,7 @@ type ArgTransactionCoordinator struct { ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler DoubleTransactionsDetector process.DoubleTransactionDetector ProcessedMiniBlocksTracker process.ProcessedMiniBlocksTracker + TxExecutionOrderHandler common.TxExecutionOrderHandler } type transactionCoordinator struct { @@ -98,6 +99,7 @@ type transactionCoordinator struct { doubleTransactionsDetector process.DoubleTransactionDetector processedMiniBlocksTracker process.ProcessedMiniBlocksTracker enableEpochsHandler common.EnableEpochsHandler + txExecutionOrderHandler common.TxExecutionOrderHandler } // NewTransactionCoordinator creates a transaction coordinator to run and coordinate preprocessors and processors @@ -123,6 +125,7 @@ func NewTransactionCoordinator(args ArgTransactionCoordinator) (*transactionCoor doubleTransactionsDetector: args.DoubleTransactionsDetector, processedMiniBlocksTracker: args.ProcessedMiniBlocksTracker, enableEpochsHandler: args.EnableEpochsHandler, + txExecutionOrderHandler: args.TxExecutionOrderHandler, } tc.miniBlockPool = args.MiniBlockPool @@ -916,6 +919,7 @@ func (tc *transactionCoordinator) CreateBlockStarted() { tc.gasHandler.Init() tc.blockSizeComputation.Init() tc.balanceComputation.Init() + tc.txExecutionOrderHandler.Clear() tc.mutPreProcessor.RLock() for _, value := range tc.txPreProcessors { @@ -1193,6 +1197,7 @@ func (tc *transactionCoordinator) processCompleteMiniBlock( ) if shouldRevert { + tc.txExecutionOrderHandler.RemoveMultiple(txsToBeReverted) tc.handleProcessTransactionError(snapshot, miniBlockHash, txsToBeReverted) } else { if tc.enableEpochsHandler.IsMiniBlockPartialExecutionFlagEnabled() { @@ -1223,7 +1228,7 @@ func (tc *transactionCoordinator) handleProcessTransactionError(snapshot int, mi err := tc.accounts.RevertToSnapshot(snapshot) if err != nil { - // TODO: evaluate if reloading the trie from disk will might solve the problem + // TODO: evaluate if reloading the trie from disk might solve the problem log.Debug("transactionCoordinator.handleProcessTransactionError: RevertToSnapshot", "error", err.Error()) } @@ -1259,6 +1264,7 @@ func (tc *transactionCoordinator) RevertProcessedTxsResults(txHashes [][]byte, k resultHashes := interProc.RemoveProcessedResults(key) accFeesBeforeRevert := tc.feeHandler.GetAccumulatedFees() tc.feeHandler.RevertFees(resultHashes) + tc.txExecutionOrderHandler.RemoveMultiple(resultHashes) accFeesAfterRevert := tc.feeHandler.GetAccumulatedFees() if accFeesBeforeRevert.Cmp(accFeesAfterRevert) != 0 { @@ -1270,6 +1276,7 @@ func (tc *transactionCoordinator) RevertProcessedTxsResults(txHashes [][]byte, k accFeesBeforeRevert := tc.feeHandler.GetAccumulatedFees() tc.feeHandler.RevertFees(txHashes) + tc.txExecutionOrderHandler.RemoveMultiple(txHashes) accFeesAfterRevert := tc.feeHandler.GetAccumulatedFees() if accFeesBeforeRevert.Cmp(accFeesAfterRevert) != 0 { @@ -1765,6 +1772,9 @@ func checkTransactionCoordinatorNilParameters(arguments ArgTransactionCoordinato if check.IfNil(arguments.ProcessedMiniBlocksTracker) { return process.ErrNilProcessedMiniBlocksTracker } + if check.IfNil(arguments.TxExecutionOrderHandler) { + return process.ErrNilTxExecutionOrderHandler + } return nil } diff --git a/process/errors.go b/process/errors.go index 895634b3599..e772c2e2649 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1148,3 +1148,6 @@ var ErrNilProcessDebugger = errors.New("nil process debugger") // ErrMaxCallsReached signals that the allowed max number of calls was reached var ErrMaxCallsReached = errors.New("max calls reached") + +// ErrNilTxExecutionOrderHandler signals that a nil transaction execution order handler was provided +var ErrNilTxExecutionOrderHandler = errors.New("nil transaction execution order handler") diff --git a/testscommon/common/executionOrderStub.go b/testscommon/common/executionOrderStub.go new file mode 100644 index 00000000000..b51bbca4c41 --- /dev/null +++ b/testscommon/common/executionOrderStub.go @@ -0,0 +1,86 @@ +package common + +type TxExecutionOrderHandlerStub struct { + AddCalled func(txHash []byte) + GetItemAtIndexCalled func(index uint32) ([]byte, error) + GetOrderCalled func(txHash []byte) (int, error) + RemoveCalled func(txHash []byte) + RemoveMultipleCalled func(txHashes [][]byte) + GetItemsCalled func() [][]byte + ContainsCalled func(txHash []byte) bool + ClearCalled func() + LenCalled func() int +} + +// Add - +func (teohs *TxExecutionOrderHandlerStub) Add(txHash []byte) { + if teohs.AddCalled != nil { + teohs.AddCalled(txHash) + } +} + +// GetItemAtIndex - +func (teohs *TxExecutionOrderHandlerStub) GetItemAtIndex(index uint32) ([]byte, error) { + if teohs.GetItemAtIndexCalled != nil { + return teohs.GetItemAtIndexCalled(index) + } + return nil, nil +} + +// GetOrder - +func (teohs *TxExecutionOrderHandlerStub) GetOrder(txHash []byte) (int, error) { + if teohs.GetOrderCalled != nil { + return teohs.GetOrderCalled(txHash) + } + return 0, nil +} + +// Remove - +func (teohs *TxExecutionOrderHandlerStub) Remove(txHash []byte) { + if teohs.RemoveCalled != nil { + teohs.RemoveCalled(txHash) + } +} + +// RemoveMultiple - +func (teohs *TxExecutionOrderHandlerStub) RemoveMultiple(txHashes [][]byte) { + if teohs.RemoveMultipleCalled != nil { + teohs.RemoveMultipleCalled(txHashes) + } +} + +// GetItems - +func (teohs *TxExecutionOrderHandlerStub) GetItems() [][]byte { + if teohs.GetItemsCalled != nil { + return teohs.GetItemsCalled() + } + return nil +} + +// Contains - +func (teohs *TxExecutionOrderHandlerStub) Contains(txHash []byte) bool { + if teohs.ContainsCalled != nil { + return teohs.ContainsCalled(txHash) + } + return false +} + +// Clear - +func (teohs *TxExecutionOrderHandlerStub) Clear() { + if teohs.ClearCalled != nil { + teohs.ClearCalled() + } +} + +// Len - +func (teohs *TxExecutionOrderHandlerStub) Len() int { + if teohs.LenCalled != nil { + return teohs.LenCalled() + } + return 0 +} + +// IsInterfaceNil - +func (teohs *TxExecutionOrderHandlerStub) IsInterfaceNil() bool { + return teohs == nil +} From 80743aa6b98a2d7fd8329eb06ee8c19fa7422080 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 26 Jan 2023 13:40:27 +0200 Subject: [PATCH 004/120] fixes part of unit tests after integration of execution order handler --- epochStart/bootstrap/process.go | 3 + errors/errors.go | 3 + factory/processing/processComponents.go | 91 ++++++++++--------- .../preprocess/scheduledTxsExecution_test.go | 81 ++++++++++++++++- process/block/shardblock_test.go | 7 ++ process/coordinator/process_test.go | 10 ++ .../preProcessorsContainerFactory.go | 8 ++ .../preProcessorsContainerFactory_test.go | 52 +++++++++++ .../shard/preProcessorsContainerFactory.go | 9 ++ 9 files changed, 219 insertions(+), 45 deletions(-) diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index c5092abb37b..ea4f704216d 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -16,6 +16,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/typeConverters/uint64ByteSlice" "github.com/multiversx/mx-chain-go/common" disabledCommon "github.com/multiversx/mx-chain-go/common/disabled" + "github.com/multiversx/mx-chain-go/common/ordering" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/dataRetriever/blockchain" @@ -1003,6 +1004,7 @@ func (e *epochStartBootstrap) updateDataForScheduled( shardNotarizedHeader data.ShardHeaderHandler, ) (*dataToSync, error) { + orderedCollection := ordering.NewOrderedCollection() scheduledTxsHandler, err := preprocess.NewScheduledTxsExecution( &factoryDisabled.TxProcessor{}, &factoryDisabled.TxCoordinator{}, @@ -1010,6 +1012,7 @@ func (e *epochStartBootstrap) updateDataForScheduled( e.coreComponentsHolder.InternalMarshalizer(), e.coreComponentsHolder.Hasher(), e.shardCoordinator, + orderedCollection, ) if err != nil { return nil, err diff --git a/errors/errors.go b/errors/errors.go index c03015d9aac..a50a6514706 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -544,3 +544,6 @@ var ErrNilPersistentHandler = errors.New("nil persistent handler") // ErrNilGenesisNodesSetupHandler signals that a nil genesis nodes setup handler has been provided var ErrNilGenesisNodesSetupHandler = errors.New("nil genesis nodes setup handler") + +// ErrNilTxExecutionOrderHandler signals that a nil tx execution order handler has been provided +var ErrNilTxExecutionOrderHandler = errors.New("nil tx execution order handler") diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index e646544535a..6dd87b2ee3a 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -144,14 +144,15 @@ type ProcessComponentsFactoryArgs struct { WorkingDir string HistoryRepo dblookupext.HistoryRepository - Data factory.DataComponentsHolder - CoreData factory.CoreComponentsHolder - Crypto factory.CryptoComponentsHolder - State factory.StateComponentsHolder - Network factory.NetworkComponentsHolder - BootstrapComponents factory.BootstrapComponentsHolder - StatusComponents factory.StatusComponentsHolder - StatusCoreComponents factory.StatusCoreComponentsHolder + Data factory.DataComponentsHolder + CoreData factory.CoreComponentsHolder + Crypto factory.CryptoComponentsHolder + State factory.StateComponentsHolder + Network factory.NetworkComponentsHolder + BootstrapComponents factory.BootstrapComponentsHolder + StatusComponents factory.StatusComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder + TxExecutionOrderHandler common.TxExecutionOrderHandler } type processComponentsFactory struct { @@ -177,14 +178,15 @@ type processComponentsFactory struct { importHandler update.ImportHandler esdtNftStorage vmcommon.ESDTNFTStorageHandler - data factory.DataComponentsHolder - coreData factory.CoreComponentsHolder - crypto factory.CryptoComponentsHolder - state factory.StateComponentsHolder - network factory.NetworkComponentsHolder - bootstrapComponents factory.BootstrapComponentsHolder - statusComponents factory.StatusComponentsHolder - statusCoreComponents factory.StatusCoreComponentsHolder + data factory.DataComponentsHolder + coreData factory.CoreComponentsHolder + crypto factory.CryptoComponentsHolder + state factory.StateComponentsHolder + network factory.NetworkComponentsHolder + bootstrapComponents factory.BootstrapComponentsHolder + statusComponents factory.StatusComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder + txExecutionOrderHandler common.TxExecutionOrderHandler } // NewProcessComponentsFactory will return a new instance of processComponentsFactory @@ -195,32 +197,33 @@ func NewProcessComponentsFactory(args ProcessComponentsFactoryArgs) (*processCom } return &processComponentsFactory{ - config: args.Config, - epochConfig: args.EpochConfig, - prefConfigs: args.PrefConfigs, - importDBConfig: args.ImportDBConfig, - accountsParser: args.AccountsParser, - smartContractParser: args.SmartContractParser, - gasSchedule: args.GasSchedule, - nodesCoordinator: args.NodesCoordinator, - data: args.Data, - coreData: args.CoreData, - crypto: args.Crypto, - state: args.State, - network: args.Network, - bootstrapComponents: args.BootstrapComponents, - statusComponents: args.StatusComponents, - requestedItemsHandler: args.RequestedItemsHandler, - whiteListHandler: args.WhiteListHandler, - whiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, - maxRating: args.MaxRating, - systemSCConfig: args.SystemSCConfig, - version: args.Version, - importStartHandler: args.ImportStartHandler, - workingDir: args.WorkingDir, - historyRepo: args.HistoryRepo, - epochNotifier: args.CoreData.EpochNotifier(), - statusCoreComponents: args.StatusCoreComponents, + config: args.Config, + epochConfig: args.EpochConfig, + prefConfigs: args.PrefConfigs, + importDBConfig: args.ImportDBConfig, + accountsParser: args.AccountsParser, + smartContractParser: args.SmartContractParser, + gasSchedule: args.GasSchedule, + nodesCoordinator: args.NodesCoordinator, + data: args.Data, + coreData: args.CoreData, + crypto: args.Crypto, + state: args.State, + network: args.Network, + bootstrapComponents: args.BootstrapComponents, + statusComponents: args.StatusComponents, + requestedItemsHandler: args.RequestedItemsHandler, + whiteListHandler: args.WhiteListHandler, + whiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, + maxRating: args.MaxRating, + systemSCConfig: args.SystemSCConfig, + version: args.Version, + importStartHandler: args.ImportStartHandler, + workingDir: args.WorkingDir, + historyRepo: args.HistoryRepo, + epochNotifier: args.CoreData.EpochNotifier(), + statusCoreComponents: args.StatusCoreComponents, + txExecutionOrderHandler: args.TxExecutionOrderHandler, }, nil } @@ -562,6 +565,7 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { pcf.coreData.InternalMarshalizer(), pcf.coreData.Hasher(), pcf.bootstrapComponents.ShardCoordinator(), + pcf.txExecutionOrderHandler, ) if err != nil { return nil, err @@ -1922,6 +1926,9 @@ func checkProcessComponentsArgs(args ProcessComponentsFactoryArgs) error { if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilAppStatusHandler) } + if check.IfNil(args.TxExecutionOrderHandler) { + return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilTxExecutionOrderHandler) + } return nil } diff --git a/process/block/preprocess/scheduledTxsExecution_test.go b/process/block/preprocess/scheduledTxsExecution_test.go index 7fc6c834249..6b6fbe91ac0 100644 --- a/process/block/preprocess/scheduledTxsExecution_test.go +++ b/process/block/preprocess/scheduledTxsExecution_test.go @@ -9,6 +9,7 @@ import ( "testing" "time" + "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" "github.com/multiversx/mx-chain-core-go/core" @@ -39,6 +40,7 @@ func TestScheduledTxsExecution_NewScheduledTxsExecutionNilTxProcessor(t *testing &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.True(t, check.IfNil(scheduledTxsExec)) @@ -55,6 +57,7 @@ func TestScheduledTxsExecution_NewScheduledTxsExecutionNilTxCoordinator(t *testi &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.True(t, check.IfNil(scheduledTxsExec)) @@ -71,6 +74,7 @@ func TestScheduledTxsExecution_NewScheduledTxsExecutionNilStorer(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.True(t, check.IfNil(scheduledTxsExec)) @@ -87,6 +91,7 @@ func TestScheduledTxsExecution_NewScheduledTxsExecutionNilMarshaller(t *testing. nil, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.True(t, check.IfNil(scheduledTxsExec)) @@ -103,6 +108,7 @@ func TestScheduledTxsExecution_NewScheduledTxsExecutionNilHasher(t *testing.T) { &marshal.GogoProtoMarshalizer{}, nil, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.True(t, check.IfNil(scheduledTxsExec)) @@ -119,12 +125,30 @@ func TestScheduledTxsExecution_NewScheduledTxsExecutionNilShardCoordinator(t *te &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, nil, + &common.TxExecutionOrderHandlerStub{}, ) assert.True(t, check.IfNil(scheduledTxsExec)) assert.Equal(t, process.ErrNilShardCoordinator, err) } +func TestScheduledTxsExecution_NewScheduledTxsNilTxExecutionOrderHandler(t *testing.T) { + t.Parallel() + + scheduledTxsExec, err := NewScheduledTxsExecution( + &testscommon.TxProcessorMock{}, + &testscommon.TransactionCoordinatorMock{}, + genericMocks.NewStorerMock(), + &marshal.GogoProtoMarshalizer{}, + &hashingMocks.HasherMock{}, + &mock.ShardCoordinatorStub{}, + nil, + ) + + assert.Nil(t, err) + assert.NotNil(t, scheduledTxsExec) +} + func TestScheduledTxsExecution_NewScheduledTxsExecutionOk(t *testing.T) { t.Parallel() @@ -135,6 +159,7 @@ func TestScheduledTxsExecution_NewScheduledTxsExecutionOk(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) @@ -151,6 +176,7 @@ func TestScheduledTxsExecution_InitShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.AddScheduledTx([]byte("txHash1"), &transaction.Transaction{Nonce: 0}) @@ -176,6 +202,7 @@ func TestScheduledTxsExecution_AddShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) res := scheduledTxsExec.AddScheduledTx([]byte("txHash1"), &transaction.Transaction{Nonce: 0}) @@ -214,6 +241,7 @@ func TestScheduledTxsExecution_ExecuteShouldErrMissingTransaction(t *testing.T) &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) err := scheduledTxsExec.Execute([]byte("txHash1")) @@ -235,6 +263,7 @@ func TestScheduledTxsExecution_ExecuteShouldErr(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.AddScheduledTx([]byte("txHash1"), &transaction.Transaction{Nonce: 0}) @@ -256,6 +285,7 @@ func TestScheduledTxsExecution_ExecuteShouldWorkOnErrFailedTransaction(t *testin &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.AddScheduledTx([]byte("txHash1"), &transaction.Transaction{Nonce: 0}) @@ -277,6 +307,7 @@ func TestScheduledTxsExecution_ExecuteShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.AddScheduledTx([]byte("txHash1"), &transaction.Transaction{Nonce: 0}) @@ -294,6 +325,7 @@ func TestScheduledTxsExecution_ExecuteAllShouldErrNilHaveTimeHandler(t *testing. &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) err := scheduledTxsExec.ExecuteAll(nil) @@ -310,6 +342,7 @@ func TestScheduledTxsExecution_ExecuteAllShouldErrTimeIsOut(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) haveTimeFunction := func() time.Duration { return time.Duration(-1) } @@ -334,6 +367,7 @@ func TestScheduledTxsExecution_ExecuteAllShouldErrFailedTransaction(t *testing.T &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) haveTimeFunction := func() time.Duration { return time.Duration(100) } @@ -357,6 +391,7 @@ func TestScheduledTxsExecution_ExecuteAllShouldWorkOnErrFailedTransaction(t *tes &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) haveTimeFunction := func() time.Duration { return time.Duration(100) } @@ -382,6 +417,7 @@ func TestScheduledTxsExecution_ExecuteAllShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) haveTimeFunction := func() time.Duration { return time.Duration(100) } @@ -404,9 +440,11 @@ func TestScheduledTxsExecution_executeShouldErr(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) - err := scheduledTxsExec.execute(nil) + txHash := []byte("txHash") + err := scheduledTxsExec.execute(txHash, nil) assert.True(t, errors.Is(err, process.ErrWrongTypeAssertion)) } @@ -425,9 +463,11 @@ func TestScheduledTxsExecution_executeShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) - err := scheduledTxsExec.execute(&transaction.Transaction{Nonce: 0}) + txHash := []byte("txHash") + err := scheduledTxsExec.execute(txHash, &transaction.Transaction{Nonce: 0}) assert.Equal(t, response, err) } @@ -463,6 +503,7 @@ func TestScheduledTxsExecution_computeScheduledSCRsShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, shardCoordinator, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.ComputeScheduledIntermediateTxs(nil, nil) @@ -479,6 +520,7 @@ func TestScheduledTxsExecution_computeScheduledSCRsShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, shardCoordinator, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.ComputeScheduledIntermediateTxs(mapAllIntermediateTxsBeforeScheduledExecution, nil) @@ -495,6 +537,7 @@ func TestScheduledTxsExecution_computeScheduledSCRsShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, shardCoordinator, + &common.TxExecutionOrderHandlerStub{}, ) localMapAllIntermediateTxsAfterScheduledExecution := map[block.Type]map[string]data.TransactionHandler{ @@ -520,6 +563,7 @@ func TestScheduledTxsExecution_computeScheduledSCRsShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, shardCoordinator, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.ComputeScheduledIntermediateTxs( @@ -547,6 +591,7 @@ func TestScheduledTxsExecution_computeScheduledSCRsShouldRemoveInvalidSCRs(t *te return false }, }, + &common.TxExecutionOrderHandlerStub{}, ) txHash1 := "txHash1" @@ -632,6 +677,7 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t return false }, }, + &common.TxExecutionOrderHandlerStub{}, ) scrsInfo := scheduledTxsExec.getAllIntermediateTxsAfterScheduledExecution( @@ -656,6 +702,7 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t return true }, }, + &common.TxExecutionOrderHandlerStub{}, ) scrsInfo := scheduledTxsExec.getAllIntermediateTxsAfterScheduledExecution( @@ -679,7 +726,7 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t SameShardCalled: func(_, _ []byte) bool { return true }, - }, + }, &common.TxExecutionOrderHandlerStub{}, ) scrsInfo := scheduledTxsExec.getAllIntermediateTxsAfterScheduledExecution( @@ -704,6 +751,7 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t return true }, }, + &common.TxExecutionOrderHandlerStub{}, ) scrsInfo := scheduledTxsExec.getAllIntermediateTxsAfterScheduledExecution( @@ -728,6 +776,7 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t return true }, }, + &common.TxExecutionOrderHandlerStub{}, ) scrsInfo := scheduledTxsExec.getAllIntermediateTxsAfterScheduledExecution( @@ -752,6 +801,7 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t return false }, }, + &common.TxExecutionOrderHandlerStub{}, ) scrsInfo := scheduledTxsExec.getAllIntermediateTxsAfterScheduledExecution( @@ -776,6 +826,7 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t return false }, }, + &common.TxExecutionOrderHandlerStub{}, ) allTxsAfterExec := map[string]data.TransactionHandler{ @@ -818,6 +869,7 @@ func TestScheduledTxsExecution_GetScheduledIntermediateTxsNonEmptySCRsMap(t *tes return false }, }, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.ComputeScheduledIntermediateTxs( @@ -848,6 +900,7 @@ func TestScheduledTxsExecution_GetScheduledIntermediateTxsEmptySCRsMap(t *testin return false }, }, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.ComputeScheduledIntermediateTxs( @@ -870,6 +923,7 @@ func TestScheduledTxsExecution_SetScheduledInfo(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) rootHash := []byte("root hash") @@ -917,6 +971,7 @@ func TestScheduledTxsExecution_Setters(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.SetTransactionCoordinator(&testscommon.TransactionCoordinatorMock{}) scheduledTxsExec.SetTransactionProcessor(&testscommon.TxProcessorMock{}) @@ -948,6 +1003,7 @@ func TestScheduledTxsExecution_getScheduledInfoForHeaderShouldFail(t *testing.T) &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledInfo, err := scheduledTxsExec.getScheduledInfoForHeader(rootHash, core.OptionalUint32{}) @@ -973,6 +1029,7 @@ func TestScheduledTxsExecution_getScheduledInfoForHeaderShouldFail(t *testing.T) }, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledInfo, err := scheduledTxsExec.getScheduledInfoForHeader(rootHash, core.OptionalUint32{}) @@ -1011,6 +1068,7 @@ func TestScheduledTxsExecution_getScheduledInfoForHeaderShouldWork(t *testing.T) &testscommon.MarshalizerMock{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledInfo, _ := scheduledTxsExec.getScheduledInfoForHeader(headerHash, core.OptionalUint32{}) @@ -1054,6 +1112,7 @@ func TestScheduledTxsExecution_getMarshalledScheduledInfoShouldWork(t *testing.T &testscommon.MarshalizerMock{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledInfo := &process.ScheduledInfo{ @@ -1083,6 +1142,7 @@ func TestScheduledTxsExecution_RollBackToBlockShouldFail(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) err := scheduledTxsExec.RollBackToBlock(rootHash) @@ -1123,6 +1183,7 @@ func TestScheduledTxsExecution_RollBackToBlockShouldWork(t *testing.T) { &testscommon.MarshalizerMock{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) err := scheduledTxsExec.RollBackToBlock(headerHash) @@ -1187,6 +1248,7 @@ func TestScheduledTxsExecution_SaveState(t *testing.T) { &testscommon.MarshalizerMock{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledInfo := &process.ScheduledInfo{ @@ -1216,6 +1278,7 @@ func TestScheduledTxsExecution_SaveStateIfNeeded(t *testing.T) { &testscommon.MarshalizerMock{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.SaveStateIfNeeded(headerHash) @@ -1240,6 +1303,7 @@ func TestScheduledTxsExecution_IsScheduledTx(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) scheduledTxsExec.AddScheduledTx(txHash1, &transaction.Transaction{Nonce: 0}) @@ -1261,6 +1325,7 @@ func TestScheduledTxsExecution_AddMiniBlocksWithNilReservedNilTxHashes(t *testin &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniBlocks := block.MiniBlockSlice{} @@ -1288,6 +1353,7 @@ func TestScheduledTxsExecution_AddMiniBlocksWithNilReservedNilTxHashes(t *testin &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniBlocks := block.MiniBlockSlice{} @@ -1316,6 +1382,7 @@ func TestScheduledTxsExecution_AddMiniBlocksShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniBlocks := block.MiniBlockSlice{} @@ -1355,6 +1422,7 @@ func TestScheduledTxsExecution_GetScheduledTxs(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) firstTransaction := &transaction.Transaction{Nonce: 0} secondTransaction := &transaction.Transaction{Nonce: 1} @@ -1379,6 +1447,7 @@ func TestScheduledTxsExecution_GetScheduledMBs(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniBlocks := block.MiniBlockSlice{} @@ -1441,6 +1510,7 @@ func TestScheduledTxsExecution_GetScheduledRootHashForHeaderWithErrorShouldFail( &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) t.Run("without epoch", func(t *testing.T) { @@ -1494,6 +1564,7 @@ func TestScheduledTxsExecution_GetScheduledRootHashForHeaderShouldWork(t *testin &testscommon.MarshalizerMock{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) t.Run("without epoch", func(t *testing.T) { @@ -1522,6 +1593,7 @@ func TestScheduledTxsExecution_removeInvalidTxsFromScheduledMiniBlocks(t *testin &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHash1 := []byte("txHash1") @@ -1607,6 +1679,7 @@ func TestScheduledTxsExecution_setScheduledMiniBlockHashes(t *testing.T) { }, &mock.HasherStub{}, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniBlocks := block.MiniBlockSlice{&block.MiniBlock{ @@ -1639,6 +1712,7 @@ func TestScheduledTxsExecution_setScheduledMiniBlockHashes(t *testing.T) { }, }, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniBlocks := block.MiniBlockSlice{mb} @@ -1670,6 +1744,7 @@ func TestScheduledTxsExecution_IsMiniBlockExecuted(t *testing.T) { }, }, &mock.ShardCoordinatorStub{}, + &common.TxExecutionOrderHandlerStub{}, ) miniBlocks := block.MiniBlockSlice{&block.MiniBlock{ diff --git a/process/block/shardblock_test.go b/process/block/shardblock_test.go index 3dafde60964..f88e1d86e31 100644 --- a/process/block/shardblock_test.go +++ b/process/block/shardblock_test.go @@ -34,6 +34,7 @@ import ( "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" + commonMock "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" "github.com/multiversx/mx-chain-go/testscommon/outport" @@ -473,6 +474,7 @@ func TestShardProcessor_ProcessBlockWithInvalidTransactionShouldErr(t *testing.T &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := factory.Create() @@ -694,6 +696,7 @@ func TestShardProcessor_ProcessBlockWithErrOnProcessBlockTransactionsCallShouldR &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := factory.Create() @@ -2594,6 +2597,7 @@ func TestShardProcessor_MarshalizedDataToBroadcastShouldWork(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := factory.Create() @@ -2702,6 +2706,7 @@ func TestShardProcessor_MarshalizedDataMarshalWithoutSuccess(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := factory.Create() @@ -3094,6 +3099,7 @@ func TestShardProcessor_CreateMiniBlocksShouldWorkWithIntraShardTxs(t *testing.T &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := factory.Create() @@ -3275,6 +3281,7 @@ func TestShardProcessor_RestoreBlockIntoPoolsShouldWork(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := factory.Create() diff --git a/process/coordinator/process_test.go b/process/coordinator/process_test.go index 42ae2fc6374..f4ef4e6de24 100644 --- a/process/coordinator/process_test.go +++ b/process/coordinator/process_test.go @@ -31,6 +31,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/database" "github.com/multiversx/mx-chain-go/storage/storageunit" "github.com/multiversx/mx-chain-go/testscommon" + commonMock "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" @@ -540,6 +541,7 @@ func createPreProcessorContainer() process.PreProcessorsContainer { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -635,6 +637,7 @@ func createPreProcessorContainerWithDataPool( &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -903,6 +906,7 @@ func TestTransactionCoordinator_CreateMbsAndProcessCrossShardTransactions(t *tes &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -1087,6 +1091,7 @@ func TestTransactionCoordinator_CreateMbsAndProcessCrossShardTransactionsNilPreP &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -1195,6 +1200,7 @@ func TestTransactionCoordinator_CreateMbsAndProcessTransactionsFromMeNothingToPr &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -1732,6 +1738,7 @@ func TestTransactionCoordinator_ProcessBlockTransactionProcessTxError(t *testing &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -1858,6 +1865,7 @@ func TestTransactionCoordinator_RequestMiniblocks(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -1997,6 +2005,7 @@ func TestShardProcessor_ProcessMiniBlockCompleteWithOkTxsShouldExecuteThemAndNot &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() @@ -2137,6 +2146,7 @@ func TestShardProcessor_ProcessMiniBlockCompleteWithErrorWhileProcessShouldCallR &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) container, _ := preFactory.Create() diff --git a/process/factory/metachain/preProcessorsContainerFactory.go b/process/factory/metachain/preProcessorsContainerFactory.go index 9ba714ff53b..4354a80ab1e 100644 --- a/process/factory/metachain/preProcessorsContainerFactory.go +++ b/process/factory/metachain/preProcessorsContainerFactory.go @@ -37,6 +37,7 @@ type preProcessorsContainerFactory struct { txTypeHandler process.TxTypeHandler scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler processedMiniBlocksTracker process.ProcessedMiniBlocksTracker + txExecutionOrderHandler common.TxExecutionOrderHandler } // NewPreProcessorsContainerFactory is responsible for creating a new preProcessors factory object @@ -60,6 +61,7 @@ func NewPreProcessorsContainerFactory( txTypeHandler process.TxTypeHandler, scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler, processedMiniBlocksTracker process.ProcessedMiniBlocksTracker, + txExecutionOrderHandler common.TxExecutionOrderHandler, ) (*preProcessorsContainerFactory, error) { if check.IfNil(shardCoordinator) { @@ -119,6 +121,9 @@ func NewPreProcessorsContainerFactory( if check.IfNil(processedMiniBlocksTracker) { return nil, process.ErrNilProcessedMiniBlocksTracker } + if check.IfNil(txExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } return &preProcessorsContainerFactory{ shardCoordinator: shardCoordinator, @@ -140,6 +145,7 @@ func NewPreProcessorsContainerFactory( txTypeHandler: txTypeHandler, scheduledTxsExecutionHandler: scheduledTxsExecutionHandler, processedMiniBlocksTracker: processedMiniBlocksTracker, + txExecutionOrderHandler: txExecutionOrderHandler, }, nil } @@ -191,6 +197,7 @@ func (ppcm *preProcessorsContainerFactory) createTxPreProcessor() (process.PrePr TxTypeHandler: ppcm.txTypeHandler, ScheduledTxsExecutionHandler: ppcm.scheduledTxsExecutionHandler, ProcessedMiniBlocksTracker: ppcm.processedMiniBlocksTracker, + TxExecutionOrderHandler: ppcm.txExecutionOrderHandler, } txPreprocessor, err := preprocess.NewTransactionPreprocessor(args) @@ -215,6 +222,7 @@ func (ppcm *preProcessorsContainerFactory) createSmartContractResultPreProcessor ppcm.balanceComputation, ppcm.enableEpochsHandler, ppcm.processedMiniBlocksTracker, + ppcm.txExecutionOrderHandler, ) return scrPreprocessor, err diff --git a/process/factory/metachain/preProcessorsContainerFactory_test.go b/process/factory/metachain/preProcessorsContainerFactory_test.go index 03580c1df1b..c70b09bb6c1 100644 --- a/process/factory/metachain/preProcessorsContainerFactory_test.go +++ b/process/factory/metachain/preProcessorsContainerFactory_test.go @@ -8,6 +8,7 @@ import ( "github.com/multiversx/mx-chain-go/process/factory/metachain" "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/testscommon" + commonMock "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" @@ -38,6 +39,7 @@ func TestNewPreProcessorsContainerFactory_NilShardCoordinator(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilShardCoordinator, err) @@ -67,6 +69,7 @@ func TestNewPreProcessorsContainerFactory_NilStore(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilStore, err) @@ -96,6 +99,7 @@ func TestNewPreProcessorsContainerFactory_NilMarshalizer(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilMarshalizer, err) @@ -125,6 +129,7 @@ func TestNewPreProcessorsContainerFactory_NilHasher(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilHasher, err) @@ -154,6 +159,7 @@ func TestNewPreProcessorsContainerFactory_NilDataPool(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilDataPoolHolder, err) @@ -183,6 +189,7 @@ func TestNewPreProcessorsContainerFactory_NilAccounts(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilAccountsAdapter, err) @@ -212,6 +219,7 @@ func TestNewPreProcessorsContainerFactory_NilFeeHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) @@ -241,6 +249,7 @@ func TestNewPreProcessorsContainerFactory_NilTxProcessor(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilTxProcessor, err) @@ -270,6 +279,7 @@ func TestNewPreProcessorsContainerFactory_NilRequestHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilRequestHandler, err) assert.Nil(t, ppcm) @@ -298,6 +308,7 @@ func TestNewPreProcessorsContainerFactory_NilGasHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilGasHandler, err) assert.Nil(t, ppcm) @@ -326,6 +337,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockTracker(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilBlockTracker, err) assert.Nil(t, ppcm) @@ -354,6 +366,7 @@ func TestNewPreProcessorsContainerFactory_NilPubkeyConverter(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilPubkeyConverter, err) assert.Nil(t, ppcm) @@ -382,6 +395,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockSizeComputationHandler(t *test &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilBlockSizeComputationHandler, err) assert.Nil(t, ppcm) @@ -410,6 +424,7 @@ func TestNewPreProcessorsContainerFactory_NilBalanceComputationHandler(t *testin &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilBalanceComputationHandler, err) assert.Nil(t, ppcm) @@ -438,6 +453,7 @@ func TestNewPreProcessorsContainerFactory_NilEnableEpochsHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilEnableEpochsHandler, err) assert.Nil(t, ppcm) @@ -466,6 +482,7 @@ func TestNewPreProcessorsContainerFactory_NilTxTypeHandler(t *testing.T) { nil, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilTxTypeHandler, err) assert.Nil(t, ppcm) @@ -494,6 +511,7 @@ func TestNewPreProcessorsContainerFactory_NilScheduledTxsExecutionHandler(t *tes &testscommon.TxTypeHandlerMock{}, nil, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilScheduledTxsExecutionHandler, err) assert.Nil(t, ppcm) @@ -522,11 +540,42 @@ func TestNewPreProcessorsContainerFactory_NilProcessedMiniBlocksTracker(t *testi &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, nil, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilProcessedMiniBlocksTracker, err) assert.Nil(t, ppcm) } +func TestNewPreProcessorsContainerFactory_NilTxExecutionOrderHandler(t *testing.T) { + t.Parallel() + + ppcm, err := metachain.NewPreProcessorsContainerFactory( + mock.NewMultiShardsCoordinatorMock(3), + &storageStubs.ChainStorerStub{}, + &mock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, + dataRetrieverMock.NewPoolsHolderMock(), + &stateMock.AccountsStub{}, + &testscommon.RequestHandlerStub{}, + &testscommon.TxProcessorMock{}, + &testscommon.SmartContractResultsProcessorMock{}, + &mock.FeeHandlerStub{}, + &testscommon.GasHandlerStub{}, + &mock.BlockTrackerMock{}, + createMockPubkeyConverter(), + &testscommon.BlockSizeComputationStub{}, + &testscommon.BalanceComputationStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &testscommon.TxTypeHandlerMock{}, + &testscommon.ScheduledTxsExecutionStub{}, + &testscommon.ProcessedMiniBlocksTrackerStub{}, + nil, + ) + + assert.Equal(t, process.ErrNilTxExecutionOrderHandler, err) + assert.Nil(t, ppcm) +} + func TestNewPreProcessorsContainerFactory(t *testing.T) { t.Parallel() @@ -550,6 +599,7 @@ func TestNewPreProcessorsContainerFactory(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) @@ -585,6 +635,7 @@ func TestPreProcessorsContainerFactory_CreateErrTxPreproc(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) @@ -618,6 +669,7 @@ func TestPreProcessorsContainerFactory_Create(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) diff --git a/process/factory/shard/preProcessorsContainerFactory.go b/process/factory/shard/preProcessorsContainerFactory.go index 7cef6a0eb03..a561412737b 100644 --- a/process/factory/shard/preProcessorsContainerFactory.go +++ b/process/factory/shard/preProcessorsContainerFactory.go @@ -39,6 +39,7 @@ type preProcessorsContainerFactory struct { txTypeHandler process.TxTypeHandler scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler processedMiniBlocksTracker process.ProcessedMiniBlocksTracker + txExecutionOrderHandler common.TxExecutionOrderHandler } // NewPreProcessorsContainerFactory is responsible for creating a new preProcessors factory object @@ -64,6 +65,7 @@ func NewPreProcessorsContainerFactory( txTypeHandler process.TxTypeHandler, scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler, processedMiniBlocksTracker process.ProcessedMiniBlocksTracker, + txExecutionOrderHandler common.TxExecutionOrderHandler, ) (*preProcessorsContainerFactory, error) { if check.IfNil(shardCoordinator) { @@ -129,6 +131,9 @@ func NewPreProcessorsContainerFactory( if check.IfNil(processedMiniBlocksTracker) { return nil, process.ErrNilProcessedMiniBlocksTracker } + if check.IfNil(txExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } return &preProcessorsContainerFactory{ shardCoordinator: shardCoordinator, @@ -152,6 +157,7 @@ func NewPreProcessorsContainerFactory( txTypeHandler: txTypeHandler, scheduledTxsExecutionHandler: scheduledTxsExecutionHandler, processedMiniBlocksTracker: processedMiniBlocksTracker, + txExecutionOrderHandler: txExecutionOrderHandler, }, nil } @@ -223,6 +229,7 @@ func (ppcm *preProcessorsContainerFactory) createTxPreProcessor() (process.PrePr TxTypeHandler: ppcm.txTypeHandler, ScheduledTxsExecutionHandler: ppcm.scheduledTxsExecutionHandler, ProcessedMiniBlocksTracker: ppcm.processedMiniBlocksTracker, + TxExecutionOrderHandler: ppcm.txExecutionOrderHandler, } txPreprocessor, err := preprocess.NewTransactionPreprocessor(args) @@ -247,6 +254,7 @@ func (ppcm *preProcessorsContainerFactory) createSmartContractResultPreProcessor ppcm.balanceComputation, ppcm.enableEpochsHandler, ppcm.processedMiniBlocksTracker, + ppcm.txExecutionOrderHandler, ) return scrPreprocessor, err @@ -267,6 +275,7 @@ func (ppcm *preProcessorsContainerFactory) createRewardsTransactionPreProcessor( ppcm.blockSizeComputation, ppcm.balanceComputation, ppcm.processedMiniBlocksTracker, + ppcm.txExecutionOrderHandler, ) return rewardTxPreprocessor, err From cdb491af40e74a2d025a6142447d16a1a97eedae Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 26 Jan 2023 16:36:05 +0200 Subject: [PATCH 005/120] fixes integration and unit tests --- factory/processing/blockProcessorCreator.go | 4 ++ factory/processing/processComponents.go | 47 +++++++-------- genesis/process/argGenesisBlockCreator.go | 43 +++++++------- genesis/process/genesisBlockCreator.go | 3 + genesis/process/genesisBlockCreator_test.go | 2 + genesis/process/metaGenesisBlockCreator.go | 2 + genesis/process/shardGenesisBlockCreator.go | 2 + .../multiShard/hardFork/hardFork_test.go | 2 + integrationTests/testInitializer.go | 3 + integrationTests/testProcessorNode.go | 10 +++- node/nodeRunner.go | 54 +++++++++-------- process/block/baseProcess_test.go | 2 + .../preprocess/scheduledTxsExecution_test.go | 4 +- .../block/preprocess/transactionsV2_test.go | 2 + process/block/preprocess/transactions_test.go | 2 + process/coordinator/process_test.go | 23 ++++++++ .../preProcessorsContainerFactory_test.go | 58 +++++++++++++++++++ testscommon/components/components.go | 6 +- 18 files changed, 195 insertions(+), 74 deletions(-) diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index 4f73a39db02..d51a59ad401 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -332,6 +332,7 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( txTypeHandler, scheduledTxsExecutionHandler, processedMiniBlocksTracker, + pcf.txExecutionOrderHandler, ) if err != nil { return nil, err @@ -372,6 +373,7 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, DoubleTransactionsDetector: doubleTransactionsDetector, ProcessedMiniBlocksTracker: processedMiniBlocksTracker, + TxExecutionOrderHandler: pcf.txExecutionOrderHandler, } txCoordinator, err := coordinator.NewTransactionCoordinator(argsTransactionCoordinator) if err != nil { @@ -632,6 +634,7 @@ func (pcf *processComponentsFactory) newMetaBlockProcessor( txTypeHandler, scheduledTxsExecutionHandler, processedMiniBlocksTracker, + pcf.txExecutionOrderHandler, ) if err != nil { return nil, err @@ -672,6 +675,7 @@ func (pcf *processComponentsFactory) newMetaBlockProcessor( ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, DoubleTransactionsDetector: doubleTransactionsDetector, ProcessedMiniBlocksTracker: processedMiniBlocksTracker, + TxExecutionOrderHandler: pcf.txExecutionOrderHandler, } txCoordinator, err := coordinator.NewTransactionCoordinator(argsTransactionCoordinator) if err != nil { diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 6dd87b2ee3a..84c8a000219 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -841,29 +841,30 @@ func (pcf *processComponentsFactory) generateGenesisHeadersAndApplyInitialBalanc } arg := processGenesis.ArgsGenesisBlockCreator{ - Core: pcf.coreData, - Data: pcf.data, - GenesisTime: uint64(pcf.coreData.GenesisNodesSetup().GetStartTime()), - StartEpochNum: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), - Accounts: pcf.state.AccountsAdapter(), - InitialNodesSetup: pcf.coreData.GenesisNodesSetup(), - Economics: pcf.coreData.EconomicsData(), - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - AccountsParser: pcf.accountsParser, - SmartContractParser: pcf.smartContractParser, - ValidatorAccounts: pcf.state.PeerAccounts(), - GasSchedule: pcf.gasSchedule, - VirtualMachineConfig: genesisVmConfig, - TxLogsProcessor: pcf.txLogsProcessor, - HardForkConfig: pcf.config.Hardfork, - TrieStorageManagers: pcf.state.TrieStorageManagers(), - SystemSCConfig: *pcf.systemSCConfig, - ImportStartHandler: pcf.importStartHandler, - WorkingDir: pcf.workingDir, - BlockSignKeyGen: pcf.crypto.BlockSignKeyGen(), - GenesisString: pcf.config.GeneralSettings.GenesisString, - GenesisNodePrice: genesisNodePrice, - EpochConfig: &pcf.epochConfig, + Core: pcf.coreData, + Data: pcf.data, + GenesisTime: uint64(pcf.coreData.GenesisNodesSetup().GetStartTime()), + StartEpochNum: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), + Accounts: pcf.state.AccountsAdapter(), + InitialNodesSetup: pcf.coreData.GenesisNodesSetup(), + Economics: pcf.coreData.EconomicsData(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + AccountsParser: pcf.accountsParser, + SmartContractParser: pcf.smartContractParser, + ValidatorAccounts: pcf.state.PeerAccounts(), + GasSchedule: pcf.gasSchedule, + VirtualMachineConfig: genesisVmConfig, + TxLogsProcessor: pcf.txLogsProcessor, + HardForkConfig: pcf.config.Hardfork, + TrieStorageManagers: pcf.state.TrieStorageManagers(), + SystemSCConfig: *pcf.systemSCConfig, + ImportStartHandler: pcf.importStartHandler, + WorkingDir: pcf.workingDir, + BlockSignKeyGen: pcf.crypto.BlockSignKeyGen(), + GenesisString: pcf.config.GeneralSettings.GenesisString, + GenesisNodePrice: genesisNodePrice, + EpochConfig: &pcf.epochConfig, + TxExecutionOrderHandler: pcf.txExecutionOrderHandler, } gbc, err := processGenesis.NewGenesisBlockCreator(arg) diff --git a/genesis/process/argGenesisBlockCreator.go b/genesis/process/argGenesisBlockCreator.go index e6166457673..4f93bf5fdec 100644 --- a/genesis/process/argGenesisBlockCreator.go +++ b/genesis/process/argGenesisBlockCreator.go @@ -41,27 +41,28 @@ type dataComponentsHandler interface { // ArgsGenesisBlockCreator holds the arguments which are needed to create a genesis block type ArgsGenesisBlockCreator struct { - GenesisTime uint64 - StartEpochNum uint32 - Data dataComponentsHandler - Core coreComponentsHandler - Accounts state.AccountsAdapter - ValidatorAccounts state.AccountsAdapter - InitialNodesSetup genesis.InitialNodesHandler - Economics process.EconomicsDataHandler - ShardCoordinator sharding.Coordinator - AccountsParser genesis.AccountsParser - SmartContractParser genesis.InitialSmartContractParser - GasSchedule core.GasScheduleNotifier - TxLogsProcessor process.TransactionLogProcessor - VirtualMachineConfig config.VirtualMachineConfig - HardForkConfig config.HardforkConfig - TrieStorageManagers map[string]common.StorageManager - SystemSCConfig config.SystemSmartContractsConfig - EpochConfig *config.EpochConfig - ImportStartHandler update.ImportStartHandler - WorkingDir string - BlockSignKeyGen crypto.KeyGenerator + GenesisTime uint64 + StartEpochNum uint32 + Data dataComponentsHandler + Core coreComponentsHandler + Accounts state.AccountsAdapter + ValidatorAccounts state.AccountsAdapter + InitialNodesSetup genesis.InitialNodesHandler + Economics process.EconomicsDataHandler + ShardCoordinator sharding.Coordinator + AccountsParser genesis.AccountsParser + SmartContractParser genesis.InitialSmartContractParser + GasSchedule core.GasScheduleNotifier + TxLogsProcessor process.TransactionLogProcessor + VirtualMachineConfig config.VirtualMachineConfig + HardForkConfig config.HardforkConfig + TrieStorageManagers map[string]common.StorageManager + SystemSCConfig config.SystemSmartContractsConfig + EpochConfig *config.EpochConfig + ImportStartHandler update.ImportStartHandler + WorkingDir string + BlockSignKeyGen crypto.KeyGenerator + TxExecutionOrderHandler common.TxExecutionOrderHandler GenesisNodePrice *big.Int GenesisString string diff --git a/genesis/process/genesisBlockCreator.go b/genesis/process/genesisBlockCreator.go index ba898b40414..1027768136f 100644 --- a/genesis/process/genesisBlockCreator.go +++ b/genesis/process/genesisBlockCreator.go @@ -201,6 +201,9 @@ func checkArgumentsForBlockCreator(arg ArgsGenesisBlockCreator) error { if check.IfNil(arg.Core.TxMarshalizer()) { return process.ErrNilMarshalizer } + if check.IfNil(arg.TxExecutionOrderHandler) { + return process.ErrNilTxExecutionOrderHandler + } if arg.EpochConfig == nil { return genesis.ErrNilEpochConfig } diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index 067412c9aad..54358f7f37e 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -21,6 +21,7 @@ import ( factoryState "github.com/multiversx/mx-chain-go/state/factory" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/genericMocks" @@ -134,6 +135,7 @@ func createMockArgument( PenalizedTooMuchGasEnableEpoch: 0, }, }, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } arg.ShardCoordinator = &mock.ShardCoordinatorMock{ diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index bfb4f26cb53..517c8dec6c7 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -480,6 +480,7 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc txTypeHandler, disabledScheduledTxsExecutionHandler, disabledProcessedMiniBlocksTracker, + arg.TxExecutionOrderHandler, ) if err != nil { return nil, err @@ -520,6 +521,7 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc ScheduledTxsExecutionHandler: disabledScheduledTxsExecutionHandler, DoubleTransactionsDetector: doubleTransactionsDetector, ProcessedMiniBlocksTracker: disabledProcessedMiniBlocksTracker, + TxExecutionOrderHandler: arg.TxExecutionOrderHandler, } txCoordinator, err := coordinator.NewTransactionCoordinator(argsTransactionCoordinator) if err != nil { diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index aa140fe629a..ab3388f2cd3 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -607,6 +607,7 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo txTypeHandler, disabledScheduledTxsExecutionHandler, disabledProcessedMiniBlocksTracker, + arg.TxExecutionOrderHandler, ) if err != nil { return nil, err @@ -647,6 +648,7 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo ScheduledTxsExecutionHandler: disabledScheduledTxsExecutionHandler, DoubleTransactionsDetector: doubleTransactionsDetector, ProcessedMiniBlocksTracker: disabledProcessedMiniBlocksTracker, + TxExecutionOrderHandler: arg.TxExecutionOrderHandler, } txCoordinator, err := coordinator.NewTransactionCoordinator(argsTransactionCoordinator) if err != nil { diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index 7caeeca4704..076de497cb4 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -20,6 +20,7 @@ import ( "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm" vmFactory "github.com/multiversx/mx-chain-go/process/factory" "github.com/multiversx/mx-chain-go/state" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" factoryTests "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/multiversx/mx-chain-go/testscommon/genesisMocks" @@ -486,6 +487,7 @@ func hardForkImport( DelegationSmartContractEnableEpoch: 0, }, }, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } genesisProcessor, err := process.NewGenesisBlockCreator(argsGenesis) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 39b7b9dafbf..4858c4213c4 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -54,6 +54,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/pruning" "github.com/multiversx/mx-chain-go/storage/storageunit" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" testStorage "github.com/multiversx/mx-chain-go/testscommon/state" @@ -705,6 +706,7 @@ func CreateFullGenesisBlocks( EpochConfig: &config.EpochConfig{ EnableEpochs: enableEpochsConfig, }, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } genesisProcessor, _ := genesisProcess.NewGenesisBlockCreator(argsGenesis) @@ -805,6 +807,7 @@ func CreateGenesisMetaBlock( EpochConfig: &config.EpochConfig{ EnableEpochs: enableEpochsConfig, }, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } if shardCoordinator.SelfId() != core.MetachainShardId { diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index ad9bf5d7c4c..d0a4f4d35e4 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -98,6 +98,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/txcache" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/bootstrapMocks" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" dblookupextMock "github.com/multiversx/mx-chain-go/testscommon/dblookupext" @@ -1536,6 +1537,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u TestMarshalizer, TestHasher, tpn.ShardCoordinator, + &commonMocks.TxExecutionOrderHandlerStub{}, ) processedMiniBlocksTracker := processedMb.NewProcessedMiniBlocksTracker() @@ -1561,6 +1563,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u txTypeHandler, scheduledTxsExecutionHandler, processedMiniBlocksTracker, + &commonMocks.TxExecutionOrderHandlerStub{}, ) tpn.PreProcessorsContainer, _ = fact.Create() @@ -1584,6 +1587,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: processedMiniBlocksTracker, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } tpn.TxCoordinator, _ = coordinator.NewTransactionCoordinator(argsTransactionCoordinator) scheduledTxsExecutionHandler.SetTransactionCoordinator(tpn.TxCoordinator) @@ -1774,7 +1778,9 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri scheduledSCRsStorer, TestMarshalizer, TestHasher, - tpn.ShardCoordinator) + tpn.ShardCoordinator, + &commonMocks.TxExecutionOrderHandlerStub{}, + ) processedMiniBlocksTracker := processedMb.NewProcessedMiniBlocksTracker() fact, _ := metaProcess.NewPreProcessorsContainerFactory( @@ -1797,6 +1803,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri txTypeHandler, scheduledTxsExecutionHandler, processedMiniBlocksTracker, + &commonMocks.TxExecutionOrderHandlerStub{}, ) tpn.PreProcessorsContainer, _ = fact.Create() @@ -1820,6 +1827,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: processedMiniBlocksTracker, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } tpn.TxCoordinator, _ = coordinator.NewTransactionCoordinator(argsTransactionCoordinator) scheduledTxsExecutionHandler.SetTransactionCoordinator(tpn.TxCoordinator) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index ce87af025d8..b2570e6be50 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -26,6 +26,7 @@ import ( "github.com/multiversx/mx-chain-go/common/disabled" "github.com/multiversx/mx-chain-go/common/forking" "github.com/multiversx/mx-chain-go/common/goroutines" + "github.com/multiversx/mx-chain-go/common/ordering" "github.com/multiversx/mx-chain-go/common/statistics" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/consensus/spos" @@ -1191,32 +1192,35 @@ func (nr *nodeRunner) CreateManagedProcessComponents( requestedItemsHandler := cache.NewTimeCache( time.Duration(uint64(time.Millisecond) * coreComponents.GenesisNodesSetup().GetRoundDuration())) + txExecutionOrderHandler := ordering.NewOrderedCollection() + processArgs := processComp.ProcessComponentsFactoryArgs{ - Config: *configs.GeneralConfig, - EpochConfig: *configs.EpochConfig, - PrefConfigs: configs.PreferencesConfig.Preferences, - ImportDBConfig: *configs.ImportDbConfig, - AccountsParser: accountsParser, - SmartContractParser: smartContractParser, - GasSchedule: gasScheduleNotifier, - NodesCoordinator: nodesCoordinator, - Data: dataComponents, - CoreData: coreComponents, - Crypto: cryptoComponents, - State: stateComponents, - Network: networkComponents, - BootstrapComponents: bootstrapComponents, - StatusComponents: statusComponents, - StatusCoreComponents: statusCoreComponents, - RequestedItemsHandler: requestedItemsHandler, - WhiteListHandler: whiteListRequest, - WhiteListerVerifiedTxs: whiteListerVerifiedTxs, - MaxRating: configs.RatingsConfig.General.MaxRating, - SystemSCConfig: configs.SystemSCConfig, - Version: configs.FlagsConfig.Version, - ImportStartHandler: importStartHandler, - WorkingDir: configs.FlagsConfig.WorkingDir, - HistoryRepo: historyRepository, + Config: *configs.GeneralConfig, + EpochConfig: *configs.EpochConfig, + PrefConfigs: configs.PreferencesConfig.Preferences, + ImportDBConfig: *configs.ImportDbConfig, + AccountsParser: accountsParser, + SmartContractParser: smartContractParser, + GasSchedule: gasScheduleNotifier, + NodesCoordinator: nodesCoordinator, + Data: dataComponents, + CoreData: coreComponents, + Crypto: cryptoComponents, + State: stateComponents, + Network: networkComponents, + BootstrapComponents: bootstrapComponents, + StatusComponents: statusComponents, + StatusCoreComponents: statusCoreComponents, + RequestedItemsHandler: requestedItemsHandler, + WhiteListHandler: whiteListRequest, + WhiteListerVerifiedTxs: whiteListerVerifiedTxs, + MaxRating: configs.RatingsConfig.General.MaxRating, + SystemSCConfig: configs.SystemSCConfig, + Version: configs.FlagsConfig.Version, + ImportStartHandler: importStartHandler, + WorkingDir: configs.FlagsConfig.WorkingDir, + HistoryRepo: historyRepository, + TxExecutionOrderHandler: txExecutionOrderHandler, } processComponentsFactory, err := processComp.NewProcessComponentsFactory(processArgs) if err != nil { diff --git a/process/block/baseProcess_test.go b/process/block/baseProcess_test.go index 1424a19978c..4efef4728be 100644 --- a/process/block/baseProcess_test.go +++ b/process/block/baseProcess_test.go @@ -39,6 +39,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/database" "github.com/multiversx/mx-chain-go/storage/storageunit" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" @@ -441,6 +442,7 @@ func createMockTransactionCoordinatorArguments( ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } return argsTransactionCoordinator diff --git a/process/block/preprocess/scheduledTxsExecution_test.go b/process/block/preprocess/scheduledTxsExecution_test.go index 6b6fbe91ac0..d9bb4c5b242 100644 --- a/process/block/preprocess/scheduledTxsExecution_test.go +++ b/process/block/preprocess/scheduledTxsExecution_test.go @@ -145,8 +145,8 @@ func TestScheduledTxsExecution_NewScheduledTxsNilTxExecutionOrderHandler(t *test nil, ) - assert.Nil(t, err) - assert.NotNil(t, scheduledTxsExec) + assert.True(t, check.IfNil(scheduledTxsExec)) + assert.Equal(t, process.ErrNilTxExecutionOrderHandler, err) } func TestScheduledTxsExecution_NewScheduledTxsExecutionOk(t *testing.T) { diff --git a/process/block/preprocess/transactionsV2_test.go b/process/block/preprocess/transactionsV2_test.go index 597b523ddf9..4e5f05ae065 100644 --- a/process/block/preprocess/transactionsV2_test.go +++ b/process/block/preprocess/transactionsV2_test.go @@ -14,6 +14,7 @@ import ( "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/storage/txcache" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" @@ -71,6 +72,7 @@ func createTransactionPreprocessor() *transactions { }, ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } preprocessor, _ := NewTransactionPreprocessor(txPreProcArgs) diff --git a/process/block/preprocess/transactions_test.go b/process/block/preprocess/transactions_test.go index 541f21fce4c..16615ab910b 100644 --- a/process/block/preprocess/transactions_test.go +++ b/process/block/preprocess/transactions_test.go @@ -30,6 +30,7 @@ import ( "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/storage/txcache" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/genericMocks" @@ -235,6 +236,7 @@ func createDefaultTransactionsProcessorArgs() ArgsTransactionPreProcessor { TxTypeHandler: &testscommon.TxTypeHandlerMock{}, ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } } diff --git a/process/coordinator/process_test.go b/process/coordinator/process_test.go index f4ef4e6de24..c283baf802b 100644 --- a/process/coordinator/process_test.go +++ b/process/coordinator/process_test.go @@ -240,6 +240,7 @@ func createMockTransactionCoordinatorArguments() ArgTransactionCoordinator { ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } return argsTransactionCoordinator @@ -2578,6 +2579,7 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldReturnWhenEpochIsNo ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -2625,6 +2627,7 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldErrMaxGasLimitPerMi ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) @@ -2696,6 +2699,7 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldErrMaxAccumulatedFe ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) @@ -2772,6 +2776,7 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldErrMaxDeveloperFees ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) @@ -2848,6 +2853,7 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldWork(t *testing.T) ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) @@ -2907,6 +2913,7 @@ func TestTransactionCoordinator_GetAllTransactionsShouldWork(t *testing.T) { ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -2989,6 +2996,7 @@ func TestTransactionCoordinator_VerifyGasLimitShouldErrMaxGasLimitPerMiniBlockIn ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3081,6 +3089,7 @@ func TestTransactionCoordinator_VerifyGasLimitShouldWork(t *testing.T) { ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3159,6 +3168,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3208,6 +3218,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3264,6 +3275,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3327,6 +3339,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3393,6 +3406,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) @@ -3446,6 +3460,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMissingTransaction(t *testing ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) @@ -3504,6 +3519,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxAccumulatedFeesExceeded(t ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) @@ -3572,6 +3588,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxDeveloperFeesExceeded(t *t ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3648,6 +3665,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxAccumulatedFeesExceededWhe }, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3732,6 +3750,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxDeveloperFeesExceededWhenS }, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3816,6 +3835,7 @@ func TestTransactionCoordinator_VerifyFeesShouldWork(t *testing.T) { }, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3892,6 +3912,7 @@ func TestTransactionCoordinator_GetMaxAccumulatedAndDeveloperFeesShouldErr(t *te ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -3947,6 +3968,7 @@ func TestTransactionCoordinator_GetMaxAccumulatedAndDeveloperFeesShouldWork(t *t ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } tc, err := NewTransactionCoordinator(txCoordinatorArgs) assert.Nil(t, err) @@ -4016,6 +4038,7 @@ func TestTransactionCoordinator_RevertIfNeededShouldWork(t *testing.T) { ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: &testscommon.ProcessedMiniBlocksTrackerStub{}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } txHashes := make([][]byte, 0) diff --git a/process/factory/shard/preProcessorsContainerFactory_test.go b/process/factory/shard/preProcessorsContainerFactory_test.go index 1a9f5938433..ff53a64b563 100644 --- a/process/factory/shard/preProcessorsContainerFactory_test.go +++ b/process/factory/shard/preProcessorsContainerFactory_test.go @@ -7,6 +7,7 @@ import ( "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/testscommon" + commonMock "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" @@ -43,6 +44,7 @@ func TestNewPreProcessorsContainerFactory_NilShardCoordinator(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilShardCoordinator, err) @@ -74,6 +76,7 @@ func TestNewPreProcessorsContainerFactory_NilStore(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilStore, err) @@ -105,6 +108,7 @@ func TestNewPreProcessorsContainerFactory_NilMarshalizer(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilMarshalizer, err) @@ -136,6 +140,7 @@ func TestNewPreProcessorsContainerFactory_NilHasher(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilHasher, err) @@ -167,6 +172,7 @@ func TestNewPreProcessorsContainerFactory_NilDataPool(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilDataPoolHolder, err) @@ -198,6 +204,7 @@ func TestNewPreProcessorsContainerFactory_NilAddrConv(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilPubkeyConverter, err) @@ -229,6 +236,7 @@ func TestNewPreProcessorsContainerFactory_NilAccounts(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilAccountsAdapter, err) @@ -260,6 +268,7 @@ func TestNewPreProcessorsContainerFactory_NilTxProcessor(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilTxProcessor, err) @@ -291,6 +300,7 @@ func TestNewPreProcessorsContainerFactory_NilSCProcessor(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilSmartContractProcessor, err) @@ -322,6 +332,7 @@ func TestNewPreProcessorsContainerFactory_NilSCR(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilSmartContractResultProcessor, err) @@ -353,6 +364,7 @@ func TestNewPreProcessorsContainerFactory_NilRewardTxProcessor(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilRewardsTxProcessor, err) @@ -384,6 +396,7 @@ func TestNewPreProcessorsContainerFactory_NilRequestHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilRequestHandler, err) @@ -415,6 +428,7 @@ func TestNewPreProcessorsContainerFactory_NilFeeHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) @@ -446,6 +460,7 @@ func TestNewPreProcessorsContainerFactory_NilGasHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilGasHandler, err) @@ -477,6 +492,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockTracker(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilBlockTracker, err) @@ -508,6 +524,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockSizeComputationHandler(t *test &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilBlockSizeComputationHandler, err) @@ -539,6 +556,7 @@ func TestNewPreProcessorsContainerFactory_NilBalanceComputationHandler(t *testin &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilBalanceComputationHandler, err) @@ -570,6 +588,7 @@ func TestNewPreProcessorsContainerFactory_NilEnableEpochsHandler(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilEnableEpochsHandler, err) @@ -601,6 +620,7 @@ func TestNewPreProcessorsContainerFactory_NilTxTypeHandler(t *testing.T) { nil, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilTxTypeHandler, err) @@ -632,6 +652,7 @@ func TestNewPreProcessorsContainerFactory_NilScheduledTxsExecutionHandler(t *tes &testscommon.TxTypeHandlerMock{}, nil, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilScheduledTxsExecutionHandler, err) @@ -663,12 +684,45 @@ func TestNewPreProcessorsContainerFactory_NilProcessedMiniBlocksTracker(t *testi &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, nil, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Equal(t, process.ErrNilProcessedMiniBlocksTracker, err) assert.Nil(t, ppcm) } +func TestNewPreProcessorsContainerFactory_NilTxExecutionOrderHandler(t *testing.T) { + t.Parallel() + + ppcm, err := NewPreProcessorsContainerFactory( + mock.NewMultiShardsCoordinatorMock(3), + &storageStubs.ChainStorerStub{}, + &mock.MarshalizerMock{}, + &hashingMocks.HasherMock{}, + dataRetrieverMock.NewPoolsHolderMock(), + createMockPubkeyConverter(), + &stateMock.AccountsStub{}, + &testscommon.RequestHandlerStub{}, + &testscommon.TxProcessorMock{}, + &testscommon.SCProcessorMock{}, + &testscommon.SmartContractResultsProcessorMock{}, + &testscommon.RewardTxProcessorMock{}, + &mock.FeeHandlerStub{}, + &testscommon.GasHandlerStub{}, + &mock.BlockTrackerMock{}, + &testscommon.BlockSizeComputationStub{}, + &testscommon.BalanceComputationStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &testscommon.TxTypeHandlerMock{}, + &testscommon.ScheduledTxsExecutionStub{}, + &testscommon.ProcessedMiniBlocksTrackerStub{}, + nil, + ) + + assert.Equal(t, process.ErrNilTxExecutionOrderHandler, err) + assert.Nil(t, ppcm) +} + func TestNewPreProcessorsContainerFactory(t *testing.T) { t.Parallel() @@ -694,6 +748,7 @@ func TestNewPreProcessorsContainerFactory(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) @@ -730,6 +785,7 @@ func TestPreProcessorsContainerFactory_CreateErrTxPreproc(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) @@ -772,6 +828,7 @@ func TestPreProcessorsContainerFactory_CreateErrScrPreproc(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) @@ -817,6 +874,7 @@ func TestPreProcessorsContainerFactory_Create(t *testing.T) { &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &commonMock.TxExecutionOrderHandlerStub{}, ) assert.Nil(t, err) diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 1afe538b5b6..766ddbbfe30 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -34,6 +34,7 @@ import ( "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" @@ -564,8 +565,9 @@ func GetProcessArgs( MaxServiceFee: 100, }, }, - Version: "v1.0.0", - HistoryRepo: &dblookupext.HistoryRepositoryStub{}, + Version: "v1.0.0", + HistoryRepo: &dblookupext.HistoryRepositoryStub{}, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } } From 5fd80b46e89585129d0ac9c04409cf72003b5eb5 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 27 Jan 2023 10:37:00 +0200 Subject: [PATCH 006/120] explicit allocation and test check.IfNil instead of IsInterfaceNil --- common/ordering/orederedCollection.go | 4 +++- common/ordering/orederedCollection_test.go | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/common/ordering/orederedCollection.go b/common/ordering/orederedCollection.go index c79579e30cc..fdddffd26c5 100644 --- a/common/ordering/orederedCollection.go +++ b/common/ordering/orederedCollection.go @@ -76,7 +76,9 @@ func (oc *orderedCollection) GetItems() []string { oc.mut.RLock() defer oc.mut.RUnlock() - cpItems := append([]string{}, oc.itemsArray...) + cpItems := make([]string, len(oc.itemsArray)) + copy(cpItems, oc.itemsArray) + return cpItems } diff --git a/common/ordering/orederedCollection_test.go b/common/ordering/orederedCollection_test.go index 5b4ec98021a..eb717464530 100644 --- a/common/ordering/orederedCollection_test.go +++ b/common/ordering/orederedCollection_test.go @@ -3,6 +3,7 @@ package ordering_test import ( "testing" + "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/common/ordering" "github.com/stretchr/testify/require" ) @@ -181,5 +182,5 @@ func TestOrderedCollection_Contains(t *testing.T) { func TestOrderedCollection_IsInterfaceNil(t *testing.T) { oc := ordering.GetNilOrderedCollection() - require.True(t, oc.IsInterfaceNil()) + require.True(t, check.IfNil(oc)) } From a6a0d3843494ed6d66ce15ac1967a6f4e8afcf82 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 27 Jan 2023 14:03:28 +0200 Subject: [PATCH 007/120] concurrency test --- common/ordering/orederedCollection_test.go | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/common/ordering/orederedCollection_test.go b/common/ordering/orederedCollection_test.go index eb717464530..965aeb1a5c4 100644 --- a/common/ordering/orederedCollection_test.go +++ b/common/ordering/orederedCollection_test.go @@ -1,6 +1,8 @@ package ordering_test import ( + "fmt" + "sync" "testing" "github.com/multiversx/mx-chain-core-go/core/check" @@ -9,12 +11,16 @@ import ( ) func TestNewOrderedCollection(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() require.NotNil(t, oc) require.Equal(t, 0, oc.Len()) } func TestOrderedCollection_Add(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() oc.Add("zero") require.Equal(t, 1, oc.Len()) @@ -25,6 +31,8 @@ func TestOrderedCollection_Add(t *testing.T) { } func TestOrderedCollection_GetOrder(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() order, err := oc.GetOrder("zero") @@ -49,6 +57,8 @@ func TestOrderedCollection_GetOrder(t *testing.T) { } func TestOrderedCollection_GetItemAtIndex(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() item, err := oc.GetItemAtIndex(0) @@ -73,6 +83,8 @@ func TestOrderedCollection_GetItemAtIndex(t *testing.T) { } func TestOrderedCollection_GetItems(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() items := oc.GetItems() @@ -90,6 +102,8 @@ func TestOrderedCollection_GetItems(t *testing.T) { } func TestOrderedCollection_Remove(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() require.Equal(t, 0, oc.Len()) @@ -143,6 +157,8 @@ func TestOrderedCollection_Remove(t *testing.T) { } func TestOrderedCollection_Clear(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() require.Equal(t, 0, oc.Len()) @@ -156,6 +172,8 @@ func TestOrderedCollection_Clear(t *testing.T) { } func TestOrderedCollection_Contains(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() require.Equal(t, 0, oc.Len()) @@ -181,6 +199,57 @@ func TestOrderedCollection_Contains(t *testing.T) { } func TestOrderedCollection_IsInterfaceNil(t *testing.T) { + t.Parallel() + oc := ordering.GetNilOrderedCollection() require.True(t, check.IfNil(oc)) } + +func TestBaseProcessor_ConcurrentCallsOrderedCollection(t *testing.T) { + t.Parallel() + oc := ordering.NewOrderedCollection() + + numCalls := 10000 + wg := &sync.WaitGroup{} + wg.Add(numCalls) + + numCases := 9 + for i := 0; i < numCalls; i++ { + go func(idx int) { + switch idx % numCases { + case 0: + for i := 0; i < numCases; i++ { + oc.Add(fmt.Sprintf("value_%d", idx+i)) + } + case 1: + _ = oc.GetItems() + case 2: + _ = oc.Len() + case 3: + for i := 0; i < numCases; i++ { + _ = oc.Contains(fmt.Sprintf("value_%d", idx-3+i)) + } + case 4: + for i := 0; i < numCases; i++ { + _, _ = oc.GetOrder(fmt.Sprintf("value_%d", idx-4+i)) + } + case 5: + for i := 0; i < numCases; i++ { + _, _ = oc.GetItemAtIndex(uint32(idx - 5 + i)) + } + case 6: + _ = oc.IsInterfaceNil() + case 7: + for i := 0; i < numCases; i++ { + oc.Remove(fmt.Sprintf("value_%d", idx-7+i)) + } + case 8: + oc.Clear() + } + + wg.Done() + }(i) + } + + wg.Wait() +} From ba4318aa55b14abecedd35de640313eef841342d Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 27 Jan 2023 16:32:35 +0200 Subject: [PATCH 008/120] rename files and fixes after merge --- .../{orederedCollection.go => orderedCollection.go} | 0 ...ederedCollection_test.go => orderedCollection_test.go} | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) rename common/ordering/{orederedCollection.go => orderedCollection.go} (100%) rename common/ordering/{orederedCollection_test.go => orderedCollection_test.go} (95%) diff --git a/common/ordering/orederedCollection.go b/common/ordering/orderedCollection.go similarity index 100% rename from common/ordering/orederedCollection.go rename to common/ordering/orderedCollection.go diff --git a/common/ordering/orederedCollection_test.go b/common/ordering/orderedCollection_test.go similarity index 95% rename from common/ordering/orederedCollection_test.go rename to common/ordering/orderedCollection_test.go index 21eca9c5abe..1f01a4a2e91 100644 --- a/common/ordering/orederedCollection_test.go +++ b/common/ordering/orderedCollection_test.go @@ -253,7 +253,7 @@ func TestBaseProcessor_ConcurrentCallsOrderedCollection(t *testing.T) { switch idx % numCases { case 0: for i := 0; i < numCases; i++ { - oc.Add(fmt.Sprintf("value_%d", idx+i)) + oc.Add([]byte(fmt.Sprintf("value_%d", idx+i))) } case 1: _ = oc.GetItems() @@ -261,11 +261,11 @@ func TestBaseProcessor_ConcurrentCallsOrderedCollection(t *testing.T) { _ = oc.Len() case 3: for i := 0; i < numCases; i++ { - _ = oc.Contains(fmt.Sprintf("value_%d", idx-3+i)) + _ = oc.Contains([]byte(fmt.Sprintf("value_%d", idx-3+i))) } case 4: for i := 0; i < numCases; i++ { - _, _ = oc.GetOrder(fmt.Sprintf("value_%d", idx-4+i)) + _, _ = oc.GetOrder([]byte(fmt.Sprintf("value_%d", idx-4+i))) } case 5: for i := 0; i < numCases; i++ { @@ -275,7 +275,7 @@ func TestBaseProcessor_ConcurrentCallsOrderedCollection(t *testing.T) { _ = oc.IsInterfaceNil() case 7: for i := 0; i < numCases; i++ { - oc.Remove(fmt.Sprintf("value_%d", idx-7+i)) + oc.Remove([]byte(fmt.Sprintf("value_%d", idx-7+i))) } case 8: oc.Clear() From 371716d733ce72f6c0d82de7bf840422e83f53f0 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 31 Jan 2023 18:04:11 +0200 Subject: [PATCH 009/120] integrate new execution order component into outport driver & remove old one --- common/interface.go | 10 + outport/process/errors.go | 3 + outport/process/executionOrder/dtos.go | 29 -- outport/process/executionOrder/interface.go | 10 - .../executionOrder/miniBlocksGetter.go | 69 --- .../executionOrder/miniBlocksGetter_test.go | 51 --- outport/process/executionOrder/scrs.go | 72 --- outport/process/executionOrder/scrs_test.go | 55 --- .../transactionsExecutionOrder.go | 299 ------------- .../transactionsExecutionOrder_test.go | 413 ------------------ outport/process/factory/check.go | 3 + outport/process/factory/check_test.go | 2 + .../factory/outportDataProviderFactory.go | 15 +- outport/process/outportDataProvider.go | 46 +- outport/process/outportDataProvider_test.go | 3 +- 15 files changed, 59 insertions(+), 1021 deletions(-) delete mode 100644 outport/process/executionOrder/dtos.go delete mode 100644 outport/process/executionOrder/interface.go delete mode 100644 outport/process/executionOrder/miniBlocksGetter.go delete mode 100644 outport/process/executionOrder/miniBlocksGetter_test.go delete mode 100644 outport/process/executionOrder/scrs.go delete mode 100644 outport/process/executionOrder/scrs_test.go delete mode 100644 outport/process/executionOrder/transactionsExecutionOrder.go delete mode 100644 outport/process/executionOrder/transactionsExecutionOrder_test.go diff --git a/common/interface.go b/common/interface.go index d28d1173b62..c3920b19b45 100644 --- a/common/interface.go +++ b/common/interface.go @@ -353,3 +353,13 @@ type TxExecutionOrderHandler interface { Len() int IsInterfaceNil() bool } + +// ExecutionOrderGetter defines the functionality of a component that can return the execution order of a block transactions +type ExecutionOrderGetter interface { + GetItemAtIndex(index uint32) ([]byte, error) + GetOrder(txHash []byte) (int, error) + GetItems() [][]byte + Contains(txHash []byte) bool + Len() int + IsInterfaceNil() bool +} diff --git a/outport/process/errors.go b/outport/process/errors.go index 42ccbdac3a8..78d1df07d36 100644 --- a/outport/process/errors.go +++ b/outport/process/errors.go @@ -25,3 +25,6 @@ var ErrNilStorer = errors.New("nil storer") // ErrNilEnableEpochsHandler signals that a nil enable epochs handler has been provided var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler") + +// ErrNilExecutionOrderGetter signals that a nil execution order getter has been provided +var ErrNilExecutionOrderGetter = errors.New("nil execution order getter") diff --git a/outport/process/executionOrder/dtos.go b/outport/process/executionOrder/dtos.go deleted file mode 100644 index d1cbba8ebd2..00000000000 --- a/outport/process/executionOrder/dtos.go +++ /dev/null @@ -1,29 +0,0 @@ -package executionOrder - -import ( - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/hashing" - "github.com/multiversx/mx-chain-core-go/marshal" - "github.com/multiversx/mx-chain-go/common" - "github.com/multiversx/mx-chain-go/storage" -) - -// ArgSorter holds the arguments needed for creating a new instance of sorter -type ArgSorter struct { - Hasher hashing.Hasher - Marshaller marshal.Marshalizer - MbsStorer storage.Storer - EnableEpochsHandler common.EnableEpochsHandler -} - -type resultsTransactionsToMe struct { - transactionsToMe []data.TransactionHandlerWithGasUsedAndFee - scheduledTransactionsToMe []data.TransactionHandlerWithGasUsedAndFee - scrsToMe map[string]data.TransactionHandlerWithGasUsedAndFee -} - -type resultsTransactionsFromMe struct { - transactionsFromMe []data.TransactionHandlerWithGasUsedAndFee - scheduledTransactionsFromMe []data.TransactionHandlerWithGasUsedAndFee - scheduledExecutedInvalidTxsHashesPrevBlock []string -} diff --git a/outport/process/executionOrder/interface.go b/outport/process/executionOrder/interface.go deleted file mode 100644 index eeb943dcd34..00000000000 --- a/outport/process/executionOrder/interface.go +++ /dev/null @@ -1,10 +0,0 @@ -package executionOrder - -import ( - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/block" -) - -type mbsGetter interface { - GetScheduledMBs(currentHeader, prevHeader data.HeaderHandler) ([]*block.MiniBlock, error) -} diff --git a/outport/process/executionOrder/miniBlocksGetter.go b/outport/process/executionOrder/miniBlocksGetter.go deleted file mode 100644 index fb6378d32ad..00000000000 --- a/outport/process/executionOrder/miniBlocksGetter.go +++ /dev/null @@ -1,69 +0,0 @@ -package executionOrder - -import ( - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/block" - "github.com/multiversx/mx-chain-core-go/marshal" - "github.com/multiversx/mx-chain-go/storage" -) - -type miniBlocksGetter struct { - storer storage.Storer - marshaller marshal.Marshalizer -} - -func newMiniblocksGetter(storer storage.Storer, marshaller marshal.Marshalizer) *miniBlocksGetter { - return &miniBlocksGetter{ - storer: storer, - marshaller: marshaller, - } -} - -// GetScheduledMBs will return the scheduled miniblocks -func (bg *miniBlocksGetter) GetScheduledMBs(currentHeader, prevHeader data.HeaderHandler) ([]*block.MiniBlock, error) { - scheduledMbs := make([]*block.MiniBlock, 0) - if !shouldProcessPrevHeaderMiniblocks(currentHeader) { - return scheduledMbs, nil - } - - for _, mbHeader := range prevHeader.GetMiniBlockHeaderHandlers() { - isScheduled := mbHeader.GetProcessingType() == int32(block.Scheduled) - if !isScheduled { - continue - } - - mb, errGet := bg.getMBByHash(mbHeader.GetHash()) - if errGet != nil { - return nil, errGet - } - - scheduledMbs = append(scheduledMbs, mb) - } - - return scheduledMbs, nil -} - -func shouldProcessPrevHeaderMiniblocks(currentHeader data.HeaderHandler) bool { - for _, mb := range currentHeader.GetMiniBlockHeaderHandlers() { - mbType := block.Type(mb.GetTypeInt32()) - if mbType == block.InvalidBlock || mbType == block.SmartContractResultBlock { - return true - } - } - return false -} - -func (bg *miniBlocksGetter) getMBByHash(mbHash []byte) (*block.MiniBlock, error) { - mbBytes, err := bg.storer.Get(mbHash) - if err != nil { - return nil, err - } - - mb := &block.MiniBlock{} - err = bg.marshaller.Unmarshal(mb, mbBytes) - if err != nil { - return nil, err - } - - return mb, nil -} diff --git a/outport/process/executionOrder/miniBlocksGetter_test.go b/outport/process/executionOrder/miniBlocksGetter_test.go deleted file mode 100644 index 18a62a4d0c1..00000000000 --- a/outport/process/executionOrder/miniBlocksGetter_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package executionOrder - -import ( - "testing" - - "github.com/multiversx/mx-chain-core-go/data/block" - "github.com/multiversx/mx-chain-core-go/marshal" - "github.com/multiversx/mx-chain-go/testscommon/storage" - "github.com/stretchr/testify/require" -) - -func TestMiniblockGetter_GetScheduledMBs(t *testing.T) { - t.Parallel() - - marshaller := &marshal.GogoProtoMarshalizer{} - mbhr := &block.MiniBlockHeaderReserved{ - ExecutionType: block.ProcessingType(1), - } - mbhrBytes, _ := marshaller.Marshal(mbhr) - - mbHash1, mbHash2, scheduledMbHash := []byte("mb1"), []byte("mb2"), []byte("scheduled") - headerPrevHeader := &block.Header{ - MiniBlockHeaders: []block.MiniBlockHeader{ - { - Hash: mbHash1, - }, - { - Hash: mbHash2, - }, - { - Hash: scheduledMbHash, - Reserved: mbhrBytes, - }, - }, - } - - header := &block.Header{ - MiniBlockHeaders: []block.MiniBlockHeader{ - { - Type: block.InvalidBlock, - }, - }, - } - - storer := &storage.StorerStub{} - mbsG := newMiniblocksGetter(storer, marshaller) - - scheduledMbs, err := mbsG.GetScheduledMBs(header, headerPrevHeader) - require.Nil(t, err) - require.Equal(t, 1, len(scheduledMbs)) -} diff --git a/outport/process/executionOrder/scrs.go b/outport/process/executionOrder/scrs.go deleted file mode 100644 index 0a22a6fad0e..00000000000 --- a/outport/process/executionOrder/scrs.go +++ /dev/null @@ -1,72 +0,0 @@ -package executionOrder - -import ( - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/block" - "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-core-go/data/smartContractResult" -) - -func setOrderSmartContractResults(pool *outport.Pool, scheduledMbsFromPreviousBlock []*block.MiniBlock, scrsToMe map[string]data.TransactionHandlerWithGasUsedAndFee) []string { - scheduledExecutedTxsPrevBlockMap := make(map[string]struct{}) - for _, mb := range scheduledMbsFromPreviousBlock { - for _, txHash := range mb.TxHashes { - scheduledExecutedTxsPrevBlockMap[string(txHash)] = struct{}{} - } - } - - scheduledExecutedSCRsPrevBlock := make([]string, 0) - scrsWithNoTxInCurrentShard := make(map[string]map[string]data.TransactionHandlerWithGasUsedAndFee) - for scrHash, scrHandler := range pool.Scrs { - scr, ok := scrHandler.GetTxHandler().(*smartContractResult.SmartContractResult) - if !ok { - continue - } - - _, originalTxWasScheduledExecuted := scheduledExecutedTxsPrevBlockMap[string(scr.OriginalTxHash)] - if originalTxWasScheduledExecuted { - scheduledExecutedSCRsPrevBlock = append(scheduledExecutedSCRsPrevBlock, scrHash) - } - - tx, found := pool.Txs[string(scr.OriginalTxHash)] - if !found { - groupScrsWithNoTxInCurrentShard(scrsWithNoTxInCurrentShard, string(scr.OriginalTxHash), scrHandler, scrHash) - continue - } - - scrHandler.SetExecutionOrder(tx.GetExecutionOrder()) - } - - setExecutionOrderScrsWithNoTxInCurrentShard(scrsWithNoTxInCurrentShard, scrsToMe) - - return scheduledExecutedSCRsPrevBlock -} - -func groupScrsWithNoTxInCurrentShard(scrsWithNoTxInCurrentShard map[string]map[string]data.TransactionHandlerWithGasUsedAndFee, originalTxHash string, scrHandler data.TransactionHandlerWithGasUsedAndFee, scrHash string) { - _, ok := scrsWithNoTxInCurrentShard[originalTxHash] - if !ok { - scrsWithNoTxInCurrentShard[originalTxHash] = make(map[string]data.TransactionHandlerWithGasUsedAndFee, 0) - } - - scrsWithNoTxInCurrentShard[originalTxHash][scrHash] = scrHandler -} - -func setExecutionOrderScrsWithNoTxInCurrentShard(groupedScrsByOriginalTxHash map[string]map[string]data.TransactionHandlerWithGasUsedAndFee, scrsToMe map[string]data.TransactionHandlerWithGasUsedAndFee) { - for _, scrsGrouped := range groupedScrsByOriginalTxHash { - maxOrder := 0 - for _, scr := range scrsGrouped { - if maxOrder < scr.GetExecutionOrder() { - maxOrder = scr.GetExecutionOrder() - } - } - - for scrHash, scr := range scrsGrouped { - _, isSCRToMe := scrsToMe[scrHash] - if isSCRToMe { - continue - } - - scr.SetExecutionOrder(maxOrder) - } - } -} diff --git a/outport/process/executionOrder/scrs_test.go b/outport/process/executionOrder/scrs_test.go deleted file mode 100644 index 2bf139eb923..00000000000 --- a/outport/process/executionOrder/scrs_test.go +++ /dev/null @@ -1,55 +0,0 @@ -package executionOrder - -import ( - "testing" - - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/block" - "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-core-go/data/smartContractResult" - "github.com/multiversx/mx-chain-core-go/data/transaction" - "github.com/stretchr/testify/require" -) - -func newScr(nonce uint64, originalTxHash string, execOrder int) data.TransactionHandlerWithGasUsedAndFee { - return &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{ - Nonce: nonce, - OriginalTxHash: []byte(originalTxHash), - }, - ExecutionOrder: execOrder, - } -} - -func TestSetOrderSmartContractResults(t *testing.T) { - t.Parallel() - - txHash, txHashNotInPool, scrHash1, scrsHash2, scrsHash3, scrHashToMe := "tx", "txHashNotInPool", "scr1", "scr2", "scr3", "scrHashToMe" - pool := &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - txHash: &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{}, ExecutionOrder: 1}, - }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - scrHash1: newScr(0, txHash, 0), - scrsHash2: newScr(1, txHashNotInPool, 0), - scrsHash3: newScr(2, txHashNotInPool, 2), - scrHashToMe: newScr(3, txHashNotInPool, 1), - }, - } - - setOrderSmartContractResults(pool, []*block.MiniBlock{}, map[string]data.TransactionHandlerWithGasUsedAndFee{ - scrHashToMe: newScr(3, txHashNotInPool, 1), - }) - - require.Equal(t, &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - txHash: &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{}, ExecutionOrder: 1}, - }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - scrHash1: newScr(0, txHash, 1), - scrsHash2: newScr(1, txHashNotInPool, 2), - scrsHash3: newScr(2, txHashNotInPool, 2), - scrHashToMe: newScr(3, txHashNotInPool, 1), - }, - }, pool) -} diff --git a/outport/process/executionOrder/transactionsExecutionOrder.go b/outport/process/executionOrder/transactionsExecutionOrder.go deleted file mode 100644 index 06fe9958968..00000000000 --- a/outport/process/executionOrder/transactionsExecutionOrder.go +++ /dev/null @@ -1,299 +0,0 @@ -package executionOrder - -import ( - "encoding/hex" - "fmt" - - "github.com/multiversx/mx-chain-core-go/core" - "github.com/multiversx/mx-chain-core-go/core/check" - txsSort "github.com/multiversx/mx-chain-core-go/core/transaction" - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/block" - "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-core-go/hashing" - "github.com/multiversx/mx-chain-go/common" - processOut "github.com/multiversx/mx-chain-go/outport/process" - "github.com/multiversx/mx-chain-go/process" - logger "github.com/multiversx/mx-chain-logger-go" -) - -var log = logger.GetOrCreate("outport/process/executionOrder") - -type sorter struct { - mbsGetter mbsGetter - hasher hashing.Hasher - enableEpochsHandler common.EnableEpochsHandler -} - -// NewSorter will create a new instance of sorter -func NewSorter(arg ArgSorter) (*sorter, error) { - if check.IfNil(arg.Hasher) { - return nil, process.ErrNilHasher - } - if check.IfNil(arg.Marshaller) { - return nil, process.ErrNilMarshalizer - } - if check.IfNil(arg.MbsStorer) { - return nil, processOut.ErrNilStorer - } - if check.IfNil(arg.EnableEpochsHandler) { - return nil, process.ErrNilEnableEpochsHandler - } - - return &sorter{ - mbsGetter: newMiniblocksGetter(arg.MbsStorer, arg.Marshaller), - hasher: arg.Hasher, - enableEpochsHandler: arg.EnableEpochsHandler, - }, nil -} - -// PutExecutionOrderInTransactionPool will put the execution order for every transaction and smart contract result -func (s *sorter) PutExecutionOrderInTransactionPool( - pool *outport.Pool, - header data.HeaderHandler, - body data.BodyHandler, - prevHeader data.HeaderHandler, -) ([]string, []string, error) { - blockBody, ok := body.(*block.Body) - if !ok { - log.Warn("s.PutExecutionOrderInTransactionPool cannot cast BodyHandler to *Body") - return nil, nil, nil - } - - scheduledMbsFromPreviousBlock, err := s.mbsGetter.GetScheduledMBs(header, prevHeader) - if err != nil { - return nil, nil, err - } - - // already sorted - resultsTxsToMe, err := extractNormalTransactionAndScrsToMe(pool, blockBody, header) - if err != nil { - return nil, nil, err - } - - // need to be sorted - resultTxsFromMe, err := s.extractTransactionsGroupedFromMe(pool, blockBody, header, scheduledMbsFromPreviousBlock) - if err != nil { - return nil, nil, err - } - - s.sortTransactions(resultTxsFromMe.transactionsFromMe, header) - - rewardsTxs, err := getRewardsTxsFromMe(pool, blockBody, header) - if err != nil { - return nil, nil, err - } - - // scheduled from me, need to be sorted - s.sortTransactions(resultTxsFromMe.scheduledTransactionsFromMe, header) - - allTransaction := append(resultsTxsToMe.transactionsToMe, resultTxsFromMe.transactionsFromMe...) - allTransaction = append(allTransaction, rewardsTxs...) - allTransaction = append(allTransaction, resultsTxsToMe.scheduledTransactionsToMe...) - allTransaction = append(allTransaction, resultTxsFromMe.scheduledTransactionsFromMe...) - - for idx, tx := range allTransaction { - tx.SetExecutionOrder(idx) - } - - scheduledExecutedSCRSHashesPrevBlock := setOrderSmartContractResults(pool, scheduledMbsFromPreviousBlock, resultsTxsToMe.scrsToMe) - - return scheduledExecutedSCRSHashesPrevBlock, resultTxsFromMe.scheduledExecutedInvalidTxsHashesPrevBlock, nil -} - -func (s *sorter) sortTransactions(transactions []data.TransactionHandlerWithGasUsedAndFee, header data.HeaderHandler) { - if s.enableEpochsHandler.IsFrontRunningProtectionFlagEnabled() { - txsSort.SortTransactionsBySenderAndNonceWithFrontRunningProtectionExtendedTransactions(transactions, s.hasher, header.GetPrevRandSeed()) - } else { - txsSort.SortTransactionsBySenderAndNonceExtendedTransactions(transactions) - } -} - -func (s *sorter) extractTransactionsGroupedFromMe( - pool *outport.Pool, blockBody *block.Body, header data.HeaderHandler, scheduledMbsFromPreviousBlock []*block.MiniBlock, -) (*resultsTransactionsFromMe, error) { - transactionsFromMe := make([]data.TransactionHandlerWithGasUsedAndFee, 0) - scheduledTransactionsFromMe := make([]data.TransactionHandlerWithGasUsedAndFee, 0) - - scheduledExecutedInvalidTxsHashesPrevBlock := make([]string, 0) - for mbIndex, mb := range blockBody.MiniBlocks { - var txs []data.TransactionHandlerWithGasUsedAndFee - var err error - if isScheduledMBProcessed(header, mbIndex) { - continue - } - - isFromMe := mb.SenderShardID == header.GetShardID() - if !isFromMe { - continue - } - - if mb.Type == block.TxBlock { - txs, err = extractTxsFromMap(mb.TxHashes, pool.Txs) - } - if mb.Type == block.InvalidBlock { - var scheduledExecutedInvalidTxsHashesCurrentMB []string - txs, scheduledExecutedInvalidTxsHashesCurrentMB, err = s.getInvalidTxsExecutedInCurrentBlock(scheduledMbsFromPreviousBlock, mb, pool) - scheduledExecutedInvalidTxsHashesPrevBlock = append(scheduledExecutedInvalidTxsHashesPrevBlock, scheduledExecutedInvalidTxsHashesCurrentMB...) - } - - if err != nil { - return nil, err - } - - if isScheduledMBNotProcessed(header, mbIndex) { - scheduledTransactionsFromMe = append(scheduledTransactionsFromMe, txs...) - } else { - transactionsFromMe = append(transactionsFromMe, txs...) - } - } - - return &resultsTransactionsFromMe{ - transactionsFromMe: transactionsFromMe, - scheduledTransactionsFromMe: scheduledTransactionsFromMe, - scheduledExecutedInvalidTxsHashesPrevBlock: scheduledExecutedInvalidTxsHashesPrevBlock, - }, nil -} - -func (s *sorter) getInvalidTxsExecutedInCurrentBlock(scheduledMbsFromPreviousBlock []*block.MiniBlock, mb *block.MiniBlock, pool *outport.Pool) ([]data.TransactionHandlerWithGasUsedAndFee, []string, error) { - if len(scheduledMbsFromPreviousBlock) == 0 { - txs, err := extractTxsFromMap(mb.TxHashes, pool.Invalid) - return txs, []string{}, err - } - - allScheduledTxs := make(map[string]struct{}) - for _, scheduledMb := range scheduledMbsFromPreviousBlock { - for _, txHash := range scheduledMb.TxHashes { - allScheduledTxs[string(txHash)] = struct{}{} - } - } - - scheduledExecutedInvalidTxsHashesPrevBlock := make([]string, 0) - invalidTxHashes := make([][]byte, 0) - for _, hash := range mb.TxHashes { - _, found := allScheduledTxs[string(hash)] - if found { - scheduledExecutedInvalidTxsHashesPrevBlock = append(scheduledExecutedInvalidTxsHashesPrevBlock, string(hash)) - continue - } - invalidTxHashes = append(invalidTxHashes, hash) - } - - txs, err := extractTxsFromMap(invalidTxHashes, pool.Invalid) - return txs, scheduledExecutedInvalidTxsHashesPrevBlock, err -} - -func extractNormalTransactionAndScrsToMe(pool *outport.Pool, blockBody *block.Body, header data.HeaderHandler) (*resultsTransactionsToMe, error) { - transactionsToMe := make([]data.TransactionHandlerWithGasUsedAndFee, 0) - scheduledTransactionsToMe := make([]data.TransactionHandlerWithGasUsedAndFee, 0) - scrsToMe := make(map[string]data.TransactionHandlerWithGasUsedAndFee) - - for mbIndex, mb := range blockBody.MiniBlocks { - var err error - var txs []data.TransactionHandlerWithGasUsedAndFee - if isScheduledMBProcessed(header, mbIndex) { - continue - } - - isToMeCross := mb.ReceiverShardID == header.GetShardID() && mb.SenderShardID != mb.ReceiverShardID - if !isToMeCross { - continue - } - - executedTxsHashes := extractExecutedTxHashes(mbIndex, mb.TxHashes, header) - if mb.Type == block.TxBlock { - txs, err = extractTxsFromMap(executedTxsHashes, pool.Txs) - } - if mb.Type == block.SmartContractResultBlock { - txs, err = extractTxsFromMap(executedTxsHashes, pool.Scrs) - extractAndPutScrsToDestinationMap(executedTxsHashes, pool.Scrs, scrsToMe) - } - if mb.Type == block.RewardsBlock { - txs, err = extractTxsFromMap(executedTxsHashes, pool.Rewards) - } - if err != nil { - return nil, err - } - - if isScheduledMBNotProcessed(header, mbIndex) { - scheduledTransactionsToMe = append(scheduledTransactionsToMe, txs...) - } else { - transactionsToMe = append(transactionsToMe, txs...) - } - } - - return &resultsTransactionsToMe{ - transactionsToMe: transactionsToMe, - scheduledTransactionsToMe: scheduledTransactionsToMe, - scrsToMe: scrsToMe, - }, nil -} - -func getRewardsTxsFromMe(pool *outport.Pool, blockBody *block.Body, header data.HeaderHandler) ([]data.TransactionHandlerWithGasUsedAndFee, error) { - rewardsTxsHashes := make([][]byte, 0) - rewardsTxs := make([]data.TransactionHandlerWithGasUsedAndFee, 0) - if header.GetShardID() != core.MetachainShardId { - return rewardsTxs, nil - } - - for _, mb := range blockBody.MiniBlocks { - if mb.Type != block.RewardsBlock { - continue - } - rewardsTxsHashes = append(rewardsTxsHashes, mb.TxHashes...) - } - - return extractTxsFromMap(rewardsTxsHashes, pool.Rewards) -} - -func extractTxsFromMap(txsHashes [][]byte, txs map[string]data.TransactionHandlerWithGasUsedAndFee) ([]data.TransactionHandlerWithGasUsedAndFee, error) { - result := make([]data.TransactionHandlerWithGasUsedAndFee, 0, len(txsHashes)) - for _, txHash := range txsHashes { - tx, found := txs[string(txHash)] - if !found { - return nil, fmt.Errorf("cannot find transaction in pool, txHash: %s", hex.EncodeToString(txHash)) - } - result = append(result, tx) - } - - return result, nil -} - -func extractExecutedTxHashes(mbIndex int, mbTxHashes [][]byte, header data.HeaderHandler) [][]byte { - miniblockHeaders := header.GetMiniBlockHeaderHandlers() - if len(miniblockHeaders) <= mbIndex { - return mbTxHashes - } - - firstProcessed := miniblockHeaders[mbIndex].GetIndexOfFirstTxProcessed() - lastProcessed := miniblockHeaders[mbIndex].GetIndexOfLastTxProcessed() - - return mbTxHashes[firstProcessed : lastProcessed+1] -} - -func extractAndPutScrsToDestinationMap(scrsHashes [][]byte, scrsMap, destinationMap map[string]data.TransactionHandlerWithGasUsedAndFee) { - for _, scrHash := range scrsHashes { - scr, found := scrsMap[string(scrHash)] - if !found { - continue - } - destinationMap[string(scrHash)] = scr - } -} - -func isScheduledMBProcessed(header data.HeaderHandler, mbIndex int) bool { - return getProcessingType(header, mbIndex) == int32(block.Processed) -} - -func isScheduledMBNotProcessed(header data.HeaderHandler, mbIndex int) bool { - return getProcessingType(header, mbIndex) == int32(block.Scheduled) -} - -func getProcessingType(header data.HeaderHandler, mbIndex int) int32 { - miniblockHeaders := header.GetMiniBlockHeaderHandlers() - if len(miniblockHeaders) <= mbIndex { - return int32(block.Normal) - } - - return miniblockHeaders[mbIndex].GetProcessingType() -} diff --git a/outport/process/executionOrder/transactionsExecutionOrder_test.go b/outport/process/executionOrder/transactionsExecutionOrder_test.go deleted file mode 100644 index 5fe94392217..00000000000 --- a/outport/process/executionOrder/transactionsExecutionOrder_test.go +++ /dev/null @@ -1,413 +0,0 @@ -package executionOrder - -import ( - "testing" - - "github.com/multiversx/mx-chain-core-go/core" - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/block" - "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-core-go/data/rewardTx" - "github.com/multiversx/mx-chain-core-go/data/smartContractResult" - "github.com/multiversx/mx-chain-core-go/data/transaction" - "github.com/multiversx/mx-chain-core-go/marshal" - processOut "github.com/multiversx/mx-chain-go/outport/process" - "github.com/multiversx/mx-chain-go/process" - "github.com/multiversx/mx-chain-go/testscommon" - "github.com/multiversx/mx-chain-go/testscommon/storage" - "github.com/stretchr/testify/require" -) - -func newArgStorer() ArgSorter { - return ArgSorter{ - Hasher: testscommon.KeccakMock{}, - Marshaller: testscommon.MarshalizerMock{}, - MbsStorer: testscommon.CreateMemUnit(), - EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{ - IsFrontRunningProtectionFlagEnabledField: true, - }, - } -} - -func TestNewSorter(t *testing.T) { - t.Parallel() - - arg := newArgStorer() - arg.Hasher = nil - s, err := NewSorter(arg) - require.Equal(t, process.ErrNilHasher, err) - require.Nil(t, s) - - arg = newArgStorer() - arg.Marshaller = nil - s, err = NewSorter(arg) - require.Equal(t, process.ErrNilMarshalizer, err) - require.Nil(t, s) - - arg = newArgStorer() - arg.MbsStorer = nil - s, err = NewSorter(arg) - require.Equal(t, processOut.ErrNilStorer, err) - require.Nil(t, s) - - arg = newArgStorer() - arg.EnableEpochsHandler = nil - s, err = NewSorter(arg) - require.Equal(t, processOut.ErrNilEnableEpochsHandler, err) - require.Nil(t, s) - - arg = newArgStorer() - s, err = NewSorter(arg) - require.Nil(t, err) - require.NotNil(t, s) -} - -func TestAddExecutionOrderInTransactionPool(t *testing.T) { - t.Parallel() - - randomness := "randomness" - hasher := &testscommon.HasherStub{ - ComputeCalled: func(s string) []byte { - if s == randomness { - return []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} - } - - return []byte(s) - }, - } - - arg := newArgStorer() - arg.Hasher = hasher - s, _ := NewSorter(arg) - - header := &block.Header{ - PrevRandSeed: []byte(randomness), - ShardID: 1, - } - - txHashToMe, txHashFromMe, invalidTxHash, rewardTxHash := []byte("toMe"), []byte("fromMe"), []byte("invalid"), []byte("reward") - scrHashToMe, scrHashFromMe, scrHashIntra := []byte("scrHashToMe"), []byte("scrHashFromMe"), []byte("scrHashIntra") - blockBody := &block.Body{ - MiniBlocks: []*block.MiniBlock{ - { - SenderShardID: 0, - ReceiverShardID: 1, - Type: block.TxBlock, - TxHashes: [][]byte{txHashToMe}, - }, - { - SenderShardID: 1, - ReceiverShardID: 0, - Type: block.TxBlock, - TxHashes: [][]byte{txHashFromMe}, - }, - { - SenderShardID: 1, - ReceiverShardID: 1, - Type: block.InvalidBlock, - TxHashes: [][]byte{invalidTxHash}, - }, - { - SenderShardID: 1, - ReceiverShardID: 2, - Type: block.SmartContractResultBlock, - TxHashes: [][]byte{scrHashFromMe}, - }, - { - SenderShardID: 2, - ReceiverShardID: 1, - Type: block.SmartContractResultBlock, - TxHashes: [][]byte{scrHashToMe}, - }, - { - SenderShardID: core.MetachainShardId, - ReceiverShardID: 1, - Type: block.RewardsBlock, - TxHashes: [][]byte{rewardTxHash}, - }, - }, - } - - pool := &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashToMe): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{Nonce: 1}}, - string(txHashFromMe): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{Nonce: 2}}, - }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(scrHashToMe): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &smartContractResult.SmartContractResult{Nonce: 3}}, - string(scrHashFromMe): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &smartContractResult.SmartContractResult{ - Nonce: 4, - OriginalTxHash: txHashToMe, - }}, - string(scrHashIntra): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &smartContractResult.SmartContractResult{ - Nonce: 0, - OriginalTxHash: txHashToMe, - }}, - }, - Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(rewardTxHash): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &rewardTx.RewardTx{}}, - }, - Invalid: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(invalidTxHash): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{Nonce: 5}}, - }, - Receipts: map[string]data.TransactionHandlerWithGasUsedAndFee{}, - Logs: nil, - } - - _, _, err := s.PutExecutionOrderInTransactionPool(pool, header, blockBody, &block.Header{}) - require.Nil(t, err) - - require.Equal(t, &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashToMe): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{Nonce: 1}, - ExecutionOrder: 0, - }, - string(txHashFromMe): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{Nonce: 2}, - ExecutionOrder: 3, - }, - }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(scrHashToMe): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{Nonce: 3}, - ExecutionOrder: 1, - }, - string(scrHashFromMe): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{ - Nonce: 4, - OriginalTxHash: txHashToMe, - }, - ExecutionOrder: 0, - }, - string(scrHashIntra): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{ - Nonce: 0, - OriginalTxHash: txHashToMe, - }, - ExecutionOrder: 0, - }, - }, - Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(rewardTxHash): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &rewardTx.RewardTx{}, - ExecutionOrder: 2, - }, - }, - Invalid: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(invalidTxHash): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{Nonce: 5}, - ExecutionOrder: 4, - }, - }, - Receipts: map[string]data.TransactionHandlerWithGasUsedAndFee{}, - Logs: nil, - }, pool) -} - -func TestAddExecutionOrderInTransactionPoolFromMeTransactionAndScheduled(t *testing.T) { - t.Parallel() - - randomness := "randomness" - hasher := &testscommon.HasherStub{ - ComputeCalled: func(s string) []byte { - if s == randomness { - return []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} - } - - return []byte(s) - }, - } - - arg := newArgStorer() - arg.Hasher = hasher - s, _ := NewSorter(arg) - - marshaller := &marshal.GogoProtoMarshalizer{} - - mbhr := &block.MiniBlockHeaderReserved{ - ExecutionType: block.ProcessingType(1), - } - - mbhrBytes, _ := marshaller.Marshal(mbhr) - header := &block.Header{ - PrevRandSeed: []byte(randomness), - ShardID: 1, - } - - firstTxHash, secondTxHash := []byte("t1"), []byte("t2") - blockBody := &block.Body{ - MiniBlocks: []*block.MiniBlock{ - { - SenderShardID: 1, - ReceiverShardID: 1, - Type: block.TxBlock, - Reserved: mbhrBytes, - TxHashes: [][]byte{secondTxHash}, - }, - { - SenderShardID: 1, - ReceiverShardID: 1, - Type: block.TxBlock, - TxHashes: [][]byte{firstTxHash}, - }, - }, - } - - pool := &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(firstTxHash): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{Nonce: 1}}, - string(secondTxHash): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{Nonce: 2}}, - }, - } - - _, _, err := s.PutExecutionOrderInTransactionPool(pool, header, blockBody, &block.Header{}) - require.Nil(t, err) - - require.Equal(t, &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(firstTxHash): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{Nonce: 1}, - ExecutionOrder: 0, - }, - string(secondTxHash): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{Nonce: 2}, - ExecutionOrder: 1, - }, - }, - }, pool) -} - -func TestAddExecutionOrderInTransactionPoolFromMeTransactionAndScheduledInvalid(t *testing.T) { - t.Parallel() - - randomness := "randomness" - hasher := &testscommon.HasherStub{ - ComputeCalled: func(s string) []byte { - if s == randomness { - return []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} - } - - return []byte(s) - }, - } - - marshaller := &marshal.GogoProtoMarshalizer{} - - arg := newArgStorer() - arg.Hasher = hasher - arg.Marshaller = marshaller - scheduledInvalidTxHash := []byte("scheduledInvalidTx") - scheduledTx := []byte("scheduledTx") - arg.MbsStorer = &storage.StorerStub{ - GetCalled: func(key []byte) ([]byte, error) { - mb := &block.MiniBlock{ - TxHashes: [][]byte{scheduledInvalidTxHash, scheduledTx}, - } - return marshaller.Marshal(mb) - }, - } - s, _ := NewSorter(arg) - - mbhr := &block.MiniBlockHeaderReserved{ - ExecutionType: block.ProcessingType(1), - } - - scheduledMBHash := []byte("scheduled") - scrHash := []byte("scrHash") - mbhrBytes, _ := marshaller.Marshal(mbhr) - header := &block.Header{ - PrevRandSeed: []byte(randomness), - ShardID: 1, - MiniBlockHeaders: []block.MiniBlockHeader{ - { - Type: block.InvalidBlock, - }, - }, - } - prevHeader := &block.Header{ - PrevRandSeed: []byte(randomness), - ShardID: 1, - MiniBlockHeaders: []block.MiniBlockHeader{ - { - Type: block.TxBlock, - SenderShardID: 1, - ReceiverShardID: 1, - }, - { - Hash: scheduledMBHash, - Reserved: mbhrBytes, - SenderShardID: 1, - ReceiverShardID: 1, - }, - }, - } - - firstTxHash, secondTxHash := []byte("t1"), []byte("t2") - blockBody := &block.Body{ - MiniBlocks: []*block.MiniBlock{ - { - SenderShardID: 1, - ReceiverShardID: 1, - Type: block.TxBlock, - TxHashes: [][]byte{secondTxHash}, - }, - { - SenderShardID: 1, - ReceiverShardID: 1, - Type: block.InvalidBlock, - TxHashes: [][]byte{firstTxHash, scheduledInvalidTxHash}, - }, - { - SenderShardID: 1, - ReceiverShardID: 1, - Type: block.SmartContractResultBlock, - TxHashes: [][]byte{scrHash}, - }, - }, - } - - pool := &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(secondTxHash): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{Nonce: 2}}, - }, - Invalid: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(firstTxHash): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &transaction.Transaction{Nonce: 1}}, - }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(scrHash): &outport.TransactionHandlerWithGasAndFee{TransactionHandler: &smartContractResult.SmartContractResult{ - Nonce: 3, - OriginalTxHash: scheduledTx, - }}, - }, - } - - scrsHashes, invalidTxsHashes, err := s.PutExecutionOrderInTransactionPool(pool, header, blockBody, prevHeader) - require.Nil(t, err) - require.Equal(t, &outport.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(secondTxHash): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{Nonce: 2}, - ExecutionOrder: 1, - }, - }, - Invalid: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(firstTxHash): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{Nonce: 1}, - ExecutionOrder: 0, - }, - }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(scrHash): &outport.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{ - Nonce: 3, - OriginalTxHash: scheduledTx, - }, - ExecutionOrder: 0, - }, - }, - }, pool) - - require.Equal(t, []string{string(scrHash)}, scrsHashes) - require.Equal(t, []string{string(scheduledInvalidTxHash)}, invalidTxsHashes) -} diff --git a/outport/process/factory/check.go b/outport/process/factory/check.go index b83ee5e1af0..ce224969cc2 100644 --- a/outport/process/factory/check.go +++ b/outport/process/factory/check.go @@ -47,6 +47,9 @@ func checkArgOutportDataProviderFactory(arg ArgOutportDataProviderFactory) error if check.IfNil(arg.EnableEpochsHandler) { return process.ErrNilEnableEpochsHandler } + if check.IfNil(arg.ExecutionOrderGetter) { + return process.ErrNilExecutionOrderGetter + } return nil } diff --git a/outport/process/factory/check_test.go b/outport/process/factory/check_test.go index d82e4d42479..f57c3a3e7a5 100644 --- a/outport/process/factory/check_test.go +++ b/outport/process/factory/check_test.go @@ -7,6 +7,7 @@ import ( "github.com/multiversx/mx-chain-go/outport/process/alteredaccounts" "github.com/multiversx/mx-chain-go/outport/process/transactionsfee" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/genericMocks" "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" @@ -30,6 +31,7 @@ func createArgOutportDataProviderFactory() ArgOutportDataProviderFactory { Hasher: &testscommon.KeccakMock{}, MbsStorer: &genericMocks.StorerMock{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{}, + ExecutionOrderGetter: &commonMocks.TxExecutionOrderHandlerStub{}, } } diff --git a/outport/process/factory/outportDataProviderFactory.go b/outport/process/factory/outportDataProviderFactory.go index 52cf264fa71..1ffe73adcd5 100644 --- a/outport/process/factory/outportDataProviderFactory.go +++ b/outport/process/factory/outportDataProviderFactory.go @@ -9,7 +9,6 @@ import ( "github.com/multiversx/mx-chain-go/outport/process" "github.com/multiversx/mx-chain-go/outport/process/alteredaccounts" "github.com/multiversx/mx-chain-go/outport/process/disabled" - "github.com/multiversx/mx-chain-go/outport/process/executionOrder" "github.com/multiversx/mx-chain-go/outport/process/transactionsfee" processTxs "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" @@ -36,6 +35,7 @@ type ArgOutportDataProviderFactory struct { Hasher hashing.Hasher MbsStorer storage.Storer EnableEpochsHandler common.EnableEpochsHandler + ExecutionOrderGetter common.ExecutionOrderGetter } // CreateOutportDataProvider will create a new instance of outport.DataProviderOutport @@ -69,17 +69,6 @@ func CreateOutportDataProvider(arg ArgOutportDataProviderFactory) (outport.DataP return nil, err } - argSorter := executionOrder.ArgSorter{ - Hasher: arg.Hasher, - Marshaller: arg.Marshaller, - MbsStorer: arg.MbsStorer, - EnableEpochsHandler: arg.EnableEpochsHandler, - } - executionOrderHandler, err := executionOrder.NewSorter(argSorter) - if err != nil { - return nil, err - } - return process.NewOutportDataProvider(process.ArgOutportDataProvider{ IsImportDBMode: arg.IsImportDBMode, ShardCoordinator: arg.ShardCoordinator, @@ -89,6 +78,6 @@ func CreateOutportDataProvider(arg ArgOutportDataProviderFactory) (outport.DataP NodesCoordinator: arg.NodesCoordinator, GasConsumedProvider: arg.GasConsumedProvider, EconomicsData: arg.EconomicsData, - ExecutionOrderHandler: executionOrderHandler, + ExecutionOrderHandler: arg.ExecutionOrderGetter, }) } diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 6c16ee99d07..2efa4deba9d 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -9,6 +9,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" outportcore "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/outport/process/alteredaccounts/shared" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" @@ -25,7 +26,7 @@ type ArgOutportDataProvider struct { NodesCoordinator nodesCoordinator.NodesCoordinator GasConsumedProvider GasConsumedProvider EconomicsData EconomicsDataHandler - ExecutionOrderHandler ExecutionOrderHandler + ExecutionOrderHandler common.ExecutionOrderGetter } // ArgPrepareOutportSaveBlockData holds the arguments needed for prepare outport save block data @@ -48,7 +49,7 @@ type outportDataProvider struct { nodesCoordinator nodesCoordinator.NodesCoordinator gasConsumedProvider GasConsumedProvider economicsData EconomicsDataHandler - executionOrderHandler ExecutionOrderHandler + executionOrderHandler common.ExecutionOrderGetter } // NewOutportDataProvider will create a new instance of outportDataProvider @@ -81,13 +82,7 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor return nil, fmt.Errorf("transactionsFeeProcessor.PutFeeAndGasUsed %w", err) } - scheduledExecutedSCRsHashesPrevBlock, scheduledExecutedInvalidTxsHashesPrevBlock, err := odp.executionOrderHandler.PutExecutionOrderInTransactionPool(pool, arg.Header, arg.Body, arg.PreviousHeader) - if err != nil { - return nil, fmt.Errorf("executionOrderHandler.PutExecutionOrderInTransactionPool %w", err) - } - - pool.ScheduledExecutedInvalidTxsHashesPrevBlock = scheduledExecutedInvalidTxsHashesPrevBlock - pool.ScheduledExecutedSCRSHashesPrevBlock = scheduledExecutedSCRsHashesPrevBlock + odp.setExecutionOrderInTransactionPool(pool) alteredAccounts, err := odp.alteredAccountsProvider.ExtractAlteredAccountsFromPool(pool, shared.AlteredAccountsOptions{ WithAdditionalOutportData: true, @@ -120,6 +115,39 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor }, nil } +func (odp *outportDataProvider) setExecutionOrderInTransactionPool( + pool *outportcore.Pool, +) { + orderedTxHashes := odp.executionOrderHandler.GetItems() + txGroups := []map[string]data.TransactionHandlerWithGasUsedAndFee{ + pool.Txs, + pool.Scrs, + pool.Receipts, + pool.Rewards, + } + + for i, txHash := range orderedTxHashes { + for _, group := range txGroups { + if setExecutionOrderIfFound(txHash, group, i) { + break + } + } + } +} + +func setExecutionOrderIfFound( + txHash []byte, + transactionHandlers map[string]data.TransactionHandlerWithGasUsedAndFee, + order int, +) bool { + tx, ok := transactionHandlers[string(txHash)] + if ok { + tx.SetExecutionOrder(order) + } + + return ok +} + func (odp *outportDataProvider) computeEpoch(header data.HeaderHandler) uint32 { epoch := header.GetEpoch() shouldDecreaseEpoch := header.IsStartOfEpochBlock() && epoch > 0 && odp.shardID != core.MetachainShardId diff --git a/outport/process/outportDataProvider_test.go b/outport/process/outportDataProvider_test.go index 0d7d4c75201..8a8e22409a7 100644 --- a/outport/process/outportDataProvider_test.go +++ b/outport/process/outportDataProvider_test.go @@ -7,6 +7,7 @@ import ( "github.com/multiversx/mx-chain-go/outport/mock" "github.com/multiversx/mx-chain-go/outport/process/transactionsfee" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/genericMocks" "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" "github.com/stretchr/testify/require" @@ -28,7 +29,7 @@ func createArgOutportDataProvider() ArgOutportDataProvider { GasConsumedProvider: &testscommon.GasHandlerStub{}, EconomicsData: &mock.EconomicsHandlerMock{}, ShardCoordinator: &testscommon.ShardsCoordinatorMock{}, - ExecutionOrderHandler: &mock.ExecutionOrderHandlerStub{}, + ExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } } From b67870429832e3164a38e80c7a1ce8c798125178 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 1 Feb 2023 13:36:28 +0200 Subject: [PATCH 010/120] add checks on tx order in outport data provider --- outport/process/errors.go | 12 +++++ outport/process/outportDataProvider.go | 74 +++++++++++++++++++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/outport/process/errors.go b/outport/process/errors.go index 78d1df07d36..b54faa3b03f 100644 --- a/outport/process/errors.go +++ b/outport/process/errors.go @@ -28,3 +28,15 @@ var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler") // ErrNilExecutionOrderGetter signals that a nil execution order getter has been provided var ErrNilExecutionOrderGetter = errors.New("nil execution order getter") + +// ErrWrongTypeAssertion signals that a wrong type assertion has been done +var ErrWrongTypeAssertion = errors.New("wrong type assertion") + +// ErrMiniBlocksHeadersMismatch signals that the number of miniBlock headers is different than the number of miniBlocks +var ErrMiniBlocksHeadersMismatch = errors.New("mini blocks headers mismatch") + +// ErrTransactionNotFoundInBody signals that a transaction was not found in the block body +var ErrTransactionNotFoundInBody = errors.New("transaction not found in body") + +// ErrOrderedTxNotFound signals that an ordered tx hash was not found in the pool +var ErrOrderedTxNotFound = errors.New("ordered tx not found in pool") diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 2efa4deba9d..4dc1d216683 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -1,6 +1,7 @@ package process import ( + "encoding/hex" "fmt" "math/big" @@ -14,6 +15,7 @@ import ( "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" + logger "github.com/multiversx/mx-chain-logger-go" ) // ArgOutportDataProvider holds the arguments needed for creating a new instance of outportDataProvider @@ -67,6 +69,8 @@ func NewOutportDataProvider(arg ArgOutportDataProvider) (*outportDataProvider, e }, nil } +var log = logger.GetOrCreate("outport/process/outportDataProvider") + // PrepareOutportSaveBlockData will prepare the provided data in a format that will be accepted by an outport driver func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutportSaveBlockData) (*outportcore.ArgsSaveBlockData, error) { if check.IfNil(arg.Header) { @@ -82,7 +86,11 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor return nil, fmt.Errorf("transactionsFeeProcessor.PutFeeAndGasUsed %w", err) } - odp.setExecutionOrderInTransactionPool(pool) + executedTxs, err := collectExecutedTxHashes(arg.Body, arg.Header) + if err != nil { + + } + odp.setExecutionOrderInTransactionPoolWithChecks(pool, executedTxs) alteredAccounts, err := odp.alteredAccountsProvider.ExtractAlteredAccountsFromPool(pool, shared.AlteredAccountsOptions{ WithAdditionalOutportData: true, @@ -115,8 +123,39 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor }, nil } -func (odp *outportDataProvider) setExecutionOrderInTransactionPool( +func collectExecutedTxHashes(bodyHandler data.BodyHandler, headerHandler data.HeaderHandler) (map[string]struct{}, error) { + executedTxHashes := make(map[string]struct{}) + mbHeaders := headerHandler.GetMiniBlockHeaderHandlers() + body, ok := bodyHandler.(*block.Body) + if !ok { + return nil, ErrWrongTypeAssertion + } + + miniBlocks := body.GetMiniBlocks() + if len(miniBlocks) != len(mbHeaders) { + return nil, ErrMiniBlocksHeadersMismatch + } + + for i, mbHeader := range mbHeaders { + if mbHeader.GetTypeInt32() == int32(block.PeerBlock) { + continue + } + if mbHeader.GetConstructionState() == int32(block.Processed) { + continue + } + + for j := mbHeader.GetIndexOfFirstTxProcessed(); j <= mbHeader.GetIndexOfLastTxProcessed(); j++ { + txHash := miniBlocks[i].TxHashes[j] + executedTxHashes[string(txHash)] = struct{}{} + } + } + + return executedTxHashes, nil +} + +func (odp *outportDataProvider) setExecutionOrderInTransactionPoolWithChecks( pool *outportcore.Pool, + executedTxHashes map[string]struct{}, ) { orderedTxHashes := odp.executionOrderHandler.GetItems() txGroups := []map[string]data.TransactionHandlerWithGasUsedAndFee{ @@ -126,13 +165,44 @@ func (odp *outportDataProvider) setExecutionOrderInTransactionPool( pool.Rewards, } + foundTxHashes := 0 for i, txHash := range orderedTxHashes { for _, group := range txGroups { if setExecutionOrderIfFound(txHash, group, i) { + foundTxHashes++ break } } } + + err := checkTxOrder(orderedTxHashes, executedTxHashes, foundTxHashes) + if err != nil { + log.Warn("setExecutionOrderInTransactionPoolWithChecks", "error", err.Error()) + } +} + +func checkTxOrder(orderedTxHashes [][]byte, executedTxHashes map[string]struct{}, foundTxHashes int) error { + if len(orderedTxHashes) != foundTxHashes { + return fmt.Errorf("%w for numOrderedTx %d, foundTxsInPool %d", + ErrOrderedTxNotFound, len(orderedTxHashes), foundTxHashes, + ) + } + + if len(executedTxHashes) == 0 { + return nil + } + + return checkBodyTransactionsHaveOrder(orderedTxHashes, executedTxHashes) +} + +func checkBodyTransactionsHaveOrder(orderedTxHashes [][]byte, executedTxHashes map[string]struct{}) error { + for _, txHash := range orderedTxHashes { + if _, ok := executedTxHashes[string(txHash)]; !ok { + return fmt.Errorf("%w for txHash %s", ErrTransactionNotFoundInBody, hex.EncodeToString(txHash)) + } + } + + return nil } func setExecutionOrderIfFound( From ad8653293e79c13c46506ef7c675d6736c564a97 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 1 Feb 2023 13:41:12 +0200 Subject: [PATCH 011/120] add warn --- outport/process/outportDataProvider.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 4dc1d216683..d052bf1bfcb 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -88,8 +88,9 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor executedTxs, err := collectExecutedTxHashes(arg.Body, arg.Header) if err != nil { - + log.Warn("collectExecutedTxHashes", "error", err) } + odp.setExecutionOrderInTransactionPoolWithChecks(pool, executedTxs) alteredAccounts, err := odp.alteredAccountsProvider.ExtractAlteredAccountsFromPool(pool, shared.AlteredAccountsOptions{ From 70dbb4359d4774ed99ff8433bfdb5755cc443259 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 1 Feb 2023 13:51:14 +0200 Subject: [PATCH 012/120] refactor set and check execution order --- outport/process/outportDataProvider.go | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index d052bf1bfcb..403eefdae0f 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -86,12 +86,17 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor return nil, fmt.Errorf("transactionsFeeProcessor.PutFeeAndGasUsed %w", err) } + orderedTxHashes, foundTxHashes := odp.setExecutionOrderInTransactionPool(pool) + executedTxs, err := collectExecutedTxHashes(arg.Body, arg.Header) if err != nil { - log.Warn("collectExecutedTxHashes", "error", err) + log.Warn("PrepareOutportSaveBlockData - collectExecutedTxHashes", "error", err) } - odp.setExecutionOrderInTransactionPoolWithChecks(pool, executedTxs) + err = checkTxOrder(orderedTxHashes, executedTxs, foundTxHashes) + if err != nil { + log.Warn("PrepareOutportSaveBlockData - checkTxOrder", "error", err.Error()) + } alteredAccounts, err := odp.alteredAccountsProvider.ExtractAlteredAccountsFromPool(pool, shared.AlteredAccountsOptions{ WithAdditionalOutportData: true, @@ -154,10 +159,9 @@ func collectExecutedTxHashes(bodyHandler data.BodyHandler, headerHandler data.He return executedTxHashes, nil } -func (odp *outportDataProvider) setExecutionOrderInTransactionPoolWithChecks( +func (odp *outportDataProvider) setExecutionOrderInTransactionPool( pool *outportcore.Pool, - executedTxHashes map[string]struct{}, -) { +) ([][]byte, int) { orderedTxHashes := odp.executionOrderHandler.GetItems() txGroups := []map[string]data.TransactionHandlerWithGasUsedAndFee{ pool.Txs, @@ -176,10 +180,7 @@ func (odp *outportDataProvider) setExecutionOrderInTransactionPoolWithChecks( } } - err := checkTxOrder(orderedTxHashes, executedTxHashes, foundTxHashes) - if err != nil { - log.Warn("setExecutionOrderInTransactionPoolWithChecks", "error", err.Error()) - } + return orderedTxHashes, foundTxHashes } func checkTxOrder(orderedTxHashes [][]byte, executedTxHashes map[string]struct{}, foundTxHashes int) error { From ec3a348ad96b6a08959d55b3f04cbbc43c32f96c Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 1 Feb 2023 17:11:59 +0200 Subject: [PATCH 013/120] fixes after review --- outport/process/outportDataProvider.go | 31 ++++++++++++++------------ 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 403eefdae0f..09d5b964d10 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -18,6 +18,8 @@ import ( logger "github.com/multiversx/mx-chain-logger-go" ) +var log = logger.GetOrCreate("outport/process/outportDataProvider") + // ArgOutportDataProvider holds the arguments needed for creating a new instance of outportDataProvider type ArgOutportDataProvider struct { IsImportDBMode bool @@ -69,8 +71,6 @@ func NewOutportDataProvider(arg ArgOutportDataProvider) (*outportDataProvider, e }, nil } -var log = logger.GetOrCreate("outport/process/outportDataProvider") - // PrepareOutportSaveBlockData will prepare the provided data in a format that will be accepted by an outport driver func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutportSaveBlockData) (*outportcore.ArgsSaveBlockData, error) { if check.IfNil(arg.Header) { @@ -143,22 +143,26 @@ func collectExecutedTxHashes(bodyHandler data.BodyHandler, headerHandler data.He } for i, mbHeader := range mbHeaders { - if mbHeader.GetTypeInt32() == int32(block.PeerBlock) { - continue - } - if mbHeader.GetConstructionState() == int32(block.Processed) { - continue - } - - for j := mbHeader.GetIndexOfFirstTxProcessed(); j <= mbHeader.GetIndexOfLastTxProcessed(); j++ { - txHash := miniBlocks[i].TxHashes[j] - executedTxHashes[string(txHash)] = struct{}{} - } + extractExecutedTxsFromMb(mbHeader, miniBlocks[i], executedTxHashes) } return executedTxHashes, nil } +func extractExecutedTxsFromMb(mbHeader data.MiniBlockHeaderHandler, miniBlock *block.MiniBlock, executedTxHashes map[string]struct{}) { + if mbHeader.GetTypeInt32() == int32(block.PeerBlock) { + return + } + if mbHeader.GetConstructionState() == int32(block.Processed) { + return + } + + for j := mbHeader.GetIndexOfFirstTxProcessed(); j <= mbHeader.GetIndexOfLastTxProcessed(); j++ { + txHash := miniBlock.TxHashes[j] + executedTxHashes[string(txHash)] = struct{}{} + } +} + func (odp *outportDataProvider) setExecutionOrderInTransactionPool( pool *outportcore.Pool, ) ([][]byte, int) { @@ -166,7 +170,6 @@ func (odp *outportDataProvider) setExecutionOrderInTransactionPool( txGroups := []map[string]data.TransactionHandlerWithGasUsedAndFee{ pool.Txs, pool.Scrs, - pool.Receipts, pool.Rewards, } From aacfa408f549481177fb066d1a95b692e5e2a97c Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 3 Feb 2023 18:58:00 +0200 Subject: [PATCH 014/120] add unit tests --- outport/process/errors.go | 27 +- outport/process/outportDataProvider.go | 62 ++- outport/process/outportDataProvider_test.go | 499 +++++++++++++++++++- 3 files changed, 569 insertions(+), 19 deletions(-) diff --git a/outport/process/errors.go b/outport/process/errors.go index b54faa3b03f..48f1b1ea4f6 100644 --- a/outport/process/errors.go +++ b/outport/process/errors.go @@ -11,11 +11,11 @@ var ErrNilNodesCoordinator = errors.New("validator group selector is nil") // ErrNilTransactionCoordinator signals that transaction coordinator is nil var ErrNilTransactionCoordinator = errors.New("transaction coordinator is nil") -// errNilHeaderHandler signal that provided header handler is nil -var errNilHeaderHandler = errors.New("nil header handler") +// ErrNilHeaderHandler signal that provided header handler is nil +var ErrNilHeaderHandler = errors.New("nil header handler") -// errNilBodyHandler signal that provided body handler is nil -var errNilBodyHandler = errors.New("nil body handler") +// ErrNilBodyHandler signal that provided body handler is nil +var ErrNilBodyHandler = errors.New("nil body handler") // ErrNilHasher signals that a nil hasher has been provided var ErrNilHasher = errors.New("nil hasher provided") @@ -35,8 +35,23 @@ var ErrWrongTypeAssertion = errors.New("wrong type assertion") // ErrMiniBlocksHeadersMismatch signals that the number of miniBlock headers is different than the number of miniBlocks var ErrMiniBlocksHeadersMismatch = errors.New("mini blocks headers mismatch") -// ErrTransactionNotFoundInBody signals that a transaction was not found in the block body -var ErrTransactionNotFoundInBody = errors.New("transaction not found in body") +// ErrExecutedTxNotFoundInOrderedTxs signals that a transaction that was executed was not found in the ordered transactions +var ErrExecutedTxNotFoundInOrderedTxs = errors.New("executed tx not found in ordered txs") // ErrOrderedTxNotFound signals that an ordered tx hash was not found in the pool var ErrOrderedTxNotFound = errors.New("ordered tx not found in pool") + +// ErrNilMiniBlockHeaderHandler signals that a nil miniBlock header handler has been provided +var ErrNilMiniBlockHeaderHandler = errors.New("nil miniBlock header handler") + +// ErrNilMiniBlock signals that a nil miniBlock has been provided +var ErrNilMiniBlock = errors.New("nil miniBlock") + +// ErrNilExecutedTxHashes signals that a nil executed tx hashes map has been provided +var ErrNilExecutedTxHashes = errors.New("nil executed tx hashes map") + +// ErrNilOrderedTxHashes signals that a nil ordered tx list has been provided +var ErrNilOrderedTxHashes = errors.New("nil ordered tx list") + +// ErrIndexOutOfBounds signals that an index is out of bounds +var ErrIndexOutOfBounds = errors.New("index out of bounds") diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 09d5b964d10..5c41edde458 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -74,10 +74,10 @@ func NewOutportDataProvider(arg ArgOutportDataProvider) (*outportDataProvider, e // PrepareOutportSaveBlockData will prepare the provided data in a format that will be accepted by an outport driver func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutportSaveBlockData) (*outportcore.ArgsSaveBlockData, error) { if check.IfNil(arg.Header) { - return nil, errNilHeaderHandler + return nil, ErrNilHeaderHandler } if check.IfNil(arg.Body) { - return nil, errNilBodyHandler + return nil, ErrNilBodyHandler } pool := odp.createPool(arg.RewardsTxs) @@ -130,6 +130,13 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor } func collectExecutedTxHashes(bodyHandler data.BodyHandler, headerHandler data.HeaderHandler) (map[string]struct{}, error) { + if check.IfNil(bodyHandler) { + return nil, ErrNilBodyHandler + } + if check.IfNil(headerHandler) { + return nil, ErrNilHeaderHandler + } + executedTxHashes := make(map[string]struct{}) mbHeaders := headerHandler.GetMiniBlockHeaderHandlers() body, ok := bodyHandler.(*block.Body) @@ -142,31 +149,53 @@ func collectExecutedTxHashes(bodyHandler data.BodyHandler, headerHandler data.He return nil, ErrMiniBlocksHeadersMismatch } + var err error for i, mbHeader := range mbHeaders { - extractExecutedTxsFromMb(mbHeader, miniBlocks[i], executedTxHashes) + err = extractExecutedTxsFromMb(mbHeader, miniBlocks[i], executedTxHashes) + if err != nil { + return nil, err + } } return executedTxHashes, nil } -func extractExecutedTxsFromMb(mbHeader data.MiniBlockHeaderHandler, miniBlock *block.MiniBlock, executedTxHashes map[string]struct{}) { +func extractExecutedTxsFromMb(mbHeader data.MiniBlockHeaderHandler, miniBlock *block.MiniBlock, executedTxHashes map[string]struct{}) error { + if mbHeader == nil { + return ErrNilMiniBlockHeaderHandler + } + if miniBlock == nil { + return ErrNilMiniBlock + } + if executedTxHashes == nil { + return ErrNilExecutedTxHashes + } if mbHeader.GetTypeInt32() == int32(block.PeerBlock) { - return + return nil } - if mbHeader.GetConstructionState() == int32(block.Processed) { - return + if mbHeader.GetProcessingType() == int32(block.Processed) { + return nil } + if int(mbHeader.GetIndexOfLastTxProcessed()) > len(miniBlock.TxHashes) { + return ErrIndexOutOfBounds + } for j := mbHeader.GetIndexOfFirstTxProcessed(); j <= mbHeader.GetIndexOfLastTxProcessed(); j++ { txHash := miniBlock.TxHashes[j] executedTxHashes[string(txHash)] = struct{}{} } + + return nil } func (odp *outportDataProvider) setExecutionOrderInTransactionPool( pool *outportcore.Pool, ) ([][]byte, int) { orderedTxHashes := odp.executionOrderHandler.GetItems() + if pool == nil { + return orderedTxHashes, 0 + } + txGroups := []map[string]data.TransactionHandlerWithGasUsedAndFee{ pool.Txs, pool.Scrs, @@ -187,7 +216,7 @@ func (odp *outportDataProvider) setExecutionOrderInTransactionPool( } func checkTxOrder(orderedTxHashes [][]byte, executedTxHashes map[string]struct{}, foundTxHashes int) error { - if len(orderedTxHashes) != foundTxHashes { + if len(orderedTxHashes) > foundTxHashes { return fmt.Errorf("%w for numOrderedTx %d, foundTxsInPool %d", ErrOrderedTxNotFound, len(orderedTxHashes), foundTxHashes, ) @@ -201,12 +230,23 @@ func checkTxOrder(orderedTxHashes [][]byte, executedTxHashes map[string]struct{} } func checkBodyTransactionsHaveOrder(orderedTxHashes [][]byte, executedTxHashes map[string]struct{}) error { + if executedTxHashes == nil { + return ErrNilExecutedTxHashes + } + if orderedTxHashes == nil { + return ErrNilOrderedTxHashes + } + + orderedTxHashesMap := make(map[string]struct{}) for _, txHash := range orderedTxHashes { - if _, ok := executedTxHashes[string(txHash)]; !ok { - return fmt.Errorf("%w for txHash %s", ErrTransactionNotFoundInBody, hex.EncodeToString(txHash)) - } + orderedTxHashesMap[string(txHash)] = struct{}{} } + for executedTxHash, _ := range executedTxHashes { + if _, ok := orderedTxHashesMap[executedTxHash]; !ok { + return fmt.Errorf("%w for txHash %s", ErrExecutedTxNotFoundInOrderedTxs, hex.EncodeToString([]byte(executedTxHash))) + } + } return nil } diff --git a/outport/process/outportDataProvider_test.go b/outport/process/outportDataProvider_test.go index 8a8e22409a7..a18ea3616e5 100644 --- a/outport/process/outportDataProvider_test.go +++ b/outport/process/outportDataProvider_test.go @@ -1,9 +1,17 @@ package process import ( + "crypto/rand" + "errors" + "fmt" "testing" + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" + outportcore "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-core-go/data/rewardTx" + "github.com/multiversx/mx-chain-core-go/data/smartContractResult" + "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/outport/mock" "github.com/multiversx/mx-chain-go/outport/process/transactionsfee" "github.com/multiversx/mx-chain-go/testscommon" @@ -49,7 +57,7 @@ func TestPrepareOutportSaveBlockDataNilHeader(t *testing.T) { outportDataP, _ := NewOutportDataProvider(arg) _, err := outportDataP.PrepareOutportSaveBlockData(ArgPrepareOutportSaveBlockData{}) - require.Equal(t, errNilHeaderHandler, err) + require.Equal(t, ErrNilHeaderHandler, err) } func TestPrepareOutportSaveBlockDataNilBody(t *testing.T) { @@ -61,7 +69,7 @@ func TestPrepareOutportSaveBlockDataNilBody(t *testing.T) { _, err := outportDataP.PrepareOutportSaveBlockData(ArgPrepareOutportSaveBlockData{ Header: &block.Header{}, }) - require.Equal(t, errNilBodyHandler, err) + require.Equal(t, ErrNilBodyHandler, err) } func TestPrepareOutportSaveBlockData(t *testing.T) { @@ -92,3 +100,490 @@ func TestPrepareOutportSaveBlockData(t *testing.T) { require.NotNil(t, res.HeaderGasConsumption) require.NotNil(t, res.TransactionsPool) } + +func Test_extractExecutedTxsFromMb(t *testing.T) { + t.Parallel() + + t.Run("nil mini block header", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + err := extractExecutedTxsFromMb(nil, &block.MiniBlock{}, executedTxHashes) + require.Equal(t, ErrNilMiniBlockHeaderHandler, err) + require.Equal(t, 0, len(executedTxHashes)) + }) + t.Run("nil mini block", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + err := extractExecutedTxsFromMb(&block.MiniBlockHeader{}, nil, executedTxHashes) + require.Equal(t, ErrNilMiniBlock, err) + require.Equal(t, 0, len(executedTxHashes)) + }) + t.Run("nil executed tx hashes", func(t *testing.T) { + err := extractExecutedTxsFromMb(&block.MiniBlockHeader{}, &block.MiniBlock{}, nil) + require.Equal(t, ErrNilExecutedTxHashes, err) + }) + t.Run("should skip peer miniBlocks", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + mbHeader := &block.MiniBlockHeader{ + Type: block.PeerBlock, + } + err := extractExecutedTxsFromMb(mbHeader, &block.MiniBlock{}, executedTxHashes) + require.Nil(t, err) + require.Equal(t, 0, len(executedTxHashes)) + }) + t.Run("should skip processed miniBlocks", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + mbs, mbHeaders := createMbsAndMbHeaders(1, 10) + mbHeaders[0].Type = block.TxBlock + err := mbHeaders[0].SetProcessingType(int32(block.Processed)) + require.Nil(t, err) + + err = extractExecutedTxsFromMb(&mbHeaders[0], mbs[0], executedTxHashes) + require.Nil(t, err) + require.Equal(t, 0, len(executedTxHashes)) + }) + + t.Run("should only return processed range (first txs in range)", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + mbs, mbHeaders := createMbsAndMbHeaders(1, 10) + mbHeaders[0].Type = block.TxBlock + _ = mbHeaders[0].SetIndexOfFirstTxProcessed(0) + _ = mbHeaders[0].SetIndexOfLastTxProcessed(5) + + err := extractExecutedTxsFromMb(&mbHeaders[0], mbs[0], executedTxHashes) + require.Nil(t, err) + require.Equal(t, 6, len(executedTxHashes)) + for i := 0; i < 6; i++ { + _, ok := executedTxHashes[string(mbs[0].TxHashes[i])] + require.True(t, ok) + } + }) + t.Run("should only return processed range (last txs in range)", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + mbs, mbHeaders := createMbsAndMbHeaders(1, 10) + mbHeaders[0].Type = block.TxBlock + _ = mbHeaders[0].SetIndexOfFirstTxProcessed(5) + _ = mbHeaders[0].SetIndexOfLastTxProcessed(9) + + err := extractExecutedTxsFromMb(&mbHeaders[0], mbs[0], executedTxHashes) + require.Nil(t, err) + require.Equal(t, 5, len(executedTxHashes)) + for i := 5; i < 10; i++ { + _, ok := executedTxHashes[string(mbs[0].TxHashes[i])] + require.True(t, ok) + } + }) + t.Run("should only return processed range (middle txs in range)", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + mbs, mbHeaders := createMbsAndMbHeaders(1, 10) + mbHeaders[0].Type = block.TxBlock + _ = mbHeaders[0].SetIndexOfFirstTxProcessed(3) + _ = mbHeaders[0].SetIndexOfLastTxProcessed(7) + + err := extractExecutedTxsFromMb(&mbHeaders[0], mbs[0], executedTxHashes) + require.Nil(t, err) + require.Equal(t, 5, len(executedTxHashes)) + for i := 3; i < 8; i++ { + _, ok := executedTxHashes[string(mbs[0].TxHashes[i])] + require.True(t, ok) + } + }) + t.Run("should only return processed range (all txs in range)", func(t *testing.T) { + executedTxHashes := make(map[string]struct{}) + mbs, mbHeaders := createMbsAndMbHeaders(1, 10) + mbHeaders[0].Type = block.TxBlock + _ = mbHeaders[0].SetIndexOfFirstTxProcessed(0) + _ = mbHeaders[0].SetIndexOfLastTxProcessed(9) + + err := extractExecutedTxsFromMb(&mbHeaders[0], mbs[0], executedTxHashes) + require.Nil(t, err) + require.Equal(t, 10, len(executedTxHashes)) + for i := 0; i < 10; i++ { + _, ok := executedTxHashes[string(mbs[0].TxHashes[i])] + require.True(t, ok) + } + }) +} + +func Test_setExecutionOrderInTransactionPool(t *testing.T) { + t.Parallel() + + t.Run("nil pool", func(t *testing.T) { + args := createArgOutportDataProvider() + odp, _ := NewOutportDataProvider(args) + txHashes := createRandTxHashes(10) + odp.executionOrderHandler = &commonMocks.TxExecutionOrderHandlerStub{ + GetItemsCalled: func() [][]byte { + return txHashes + }, + } + + orderedHashes, numProcessed := odp.setExecutionOrderInTransactionPool(nil) + require.Equal(t, 0, numProcessed) + require.Equal(t, len(txHashes), len(orderedHashes)) + for i := 0; i < len(txHashes); i++ { + require.Equal(t, txHashes[i], orderedHashes[i]) + } + }) + t.Run("nil pool txs, scrs, rewards", func(t *testing.T) { + args := createArgOutportDataProvider() + odp, _ := NewOutportDataProvider(args) + pool := &outportcore.Pool{ + Txs: nil, + Scrs: nil, + Rewards: nil, + } + + txHashes := createRandTxHashes(10) + odp.executionOrderHandler = &commonMocks.TxExecutionOrderHandlerStub{ + GetItemsCalled: func() [][]byte { + return txHashes + }, + } + + orderedHashes, numProcessed := odp.setExecutionOrderInTransactionPool(pool) + require.Equal(t, 0, numProcessed) + require.Equal(t, len(txHashes), len(orderedHashes)) + }) + t.Run("transactions not found in pool txsm, scrs or rewards", func(t *testing.T) { + args := createArgOutportDataProvider() + odp, _ := NewOutportDataProvider(args) + pool := &outportcore.Pool{ + Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ + "tx1": &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &transaction.Transaction{ + Nonce: 0, + }, + }, + }, + Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ + "scr1": &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &smartContractResult.SmartContractResult{ + Nonce: 0, + }, + }, + }, + Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ + "reward1": &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &rewardTx.RewardTx{ + Epoch: 0, + }, + }, + }, + } + + txHashes := createRandTxHashes(10) + odp.executionOrderHandler = &commonMocks.TxExecutionOrderHandlerStub{ + GetItemsCalled: func() [][]byte { + return txHashes + }, + } + + orderedHashes, numProcessed := odp.setExecutionOrderInTransactionPool(pool) + require.Equal(t, 0, numProcessed) + require.Equal(t, len(txHashes), len(orderedHashes)) + }) + + t.Run("transactions partially found (first txs in list) in pool txsm, scrs or rewards", func(t *testing.T) { + args := createArgOutportDataProvider() + odp, _ := NewOutportDataProvider(args) + txHashes := createRandTxHashes(10) + pool := &outportcore.Pool{ + Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ + string(txHashes[0]): &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &transaction.Transaction{ + Nonce: 0, + }, + }, + }, + Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ + string(txHashes[1]): &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &smartContractResult.SmartContractResult{ + Nonce: 0, + }, + }, + }, + Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ + string(txHashes[2]): &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &rewardTx.RewardTx{ + Epoch: 0, + }, + }, + }, + } + + odp.executionOrderHandler = &commonMocks.TxExecutionOrderHandlerStub{ + GetItemsCalled: func() [][]byte { + return txHashes + }, + } + + orderedHashes, numProcessed := odp.setExecutionOrderInTransactionPool(pool) + require.Equal(t, 3, numProcessed) + require.Equal(t, pool.Txs[string(txHashes[0])].GetExecutionOrder(), 0) + require.Equal(t, pool.Scrs[string(txHashes[1])].GetExecutionOrder(), 1) + require.Equal(t, pool.Rewards[string(txHashes[2])].GetExecutionOrder(), 2) + require.Equal(t, len(txHashes), len(orderedHashes)) + }) + t.Run("transactions partially found (last txs in list) in pool txsm, scrs or rewards", func(t *testing.T) { + args := createArgOutportDataProvider() + odp, _ := NewOutportDataProvider(args) + txHashes := createRandTxHashes(10) + pool := &outportcore.Pool{ + Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ + string(txHashes[7]): &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &transaction.Transaction{ + Nonce: 0, + }, + }, + }, + Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ + string(txHashes[8]): &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &smartContractResult.SmartContractResult{ + Nonce: 0, + }, + }, + }, + Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ + string(txHashes[9]): &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &rewardTx.RewardTx{ + Epoch: 0, + }, + }, + }, + } + + odp.executionOrderHandler = &commonMocks.TxExecutionOrderHandlerStub{ + GetItemsCalled: func() [][]byte { + return txHashes + }, + } + + orderedHashes, numProcessed := odp.setExecutionOrderInTransactionPool(pool) + require.Equal(t, 3, numProcessed) + require.Equal(t, pool.Txs[string(txHashes[7])].GetExecutionOrder(), 7) + require.Equal(t, pool.Scrs[string(txHashes[8])].GetExecutionOrder(), 8) + require.Equal(t, pool.Rewards[string(txHashes[9])].GetExecutionOrder(), 9) + require.Equal(t, len(txHashes), len(orderedHashes)) + }) +} + +func Test_checkTxOrder(t *testing.T) { + t.Parallel() + + t.Run("nil ordered txHashes", func(t *testing.T) { + err := checkTxOrder(nil, make(map[string]struct{}), 0) + require.Equal(t, ErrNilOrderedTxHashes, err) + }) + t.Run("nil executed txHashes", func(t *testing.T) { + err := checkTxOrder(make([][]byte, 0), nil, 0) + require.Equal(t, ErrNilExecutedTxHashes, err) + }) + t.Run("foundTxHashes < len(orderedTxHashes)", func(t *testing.T) { + err := checkTxOrder(make([][]byte, 0), make(map[string]struct{}), 0) + require.True(t, errors.Is(err, ErrOrderedTxNotFound)) + }) + t.Run("foundTxHashes == len(orderedTxHashes) and all txHashes found", func(t *testing.T) { + orderedTxHashes := createRandTxHashes(10) + executedTxHashes := make(map[string]struct{}) + for _, txHash := range orderedTxHashes { + executedTxHashes[string(txHash)] = struct{}{} + } + + err := checkTxOrder(orderedTxHashes, executedTxHashes, len(orderedTxHashes)) + require.Nil(t, err) + }) + t.Run("foundTxHashes == len(orderedTxHashes) and not all executed txHashes found", func(t *testing.T) { + orderedTxHashes := createRandTxHashes(10) + executedTxHashes := make(map[string]struct{}) + for _, txHash := range orderedTxHashes { + executedTxHashes[string(txHash)] = struct{}{} + } + executedTxHashes["newTxHash"] = struct{}{} + err := checkTxOrder(orderedTxHashes, executedTxHashes, len(orderedTxHashes)) + require.True(t, errors.Is(err, ErrExecutedTxNotFoundInOrderedTxs)) + }) +} + +func Test_checkBodyTransactionsHaveOrder(t *testing.T) { + t.Parallel() + + t.Run("nil orderedTxHashes", func(t *testing.T) { + err := checkBodyTransactionsHaveOrder(nil, make(map[string]struct{})) + require.Nil(t, err) + }) + t.Run("empty orderedTxHashes", func(t *testing.T) { + err := checkBodyTransactionsHaveOrder(make([][]byte, 0), make(map[string]struct{})) + require.Nil(t, err) + }) + + t.Run("nil executedTxHashes", func(t *testing.T) { + err := checkBodyTransactionsHaveOrder(createRandTxHashes(10), nil) + require.Equal(t, ErrNilExecutedTxHashes, err) + }) + t.Run("empty executedTxHashes", func(t *testing.T) { + err := checkBodyTransactionsHaveOrder(createRandTxHashes(10), make(map[string]struct{})) + require.Nil(t, err) + }) + t.Run("executedTxHashes not found in orderedTxHashes", func(t *testing.T) { + orderedTxHashes := createRandTxHashes(10) + executedTxHashes := make(map[string]struct{}) + for _, txHash := range orderedTxHashes { + executedTxHashes[string(txHash)] = struct{}{} + } + + executedTxHashes["newTxHash"] = struct{}{} + err := checkBodyTransactionsHaveOrder(orderedTxHashes, executedTxHashes) + require.True(t, errors.Is(err, ErrExecutedTxNotFoundInOrderedTxs)) + }) +} + +func Test_setExecutionOrderIfFound(t *testing.T) { + t.Parallel() + + t.Run("transaction not found", func(t *testing.T) { + txHash := []byte("txHash") + transactionHandlers := make(map[string]data.TransactionHandlerWithGasUsedAndFee) + order := 0 + + found := setExecutionOrderIfFound(txHash, transactionHandlers, order) + require.False(t, found) + require.Len(t, transactionHandlers, 0) + }) + t.Run("transaction found", func(t *testing.T) { + txHash := []byte("txHash") + transactionHandlers := map[string]data.TransactionHandlerWithGasUsedAndFee{ + string(txHash): &outportcore.TransactionHandlerWithGasAndFee{ + TransactionHandler: &transaction.Transaction{}, + }, + } + + res := setExecutionOrderIfFound(txHash, transactionHandlers, 0) + require.True(t, res) + require.Equal(t, 0, transactionHandlers[string(txHash)].GetExecutionOrder()) + }) +} + +func Test_collectExecutedTxHashes(t *testing.T) { + t.Parallel() + + t.Run("nil body handler", func(t *testing.T) { + _, err := collectExecutedTxHashes(nil, &block.Header{}) + require.Equal(t, ErrNilBodyHandler, err) + + }) + t.Run("nil header handler", func(t *testing.T) { + _, err := collectExecutedTxHashes(&block.Body{}, nil) + require.Equal(t, ErrNilHeaderHandler, err) + }) + t.Run("mismatch between miniblocks and miniblock headers", func(t *testing.T) { + mbs, mbHeaders := createMbsAndMbHeaders(1, 10) + mbHeaders = mbHeaders[:len(mbHeaders)-1] + body := &block.Body{ + MiniBlocks: mbs, + } + header := &block.Header{ + MiniBlockHeaders: mbHeaders, + } + + _, err := collectExecutedTxHashes(body, header) + require.Equal(t, ErrMiniBlocksHeadersMismatch, err) + + // more mbs + mbs, mbHeaders = createMbsAndMbHeaders(100, 10) + mbHeaders = mbHeaders[:len(mbHeaders)-1] + body = &block.Body{ + MiniBlocks: mbs, + } + header = &block.Header{ + MiniBlockHeaders: mbHeaders, + } + + _, err = collectExecutedTxHashes(body, header) + require.Equal(t, ErrMiniBlocksHeadersMismatch, err) + }) + t.Run("should work with empty miniBlocks", func(t *testing.T) { + mbs, mbHeaders := createMbsAndMbHeaders(10, 0) + body := &block.Body{ + MiniBlocks: mbs, + } + header := &block.Header{ + MiniBlockHeaders: mbHeaders, + } + + collectedTxs, err := collectExecutedTxHashes(body, header) + require.Nil(t, err) + require.Equal(t, 0, len(collectedTxs)) + }) + t.Run("should work with nil miniBlocks", func(t *testing.T) { + mbs := []*block.MiniBlock(nil) + mbHeaders := []block.MiniBlockHeader(nil) + body := &block.Body{ + MiniBlocks: mbs, + } + header := &block.Header{ + MiniBlockHeaders: mbHeaders, + } + + collectedTxs, err := collectExecutedTxHashes(body, header) + require.Nil(t, err) + require.Equal(t, 0, len(collectedTxs)) + }) + t.Run("should work", func(t *testing.T) { + mbs, mbHeaders := createMbsAndMbHeaders(10, 10) + body := &block.Body{ + MiniBlocks: mbs, + } + header := &block.Header{ + MiniBlockHeaders: mbHeaders, + } + + collectedTxs, err := collectExecutedTxHashes(body, header) + require.Nil(t, err) + require.Equal(t, 100, len(collectedTxs)) + }) +} + +func createMbsAndMbHeaders(numPairs int, numTxsPerMb int) ([]*block.MiniBlock, []block.MiniBlockHeader) { + mbs := make([]*block.MiniBlock, numPairs) + mbHeaders := make([]block.MiniBlockHeader, numPairs) + + for i := 0; i < numPairs; i++ { + txHashes := createRandTxHashes(numTxsPerMb) + mb, mbHeader := createMbAndMbHeader(txHashes) + mbs[i] = mb + mbHeaders[i] = mbHeader + } + + return mbs, mbHeaders +} + +func createMbAndMbHeader(txHashes [][]byte) (*block.MiniBlock, block.MiniBlockHeader) { + mb := &block.MiniBlock{ + TxHashes: txHashes, + ReceiverShardID: 0, + SenderShardID: 1, + } + + mbHeader := block.MiniBlockHeader{ + ReceiverShardID: 0, + SenderShardID: 1, + TxCount: uint32(len(txHashes)), + } + + return mb, mbHeader +} + +func createRandomByteArray(size uint32) []byte { + buff := make([]byte, size) + _, _ = rand.Read(buff) + + return buff +} + +func createRandTxHashes(numTxHashes int) [][]byte { + txHashes := make([][]byte, numTxHashes) + for i := 0; i < numTxHashes; i++ { + txHashes[i] = []byte(fmt.Sprintf("txHash_%s", createRandomByteArray(10))) + } + + return txHashes +} From f1274788be9ae2b7aaeb06a9d3801569e1869b93 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 6 Feb 2023 12:51:36 +0200 Subject: [PATCH 015/120] fix unit tests --- outport/process/outportDataProvider.go | 5 +---- outport/process/outportDataProvider_test.go | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 5c41edde458..1bd3e3326ee 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -233,16 +233,13 @@ func checkBodyTransactionsHaveOrder(orderedTxHashes [][]byte, executedTxHashes m if executedTxHashes == nil { return ErrNilExecutedTxHashes } - if orderedTxHashes == nil { - return ErrNilOrderedTxHashes - } orderedTxHashesMap := make(map[string]struct{}) for _, txHash := range orderedTxHashes { orderedTxHashesMap[string(txHash)] = struct{}{} } - for executedTxHash, _ := range executedTxHashes { + for executedTxHash := range executedTxHashes { if _, ok := orderedTxHashesMap[executedTxHash]; !ok { return fmt.Errorf("%w for txHash %s", ErrExecutedTxNotFoundInOrderedTxs, hex.EncodeToString([]byte(executedTxHash))) } diff --git a/outport/process/outportDataProvider_test.go b/outport/process/outportDataProvider_test.go index a18ea3616e5..c9fcd997d3d 100644 --- a/outport/process/outportDataProvider_test.go +++ b/outport/process/outportDataProvider_test.go @@ -369,16 +369,24 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { func Test_checkTxOrder(t *testing.T) { t.Parallel() - t.Run("nil ordered txHashes", func(t *testing.T) { + t.Run("nil ordered txHashes with empty executed txs", func(t *testing.T) { err := checkTxOrder(nil, make(map[string]struct{}), 0) - require.Equal(t, ErrNilOrderedTxHashes, err) + require.Nil(t, err) + }) + t.Run("nil ordered txHashes with non-empty executed txs", func(t *testing.T) { + err := checkTxOrder(nil, map[string]struct{}{"txHash": {}}, 0) + require.True(t, errors.Is(err, ErrExecutedTxNotFoundInOrderedTxs)) }) - t.Run("nil executed txHashes", func(t *testing.T) { + t.Run("nil executed txHashes with empty ordered txHashes", func(t *testing.T) { err := checkTxOrder(make([][]byte, 0), nil, 0) - require.Equal(t, ErrNilExecutedTxHashes, err) + require.Nil(t, err) + }) + t.Run("nil executed txHashes with non-empty ordered txHashes", func(t *testing.T) { + err := checkTxOrder([][]byte{{'a'}}, nil, 0) + require.True(t, errors.Is(err, ErrOrderedTxNotFound)) }) t.Run("foundTxHashes < len(orderedTxHashes)", func(t *testing.T) { - err := checkTxOrder(make([][]byte, 0), make(map[string]struct{}), 0) + err := checkTxOrder(make([][]byte, 1), make(map[string]struct{}), 0) require.True(t, errors.Is(err, ErrOrderedTxNotFound)) }) t.Run("foundTxHashes == len(orderedTxHashes) and all txHashes found", func(t *testing.T) { From 58e8cda800e4c259747508158298a20626c0202d Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 7 Feb 2023 12:54:09 +0200 Subject: [PATCH 016/120] use real tx execution order handler in integration tests --- integrationTests/testProcessorNode.go | 16 +++++++++------- process/block/preprocess/rewardTxPreProcessor.go | 6 +++--- .../preprocess/scheduledTxsExecution_test.go | 3 ++- .../preprocess/smartContractResults_test.go | 3 ++- process/coordinator/process.go | 1 - testscommon/common/executionOrderStub.go | 1 + 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index d0a4f4d35e4..1862df8c203 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -35,6 +35,7 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/common/enablers" "github.com/multiversx/mx-chain-go/common/forking" + "github.com/multiversx/mx-chain-go/common/ordering" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/consensus" "github.com/multiversx/mx-chain-go/consensus/spos/sposFactory" @@ -98,7 +99,6 @@ import ( "github.com/multiversx/mx-chain-go/storage/txcache" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/bootstrapMocks" - commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" dblookupextMock "github.com/multiversx/mx-chain-go/testscommon/dblookupext" @@ -350,6 +350,7 @@ type TestProcessorNode struct { Rater sharding.PeerAccountListAndRatingHandler EpochStartSystemSCProcessor process.EpochStartSystemSCProcessor + TxExecutionOrderHandler common.TxExecutionOrderHandler // Node is used to call the functionality already implemented in it Node *node.Node @@ -450,6 +451,7 @@ func newBaseTestProcessorNode(args ArgTestProcessorNode) *TestProcessorNode { BootstrapStorer: &mock.BoostrapStorerMock{}, RatingsData: args.RatingsData, EpochStartNotifier: args.EpochStartSubscriber, + TxExecutionOrderHandler: ordering.NewOrderedCollection(), } tpn.NodeKeys = args.NodeKeys @@ -1537,7 +1539,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u TestMarshalizer, TestHasher, tpn.ShardCoordinator, - &commonMocks.TxExecutionOrderHandlerStub{}, + tpn.TxExecutionOrderHandler, ) processedMiniBlocksTracker := processedMb.NewProcessedMiniBlocksTracker() @@ -1563,7 +1565,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u txTypeHandler, scheduledTxsExecutionHandler, processedMiniBlocksTracker, - &commonMocks.TxExecutionOrderHandlerStub{}, + tpn.TxExecutionOrderHandler, ) tpn.PreProcessorsContainer, _ = fact.Create() @@ -1587,7 +1589,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: processedMiniBlocksTracker, - TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, + TxExecutionOrderHandler: tpn.TxExecutionOrderHandler, } tpn.TxCoordinator, _ = coordinator.NewTransactionCoordinator(argsTransactionCoordinator) scheduledTxsExecutionHandler.SetTransactionCoordinator(tpn.TxCoordinator) @@ -1779,7 +1781,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri TestMarshalizer, TestHasher, tpn.ShardCoordinator, - &commonMocks.TxExecutionOrderHandlerStub{}, + tpn.TxExecutionOrderHandler, ) processedMiniBlocksTracker := processedMb.NewProcessedMiniBlocksTracker() @@ -1803,7 +1805,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri txTypeHandler, scheduledTxsExecutionHandler, processedMiniBlocksTracker, - &commonMocks.TxExecutionOrderHandlerStub{}, + tpn.TxExecutionOrderHandler, ) tpn.PreProcessorsContainer, _ = fact.Create() @@ -1827,7 +1829,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, DoubleTransactionsDetector: &testscommon.PanicDoubleTransactionsDetector{}, ProcessedMiniBlocksTracker: processedMiniBlocksTracker, - TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, + TxExecutionOrderHandler: tpn.TxExecutionOrderHandler, } tpn.TxCoordinator, _ = coordinator.NewTransactionCoordinator(argsTransactionCoordinator) scheduledTxsExecutionHandler.SetTransactionCoordinator(tpn.TxCoordinator) diff --git a/process/block/preprocess/rewardTxPreProcessor.go b/process/block/preprocess/rewardTxPreProcessor.go index 29b4164fdb7..b6791c64f21 100644 --- a/process/block/preprocess/rewardTxPreProcessor.go +++ b/process/block/preprocess/rewardTxPreProcessor.go @@ -46,7 +46,7 @@ func NewRewardTxPreprocessor( blockSizeComputation BlockSizeComputationHandler, balanceComputation BalanceComputationHandler, processedMiniBlocksTracker process.ProcessedMiniBlocksTracker, - TxExecutionOrderHandler common.TxExecutionOrderHandler, + txExecutionOrderHandler common.TxExecutionOrderHandler, ) (*rewardTxPreprocessor, error) { if check.IfNil(hasher) { @@ -88,7 +88,7 @@ func NewRewardTxPreprocessor( if check.IfNil(processedMiniBlocksTracker) { return nil, process.ErrNilProcessedMiniBlocksTracker } - if check.IfNil(TxExecutionOrderHandler) { + if check.IfNil(txExecutionOrderHandler) { return nil, process.ErrNilTxExecutionOrderHandler } @@ -105,7 +105,7 @@ func NewRewardTxPreprocessor( accounts: accounts, pubkeyConverter: pubkeyConverter, processedMiniBlocksTracker: processedMiniBlocksTracker, - txExecutionOrderHandler: TxExecutionOrderHandler, + txExecutionOrderHandler: txExecutionOrderHandler, } rtp := &rewardTxPreprocessor{ diff --git a/process/block/preprocess/scheduledTxsExecution_test.go b/process/block/preprocess/scheduledTxsExecution_test.go index d9bb4c5b242..02bc318e584 100644 --- a/process/block/preprocess/scheduledTxsExecution_test.go +++ b/process/block/preprocess/scheduledTxsExecution_test.go @@ -726,7 +726,8 @@ func TestScheduledTxsExecution_getAllIntermediateTxsAfterScheduledExecution(t *t SameShardCalled: func(_, _ []byte) bool { return true }, - }, &common.TxExecutionOrderHandlerStub{}, + }, + &common.TxExecutionOrderHandlerStub{}, ) scrsInfo := scheduledTxsExec.getAllIntermediateTxsAfterScheduledExecution( diff --git a/process/block/preprocess/smartContractResults_test.go b/process/block/preprocess/smartContractResults_test.go index 5671437f958..47376f8ba31 100644 --- a/process/block/preprocess/smartContractResults_test.go +++ b/process/block/preprocess/smartContractResults_test.go @@ -1362,7 +1362,8 @@ func TestScrsPreprocessor_ProcessMiniBlock(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.EnableEpochsHandlerStub{}, - &testscommon.ProcessedMiniBlocksTrackerStub{}, &common.TxExecutionOrderHandlerStub{}, + &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHash := []byte("tx1_hash") diff --git a/process/coordinator/process.go b/process/coordinator/process.go index 123851d5b09..356d3ecdf90 100644 --- a/process/coordinator/process.go +++ b/process/coordinator/process.go @@ -1228,7 +1228,6 @@ func (tc *transactionCoordinator) handleProcessTransactionError(snapshot int, mi err := tc.accounts.RevertToSnapshot(snapshot) if err != nil { - // TODO: evaluate if reloading the trie from disk might solve the problem log.Debug("transactionCoordinator.handleProcessTransactionError: RevertToSnapshot", "error", err.Error()) } diff --git a/testscommon/common/executionOrderStub.go b/testscommon/common/executionOrderStub.go index b51bbca4c41..6d80693ae7b 100644 --- a/testscommon/common/executionOrderStub.go +++ b/testscommon/common/executionOrderStub.go @@ -1,5 +1,6 @@ package common +// TxExecutionOrderHandlerStub - type TxExecutionOrderHandlerStub struct { AddCalled func(txHash []byte) GetItemAtIndexCalled func(index uint32) ([]byte, error) From f4eae1634848383e8709eec2169676f08133329f Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 7 Feb 2023 13:09:14 +0200 Subject: [PATCH 017/120] move revert of execution order on handleProcessTransactionError --- process/block/preprocess/basePreProcess.go | 1 + process/block/preprocess/rewardTxPreProcessor.go | 1 - process/block/preprocess/smartContractResults.go | 1 - process/block/preprocess/transactions.go | 1 - process/coordinator/process.go | 3 +-- 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/process/block/preprocess/basePreProcess.go b/process/block/preprocess/basePreProcess.go index 0e5a3c2d4dc..9d169c2ce99 100644 --- a/process/block/preprocess/basePreProcess.go +++ b/process/block/preprocess/basePreProcess.go @@ -508,6 +508,7 @@ func (bpp *basePreProcess) handleProcessTransactionError(preProcessorExecutionIn } preProcessorExecutionInfoHandler.RevertProcessedTxsResults([][]byte{txHash}, txHash) + bpp.txExecutionOrderHandler.Remove(txHash) } func getMiniBlockHeaderOfMiniBlock(headerHandler data.HeaderHandler, miniBlockHash []byte) (data.MiniBlockHeaderHandler, error) { diff --git a/process/block/preprocess/rewardTxPreProcessor.go b/process/block/preprocess/rewardTxPreProcessor.go index b6791c64f21..cc1ed7e9357 100644 --- a/process/block/preprocess/rewardTxPreProcessor.go +++ b/process/block/preprocess/rewardTxPreProcessor.go @@ -504,7 +504,6 @@ func (rtp *rewardTxPreprocessor) ProcessMiniBlock( rtp.txExecutionOrderHandler.Add(miniBlockTxHashes[txIndex]) err = rtp.rewardsProcessor.ProcessRewardTransaction(miniBlockRewardTxs[txIndex]) if err != nil { - rtp.txExecutionOrderHandler.Remove(miniBlockTxHashes[txIndex]) rtp.handleProcessTransactionError(preProcessorExecutionInfoHandler, snapshot, miniBlockTxHashes[txIndex]) break } diff --git a/process/block/preprocess/smartContractResults.go b/process/block/preprocess/smartContractResults.go index 95679183154..f1fc3274068 100644 --- a/process/block/preprocess/smartContractResults.go +++ b/process/block/preprocess/smartContractResults.go @@ -624,7 +624,6 @@ func (scr *smartContractResults) ProcessMiniBlock( scr.txExecutionOrderHandler.Add(miniBlockTxHashes[txIndex]) _, err = scr.scrProcessor.ProcessSmartContractResult(miniBlockScrs[txIndex]) if err != nil { - scr.txExecutionOrderHandler.Remove(miniBlockTxHashes[txIndex]) scr.handleProcessTransactionError(preProcessorExecutionInfoHandler, snapshot, miniBlockTxHashes[txIndex]) break } diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index 61c49246455..b0c2987bcb9 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -1625,7 +1625,6 @@ func (txs *transactions) processInNormalMode( txs.txExecutionOrderHandler.Add(txHash) _, err := txs.txProcessor.ProcessTransaction(tx) if err != nil { - txs.txExecutionOrderHandler.Remove(txHash) txs.handleProcessTransactionError(preProcessorExecutionInfoHandler, snapshot, txHash) return err } diff --git a/process/coordinator/process.go b/process/coordinator/process.go index 356d3ecdf90..3234f9e08e2 100644 --- a/process/coordinator/process.go +++ b/process/coordinator/process.go @@ -1197,7 +1197,6 @@ func (tc *transactionCoordinator) processCompleteMiniBlock( ) if shouldRevert { - tc.txExecutionOrderHandler.RemoveMultiple(txsToBeReverted) tc.handleProcessTransactionError(snapshot, miniBlockHash, txsToBeReverted) } else { if tc.enableEpochsHandler.IsMiniBlockPartialExecutionFlagEnabled() { @@ -1234,6 +1233,7 @@ func (tc *transactionCoordinator) handleProcessTransactionError(snapshot int, mi if len(txsToBeReverted) > 0 { tc.RevertProcessedTxsResults(txsToBeReverted, miniBlockHash) } + tc.txExecutionOrderHandler.RemoveMultiple(txsToBeReverted) } // InitProcessedTxsResults inits processed txs results for the given key @@ -1277,7 +1277,6 @@ func (tc *transactionCoordinator) RevertProcessedTxsResults(txHashes [][]byte, k tc.feeHandler.RevertFees(txHashes) tc.txExecutionOrderHandler.RemoveMultiple(txHashes) accFeesAfterRevert := tc.feeHandler.GetAccumulatedFees() - if accFeesBeforeRevert.Cmp(accFeesAfterRevert) != 0 { log.Debug("revertProcessedTxsResults.RevertFees with tx hashes", "num txHashes", len(txHashes), From a1bd56bfb0c8198ced95bd0f6a4b7d573426e779 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 7 Feb 2023 15:25:38 +0200 Subject: [PATCH 018/120] remove redundant checks, rename index --- outport/process/outportDataProvider.go | 11 ++--------- outport/process/outportDataProvider_test.go | 9 --------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 1bd3e3326ee..7e65dd97aa9 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -130,13 +130,6 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor } func collectExecutedTxHashes(bodyHandler data.BodyHandler, headerHandler data.HeaderHandler) (map[string]struct{}, error) { - if check.IfNil(bodyHandler) { - return nil, ErrNilBodyHandler - } - if check.IfNil(headerHandler) { - return nil, ErrNilHeaderHandler - } - executedTxHashes := make(map[string]struct{}) mbHeaders := headerHandler.GetMiniBlockHeaderHandlers() body, ok := bodyHandler.(*block.Body) @@ -180,8 +173,8 @@ func extractExecutedTxsFromMb(mbHeader data.MiniBlockHeaderHandler, miniBlock *b if int(mbHeader.GetIndexOfLastTxProcessed()) > len(miniBlock.TxHashes) { return ErrIndexOutOfBounds } - for j := mbHeader.GetIndexOfFirstTxProcessed(); j <= mbHeader.GetIndexOfLastTxProcessed(); j++ { - txHash := miniBlock.TxHashes[j] + for index := mbHeader.GetIndexOfFirstTxProcessed(); index <= mbHeader.GetIndexOfLastTxProcessed(); index++ { + txHash := miniBlock.TxHashes[index] executedTxHashes[string(txHash)] = struct{}{} } diff --git a/outport/process/outportDataProvider_test.go b/outport/process/outportDataProvider_test.go index c9fcd997d3d..3815469f094 100644 --- a/outport/process/outportDataProvider_test.go +++ b/outport/process/outportDataProvider_test.go @@ -473,15 +473,6 @@ func Test_setExecutionOrderIfFound(t *testing.T) { func Test_collectExecutedTxHashes(t *testing.T) { t.Parallel() - t.Run("nil body handler", func(t *testing.T) { - _, err := collectExecutedTxHashes(nil, &block.Header{}) - require.Equal(t, ErrNilBodyHandler, err) - - }) - t.Run("nil header handler", func(t *testing.T) { - _, err := collectExecutedTxHashes(&block.Body{}, nil) - require.Equal(t, ErrNilHeaderHandler, err) - }) t.Run("mismatch between miniblocks and miniblock headers", func(t *testing.T) { mbs, mbHeaders := createMbsAndMbHeaders(1, 10) mbHeaders = mbHeaders[:len(mbHeaders)-1] From d6f78f60490afe06c3029f27384c089c279d18e8 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 7 Feb 2023 15:37:08 +0200 Subject: [PATCH 019/120] fix typo --- outport/process/outportDataProvider_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/outport/process/outportDataProvider_test.go b/outport/process/outportDataProvider_test.go index 3815469f094..4fae66a9a9c 100644 --- a/outport/process/outportDataProvider_test.go +++ b/outport/process/outportDataProvider_test.go @@ -243,7 +243,7 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { require.Equal(t, 0, numProcessed) require.Equal(t, len(txHashes), len(orderedHashes)) }) - t.Run("transactions not found in pool txsm, scrs or rewards", func(t *testing.T) { + t.Run("transactions not found in pool txs, scrs or rewards", func(t *testing.T) { args := createArgOutportDataProvider() odp, _ := NewOutportDataProvider(args) pool := &outportcore.Pool{ @@ -282,7 +282,7 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { require.Equal(t, len(txHashes), len(orderedHashes)) }) - t.Run("transactions partially found (first txs in list) in pool txsm, scrs or rewards", func(t *testing.T) { + t.Run("transactions partially found (first txs in list) in pool txs, scrs or rewards", func(t *testing.T) { args := createArgOutportDataProvider() odp, _ := NewOutportDataProvider(args) txHashes := createRandTxHashes(10) @@ -323,7 +323,7 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { require.Equal(t, pool.Rewards[string(txHashes[2])].GetExecutionOrder(), 2) require.Equal(t, len(txHashes), len(orderedHashes)) }) - t.Run("transactions partially found (last txs in list) in pool txsm, scrs or rewards", func(t *testing.T) { + t.Run("transactions partially found (last txs in list) in pool txs, scrs or rewards", func(t *testing.T) { args := createArgOutportDataProvider() odp, _ := NewOutportDataProvider(args) txHashes := createRandTxHashes(10) From 2c2fc7a1f235ee77f7feabfc3fb8c3502477a345 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 7 Feb 2023 16:08:16 +0200 Subject: [PATCH 020/120] remove unused const in testConsensusNode --- integrationTests/testConsensusNode.go | 1 - 1 file changed, 1 deletion(-) diff --git a/integrationTests/testConsensusNode.go b/integrationTests/testConsensusNode.go index 0b7d5092319..c85ea2b0957 100644 --- a/integrationTests/testConsensusNode.go +++ b/integrationTests/testConsensusNode.go @@ -51,7 +51,6 @@ const ( signatureSize = 48 publicKeySize = 96 maxShards = 1 - nodeShardId = 0 ) var testPubkeyConverter, _ = pubkeyConverter.NewHexPubkeyConverter(32) From d16944a1cc7742e3c8c74bd44f10da5e91d841f7 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Thu, 20 Apr 2023 16:30:24 +0300 Subject: [PATCH 021/120] fixes and extra logs --- factory/processing/blockProcessorCreator.go | 1 + outport/process/outportDataProvider.go | 42 ++++++++++++++++++++- process/common.go | 2 + 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index d51a59ad401..eae6fee832b 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -941,6 +941,7 @@ func (pcf *processComponentsFactory) createOutportDataProvider( Hasher: pcf.coreData.Hasher(), MbsStorer: mbsStorer, EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + ExecutionOrderGetter: pcf.txExecutionOrderHandler, }) } diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 7e65dd97aa9..5d02581e078 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -98,6 +98,8 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor log.Warn("PrepareOutportSaveBlockData - checkTxOrder", "error", err.Error()) } + printPool(pool) + alteredAccounts, err := odp.alteredAccountsProvider.ExtractAlteredAccountsFromPool(pool, shared.AlteredAccountsOptions{ WithAdditionalOutportData: true, }) @@ -192,7 +194,10 @@ func (odp *outportDataProvider) setExecutionOrderInTransactionPool( txGroups := []map[string]data.TransactionHandlerWithGasUsedAndFee{ pool.Txs, pool.Scrs, - pool.Rewards, + } + + if odp.shardID != core.MetachainShardId { + txGroups = append(txGroups, pool.Rewards) } foundTxHashes := 0 @@ -324,3 +329,38 @@ func WrapTxsMap(txs map[string]data.TransactionHandler) map[string]data.Transact func (odp *outportDataProvider) IsInterfaceNil() bool { return odp == nil } + +func printPool(pool *outportcore.Pool) { + printMapTxs := func(txs map[string]data.TransactionHandlerWithGasUsedAndFee) { + for hash, tx := range txs { + log.Warn(hex.EncodeToString([]byte(hash)), "order", tx.GetExecutionOrder()) + } + } + + total := len(pool.Txs) + len(pool.Invalid) + len(pool.Scrs) + len(pool.Rewards) + if total > 0 { + log.Warn("###################################") + } + + if len(pool.Txs) > 0 { + log.Warn("############### NORMAL TXS ####################") + printMapTxs(pool.Txs) + } + if len(pool.Invalid) > 0 { + log.Warn("############### INVALID ####################") + printMapTxs(pool.Invalid) + } + + if len(pool.Scrs) > 0 { + log.Warn("############### SCRS ####################") + printMapTxs(pool.Scrs) + } + + if len(pool.Rewards) > 0 { + log.Warn("############### REWARDS ####################") + printMapTxs(pool.Rewards) + } + if total > 0 { + log.Warn("###################################") + } +} diff --git a/process/common.go b/process/common.go index 901b74c6221..7df60d90e44 100644 --- a/process/common.go +++ b/process/common.go @@ -707,6 +707,8 @@ func DisplayProcessTxDetails( "data", hex.EncodeToString(txHandler.GetData()), "sender", senderAddress, "receiver", receiverAddress) + + log.Warn("executing transaction", "txHash", txHash) } // IsAllowedToSaveUnderKey returns if saving key-value in data tries under given key is allowed From 31ad05ccd88e82097845bbc84b2a69e04fce0391 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 21 Apr 2023 11:16:26 +0300 Subject: [PATCH 022/120] extra log --- process/block/preprocess/transactions.go | 1 + 1 file changed, 1 insertion(+) diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index b0c2987bcb9..1bd8bb0ada6 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -886,6 +886,7 @@ func (txs *transactions) processAndRemoveBadTransaction( if err != nil && !errors.Is(err, process.ErrFailedTransaction) { txs.txExecutionOrderHandler.Remove(txHash) + log.Warn("already executed", "error", err.Error(), "txhash", txHash) return err } From cfe9b282298098ff56ee6e08ade83f2dad041078 Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 2 May 2023 15:47:51 +0300 Subject: [PATCH 023/120] go mod updates --- go.mod | 4 +++- go.sum | 4 ---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index bec5e0413cb..6152119e359 100644 --- a/go.mod +++ b/go.mod @@ -188,4 +188,6 @@ require ( replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 -// replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230425103418-e8794cf05ba5 => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go +replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go + +replace github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b => /home/bogdan/Elrond/elrond-vm-common diff --git a/go.sum b/go.sum index 767139ce5d2..a2c84fce220 100644 --- a/go.sum +++ b/go.sum @@ -637,10 +637,6 @@ github.com/multiversx/mx-chain-storage-go v1.0.8 h1:PB9OAwZs3rWz7nybBOxVCxgrd785 github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNgT1esY3K9Pj6vPnoCwV9C3U= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b h1:k6W1c+Evk0Qu1LkTZwVuOaogFcOzYnyN4/Hyf/Z6RkU= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a h1:V0Yecz+9r/cIl2gqD0MylUOro3NIztyVTZ4msDCVisU= -github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a/go.mod h1:TZYNHIsMYLFIoKtgd+NOU+HdrGkQmdhf30k3MImVT8U= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4 h1:5/vAKFsQ1Jtq2uvG4ETdqTARU8wwjzreb1AOOblP2Lg= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4/go.mod h1:3RtwnTGJTeBBHMzbq1E3IMKFa/aeuoL06Y8GAV4mZfk= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230425093821-9ea20e2ba44d h1:WHXtA9OnC55IasXSOqauQa0d8613adna5L9sWKR+XI0= From 6fae59ea4fa61ca3962864f51bb267cd72124f5f Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 2 May 2023 21:33:09 +0300 Subject: [PATCH 024/120] go mod updates --- go.mod | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6152119e359..ec4da6c83b9 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/multiversx/mx-chain-scenario-go v1.1.2 github.com/multiversx/mx-chain-storage-go v1.0.8 github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b - github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a + github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230502140545-b836586c36f6 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230425093821-9ea20e2ba44d github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230425093655-5bda00c8ebe7 @@ -188,6 +188,6 @@ require ( replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 -replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go +replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230502140545-b836586c36f6 => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go replace github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b => /home/bogdan/Elrond/elrond-vm-common From 24222afe27b0d35f43776f304aa563edb9423597 Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 8 May 2023 10:32:47 +0300 Subject: [PATCH 025/120] log events changes --- facade/nodeFacade.go | 2 +- facade/nodeFacade_test.go | 4 ++-- go.mod | 4 +++- process/smartContract/process.go | 4 ++-- process/smartContract/processorV2/processV2.go | 4 ++-- process/transactionLog/process.go | 2 +- vm/systemSmartContracts/eei.go | 4 ++-- 7 files changed, 13 insertions(+), 11 deletions(-) diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index eb2523e08a9..a1a2d9391a4 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -655,7 +655,7 @@ func (nf *nodeFacade) convertVmOutputToApiResponse(input *vmcommon.VMOutput) *vm Identifier: originalLog.Identifier, Address: logAddress, Topics: originalLog.Topics, - Data: originalLog.Data, + Data: originalLog.GetFirstDataItem(), }) } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index a1a39380fbc..355b215decf 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -1336,7 +1336,7 @@ func TestFacade_convertVmOutputToApiResponse(t *testing.T) { retData := [][]byte{[]byte("ret_data_0")} outAcc, outAccStorageKey, outAccOffset := []byte("addr0"), []byte("out_acc_storage_key"), []byte("offset") outAccTransferSndrAddr := []byte("addr1") - logId, logAddr, logTopics, logData := []byte("log_id"), []byte("log_addr"), [][]byte{[]byte("log_topic")}, []byte("log_data") + logId, logAddr, logTopics, logData := []byte("log_id"), []byte("log_addr"), [][]byte{[]byte("log_topic")}, [][]byte{[]byte("log_data")} vmInput := vmcommon.VMOutput{ ReturnData: retData, OutputAccounts: map[string]*vmcommon.OutputAccount{ @@ -1385,7 +1385,7 @@ func TestFacade_convertVmOutputToApiResponse(t *testing.T) { Identifier: logId, Address: convertAddressFunc(logAddr), Topics: logTopics, - Data: logData, + Data: logData[0], }, } diff --git a/go.mod b/go.mod index bec5e0413cb..6152119e359 100644 --- a/go.mod +++ b/go.mod @@ -188,4 +188,6 @@ require ( replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 -// replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230425103418-e8794cf05ba5 => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go +replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go + +replace github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b => /home/bogdan/Elrond/elrond-vm-common diff --git a/process/smartContract/process.go b/process/smartContract/process.go index 8f0e8ba643d..fa1cec98ee0 100644 --- a/process/smartContract/process.go +++ b/process/smartContract/process.go @@ -1557,7 +1557,7 @@ func createNewLogFromSCR(txHandler data.TransactionHandler) *vmcommon.LogEntry { Identifier: []byte(core.WriteLogIdentifier), Address: txHandler.GetSndAddr(), Topics: [][]byte{txHandler.GetRcvAddr()}, - Data: txHandler.GetData(), + Data: [][]byte{txHandler.GetData()}, } if len(returnMessage) > 0 { newLog.Topics = append(newLog.Topics, returnMessage) @@ -1577,7 +1577,7 @@ func createNewLogFromSCRIfError(txHandler data.TransactionHandler) *vmcommon.Log Identifier: []byte(core.SignalErrorOperation), Address: txHandler.GetSndAddr(), Topics: [][]byte{txHandler.GetRcvAddr(), returnMessage}, - Data: txHandler.GetData(), + Data: [][]byte{txHandler.GetData()}, } return newLog diff --git a/process/smartContract/processorV2/processV2.go b/process/smartContract/processorV2/processV2.go index 302d820bbd2..bfd3c1c9f6b 100644 --- a/process/smartContract/processorV2/processV2.go +++ b/process/smartContract/processorV2/processV2.go @@ -1623,7 +1623,7 @@ func createNewLogFromSCR(txHandler data.TransactionHandler) *vmcommon.LogEntry { Identifier: []byte(generalSCRIdentifier), Address: txHandler.GetSndAddr(), Topics: [][]byte{txHandler.GetRcvAddr()}, - Data: txHandler.GetData(), + Data: [][]byte{txHandler.GetData()}, } if len(returnMessage) > 0 { newLog.Topics = append(newLog.Topics, returnMessage) @@ -1643,7 +1643,7 @@ func createNewLogFromSCRIfError(txHandler data.TransactionHandler) *vmcommon.Log Identifier: []byte(signalError), Address: txHandler.GetSndAddr(), Topics: [][]byte{txHandler.GetRcvAddr(), returnMessage}, - Data: txHandler.GetData(), + Data: [][]byte{txHandler.GetData()}, } return newLog diff --git a/process/transactionLog/process.go b/process/transactionLog/process.go index 99f19580393..d975e04ad72 100644 --- a/process/transactionLog/process.go +++ b/process/transactionLog/process.go @@ -156,7 +156,7 @@ func (tlp *txLogProcessor) SaveLog(txHash []byte, tx data.TransactionHandler, lo Identifier: logEntry.Identifier, Address: logEntry.Address, Topics: logEntry.Topics, - Data: logEntry.Data, + Data: logEntry.GetFirstDataItem(), }) } diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 4ca1437764c..9e07404a77e 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -433,8 +433,8 @@ func (host *vmContext) transferBeforeInternalExec(callInput *vmcommon.ContractCa logEntry := &vmcommon.LogEntry{ Identifier: []byte(transferValueOnly), Address: callInput.RecipientAddr, - Topics: [][]byte{sender, callInput.RecipientAddr, callInput.CallValue.Bytes()}, - Data: []byte{}, + Topics: [][]byte{sender, callInput.CallValue.Bytes()}, + Data: vmcommon.FormatLogDataForCall("", callInput.Function, callInput.Arguments), } host.AddLogEntry(logEntry) } From 3dbe0ed0078805f25e811b5ce0a39fe03c56969f Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 9 May 2023 16:08:42 +0300 Subject: [PATCH 026/120] fixes after review --- go.mod | 8 ++++---- go.sum | 5 +++++ vm/systemSmartContracts/eei.go | 20 +++++++++----------- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 6152119e359..ed0f0adf592 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( github.com/multiversx/mx-chain-p2p-go v1.0.16 github.com/multiversx/mx-chain-scenario-go v1.1.2 github.com/multiversx/mx-chain-storage-go v1.0.8 - github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b - github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a + github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f + github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230425093821-9ea20e2ba44d github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230425093655-5bda00c8ebe7 @@ -188,6 +188,6 @@ require ( replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 -replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230428124145-d89f33fa3b1a => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go +// replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230508073311-6359f6ceab37 => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go -replace github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b => /home/bogdan/Elrond/elrond-vm-common +// replace github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230508073211-998e70d76b02 => /home/bogdan/Elrond/elrond-vm-common diff --git a/go.sum b/go.sum index a2c84fce220..330dce5ee28 100644 --- a/go.sum +++ b/go.sum @@ -637,6 +637,11 @@ github.com/multiversx/mx-chain-storage-go v1.0.8 h1:PB9OAwZs3rWz7nybBOxVCxgrd785 github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNgT1esY3K9Pj6vPnoCwV9C3U= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f h1:H37/a22h+mvIJgb0sC3WzSav8Wz/IhD5rU65D/CHRLU= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6 h1:/fHqigbGeHu4UxtgcLKgEZ8ZZ/VfHZa82VWGCHO+2WQ= +github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6/go.mod h1:pSJlqf2h4Vh6xznUi+/SAeqG8fjPEQw8wbIp9MlYsrQ= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4 h1:5/vAKFsQ1Jtq2uvG4ETdqTARU8wwjzreb1AOOblP2Lg= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4/go.mod h1:3RtwnTGJTeBBHMzbq1E3IMKFa/aeuoL06Y8GAV4mZfk= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230425093821-9ea20e2ba44d h1:WHXtA9OnC55IasXSOqauQa0d8613adna5L9sWKR+XI0= diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 9e07404a77e..47d4b75b75d 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -423,21 +423,19 @@ func createDirectCallInput( return input } -func (host *vmContext) transferBeforeInternalExec(callInput *vmcommon.ContractCallInput, sender []byte) error { +func (host *vmContext) transferBeforeInternalExec(callInput *vmcommon.ContractCallInput, sender []byte, callType string) error { if !host.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { return host.Transfer(callInput.RecipientAddr, sender, callInput.CallValue, nil, 0) } host.transferValueOnly(callInput.RecipientAddr, sender, callInput.CallValue) - if callInput.CallValue.Cmp(zero) > 0 { - logEntry := &vmcommon.LogEntry{ - Identifier: []byte(transferValueOnly), - Address: callInput.RecipientAddr, - Topics: [][]byte{sender, callInput.CallValue.Bytes()}, - Data: vmcommon.FormatLogDataForCall("", callInput.Function, callInput.Arguments), - } - host.AddLogEntry(logEntry) + logEntry := &vmcommon.LogEntry{ + Identifier: []byte(transferValueOnly), + Address: callInput.RecipientAddr, + Topics: [][]byte{sender, callInput.CallValue.Bytes()}, + Data: vmcommon.FormatLogDataForCall(callType, callInput.Function, callInput.Arguments), } + host.AddLogEntry(logEntry) return nil } @@ -460,7 +458,7 @@ func (host *vmContext) DeploySystemSC( callInput := createDirectCallInput(newAddress, ownerAddress, value, initFunction, input) - err := host.transferBeforeInternalExec(callInput, host.scAddress) + err := host.transferBeforeInternalExec(callInput, host.scAddress, "DeploySmartContract") if err != nil { return vmcommon.ExecutionFailed, err } @@ -517,7 +515,7 @@ func (host *vmContext) ExecuteOnDestContext(destination []byte, sender []byte, v return nil, err } - err = host.transferBeforeInternalExec(callInput, sender) + err = host.transferBeforeInternalExec(callInput, sender, "ExecuteOnDestContext") if err != nil { return nil, err } From 23f6c90ab12b706d34c92e8499c2d4d670526544 Mon Sep 17 00:00:00 2001 From: matei-p Date: Fri, 12 May 2023 11:17:11 +0300 Subject: [PATCH 027/120] using latest legacy vms --- go.mod | 6 +++--- go.sum | 13 ++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index ed0f0adf592..b58518d53ad 100644 --- a/go.mod +++ b/go.mod @@ -22,9 +22,9 @@ require ( github.com/multiversx/mx-chain-storage-go v1.0.8 github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230425093821-9ea20e2ba44d - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230425093655-5bda00c8ebe7 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230512080139-c7f54612ba66 github.com/pelletier/go-toml v1.9.3 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index 330dce5ee28..49a251072dc 100644 --- a/go.sum +++ b/go.sum @@ -637,17 +637,16 @@ github.com/multiversx/mx-chain-storage-go v1.0.8 h1:PB9OAwZs3rWz7nybBOxVCxgrd785 github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNgT1esY3K9Pj6vPnoCwV9C3U= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230425081117-bd6069791f3b/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f h1:H37/a22h+mvIJgb0sC3WzSav8Wz/IhD5rU65D/CHRLU= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6 h1:/fHqigbGeHu4UxtgcLKgEZ8ZZ/VfHZa82VWGCHO+2WQ= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6/go.mod h1:pSJlqf2h4Vh6xznUi+/SAeqG8fjPEQw8wbIp9MlYsrQ= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4 h1:5/vAKFsQ1Jtq2uvG4ETdqTARU8wwjzreb1AOOblP2Lg= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230425091341-4a24504bcde4/go.mod h1:3RtwnTGJTeBBHMzbq1E3IMKFa/aeuoL06Y8GAV4mZfk= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230425093821-9ea20e2ba44d h1:WHXtA9OnC55IasXSOqauQa0d8613adna5L9sWKR+XI0= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230425093821-9ea20e2ba44d/go.mod h1:JKKgAANa8sPJuHNhIrbvPtn8f7V+p+KQrkLo0jlp05s= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230425093655-5bda00c8ebe7 h1:chKnP0NjQSffXQ85NIlUhOW+Ek+YUSvZgTVmZzGPHjM= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230425093655-5bda00c8ebe7/go.mod h1:GbM+EeBIN3r/mUsW0Q3T5Q05PJHmJBt952xaU3zGx70= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 h1:aMUzVZwuC0VDuGisJfPKWgYyTNVa1GhbB/oX/g/daZ4= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75/go.mod h1:zaXfmkcvtVNM7rM5ttrf89GsI3UUdr3VJcAbxunip1w= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 h1:PvsPhplAtU8cCjxf9ULZUy7YA3KdRmBewgAYFRB+8sg= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7/go.mod h1:hivjsQwoSC0+oHQn1nvBethdpykw7CQL7YnTrLDrVd0= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230512080139-c7f54612ba66 h1:56zWvAlK9JS5NSsG8e4SvyQPIBMoI7gCgJ4SvY1I/S4= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230512080139-c7f54612ba66/go.mod h1:q/GunkvXqFPqQGHiGhskWvr7+tsmqN0iFp5X84zssjk= github.com/multiversx/mx-components-big-int v0.1.1 h1:695mYPKYOrmGEGgRH4/pZruDoe3CPP1LHrBxKfvj5l4= github.com/multiversx/mx-components-big-int v0.1.1/go.mod h1:0QrcFdfeLgJ/am10HGBeH0G0DNF+0Qx1E4DS/iozQls= github.com/multiversx/protobuf v1.3.2 h1:RaNkxvGTGbA0lMcnHAN24qE1G1i+Xs5yHA6MDvQ4mSM= From c600631a88b947107e13264a1c8795a6c05a1ce7 Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 15 May 2023 10:10:35 +0300 Subject: [PATCH 028/120] test fix --- go.mod | 4 ---- integrationTests/vm/txsFee/guardAccount_test.go | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index b58518d53ad..83626f795bb 100644 --- a/go.mod +++ b/go.mod @@ -187,7 +187,3 @@ require ( ) replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 - -// replace github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230508073311-6359f6ceab37 => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go - -// replace github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230508073211-998e70d76b02 => /home/bogdan/Elrond/elrond-vm-common diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index 10de99e4d7f..0774e913736 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -402,6 +402,7 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { Address: alice, Identifier: []byte(core.BuiltInFunctionSetGuardian), Topics: [][]byte{bob, uuid}, + Data: []byte{}, }, event) testContext.TxsLogsProcessor.Clean() @@ -459,6 +460,7 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { require.Equal(t, &transaction.Event{ Address: alice, Identifier: []byte(core.BuiltInFunctionGuardAccount), + Data: []byte{}, }, event) testContext.TxsLogsProcessor.Clean() } From c7cedfd55041eb6ad00c538ad6f19b55e98db540 Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 15 May 2023 11:17:03 +0300 Subject: [PATCH 029/120] test fix --- integrationTests/vm/txsFee/scCalls_test.go | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/integrationTests/vm/txsFee/scCalls_test.go b/integrationTests/vm/txsFee/scCalls_test.go index 09e8b9e9f17..c7162ec5248 100644 --- a/integrationTests/vm/txsFee/scCalls_test.go +++ b/integrationTests/vm/txsFee/scCalls_test.go @@ -444,11 +444,15 @@ func TestScCallBuyNFT_OneFailedTxAndOneOkTx(t *testing.T) { _, errCommit := testContext.Accounts.Commit() require.Nil(t, errCommit) - intermediateTxs := testContext.GetIntermediateTransactions(t) - require.Equal(t, 1, len(intermediateTxs)) + logs := testContext.TxsLogsProcessor.GetAllCurrentLogs() + assert.Equal(t, 2, len(logs)) - scr := intermediateTxs[0].(*smartContractResult.SmartContractResult) - assert.Equal(t, vmhost.ErrInvalidTokenIndex.Error(), string(scr.ReturnMessage)) + logEvents := logs[1].GetLogEvents() + assert.Equal(t, 2, len(logEvents)) + + topics := logEvents[0].GetTopics() + assert.Equal(t, 2, len(topics)) + assert.Equal(t, vmhost.ErrInvalidTokenIndex.Error(), string(topics[1])) }) t.Run("transaction that succeed", func(t *testing.T) { utils.CleanAccumulatedIntermediateTransactions(t, testContext) @@ -467,11 +471,15 @@ func TestScCallBuyNFT_OneFailedTxAndOneOkTx(t *testing.T) { _, errCommit := testContext.Accounts.Commit() require.Nil(t, errCommit) - intermediateTxs := testContext.GetIntermediateTransactions(t) - assert.Equal(t, 1, len(intermediateTxs)) + logs := testContext.TxsLogsProcessor.GetAllCurrentLogs() + assert.Equal(t, 3, len(logs)) - scr := intermediateTxs[0].(*smartContractResult.SmartContractResult) - assert.Equal(t, vmhost.ErrInvalidTokenIndex.Error(), string(scr.ReturnMessage)) + logEvents := logs[1].GetLogEvents() + assert.Equal(t, 2, len(logEvents)) + + topics := logEvents[0].GetTopics() + assert.Equal(t, 2, len(topics)) + assert.Equal(t, vmhost.ErrInvalidTokenIndex.Error(), string(topics[1])) }) } From ad33bbf9fd17d8f458b3a7f5351074888e637865 Mon Sep 17 00:00:00 2001 From: matei-p Date: Fri, 26 May 2023 10:34:48 +0300 Subject: [PATCH 030/120] go mod updates --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 83626f795bb..1cff690cd9c 100644 --- a/go.mod +++ b/go.mod @@ -18,10 +18,10 @@ require ( github.com/multiversx/mx-chain-es-indexer-go v1.4.1 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.16 - github.com/multiversx/mx-chain-scenario-go v1.1.2 + github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.8 github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f - github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6 + github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230512080139-c7f54612ba66 diff --git a/go.sum b/go.sum index 49a251072dc..f7c15656fa8 100644 --- a/go.sum +++ b/go.sum @@ -631,16 +631,16 @@ github.com/multiversx/mx-chain-logger-go v1.0.11 h1:DFsHa+sc5fKwhDR50I8uBM99RTDT github.com/multiversx/mx-chain-logger-go v1.0.11/go.mod h1:1srDkP0DQucWQ+rYfaq0BX2qLnULsUdRPADpYUTM6dA= github.com/multiversx/mx-chain-p2p-go v1.0.16 h1:iMK8KUi006/avVcmecnk7lqbDCRL0BN04vgepoVLlyY= github.com/multiversx/mx-chain-p2p-go v1.0.16/go.mod h1:7piVUb5Z7UHK6n3JW8yIc32RdDFZu7GivRY29q0r2gI= -github.com/multiversx/mx-chain-scenario-go v1.1.2 h1:6Mok/W48r5lBlqJfriFFhDO5UiYUU1Em+0n0oB0NNGs= -github.com/multiversx/mx-chain-scenario-go v1.1.2/go.mod h1:xl+aL6n3aibMtfJH3hFGxzddWmn1hEx2Fg0c6ahoQvU= +github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd h1:nugF4RKzOYUpcSifld9L4I4GiC84v2NVX9H08KV7r44= +github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd/go.mod h1:xl+aL6n3aibMtfJH3hFGxzddWmn1hEx2Fg0c6ahoQvU= github.com/multiversx/mx-chain-storage-go v1.0.8 h1:PB9OAwZs3rWz7nybBOxVCxgrd785FUUUAsVc5JWXYCw= github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNgT1esY3K9Pj6vPnoCwV9C3U= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f h1:H37/a22h+mvIJgb0sC3WzSav8Wz/IhD5rU65D/CHRLU= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6 h1:/fHqigbGeHu4UxtgcLKgEZ8ZZ/VfHZa82VWGCHO+2WQ= -github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230509130604-825e323f67b6/go.mod h1:pSJlqf2h4Vh6xznUi+/SAeqG8fjPEQw8wbIp9MlYsrQ= +github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b h1:TGUrWZnJeKtEqH4WFfbwV2d4x4k6gxqqgjjKKRUWRlI= +github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b/go.mod h1:kNih6dPba1EoSxEZC1zKW096i2WTNSfa6MsvPhKOrac= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 h1:aMUzVZwuC0VDuGisJfPKWgYyTNVa1GhbB/oX/g/daZ4= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75/go.mod h1:zaXfmkcvtVNM7rM5ttrf89GsI3UUdr3VJcAbxunip1w= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 h1:PvsPhplAtU8cCjxf9ULZUy7YA3KdRmBewgAYFRB+8sg= From 0ae4b15cff59b5a4de5b284d05a45d07e0f79499 Mon Sep 17 00:00:00 2001 From: matei-p Date: Fri, 26 May 2023 10:41:07 +0300 Subject: [PATCH 031/120] go mod updates --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1cff690cd9c..962a3c58a30 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/multiversx/mx-chain-p2p-go v1.0.16 github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.8 - github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f + github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230526073545-2e8c1cb94ef2 github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 diff --git a/go.sum b/go.sum index f7c15656fa8..befe27c40e4 100644 --- a/go.sum +++ b/go.sum @@ -637,8 +637,9 @@ github.com/multiversx/mx-chain-storage-go v1.0.8 h1:PB9OAwZs3rWz7nybBOxVCxgrd785 github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNgT1esY3K9Pj6vPnoCwV9C3U= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f h1:H37/a22h+mvIJgb0sC3WzSav8Wz/IhD5rU65D/CHRLU= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230526073545-2e8c1cb94ef2 h1:BJbCPRJF97f3NichDTVvCowWv3yZMl9sxgGBvQee3hY= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230526073545-2e8c1cb94ef2/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b h1:TGUrWZnJeKtEqH4WFfbwV2d4x4k6gxqqgjjKKRUWRlI= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b/go.mod h1:kNih6dPba1EoSxEZC1zKW096i2WTNSfa6MsvPhKOrac= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 h1:aMUzVZwuC0VDuGisJfPKWgYyTNVa1GhbB/oX/g/daZ4= From ad18eebacba3c4978725a91c9fa80e2814df01fd Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 29 May 2023 10:12:25 +0300 Subject: [PATCH 032/120] core go deps --- facade/nodeFacade.go | 2 +- facade/nodeFacade_test.go | 2 +- go.mod | 3 ++- go.sum | 4 ++-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index a1a2d9391a4..eb2523e08a9 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -655,7 +655,7 @@ func (nf *nodeFacade) convertVmOutputToApiResponse(input *vmcommon.VMOutput) *vm Identifier: originalLog.Identifier, Address: logAddress, Topics: originalLog.Topics, - Data: originalLog.GetFirstDataItem(), + Data: originalLog.Data, }) } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 355b215decf..69da060bd16 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -1385,7 +1385,7 @@ func TestFacade_convertVmOutputToApiResponse(t *testing.T) { Identifier: logId, Address: convertAddressFunc(logAddr), Topics: logTopics, - Data: logData[0], + Data: logData, }, } diff --git a/go.mod b/go.mod index 962a3c58a30..8d983dd484d 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/google/gops v0.3.18 github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/multiversx/mx-chain-core-go v1.2.1 + github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.4.1 github.com/multiversx/mx-chain-logger-go v1.0.11 @@ -187,3 +187,4 @@ require ( ) replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 + diff --git a/go.sum b/go.sum index befe27c40e4..770a6970dfa 100644 --- a/go.sum +++ b/go.sum @@ -621,8 +621,8 @@ github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiversx/concurrent-map v0.1.4 h1:hdnbM8VE4b0KYJaGY5yJS2aNIW9TFFsUYwbO0993uPI= github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7eFQ4U2vKMOp4A/9+o= github.com/multiversx/mx-chain-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.1 h1:kmDfK7Znl3S0IJlDEE4sFuBOmA2rZkBudxlGhI1bvQc= -github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b h1:44s5BIfqgYnGoScXMOToSWqAOcNt7EccOcvnb9Wady0= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-crypto-go v1.2.6 h1:yxsjAQGh62los+iYmORMfh3w9qen0xbYlmwU0juNSeg= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-es-indexer-go v1.4.1 h1:gD/D7xZP7OL8L/ZZ3SoOfKjVHrU0iUxIG2AbidHFTUc= From 015efe779f2014158ea64ae96e5fead127eaec71 Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 30 May 2023 11:16:40 +0300 Subject: [PATCH 033/120] fixes after review --- facade/nodeFacade.go | 9 +++++---- facade/nodeFacade_test.go | 40 +++++++++++++++++++++++++++++++++------ go.mod | 5 ++--- go.sum | 9 +++++---- 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index eb2523e08a9..ea7d69f43e1 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -652,10 +652,11 @@ func (nf *nodeFacade) convertVmOutputToApiResponse(input *vmcommon.VMOutput) *vm } logs = append(logs, &vm.LogEntryApi{ - Identifier: originalLog.Identifier, - Address: logAddress, - Topics: originalLog.Topics, - Data: originalLog.Data, + Identifier: originalLog.Identifier, + Address: logAddress, + Topics: originalLog.Topics, + Data: originalLog.GetFirstDataItem(), + AdditionalData: originalLog.GetTailDataItems(), }) } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 69da060bd16..743f2313403 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -1324,7 +1324,34 @@ func TestNodeFacade_GetInternalMiniBlockByHashShouldWork(t *testing.T) { assert.Equal(t, ret, blk) } -func TestFacade_convertVmOutputToApiResponse(t *testing.T) { +func TestFacade_convertVmOutputToApiResponseNilLogData(t *testing.T) { + expectedLogData := []byte{} + expectedAdditionalLogData := [][]byte{} + testConvertVmOutput(t, nil, expectedLogData, expectedAdditionalLogData) +} + +func TestFacade_convertVmOutputToApiResponseEmptyLogData(t *testing.T) { + logData := [][]byte{} + expectedLogData := []byte{} + expectedAdditionalLogData := [][]byte{} + testConvertVmOutput(t, logData, expectedLogData, expectedAdditionalLogData) +} + +func TestFacade_convertVmOutputToApiResponseSingleLogData(t *testing.T) { + logData := [][]byte{[]byte("log_data")} + expectedLogData := []byte("log_data") + expectedAdditionalLogData := [][]byte{} + testConvertVmOutput(t, logData, expectedLogData, expectedAdditionalLogData) +} + +func TestFacade_convertVmOutputToApiResponseMultiLogData(t *testing.T) { + logData := [][]byte{[]byte("log_data1"), []byte("log_data2"), []byte("log_data3")} + expectedLogData := []byte("log_data1") + expectedAdditionalLogData := [][]byte{[]byte("log_data2"), []byte("log_data3")} + testConvertVmOutput(t, logData, expectedLogData, expectedAdditionalLogData) +} + +func testConvertVmOutput(t *testing.T, logData [][]byte, expectedLogData []byte, expectedAdditionalLogData [][]byte) { arg := createMockArguments() nf, _ := NewNodeFacade(arg) @@ -1336,7 +1363,7 @@ func TestFacade_convertVmOutputToApiResponse(t *testing.T) { retData := [][]byte{[]byte("ret_data_0")} outAcc, outAccStorageKey, outAccOffset := []byte("addr0"), []byte("out_acc_storage_key"), []byte("offset") outAccTransferSndrAddr := []byte("addr1") - logId, logAddr, logTopics, logData := []byte("log_id"), []byte("log_addr"), [][]byte{[]byte("log_topic")}, [][]byte{[]byte("log_data")} + logId, logAddr, logTopics := []byte("log_id"), []byte("log_addr"), [][]byte{[]byte("log_topic")} vmInput := vmcommon.VMOutput{ ReturnData: retData, OutputAccounts: map[string]*vmcommon.OutputAccount{ @@ -1382,10 +1409,11 @@ func TestFacade_convertVmOutputToApiResponse(t *testing.T) { expectedLogs := []*vm.LogEntryApi{ { - Identifier: logId, - Address: convertAddressFunc(logAddr), - Topics: logTopics, - Data: logData, + Identifier: logId, + Address: convertAddressFunc(logAddr), + Topics: logTopics, + Data: expectedLogData, + AdditionalData: expectedAdditionalLogData, }, } diff --git a/go.mod b/go.mod index 8d983dd484d..eaff417c409 100644 --- a/go.mod +++ b/go.mod @@ -13,14 +13,14 @@ require ( github.com/google/gops v0.3.18 github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b + github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.4.1 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.16 github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.8 - github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230526073545-2e8c1cb94ef2 + github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530081559-e18b831308b2 github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 @@ -187,4 +187,3 @@ require ( ) replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 - diff --git a/go.sum b/go.sum index 770a6970dfa..d07641ba7bf 100644 --- a/go.sum +++ b/go.sum @@ -621,8 +621,9 @@ github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiversx/concurrent-map v0.1.4 h1:hdnbM8VE4b0KYJaGY5yJS2aNIW9TFFsUYwbO0993uPI= github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7eFQ4U2vKMOp4A/9+o= github.com/multiversx/mx-chain-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b h1:44s5BIfqgYnGoScXMOToSWqAOcNt7EccOcvnb9Wady0= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 h1:rHqPhrsxLEXWuWFX8UqP4huWRJLxjazHprvz9ma3z4s= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-crypto-go v1.2.6 h1:yxsjAQGh62los+iYmORMfh3w9qen0xbYlmwU0juNSeg= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-es-indexer-go v1.4.1 h1:gD/D7xZP7OL8L/ZZ3SoOfKjVHrU0iUxIG2AbidHFTUc= @@ -638,8 +639,8 @@ github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNg github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230526073545-2e8c1cb94ef2 h1:BJbCPRJF97f3NichDTVvCowWv3yZMl9sxgGBvQee3hY= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230526073545-2e8c1cb94ef2/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530081559-e18b831308b2 h1:1gZWomz2Bjy1yaZBPR7nvb/B1cIeQAEgESEdFdorLWM= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530081559-e18b831308b2/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b h1:TGUrWZnJeKtEqH4WFfbwV2d4x4k6gxqqgjjKKRUWRlI= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b/go.mod h1:kNih6dPba1EoSxEZC1zKW096i2WTNSfa6MsvPhKOrac= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 h1:aMUzVZwuC0VDuGisJfPKWgYyTNVa1GhbB/oX/g/daZ4= From d3f39cb25876689eaa199b26cda104390190fc2d Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 30 May 2023 13:26:58 +0300 Subject: [PATCH 034/120] fixes after review --- facade/nodeFacade.go | 2 +- facade/nodeFacade_test.go | 11 ++++------- go.mod | 4 ++-- go.sum | 8 ++++---- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index ea7d69f43e1..eac94c3d091 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -656,7 +656,7 @@ func (nf *nodeFacade) convertVmOutputToApiResponse(input *vmcommon.VMOutput) *vm Address: logAddress, Topics: originalLog.Topics, Data: originalLog.GetFirstDataItem(), - AdditionalData: originalLog.GetTailDataItems(), + AdditionalData: originalLog.Data, }) } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 743f2313403..fec64939807 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -1325,29 +1325,26 @@ func TestNodeFacade_GetInternalMiniBlockByHashShouldWork(t *testing.T) { } func TestFacade_convertVmOutputToApiResponseNilLogData(t *testing.T) { - expectedLogData := []byte{} - expectedAdditionalLogData := [][]byte{} - testConvertVmOutput(t, nil, expectedLogData, expectedAdditionalLogData) + testConvertVmOutput(t, nil, nil, nil) } func TestFacade_convertVmOutputToApiResponseEmptyLogData(t *testing.T) { logData := [][]byte{} - expectedLogData := []byte{} expectedAdditionalLogData := [][]byte{} - testConvertVmOutput(t, logData, expectedLogData, expectedAdditionalLogData) + testConvertVmOutput(t, logData, nil, expectedAdditionalLogData) } func TestFacade_convertVmOutputToApiResponseSingleLogData(t *testing.T) { logData := [][]byte{[]byte("log_data")} expectedLogData := []byte("log_data") - expectedAdditionalLogData := [][]byte{} + expectedAdditionalLogData := [][]byte{[]byte("log_data")} testConvertVmOutput(t, logData, expectedLogData, expectedAdditionalLogData) } func TestFacade_convertVmOutputToApiResponseMultiLogData(t *testing.T) { logData := [][]byte{[]byte("log_data1"), []byte("log_data2"), []byte("log_data3")} expectedLogData := []byte("log_data1") - expectedAdditionalLogData := [][]byte{[]byte("log_data2"), []byte("log_data3")} + expectedAdditionalLogData := [][]byte{[]byte("log_data1"), []byte("log_data2"), []byte("log_data3")} testConvertVmOutput(t, logData, expectedLogData, expectedAdditionalLogData) } diff --git a/go.mod b/go.mod index eaff417c409..4b3fbf24766 100644 --- a/go.mod +++ b/go.mod @@ -13,14 +13,14 @@ require ( github.com/google/gops v0.3.18 github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 + github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.4.1 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.16 github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.8 - github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530081559-e18b831308b2 + github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530102542-8c1cb3b761b7 github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 diff --git a/go.sum b/go.sum index d07641ba7bf..63aa2f46dc2 100644 --- a/go.sum +++ b/go.sum @@ -622,8 +622,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-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 h1:rHqPhrsxLEXWuWFX8UqP4huWRJLxjazHprvz9ma3z4s= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b h1:44s5BIfqgYnGoScXMOToSWqAOcNt7EccOcvnb9Wady0= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-crypto-go v1.2.6 h1:yxsjAQGh62los+iYmORMfh3w9qen0xbYlmwU0juNSeg= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-es-indexer-go v1.4.1 h1:gD/D7xZP7OL8L/ZZ3SoOfKjVHrU0iUxIG2AbidHFTUc= @@ -639,8 +639,8 @@ github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNg github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530081559-e18b831308b2 h1:1gZWomz2Bjy1yaZBPR7nvb/B1cIeQAEgESEdFdorLWM= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530081559-e18b831308b2/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530102542-8c1cb3b761b7 h1:kTdwTfWnt/rolg+CNExLA48bQ9EpfU9iklgnyPo3MA0= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530102542-8c1cb3b761b7/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b h1:TGUrWZnJeKtEqH4WFfbwV2d4x4k6gxqqgjjKKRUWRlI= github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b/go.mod h1:kNih6dPba1EoSxEZC1zKW096i2WTNSfa6MsvPhKOrac= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 h1:aMUzVZwuC0VDuGisJfPKWgYyTNVa1GhbB/oX/g/daZ4= From 5e40513b6c46ca4d077628084f45115da0ccbcd0 Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 30 May 2023 13:32:29 +0300 Subject: [PATCH 035/120] go mod fix --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4b3fbf24766..140e8a52350 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/google/gops v0.3.18 github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b + github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.4.1 github.com/multiversx/mx-chain-logger-go v1.0.11 diff --git a/go.sum b/go.sum index 63aa2f46dc2..d84478cdd71 100644 --- a/go.sum +++ b/go.sum @@ -622,8 +622,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-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b h1:44s5BIfqgYnGoScXMOToSWqAOcNt7EccOcvnb9Wady0= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230529071050-780f9acc238b/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 h1:rHqPhrsxLEXWuWFX8UqP4huWRJLxjazHprvz9ma3z4s= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-crypto-go v1.2.6 h1:yxsjAQGh62los+iYmORMfh3w9qen0xbYlmwU0juNSeg= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-es-indexer-go v1.4.1 h1:gD/D7xZP7OL8L/ZZ3SoOfKjVHrU0iUxIG2AbidHFTUc= From 95b68d45309c3ec7cdd14151af5189ccbd3d4faa Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 31 May 2023 17:16:05 +0300 Subject: [PATCH 036/120] fixes after review --- go.mod | 6 +++--- go.sum | 12 ++++++------ process/transactionLog/process.go | 9 +++++---- process/transactionLog/process_test.go | 8 +++++++- vm/systemSmartContracts/eei.go | 4 ++-- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index 140e8a52350..3a9c4aca773 100644 --- a/go.mod +++ b/go.mod @@ -13,15 +13,15 @@ require ( github.com/google/gops v0.3.18 github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 - github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 + github.com/multiversx/mx-chain-core-go v1.2.3-0.20230531140945-b7bc17bd66fe github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.4.1 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.16 github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.8 - github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530102542-8c1cb3b761b7 - github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b + github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230531140910-a909ddad23d6 + github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230531141145-a105dc8676c3 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230512080139-c7f54612ba66 diff --git a/go.sum b/go.sum index d84478cdd71..2e8bd3db7e3 100644 --- a/go.sum +++ b/go.sum @@ -622,8 +622,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-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62 h1:rHqPhrsxLEXWuWFX8UqP4huWRJLxjazHprvz9ma3z4s= -github.com/multiversx/mx-chain-core-go v1.2.3-0.20230530081436-6b256b073e62/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230531140945-b7bc17bd66fe h1:uwEO1O7BkpDJN2muWAct8wthqqK/21yOOprXVXsPHX4= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230531140945-b7bc17bd66fe/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-crypto-go v1.2.6 h1:yxsjAQGh62los+iYmORMfh3w9qen0xbYlmwU0juNSeg= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-es-indexer-go v1.4.1 h1:gD/D7xZP7OL8L/ZZ3SoOfKjVHrU0iUxIG2AbidHFTUc= @@ -639,10 +639,10 @@ github.com/multiversx/mx-chain-storage-go v1.0.8/go.mod h1:lEkFYFe6taKYxqO1einNg github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530102542-8c1cb3b761b7 h1:kTdwTfWnt/rolg+CNExLA48bQ9EpfU9iklgnyPo3MA0= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230530102542-8c1cb3b761b7/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b h1:TGUrWZnJeKtEqH4WFfbwV2d4x4k6gxqqgjjKKRUWRlI= -github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230525111940-e424e787989b/go.mod h1:kNih6dPba1EoSxEZC1zKW096i2WTNSfa6MsvPhKOrac= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230531140910-a909ddad23d6 h1:nsO/C0veOG5YYr0JunVm24e3SALVhzAch4za7VLcDAI= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230531140910-a909ddad23d6/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230531141145-a105dc8676c3 h1:6V3vyUs9at+NETi8bAaNNl/IjeX/hxeMTkigZD8kItE= +github.com/multiversx/mx-chain-vm-go v1.5.4-0.20230531141145-a105dc8676c3/go.mod h1:Z05MpGEApDMRnizy9iP5c00kGYifOm2IeRC0YIC5/3E= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75 h1:aMUzVZwuC0VDuGisJfPKWgYyTNVa1GhbB/oX/g/daZ4= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230512081309-5a21e9f58f75/go.mod h1:zaXfmkcvtVNM7rM5ttrf89GsI3UUdr3VJcAbxunip1w= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230512080225-93b429c3fad7 h1:PvsPhplAtU8cCjxf9ULZUy7YA3KdRmBewgAYFRB+8sg= diff --git a/process/transactionLog/process.go b/process/transactionLog/process.go index d975e04ad72..76a44294cd2 100644 --- a/process/transactionLog/process.go +++ b/process/transactionLog/process.go @@ -153,10 +153,11 @@ func (tlp *txLogProcessor) SaveLog(txHash []byte, tx data.TransactionHandler, lo for _, logEntry := range logEntries { txLog.Events = append(txLog.Events, &transaction.Event{ - Identifier: logEntry.Identifier, - Address: logEntry.Address, - Topics: logEntry.Topics, - Data: logEntry.GetFirstDataItem(), + Identifier: logEntry.Identifier, + Address: logEntry.Address, + Topics: logEntry.Topics, + Data: logEntry.GetFirstDataItem(), + AdditionalData: logEntry.Data, }) } diff --git a/process/transactionLog/process_test.go b/process/transactionLog/process_test.go index e676c1ea5c6..776f611090f 100644 --- a/process/transactionLog/process_test.go +++ b/process/transactionLog/process_test.go @@ -129,6 +129,8 @@ func TestTxLogProcessor_SaveLogsStoreErr(t *testing.T) { func TestTxLogProcessor_SaveLogsCallsPutWithMarshalBuff(t *testing.T) { buffExpected := []byte("marshaled log") buffActual := []byte("currently wrong value") + expectedLogData := [][]byte{[]byte("data1"), []byte("data2")} + txLogProcessor, _ := transactionLog.NewTxLogProcessor(transactionLog.ArgTxLogProcessor{ Storer: &storageStubs.StorerStub{ PutCalled: func(key, data []byte) error { @@ -138,6 +140,10 @@ func TestTxLogProcessor_SaveLogsCallsPutWithMarshalBuff(t *testing.T) { }, Marshalizer: &mock.MarshalizerStub{ MarshalCalled: func(obj interface{}) (bytes []byte, err error) { + // require.Equal(t, buffExpected, buffActual) + log, _ := obj.(*transaction.Log) + require.Equal(t, expectedLogData[0], log.Events[0].Data) + require.Equal(t, expectedLogData, log.Events[0].AdditionalData) return buffExpected, nil }, }, @@ -145,7 +151,7 @@ func TestTxLogProcessor_SaveLogsCallsPutWithMarshalBuff(t *testing.T) { }) logs := []*vmcommon.LogEntry{ - {Address: []byte("first log")}, + {Address: []byte("first log"), Data: expectedLogData}, } _ = txLogProcessor.SaveLog([]byte("txhash"), &transaction.Transaction{}, logs) diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index fc83caf2d16..079ad5f2008 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -425,8 +425,8 @@ func (host *vmContext) transferBeforeInternalExec(callInput *vmcommon.ContractCa logEntry := &vmcommon.LogEntry{ Identifier: []byte(transferValueOnly), - Address: callInput.RecipientAddr, - Topics: [][]byte{sender, callInput.CallValue.Bytes()}, + Address: sender, + Topics: [][]byte{callInput.CallValue.Bytes(), callInput.RecipientAddr}, Data: vmcommon.FormatLogDataForCall(callType, callInput.Function, callInput.Arguments), } host.AddLogEntry(logEntry) From bab0680282d4c3f6d2497d7b4b6e2364ed075a5b Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 31 May 2023 18:20:21 +0300 Subject: [PATCH 037/120] test fix --- .../vm/txsFee/guardAccount_test.go | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index 0774e913736..88f36d09d9b 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -399,10 +399,11 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { event := allLogs[0].LogHandler.GetLogEvents()[0] require.Equal(t, &transaction.Event{ - Address: alice, - Identifier: []byte(core.BuiltInFunctionSetGuardian), - Topics: [][]byte{bob, uuid}, - Data: []byte{}, + Address: alice, + Identifier: []byte(core.BuiltInFunctionSetGuardian), + Topics: [][]byte{bob, uuid}, + Data: nil, + AdditionalData: nil, }, event) testContext.TxsLogsProcessor.Clean() @@ -430,10 +431,11 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { event = allLogs[0].LogHandler.GetLogEvents()[0] require.Equal(t, &transaction.Event{ - Address: alice, - Identifier: []byte(core.SignalErrorOperation), - Topics: [][]byte{alice, []byte("account has no active guardian")}, - Data: []byte("@6163636f756e7420686173206e6f2061637469766520677561726469616e"), + Address: alice, + Identifier: []byte(core.SignalErrorOperation), + Topics: [][]byte{alice, []byte("account has no active guardian")}, + Data: []byte("@6163636f756e7420686173206e6f2061637469766520677561726469616e"), + AdditionalData: [][]byte{[]byte("@6163636f756e7420686173206e6f2061637469766520677561726469616e")}, }, event) testContext.TxsLogsProcessor.Clean() @@ -458,9 +460,10 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { event = allLogs[0].LogHandler.GetLogEvents()[0] require.Equal(t, &transaction.Event{ - Address: alice, - Identifier: []byte(core.BuiltInFunctionGuardAccount), - Data: []byte{}, + Address: alice, + Identifier: []byte(core.BuiltInFunctionGuardAccount), + Data: nil, + AdditionalData: nil, }, event) testContext.TxsLogsProcessor.Clean() } From 28539bb2542e5e88a15f1c4d179dabc9c3df6d1c Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 6 Jun 2023 11:39:41 +0300 Subject: [PATCH 038/120] small fix --- process/transactionLog/process_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/process/transactionLog/process_test.go b/process/transactionLog/process_test.go index 776f611090f..f132c865486 100644 --- a/process/transactionLog/process_test.go +++ b/process/transactionLog/process_test.go @@ -140,7 +140,6 @@ func TestTxLogProcessor_SaveLogsCallsPutWithMarshalBuff(t *testing.T) { }, Marshalizer: &mock.MarshalizerStub{ MarshalCalled: func(obj interface{}) (bytes []byte, err error) { - // require.Equal(t, buffExpected, buffActual) log, _ := obj.(*transaction.Log) require.Equal(t, expectedLogData[0], log.Events[0].Data) require.Equal(t, expectedLogData, log.Events[0].AdditionalData) From a87b88b9213f860d029a31aeb5ef975b1f98bd1b Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 3 Jul 2023 13:28:36 +0300 Subject: [PATCH 039/120] minor fix --- process/transactionEvaluator/transactionSimulator.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/transactionEvaluator/transactionSimulator.go b/process/transactionEvaluator/transactionSimulator.go index ea9760b6ef1..8d1a405643d 100644 --- a/process/transactionEvaluator/transactionSimulator.go +++ b/process/transactionEvaluator/transactionSimulator.go @@ -146,7 +146,7 @@ func (ts *transactionSimulator) addLogsFromVmOutput(results *txSimData.Simulatio Address: ts.addressPubKeyConverter.SilentEncode(entry.Address, log), Identifier: string(entry.Identifier), Topics: entry.Topics, - Data: entry.Data, + Data: entry.GetFirstDataItem(), }) } } From 73f6bb4ee0e09afc399b9f78a5c626187fbf52b8 Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 3 Jul 2023 13:46:03 +0300 Subject: [PATCH 040/120] legacy vm deps --- go.mod | 6 +++--- go.sum | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 2544cb9f08d..ca9e74b511b 100644 --- a/go.mod +++ b/go.mod @@ -22,9 +22,9 @@ require ( github.com/multiversx/mx-chain-storage-go v1.0.11 github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.86 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230522144058-6e42464d2e73 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230522143557-fc926d66b434 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230522142445-0f06f4075754 github.com/pelletier/go-toml v1.9.3 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index 846aafaa294..720b48cd8da 100644 --- a/go.sum +++ b/go.sum @@ -644,17 +644,17 @@ github.com/multiversx/mx-chain-storage-go v1.0.11 h1:u4ZsfIXEU3nJWRUxyAswhBn2pT6 github.com/multiversx/mx-chain-storage-go v1.0.11/go.mod h1:VP9fwyFBmbmDzahUuu0IeGX/dKG3iBWjN6FSQ6YtVaI= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.5.0/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c h1:8wz/fxqsnk80jRDW1Q8st7noNQBN/AaYJbAW5cvQpuA= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c h1:4uaYXpU+Kh60R7iuaGitOKnD7hzwJEA8st0q3p0kqpg= github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c/go.mod h1:wsVfy2Jk1X68LFtAs18U0A4UcEW/vLrRU8PNGQM/mc0= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59 h1:vbsVspKWU0IQBo+mFBH9LCqAtkZqPQy73qdVAhpy2Bc= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59/go.mod h1:3ABXSSfMOcdPApGoArfnVGz1BfcJgyWd8Ip2D0FZPNE= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60 h1:1zW2c3lAt7by5fNl3T4u79z2LHyNtgsoMShTucmeNa4= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60/go.mod h1:6V95ltdliuQ51mIF2YmmOzT8tqkkthRcgRRNDz1nUZE= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.86 h1:4S2vEofRGURcucft1Sn0/3EK27PHG1kXTJ61uGU+SDs= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.86/go.mod h1:88lSkt0SEm3bsYOvn63DX1kjaZwL1gggYrJGtvtGLU8= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230522144058-6e42464d2e73 h1:XWNkSTSZ4cBrUw1IOSVrn6jv7N/775bDZLRotcsnSvU= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230522144058-6e42464d2e73/go.mod h1:zaXfmkcvtVNM7rM5ttrf89GsI3UUdr3VJcAbxunip1w= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230522143557-fc926d66b434 h1:Mhz1uo94J4nPJi3kjSp00cOf9QLr6QTBald0NcBCnHI= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230522143557-fc926d66b434/go.mod h1:hivjsQwoSC0+oHQn1nvBethdpykw7CQL7YnTrLDrVd0= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230522142445-0f06f4075754 h1:2x8uOfKyYWH9sqILw1DJAilW979G2wVzbzzPRD6AviU= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230522142445-0f06f4075754/go.mod h1:q/GunkvXqFPqQGHiGhskWvr7+tsmqN0iFp5X84zssjk= github.com/multiversx/mx-components-big-int v0.1.1 h1:695mYPKYOrmGEGgRH4/pZruDoe3CPP1LHrBxKfvj5l4= github.com/multiversx/mx-components-big-int v0.1.1/go.mod h1:0QrcFdfeLgJ/am10HGBeH0G0DNF+0Qx1E4DS/iozQls= github.com/multiversx/protobuf v1.3.2 h1:RaNkxvGTGbA0lMcnHAN24qE1G1i+Xs5yHA6MDvQ4mSM= From f66ea030ac2a7e4b92ddc503b63c5f01bd6f5ac7 Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 3 Jul 2023 14:12:30 +0300 Subject: [PATCH 041/120] more go mod fixes --- go.mod | 6 +++--- go.sum | 13 ++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index ca9e74b511b..c4ae2a5d9e0 100644 --- a/go.mod +++ b/go.mod @@ -22,9 +22,9 @@ require ( github.com/multiversx/mx-chain-storage-go v1.0.11 github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230522144058-6e42464d2e73 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230522143557-fc926d66b434 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230522142445-0f06f4075754 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230703110501-5ef444f19b96 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230703110707-eb0e55bd7b48 github.com/pelletier/go-toml v1.9.3 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index 720b48cd8da..1d5bd603eda 100644 --- a/go.sum +++ b/go.sum @@ -644,17 +644,16 @@ github.com/multiversx/mx-chain-storage-go v1.0.11 h1:u4ZsfIXEU3nJWRUxyAswhBn2pT6 github.com/multiversx/mx-chain-storage-go v1.0.11/go.mod h1:VP9fwyFBmbmDzahUuu0IeGX/dKG3iBWjN6FSQ6YtVaI= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230509130344-9d241d34991f/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c h1:8wz/fxqsnk80jRDW1Q8st7noNQBN/AaYJbAW5cvQpuA= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c h1:4uaYXpU+Kh60R7iuaGitOKnD7hzwJEA8st0q3p0kqpg= github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c/go.mod h1:wsVfy2Jk1X68LFtAs18U0A4UcEW/vLrRU8PNGQM/mc0= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230522144058-6e42464d2e73 h1:XWNkSTSZ4cBrUw1IOSVrn6jv7N/775bDZLRotcsnSvU= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54-0.20230522144058-6e42464d2e73/go.mod h1:zaXfmkcvtVNM7rM5ttrf89GsI3UUdr3VJcAbxunip1w= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230522143557-fc926d66b434 h1:Mhz1uo94J4nPJi3kjSp00cOf9QLr6QTBald0NcBCnHI= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.55-0.20230522143557-fc926d66b434/go.mod h1:hivjsQwoSC0+oHQn1nvBethdpykw7CQL7YnTrLDrVd0= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230522142445-0f06f4075754 h1:2x8uOfKyYWH9sqILw1DJAilW979G2wVzbzzPRD6AviU= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.81-0.20230522142445-0f06f4075754/go.mod h1:q/GunkvXqFPqQGHiGhskWvr7+tsmqN0iFp5X84zssjk= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a h1:VNWqguDSsnaa/9Mo6WQRUw0Q8XMRIblD91gRmTPr1Kc= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a/go.mod h1:fAa2RF1ZN7dFPga7RzhWsHiKx0OgXSo7xkry54UzQFA= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230703110501-5ef444f19b96 h1:tg1Ii+pf5Zvoj4daUTH+Xi9RDCGUmFc1Q0mO8YoaGq8= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230703110501-5ef444f19b96/go.mod h1:KNHR8Q1jBDk4DzaHu9XppwkLmHr/USKqsji229Xn3tc= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230703110707-eb0e55bd7b48 h1:rgNRAk699GCHlRyA+sxm9vnV5KdgmiuvaBuj999o1h0= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230703110707-eb0e55bd7b48/go.mod h1:q7sJ9nahtiIdsUpYteommLl33IiRIVEx+k0GR+tdhgU= github.com/multiversx/mx-components-big-int v0.1.1 h1:695mYPKYOrmGEGgRH4/pZruDoe3CPP1LHrBxKfvj5l4= github.com/multiversx/mx-components-big-int v0.1.1/go.mod h1:0QrcFdfeLgJ/am10HGBeH0G0DNF+0Qx1E4DS/iozQls= github.com/multiversx/protobuf v1.3.2 h1:RaNkxvGTGbA0lMcnHAN24qE1G1i+Xs5yHA6MDvQ4mSM= From a9af60cdd1f39cbbacc266d0add1cb19c15e68c7 Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 5 Jul 2023 09:56:47 +0300 Subject: [PATCH 042/120] activation for log events --- common/constants.go | 3 +++ common/enablers/enableEpochsHandler.go | 1 + common/enablers/enableEpochsHandler_test.go | 4 ++++ common/enablers/epochFlags.go | 7 +++++++ common/interface.go | 1 + config/epochConfig.go | 1 + config/tomlConfig_test.go | 1 + genesis/process/shardGenesisBlockCreator.go | 1 + go.mod | 2 +- go.sum | 2 ++ node/metrics/metrics.go | 1 + node/metrics/metrics_test.go | 1 + sharding/mock/enableEpochsHandlerMock.go | 5 +++++ .../enableEpochsHandlerMock/enableEpochsHandlerStub.go | 9 +++++++++ 14 files changed, 38 insertions(+), 1 deletion(-) diff --git a/common/constants.go b/common/constants.go index 521ef905d8e..83fcfeee59e 100644 --- a/common/constants.go +++ b/common/constants.go @@ -603,6 +603,9 @@ const ( // MetricSetGuardianEnableEpoch represents the epoch when the guardian feature is enabled MetricSetGuardianEnableEpoch = "erd_set_guardian_feature_enable_epoch" + + // MetricSetScToScLogEventEnableEpoch represents the epoch when the sc to sc log event feature is enabled + MetricSetScToScLogEventEnableEpoch = "erd_set_sc_to_sc_log_event_enable_epoch" ) const ( diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index 4e7478ad6a7..05e65db74f4 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -120,6 +120,7 @@ func (handler *enableEpochsHandler) EpochConfirmed(epoch uint32, _ uint64) { handler.setFlagValue(epoch >= handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch, handler.alwaysSaveTokenMetaDataFlag, "alwaysSaveTokenMetaDataFlag", epoch, handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.RelayedNonceFixEnableEpoch, handler.relayedNonceFixFlag, "relayedNonceFixFlag", epoch, handler.enableEpochsConfig.RelayedNonceFixEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.SetGuardianEnableEpoch, handler.setGuardianFlag, "setGuardianFlag", epoch, handler.enableEpochsConfig.SetGuardianEnableEpoch) + handler.setFlagValue(epoch >= handler.enableEpochsConfig.ScToScLogEventEnableEpoch, handler.scToScLogEventFlag, "setScToScLogEventFlag", epoch, handler.enableEpochsConfig.ScToScLogEventEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.MultiClaimOnDelegationEnableEpoch, handler.multiClaimOnDelegationFlag, "multiClaimOnDelegationFlag", epoch, handler.enableEpochsConfig.MultiClaimOnDelegationEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.KeepExecOrderOnCreatedSCRsEnableEpoch, handler.keepExecOrderOnCreatedSCRsFlag, "keepExecOrderOnCreatedSCRsFlag", epoch, handler.enableEpochsConfig.KeepExecOrderOnCreatedSCRsEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.ChangeUsernameEnableEpoch, handler.changeUsernameFlag, "changeUsername", epoch, handler.enableEpochsConfig.ChangeUsernameEnableEpoch) diff --git a/common/enablers/enableEpochsHandler_test.go b/common/enablers/enableEpochsHandler_test.go index b8d07171444..094c6e342a7 100644 --- a/common/enablers/enableEpochsHandler_test.go +++ b/common/enablers/enableEpochsHandler_test.go @@ -102,6 +102,7 @@ func createEnableEpochsConfig() config.EnableEpochs { ChangeUsernameEnableEpoch: 85, ConsistentTokensValuesLengthCheckEnableEpoch: 86, FixDelegationChangeOwnerOnAccountEnableEpoch: 87, + ScToScLogEventEnableEpoch: 88, } } @@ -229,6 +230,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.True(t, handler.IsRuntimeCodeSizeFixEnabled()) assert.True(t, handler.IsRelayedNonceFixEnabled()) assert.True(t, handler.IsSetGuardianEnabled()) + assert.True(t, handler.IsScToScEventLogEnabled()) assert.True(t, handler.IsAutoBalanceDataTriesEnabled()) assert.True(t, handler.IsKeepExecOrderOnCreatedSCRsEnabled()) assert.True(t, handler.IsMultiClaimOnDelegationEnabled()) @@ -346,6 +348,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.True(t, handler.IsRuntimeCodeSizeFixEnabled()) assert.True(t, handler.IsRelayedNonceFixEnabled()) assert.True(t, handler.IsSetGuardianEnabled()) + assert.True(t, handler.IsScToScEventLogEnabled()) assert.True(t, handler.IsAutoBalanceDataTriesEnabled()) assert.True(t, handler.IsKeepExecOrderOnCreatedSCRsEnabled()) assert.True(t, handler.IsMultiClaimOnDelegationEnabled()) @@ -458,6 +461,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.False(t, handler.IsRuntimeCodeSizeFixEnabled()) assert.False(t, handler.IsRelayedNonceFixEnabled()) assert.False(t, handler.IsSetGuardianEnabled()) + assert.False(t, handler.IsScToScEventLogEnabled()) assert.False(t, handler.IsAutoBalanceDataTriesEnabled()) assert.False(t, handler.IsKeepExecOrderOnCreatedSCRsEnabled()) assert.False(t, handler.IsMultiClaimOnDelegationEnabled()) diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index 17c78fe445e..5ccc319b94a 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -92,6 +92,7 @@ type epochFlagsHolder struct { wipeSingleNFTLiquidityDecreaseFlag *atomic.Flag alwaysSaveTokenMetaDataFlag *atomic.Flag setGuardianFlag *atomic.Flag + scToScLogEventFlag *atomic.Flag relayedNonceFixFlag *atomic.Flag keepExecOrderOnCreatedSCRsFlag *atomic.Flag multiClaimOnDelegationFlag *atomic.Flag @@ -190,6 +191,7 @@ func newEpochFlagsHolder() *epochFlagsHolder { wipeSingleNFTLiquidityDecreaseFlag: &atomic.Flag{}, alwaysSaveTokenMetaDataFlag: &atomic.Flag{}, setGuardianFlag: &atomic.Flag{}, + scToScLogEventFlag: &atomic.Flag{}, relayedNonceFixFlag: &atomic.Flag{}, keepExecOrderOnCreatedSCRsFlag: &atomic.Flag{}, consistentTokensValuesCheckFlag: &atomic.Flag{}, @@ -688,6 +690,11 @@ func (holder *epochFlagsHolder) IsSetGuardianEnabled() bool { return holder.setGuardianFlag.IsSet() } +// IsScToScLogEventFlagEnabled returns true if scToScLogEventFlag is enabled +func (holder *epochFlagsHolder) IsScToScEventLogEnabled() bool { + return holder.scToScLogEventFlag.IsSet() +} + // IsRelayedNonceFixEnabled returns true if relayedNonceFixFlag is enabled func (holder *epochFlagsHolder) IsRelayedNonceFixEnabled() bool { return holder.relayedNonceFixFlag.IsSet() diff --git a/common/interface.go b/common/interface.go index 1e3a4bbdb18..b851b9f4a12 100644 --- a/common/interface.go +++ b/common/interface.go @@ -383,6 +383,7 @@ type EnableEpochsHandler interface { IsWipeSingleNFTLiquidityDecreaseEnabled() bool IsAlwaysSaveTokenMetaDataEnabled() bool IsSetGuardianEnabled() bool + IsScToScEventLogEnabled() bool IsRelayedNonceFixEnabled() bool IsKeepExecOrderOnCreatedSCRsEnabled() bool IsMultiClaimOnDelegationEnabled() bool diff --git a/config/epochConfig.go b/config/epochConfig.go index a3accb6c7c2..0fef90b7f0e 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -95,6 +95,7 @@ type EnableEpochs struct { WipeSingleNFTLiquidityDecreaseEnableEpoch uint32 AlwaysSaveTokenMetaDataEnableEpoch uint32 SetGuardianEnableEpoch uint32 + ScToScLogEventEnableEpoch uint32 RelayedNonceFixEnableEpoch uint32 KeepExecOrderOnCreatedSCRsEnableEpoch uint32 MultiClaimOnDelegationEnableEpoch uint32 diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 765919b32ff..879fba23c30 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -882,6 +882,7 @@ func TestEnableEpochConfig(t *testing.T) { ChangeUsernameEnableEpoch: 85, ConsistentTokensValuesLengthCheckEnableEpoch: 86, FixDelegationChangeOwnerOnAccountEnableEpoch: 87, + ScToScLogEventEnableEpoch: 88, MaxNodesChangeEnableEpoch: []MaxNodesChangeConfig{ { EpochEnable: 44, diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index 41d43448e02..07622282154 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -146,6 +146,7 @@ func createGenesisConfig() config.EnableEpochs { MaxBlockchainHookCountersEnableEpoch: unreachableEpoch, BLSMultiSignerEnableEpoch: blsMultiSignerEnableEpoch, SetGuardianEnableEpoch: unreachableEpoch, + ScToScLogEventEnableEpoch: unreachableEpoch, } } diff --git a/go.mod b/go.mod index c4ae2a5d9e0..657ef1796a0 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.11 - github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c + github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13 github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230703110501-5ef444f19b96 diff --git a/go.sum b/go.sum index 1d5bd603eda..2c00034ed35 100644 --- a/go.sum +++ b/go.sum @@ -646,6 +646,8 @@ github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3de github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c h1:8wz/fxqsnk80jRDW1Q8st7noNQBN/AaYJbAW5cvQpuA= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= +github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13 h1:ZJ3YT5aCHVMYryPIZT9bSaai+MYUyr+nyiazyBB1rIw= +github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c h1:4uaYXpU+Kh60R7iuaGitOKnD7hzwJEA8st0q3p0kqpg= github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c/go.mod h1:wsVfy2Jk1X68LFtAs18U0A4UcEW/vLrRU8PNGQM/mc0= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a h1:VNWqguDSsnaa/9Mo6WQRUw0Q8XMRIblD91gRmTPr1Kc= diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index d584be00004..25472add7e8 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -129,6 +129,7 @@ func InitConfigMetrics( appStatusHandler.SetStringValue(common.MetricTotalSupply, economicsConfig.GlobalSettings.GenesisTotalSupply) appStatusHandler.SetUInt64Value(common.MetricWaitingListFixEnableEpoch, uint64(enableEpochs.WaitingListFixEnableEpoch)) appStatusHandler.SetUInt64Value(common.MetricSetGuardianEnableEpoch, uint64(enableEpochs.SetGuardianEnableEpoch)) + appStatusHandler.SetUInt64Value(common.MetricSetScToScLogEventEnableEpoch, uint64(enableEpochs.ScToScLogEventEnableEpoch)) for i, nodesChangeConfig := range enableEpochs.MaxNodesChangeEnableEpoch { epochEnable := fmt.Sprintf("%s%d%s", common.MetricMaxNodesChangeEnableEpoch, i, common.EpochEnableSuffix) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 381a16100d6..2e4e6f7f944 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -138,6 +138,7 @@ func TestInitConfigMetrics(t *testing.T) { BuiltInFunctionOnMetaEnableEpoch: 34, WaitingListFixEnableEpoch: 35, SetGuardianEnableEpoch: 36, + ScToScLogEventEnableEpoch: 37, MaxNodesChangeEnableEpoch: []config.MaxNodesChangeConfig{ { EpochEnable: 0, diff --git a/sharding/mock/enableEpochsHandlerMock.go b/sharding/mock/enableEpochsHandlerMock.go index 82764fc3711..5c2c07ec2be 100644 --- a/sharding/mock/enableEpochsHandlerMock.go +++ b/sharding/mock/enableEpochsHandlerMock.go @@ -578,6 +578,11 @@ func (mock *EnableEpochsHandlerMock) IsSetGuardianEnabled() bool { return false } +// IsScToScEventLogEnabled returns false +func (mock *EnableEpochsHandlerMock) IsScToScEventLogEnabled() bool { + return false +} + // IsRelayedNonceFixEnabled - func (mock *EnableEpochsHandlerMock) IsRelayedNonceFixEnabled() bool { return false diff --git a/testscommon/enableEpochsHandlerMock/enableEpochsHandlerStub.go b/testscommon/enableEpochsHandlerMock/enableEpochsHandlerStub.go index bf1625a59f6..a56f0d02ee2 100644 --- a/testscommon/enableEpochsHandlerMock/enableEpochsHandlerStub.go +++ b/testscommon/enableEpochsHandlerMock/enableEpochsHandlerStub.go @@ -119,6 +119,7 @@ type EnableEpochsHandlerStub struct { IsWipeSingleNFTLiquidityDecreaseEnabledField bool IsAlwaysSaveTokenMetaDataEnabledField bool IsSetGuardianEnabledField bool + IsScToScEventLogEnabledField bool IsRelayedNonceFixEnabledField bool IsKeepExecOrderOnCreatedSCRsEnabledField bool IsMultiClaimOnDelegationEnabledField bool @@ -1039,6 +1040,14 @@ func (stub *EnableEpochsHandlerStub) IsSetGuardianEnabled() bool { return stub.IsSetGuardianEnabledField } +// IsScToScEventLogEnabled - +func (stub *EnableEpochsHandlerStub) IsScToScEventLogEnabled() bool { + stub.RLock() + defer stub.RUnlock() + + return stub.IsScToScEventLogEnabledField +} + // IsRelayedNonceFixEnabled - func (stub *EnableEpochsHandlerStub) IsRelayedNonceFixEnabled() bool { stub.RLock() From a24edcdc2d2b7a757bb5051ae6a4d4ea4207ea25 Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 5 Jul 2023 10:20:08 +0300 Subject: [PATCH 043/120] tests fix --- config/tomlConfig_test.go | 3 +++ node/metrics/metrics_test.go | 1 + 2 files changed, 4 insertions(+) diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 879fba23c30..e63b95f2a9f 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -775,6 +775,9 @@ func TestEnableEpochConfig(t *testing.T) { # FixDelegationChangeOwnerOnAccountEnableEpoch represents the epoch when the fix for the delegation system smart contract is enabled FixDelegationChangeOwnerOnAccountEnableEpoch = 87 + # ScToScLogEventEnableEpoch represents the epoch when the sc to sc log event feature is enabled + ScToScLogEventEnableEpoch = 88 + # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ { EpochEnable = 44, MaxNumNodes = 2169, NodesToShufflePerShard = 80 }, diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 2e4e6f7f944..765055afaa2 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -193,6 +193,7 @@ func TestInitConfigMetrics(t *testing.T) { "erd_max_nodes_change_enable_epoch0_max_num_nodes": uint32(1), "erd_max_nodes_change_enable_epoch0_nodes_to_shuffle_per_shard": uint32(2), "erd_set_guardian_feature_enable_epoch": uint32(36), + "erd_set_sc_to_sc_log_event_enable_epoch": uint32(37), } economicsConfig := config.EconomicsConfig{ From b96715c3c4d5c82d001c158b66bb355b47c168b9 Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 5 Jul 2023 10:36:19 +0300 Subject: [PATCH 044/120] mod tidy --- go.sum | 1 - 1 file changed, 1 deletion(-) diff --git a/go.sum b/go.sum index 2c00034ed35..43c0c252e4d 100644 --- a/go.sum +++ b/go.sum @@ -644,7 +644,6 @@ github.com/multiversx/mx-chain-storage-go v1.0.11 h1:u4ZsfIXEU3nJWRUxyAswhBn2pT6 github.com/multiversx/mx-chain-storage-go v1.0.11/go.mod h1:VP9fwyFBmbmDzahUuu0IeGX/dKG3iBWjN6FSQ6YtVaI= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c h1:8wz/fxqsnk80jRDW1Q8st7noNQBN/AaYJbAW5cvQpuA= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13 h1:ZJ3YT5aCHVMYryPIZT9bSaai+MYUyr+nyiazyBB1rIw= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= From 8ba6cbf0ceda7ec18ec6f6a40d71cb0b4afcf6bf Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 5 Jul 2023 11:03:24 +0300 Subject: [PATCH 045/120] updated vms --- go.mod | 8 ++++---- go.sum | 17 ++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 657ef1796a0..80dae7ae407 100644 --- a/go.mod +++ b/go.mod @@ -21,10 +21,10 @@ require ( github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.11 github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13 - github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230703110501-5ef444f19b96 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230703110707-eb0e55bd7b48 + github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705075434-66db49718eb3 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705075820-f9b79acddd8d + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705075931-339026e21e79 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705075331-ed55dd4c2f4e github.com/pelletier/go-toml v1.9.3 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index 43c0c252e4d..653dc57fa63 100644 --- a/go.sum +++ b/go.sum @@ -644,17 +644,16 @@ github.com/multiversx/mx-chain-storage-go v1.0.11 h1:u4ZsfIXEU3nJWRUxyAswhBn2pT6 github.com/multiversx/mx-chain-storage-go v1.0.11/go.mod h1:VP9fwyFBmbmDzahUuu0IeGX/dKG3iBWjN6FSQ6YtVaI= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230703074321-551d870ceb5c/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13 h1:ZJ3YT5aCHVMYryPIZT9bSaai+MYUyr+nyiazyBB1rIw= github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= -github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c h1:4uaYXpU+Kh60R7iuaGitOKnD7hzwJEA8st0q3p0kqpg= -github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230703084454-9fd1e35c0b9c/go.mod h1:wsVfy2Jk1X68LFtAs18U0A4UcEW/vLrRU8PNGQM/mc0= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a h1:VNWqguDSsnaa/9Mo6WQRUw0Q8XMRIblD91gRmTPr1Kc= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230703105826-fcde8b74158a/go.mod h1:fAa2RF1ZN7dFPga7RzhWsHiKx0OgXSo7xkry54UzQFA= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230703110501-5ef444f19b96 h1:tg1Ii+pf5Zvoj4daUTH+Xi9RDCGUmFc1Q0mO8YoaGq8= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230703110501-5ef444f19b96/go.mod h1:KNHR8Q1jBDk4DzaHu9XppwkLmHr/USKqsji229Xn3tc= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230703110707-eb0e55bd7b48 h1:rgNRAk699GCHlRyA+sxm9vnV5KdgmiuvaBuj999o1h0= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230703110707-eb0e55bd7b48/go.mod h1:q7sJ9nahtiIdsUpYteommLl33IiRIVEx+k0GR+tdhgU= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705075434-66db49718eb3 h1:C87BJbxv+ljYXbuPP084RBLgyajEC8NTSsHVK41Bjjw= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705075434-66db49718eb3/go.mod h1:cts8KDwefnj6GHV3YYhyXxKMxPxY0E5ZTabnbfHeezY= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705075820-f9b79acddd8d h1:2ZrDknQOCjf0e4r8NZrPabeEsB0xNDNH0uk3ioMO/E4= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705075820-f9b79acddd8d/go.mod h1:19TqftqH98F/w3gPeazK6LIbPCcwyiEdebvi1EIVLNw= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705075931-339026e21e79 h1:mQgTkyRihiQKvdnKnhPc0a5jOyUMGWXRxnezqDnPHm4= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705075931-339026e21e79/go.mod h1:Y50BHCTxtvc2rTxnb13kWv86iS86IL6Tnb1r/HMSu7s= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705075331-ed55dd4c2f4e h1:qyPP4O55QwO1HRp29ep/fC+/mflIxoUC2lfPM6Rr2Gc= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705075331-ed55dd4c2f4e/go.mod h1:9Fhp/lHTaDOBXenxu1G8Ld0kHM1uWlty3FI15cLv+Yw= github.com/multiversx/mx-components-big-int v0.1.1 h1:695mYPKYOrmGEGgRH4/pZruDoe3CPP1LHrBxKfvj5l4= github.com/multiversx/mx-components-big-int v0.1.1/go.mod h1:0QrcFdfeLgJ/am10HGBeH0G0DNF+0Qx1E4DS/iozQls= github.com/multiversx/protobuf v1.3.2 h1:RaNkxvGTGbA0lMcnHAN24qE1G1i+Xs5yHA6MDvQ4mSM= From 06c1cc4186ea045fa4b1848e465bfaef34527ae7 Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 5 Jul 2023 15:21:28 +0300 Subject: [PATCH 046/120] toml fix --- cmd/node/config/enableEpochs.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 50b329de112..a0eaadcc05e 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -269,6 +269,9 @@ # FixDelegationChangeOwnerOnAccountEnableEpoch represents the epoch when the fix for the delegation system smart contract is enabled FixDelegationChangeOwnerOnAccountEnableEpoch = 3 + # ScToScLogEventEnableEpoch represents the epoch when the sc to sc log event feature is enabled + ScToScLogEventEnableEpoch = 3 + # BLSMultiSignerEnableEpoch represents the activation epoch for different types of BLS multi-signers BLSMultiSignerEnableEpoch = [ { EnableEpoch = 0, Type = "no-KOSK" }, From 36d51635b2e51ff9c95ddc2537164f23084ee1cf Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 5 Jul 2023 15:41:05 +0300 Subject: [PATCH 047/120] toml fix --- cmd/node/config/enableEpochs.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index a0eaadcc05e..4b25d2e1a64 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -269,8 +269,8 @@ # FixDelegationChangeOwnerOnAccountEnableEpoch represents the epoch when the fix for the delegation system smart contract is enabled FixDelegationChangeOwnerOnAccountEnableEpoch = 3 - # ScToScLogEventEnableEpoch represents the epoch when the sc to sc log event feature is enabled - ScToScLogEventEnableEpoch = 3 + # ScToScLogEventEnableEpoch represents the epoch when the sc to sc log event feature is enabled + ScToScLogEventEnableEpoch = 3 # BLSMultiSignerEnableEpoch represents the activation epoch for different types of BLS multi-signers BLSMultiSignerEnableEpoch = [ From 7a32d1a15946d12f6d3c74aabdd51ba0ec8e1a4c Mon Sep 17 00:00:00 2001 From: matei-p Date: Wed, 5 Jul 2023 16:52:46 +0300 Subject: [PATCH 048/120] go mod updates --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 80dae7ae407..e519d3e9d7b 100644 --- a/go.mod +++ b/go.mod @@ -14,17 +14,17 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-communication-go v1.0.3 - github.com/multiversx/mx-chain-core-go v1.2.9-0.20230703090922-9bca4fc66269 + github.com/multiversx/mx-chain-core-go v1.2.9-0.20230704070435-b44c0e744f6b github.com/multiversx/mx-chain-crypto-go v1.2.7 github.com/multiversx/mx-chain-es-indexer-go v1.4.5 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-scenario-go v1.1.3-0.20230516140717-d1799bcc9bfd github.com/multiversx/mx-chain-storage-go v1.0.11 - github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13 - github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705075434-66db49718eb3 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705075820-f9b79acddd8d - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705075931-339026e21e79 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705075331-ed55dd4c2f4e + github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705121136-f989490b751e + github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705133956-5d75d3ecbbf6 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705134039-9321d5174362 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705134125-0e31450d5e9b + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705134208-197f4a85da5c github.com/pelletier/go-toml v1.9.3 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index 653dc57fa63..328f64c8a50 100644 --- a/go.sum +++ b/go.sum @@ -628,8 +628,8 @@ github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZb github.com/multiversx/mx-chain-core-go v1.2.5/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-core-go v1.2.6/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-core-go v1.2.7/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= -github.com/multiversx/mx-chain-core-go v1.2.9-0.20230703090922-9bca4fc66269 h1:2eVj6flk7YAONqKgcpNyDfOmH4Sx6WJFsMrHaVFq5os= -github.com/multiversx/mx-chain-core-go v1.2.9-0.20230703090922-9bca4fc66269/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= +github.com/multiversx/mx-chain-core-go v1.2.9-0.20230704070435-b44c0e744f6b h1:JLjZgARFeTS4cwbCmQ9CSLdZRzGPkE8rSSF7Ii6i9QU= +github.com/multiversx/mx-chain-core-go v1.2.9-0.20230704070435-b44c0e744f6b/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-crypto-go v1.2.7 h1:7OAINQ+zmnuUelJ2G1ETt5vLtBHn46tXmQO+hFXRrmw= github.com/multiversx/mx-chain-crypto-go v1.2.7/go.mod h1:YVTxFG1OwtJW3jGOuRewvJKqyqrUzXzR5p/7/+jKlYM= @@ -644,16 +644,16 @@ github.com/multiversx/mx-chain-storage-go v1.0.11 h1:u4ZsfIXEU3nJWRUxyAswhBn2pT6 github.com/multiversx/mx-chain-storage-go v1.0.11/go.mod h1:VP9fwyFBmbmDzahUuu0IeGX/dKG3iBWjN6FSQ6YtVaI= github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3dec/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= -github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13 h1:ZJ3YT5aCHVMYryPIZT9bSaai+MYUyr+nyiazyBB1rIw= -github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705065430-c2fb78ea7b13/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= -github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705075434-66db49718eb3 h1:C87BJbxv+ljYXbuPP084RBLgyajEC8NTSsHVK41Bjjw= -github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705075434-66db49718eb3/go.mod h1:cts8KDwefnj6GHV3YYhyXxKMxPxY0E5ZTabnbfHeezY= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705075820-f9b79acddd8d h1:2ZrDknQOCjf0e4r8NZrPabeEsB0xNDNH0uk3ioMO/E4= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705075820-f9b79acddd8d/go.mod h1:19TqftqH98F/w3gPeazK6LIbPCcwyiEdebvi1EIVLNw= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705075931-339026e21e79 h1:mQgTkyRihiQKvdnKnhPc0a5jOyUMGWXRxnezqDnPHm4= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705075931-339026e21e79/go.mod h1:Y50BHCTxtvc2rTxnb13kWv86iS86IL6Tnb1r/HMSu7s= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705075331-ed55dd4c2f4e h1:qyPP4O55QwO1HRp29ep/fC+/mflIxoUC2lfPM6Rr2Gc= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705075331-ed55dd4c2f4e/go.mod h1:9Fhp/lHTaDOBXenxu1G8Ld0kHM1uWlty3FI15cLv+Yw= +github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705121136-f989490b751e h1:d6G0I3uiW0MMXms91Z08wKlz9kULCmkAvYxnsIOrfNA= +github.com/multiversx/mx-chain-vm-common-go v1.5.1-0.20230705121136-f989490b751e/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705133956-5d75d3ecbbf6 h1:h5VsZj3EOBXcvU4azGMaLlAoacpGMy7opHTwbbU18E8= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230705133956-5d75d3ecbbf6/go.mod h1:VCOA6AaX0plabtVlJ9UVRmfbZ2umcQOq0nLlaxn9nDo= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705134039-9321d5174362 h1:l5InhpU5s546edCaK1sTBSvMHhrCov03QRXS1AWAaJ0= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60-0.20230705134039-9321d5174362/go.mod h1:960c83E7d4ZTrcTEie9+v6fhpBdWl2KGsjWqNUhy0DI= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705134125-0e31450d5e9b h1:g9xK35Z5nZej4b3T5m0OmfOdEJFkDZYdSULsJNlLXlY= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61-0.20230705134125-0e31450d5e9b/go.mod h1:XiOqP283rvfkVR4senm/kdFhu/aFGJ4bUdmWa9tfgz8= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705134208-197f4a85da5c h1:RLRetRKIMFI7juPi2r2xGEv2xFprr9n6SKpVECyoPJc= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87-0.20230705134208-197f4a85da5c/go.mod h1:VOTO22cP0wO4PpALkQtvxLdCZUNb0k3nJqyu1CdCjTU= github.com/multiversx/mx-components-big-int v0.1.1 h1:695mYPKYOrmGEGgRH4/pZruDoe3CPP1LHrBxKfvj5l4= github.com/multiversx/mx-components-big-int v0.1.1/go.mod h1:0QrcFdfeLgJ/am10HGBeH0G0DNF+0Qx1E4DS/iozQls= github.com/multiversx/protobuf v1.3.2 h1:RaNkxvGTGbA0lMcnHAN24qE1G1i+Xs5yHA6MDvQ4mSM= From d080991e3224a09fc28b32e34486f539fde29e59 Mon Sep 17 00:00:00 2001 From: matei-p Date: Mon, 10 Jul 2023 10:12:49 +0300 Subject: [PATCH 049/120] back transfer test --- go.mod | 2 + go.sum | 2 - .../wasm/wasmvm/async_mock_contracts_test.go | 79 +++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 05ec27e1f5f..c1019abedc4 100644 --- a/go.mod +++ b/go.mod @@ -187,3 +187,5 @@ require ( ) replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 + +replace github.com/multiversx/mx-chain-vm-go v1.5.4 => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go diff --git a/go.sum b/go.sum index a92affe4685..37ef579f79a 100644 --- a/go.sum +++ b/go.sum @@ -646,8 +646,6 @@ github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3de github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.5.0 h1:AG2uG/13DjULAb4PvGHynhG3xjjfCF4lwxr2LRULj9I= github.com/multiversx/mx-chain-vm-common-go v1.5.0/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= -github.com/multiversx/mx-chain-vm-go v1.5.4 h1:V9Ug4grgPdVjkvRSLQm8edyFi4JqPiDqtHEdAG4JYBA= -github.com/multiversx/mx-chain-vm-go v1.5.4/go.mod h1:UJoOzoYi6fZDazRY4r/g4GZnEVGT7DTnD14Wv1WO8Wo= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59 h1:vbsVspKWU0IQBo+mFBH9LCqAtkZqPQy73qdVAhpy2Bc= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59/go.mod h1:3ABXSSfMOcdPApGoArfnVGz1BfcJgyWd8Ip2D0FZPNE= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60 h1:1zW2c3lAt7by5fNl3T4u79z2LHyNtgsoMShTucmeNa4= diff --git a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go index b6126005335..928f2e4298f 100644 --- a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go +++ b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/integrationTests" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/txDataBuilder" "github.com/multiversx/mx-chain-vm-go/mock/contracts" "github.com/multiversx/mx-chain-vm-go/testcommon" @@ -165,3 +166,81 @@ func testMockContract_CrossShard(t *testing.T, asyncCallType []byte) { require.Nil(t, err) require.Equal(t, ownerOfParent.Address, originalCallerChild) } + +func TestMockContract_NewAsync_BackTransfer_CrossShard(t *testing.T) { + if testing.Short() { + t.Skip("this is not a short test") + } + + numberOfShards := 2 + net := integrationTests.NewTestNetworkSized(t, numberOfShards, 1, 1) + net.Start() + net.Step() + + transferEGLD := big.NewInt(42) + net.CreateWallets(3) + net.MintWalletsUint64(100000000000) + ownerOfParent := net.Wallets[0] + + parentAddress, _ := GetAddressForNewAccount(t, net, net.NodesSharded[0][0]) + childAddress, _ := GetAddressForNewAccount(t, net, net.NodesSharded[0][0]) + nephewAddress, _ := GetAddressForNewAccount(t, net, net.NodesSharded[1][0]) + + thirdPartyAddress := MakeTestWalletAddress("thirdPartyAddress") + vaultAddress := MakeTestWalletAddress("vaultAddress") + + testConfig := &testcommon.TestConfig{ + ParentBalance: 20, + ChildBalance: 10, + + GasProvided: 2_000_000, + GasProvidedToChild: 1_000_000, + GasUsedByParent: 400, + + ChildAddress: childAddress, + ThirdPartyAddress: thirdPartyAddress, + VaultAddress: vaultAddress, + TransferFromParentToChild: 8, + + SuccessCallback: "myCallback", + ErrorCallback: "myCallback", + } + + InitializeMockContracts( + t, net, + test.CreateMockContractOnShard(parentAddress, 0). + WithBalance(testConfig.ParentBalance). + WithConfig(testConfig). + WithCodeMetadata([]byte{0, vmcommon.MetadataPayable}). + WithMethods(contracts.BackTransfer_ParentCallsChild), + test.CreateMockContractOnShard(childAddress, 0). + WithBalance(testConfig.ChildBalance). + WithConfig(testConfig). + WithMethods( + contracts.BackTransfer_ChildMakesAsync, + contracts.BackTransfer_ChildCallback, + ), + test.CreateMockContractOnShard(nephewAddress, 1). + WithBalance(testConfig.ChildBalance). + WithConfig(testConfig). + WithMethods(contracts.WasteGasChildMock), + ) + + txData := txDataBuilder. + NewBuilder(). + Func("callChild"). + ToBytes() + tx := net.CreateTx(ownerOfParent, parentAddress, transferEGLD, txData) + tx.GasLimit = testConfig.GasProvided + + _ = net.SignAndSendTx(ownerOfParent, tx) + + net.Steps(16) + + parentHandler, err := net.NodesSharded[0][0].BlockchainHook.GetUserAccount(parentAddress) + require.Nil(t, err) + + parentValueA, _, err := parentHandler.AccountDataHandler().RetrieveValue(test.ParentKeyA) + require.Nil(t, err) + require.Equal(t, []byte("ok"), parentValueA) +} From ccdff137470d59002b8bd70b0c1bb4ab15bda4ad Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 11 Jul 2023 14:38:05 +0300 Subject: [PATCH 050/120] go mod updates --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index f5518508ec8..90b12c3e258 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-communication-go v1.0.3 - github.com/multiversx/mx-chain-core-go v1.2.9-0.20230704070435-b44c0e744f6b + github.com/multiversx/mx-chain-core-go v1.2.9 github.com/multiversx/mx-chain-crypto-go v1.2.7 github.com/multiversx/mx-chain-es-indexer-go v1.4.6 github.com/multiversx/mx-chain-logger-go v1.0.11 diff --git a/go.sum b/go.sum index 32821844a60..b11aa8c8759 100644 --- a/go.sum +++ b/go.sum @@ -627,9 +627,8 @@ github.com/multiversx/mx-chain-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZ github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.2.5/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-core-go v1.2.6/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= -github.com/multiversx/mx-chain-core-go v1.2.7/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= -github.com/multiversx/mx-chain-core-go v1.2.9-0.20230704070435-b44c0e744f6b h1:JLjZgARFeTS4cwbCmQ9CSLdZRzGPkE8rSSF7Ii6i9QU= -github.com/multiversx/mx-chain-core-go v1.2.9-0.20230704070435-b44c0e744f6b/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= +github.com/multiversx/mx-chain-core-go v1.2.9 h1:uXrmzhKxEe5sztUTs1am3ILrxuBwNQQOESOKBlyrlLE= +github.com/multiversx/mx-chain-core-go v1.2.9/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-crypto-go v1.2.7 h1:7OAINQ+zmnuUelJ2G1ETt5vLtBHn46tXmQO+hFXRrmw= github.com/multiversx/mx-chain-crypto-go v1.2.7/go.mod h1:YVTxFG1OwtJW3jGOuRewvJKqyqrUzXzR5p/7/+jKlYM= From 645f0566b16a2b983073a34b168a2404f401ebbf Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 11 Jul 2023 15:57:47 +0300 Subject: [PATCH 051/120] go mod update --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 90b12c3e258..9d138081f5d 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-communication-go v1.0.3 - github.com/multiversx/mx-chain-core-go v1.2.9 + github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711111607-1d9ec14f58e8 github.com/multiversx/mx-chain-crypto-go v1.2.7 github.com/multiversx/mx-chain-es-indexer-go v1.4.6 github.com/multiversx/mx-chain-logger-go v1.0.11 diff --git a/go.sum b/go.sum index b11aa8c8759..c9d99a7827b 100644 --- a/go.sum +++ b/go.sum @@ -627,8 +627,9 @@ github.com/multiversx/mx-chain-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZ github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.2.5/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-core-go v1.2.6/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= -github.com/multiversx/mx-chain-core-go v1.2.9 h1:uXrmzhKxEe5sztUTs1am3ILrxuBwNQQOESOKBlyrlLE= github.com/multiversx/mx-chain-core-go v1.2.9/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= +github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711111607-1d9ec14f58e8 h1:6Qh6AFe/OHbP5o7+KRlCXsigiJ0KvjQHjxKM9Fkcx1E= +github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711111607-1d9ec14f58e8/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-crypto-go v1.2.7 h1:7OAINQ+zmnuUelJ2G1ETt5vLtBHn46tXmQO+hFXRrmw= github.com/multiversx/mx-chain-crypto-go v1.2.7/go.mod h1:YVTxFG1OwtJW3jGOuRewvJKqyqrUzXzR5p/7/+jKlYM= From e44602168cd4bf97851d2050530e444379d09cc3 Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 11 Jul 2023 17:26:22 +0300 Subject: [PATCH 052/120] update Events structure --- node/external/logs/logsConverter.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/node/external/logs/logsConverter.go b/node/external/logs/logsConverter.go index 7b05b2122b6..1b9adbb454e 100644 --- a/node/external/logs/logsConverter.go +++ b/node/external/logs/logsConverter.go @@ -22,10 +22,11 @@ func (converter *logsConverter) txLogToApiResource(logKey []byte, log *transacti eventAddress := converter.encodeAddress(event.Address) events[i] = &transaction.Events{ - Address: eventAddress, - Identifier: string(event.Identifier), - Topics: event.Topics, - Data: event.Data, + Address: eventAddress, + Identifier: string(event.Identifier), + Topics: event.Topics, + Data: event.Data, + AdditionalData: event.AdditionalData, } } From b8f64688e80bd91b5ffb83d111af39a1456971d9 Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 11 Jul 2023 17:28:17 +0300 Subject: [PATCH 053/120] update Events structure --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9d138081f5d..f70958ceda7 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-communication-go v1.0.3 - github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711111607-1d9ec14f58e8 + github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711142723-8fbe8e75cf82 github.com/multiversx/mx-chain-crypto-go v1.2.7 github.com/multiversx/mx-chain-es-indexer-go v1.4.6 github.com/multiversx/mx-chain-logger-go v1.0.11 diff --git a/go.sum b/go.sum index c9d99a7827b..ebd99bff4eb 100644 --- a/go.sum +++ b/go.sum @@ -628,8 +628,8 @@ github.com/multiversx/mx-chain-core-go v1.2.1/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZb github.com/multiversx/mx-chain-core-go v1.2.5/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-core-go v1.2.6/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-core-go v1.2.9/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= -github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711111607-1d9ec14f58e8 h1:6Qh6AFe/OHbP5o7+KRlCXsigiJ0KvjQHjxKM9Fkcx1E= -github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711111607-1d9ec14f58e8/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= +github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711142723-8fbe8e75cf82 h1:pp+D2Si2T+fb7E8RITzo6a8Ig9FIYE+CkUxasOxvS/I= +github.com/multiversx/mx-chain-core-go v1.2.10-0.20230711142723-8fbe8e75cf82/go.mod h1:jzYFSiYBuO0dGpGFXnZWSwcwcKP7Flyn/X41y4zIQrQ= github.com/multiversx/mx-chain-crypto-go v1.2.6/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-crypto-go v1.2.7 h1:7OAINQ+zmnuUelJ2G1ETt5vLtBHn46tXmQO+hFXRrmw= github.com/multiversx/mx-chain-crypto-go v1.2.7/go.mod h1:YVTxFG1OwtJW3jGOuRewvJKqyqrUzXzR5p/7/+jKlYM= From cc7b26007f85d75ff63e2c7f8e528e96d42a5154 Mon Sep 17 00:00:00 2001 From: matei-p Date: Tue, 11 Jul 2023 14:14:10 +0300 Subject: [PATCH 054/120] temp test updates --- .../wasm/wasmvm/async_mock_contracts_test.go | 12 ++++++ .../vm/wasm/wasmvm/mock_contracts.go | 39 ++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go index 928f2e4298f..54bf5fb94fd 100644 --- a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go +++ b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go @@ -197,13 +197,17 @@ func TestMockContract_NewAsync_BackTransfer_CrossShard(t *testing.T) { GasProvidedToChild: 1_000_000, GasUsedByParent: 400, + ParentAddress: parentAddress, ChildAddress: childAddress, + NephewAddress: nephewAddress, ThirdPartyAddress: thirdPartyAddress, VaultAddress: vaultAddress, TransferFromParentToChild: 8, SuccessCallback: "myCallback", ErrorCallback: "myCallback", + + ESDTTokensToTransfer: 5, } InitializeMockContracts( @@ -243,4 +247,12 @@ func TestMockContract_NewAsync_BackTransfer_CrossShard(t *testing.T) { parentValueA, _, err := parentHandler.AccountDataHandler().RetrieveValue(test.ParentKeyA) require.Nil(t, err) require.Equal(t, []byte("ok"), parentValueA) + + expectedEgld := big.NewInt(0) + expectedEgld.Add(MockInitialBalance, big.NewInt(testConfig.TransferFromChildToParent)) + require.Equal(t, expectedEgld, parentHandler.GetBalance()) + + esdtData, err := net.NodesSharded[0][0].BlockchainHook.GetESDTToken(parentAddress, EsdtTokenIdentifier, 0) + require.Nil(t, err) + require.Equal(t, big.NewInt(int64(InitialEsdt+testConfig.ESDTTokensToTransfer)), esdtData.Value) } diff --git a/integrationTests/vm/wasm/wasmvm/mock_contracts.go b/integrationTests/vm/wasm/wasmvm/mock_contracts.go index f8294d05787..9de48ec1b23 100644 --- a/integrationTests/vm/wasm/wasmvm/mock_contracts.go +++ b/integrationTests/vm/wasm/wasmvm/mock_contracts.go @@ -1,10 +1,13 @@ package wasmvm import ( + "fmt" "math/big" "strings" "testing" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/esdt" "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/factory" @@ -27,6 +30,9 @@ var MockInitialBalance = big.NewInt(10_000_000) // WalletAddressPrefix is the prefix of any smart contract address used for testing. var WalletAddressPrefix = []byte("..........") +var InitialEsdt = uint64(100) +var EsdtTokenIdentifier = []byte("TTT-010101") + // InitializeMockContracts - func InitializeMockContracts( t *testing.T, @@ -71,7 +77,8 @@ func GetAddressForNewAccountOnWalletAndNode( wallet *integrationTests.TestWalletAccount, node *integrationTests.TestProcessorNode, ) ([]byte, state.UserAccountHandler) { - return GetAddressForNewAccountOnWalletAndNodeWithVM(t, net, wallet, node, net.DefaultVM) + return GetAddressForNewAccountOnWalletAndNodeWithVM(t, net, wallet, node, + net.DefaultVM) } // GetAddressForNewAccountOnWalletAndNodeWithVM - @@ -82,6 +89,10 @@ func GetAddressForNewAccountOnWalletAndNodeWithVM( node *integrationTests.TestProcessorNode, vmType []byte, ) ([]byte, state.UserAccountHandler) { + esdtValue := big.NewInt(int64(InitialEsdt)) + esdtNonce := uint64(0) + pubKey := []byte("12345678901234567890123456789012") + walletAccount, err := node.AccntState.GetExistingAccount(wallet.Address) require.Nil(t, err) walletAccount.IncreaseNonce(1) @@ -102,6 +113,32 @@ func GetAddressForNewAccountOnWalletAndNodeWithVM( _ = userAccount.AddToBalance(MockInitialBalance) userAccount.SetCode(address) userAccount.SetCodeHash(address) + + esdtData := &esdt.ESDigitalToken{ + Value: esdtValue, + Properties: []byte{}, + } + if esdtNonce > 0 { + esdtData.TokenMetaData = &esdt.MetaData{ + Name: []byte(fmt.Sprintf("Token %d", esdtNonce)), + URIs: [][]byte{[]byte(fmt.Sprintf("URI for token %d", esdtNonce))}, + Creator: pubKey, + Nonce: esdtNonce, + } + } + + esdtDataBytes, err := integrationTests.TestMarshalizer.Marshal(esdtData) + require.Nil(t, err) + + key := append([]byte(core.ProtectedKeyPrefix), []byte(core.ESDTKeyIdentifier)...) + key = append(key, EsdtTokenIdentifier...) + if esdtNonce > 0 { + key = append(key, big.NewInt(0).SetUint64(esdtNonce).Bytes()...) + } + + err = userAccount.SaveKeyValue(key, esdtDataBytes) + require.Nil(t, err) + err = node.AccntState.SaveAccount(userAccount) require.Nil(t, err) From e6cc999ff7109230f62334188ca9a9e9e4938b56 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Jul 2023 10:25:29 +0300 Subject: [PATCH 055/120] new vm --- go.mod | 2 +- go.sum | 2 ++ integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c1019abedc4..1fabcdf3615 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/multiversx/mx-chain-scenario-go v1.1.2 github.com/multiversx/mx-chain-storage-go v1.0.11 github.com/multiversx/mx-chain-vm-common-go v1.5.0 - github.com/multiversx/mx-chain-vm-go v1.5.4 + github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230711135416-36c3ad3a2dc9 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.86 diff --git a/go.sum b/go.sum index 37ef579f79a..4593b507ad3 100644 --- a/go.sum +++ b/go.sum @@ -646,6 +646,8 @@ github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3de github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.5.0 h1:AG2uG/13DjULAb4PvGHynhG3xjjfCF4lwxr2LRULj9I= github.com/multiversx/mx-chain-vm-common-go v1.5.0/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230711135416-36c3ad3a2dc9 h1:PKPKbjqvgPb3fGeciZZpTIGS3sESplJ5Gm+iAwxjEnY= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230711135416-36c3ad3a2dc9/go.mod h1:UJoOzoYi6fZDazRY4r/g4GZnEVGT7DTnD14Wv1WO8Wo= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59 h1:vbsVspKWU0IQBo+mFBH9LCqAtkZqPQy73qdVAhpy2Bc= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59/go.mod h1:3ABXSSfMOcdPApGoArfnVGz1BfcJgyWd8Ip2D0FZPNE= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60 h1:1zW2c3lAt7by5fNl3T4u79z2LHyNtgsoMShTucmeNa4= diff --git a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go index 928f2e4298f..49ecb16fb6a 100644 --- a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go +++ b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go @@ -6,7 +6,6 @@ import ( "testing" "github.com/multiversx/mx-chain-go/integrationTests" - vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/txDataBuilder" "github.com/multiversx/mx-chain-vm-go/mock/contracts" "github.com/multiversx/mx-chain-vm-go/testcommon" @@ -211,7 +210,7 @@ func TestMockContract_NewAsync_BackTransfer_CrossShard(t *testing.T) { test.CreateMockContractOnShard(parentAddress, 0). WithBalance(testConfig.ParentBalance). WithConfig(testConfig). - WithCodeMetadata([]byte{0, vmcommon.MetadataPayable}). + WithCodeMetadata([]byte{0, 0}). WithMethods(contracts.BackTransfer_ParentCallsChild), test.CreateMockContractOnShard(childAddress, 0). WithBalance(testConfig.ChildBalance). From 5fda82972dc3899e255bce151124fa5d9a625d1c Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Jul 2023 10:36:40 +0300 Subject: [PATCH 056/120] test fixes --- .../vm/wasm/wasmvm/async_mock_contracts_test.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go index 7ba5b6358ef..393ef51f5de 100644 --- a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go +++ b/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go @@ -243,13 +243,9 @@ func TestMockContract_NewAsync_BackTransfer_CrossShard(t *testing.T) { parentHandler, err := net.NodesSharded[0][0].BlockchainHook.GetUserAccount(parentAddress) require.Nil(t, err) - parentValueA, _, err := parentHandler.AccountDataHandler().RetrieveValue(test.ParentKeyA) - require.Nil(t, err) - require.Equal(t, []byte("ok"), parentValueA) - expectedEgld := big.NewInt(0) expectedEgld.Add(MockInitialBalance, big.NewInt(testConfig.TransferFromChildToParent)) - require.Equal(t, expectedEgld, parentHandler.GetBalance()) + require.True(t, parentHandler.GetBalance().Cmp(expectedEgld) > 0) esdtData, err := net.NodesSharded[0][0].BlockchainHook.GetESDTToken(parentAddress, EsdtTokenIdentifier, 0) require.Nil(t, err) From c09865157689b114fdf9aa0156138e150111ad5e Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 13 Jul 2023 09:27:35 +0300 Subject: [PATCH 057/120] test fixes --- go.mod | 4 +--- go.sum | 4 ++-- integrationTests/multiShard/smartContract/scCallingSC_test.go | 1 - 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index bbaf5e8dee6..3df200f013f 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/multiversx/mx-chain-scenario-go v1.1.2 github.com/multiversx/mx-chain-storage-go v1.0.11 github.com/multiversx/mx-chain-vm-common-go v1.5.0 - github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230711135416-36c3ad3a2dc9 + github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230712123623-be100dc2f2ed github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.86 @@ -187,5 +187,3 @@ require ( ) replace github.com/gogo/protobuf => github.com/multiversx/protobuf v1.3.2 - -replace github.com/multiversx/mx-chain-vm-go v1.5.4 => /home/bogdan/go2/src/github.com/multiversx/mx-chain-vm-go diff --git a/go.sum b/go.sum index 74c1d248560..b0f50918a59 100644 --- a/go.sum +++ b/go.sum @@ -645,8 +645,8 @@ github.com/multiversx/mx-chain-vm-common-go v1.3.33-0.20230123162357-c6f6931a3de github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= github.com/multiversx/mx-chain-vm-common-go v1.5.0 h1:AG2uG/13DjULAb4PvGHynhG3xjjfCF4lwxr2LRULj9I= github.com/multiversx/mx-chain-vm-common-go v1.5.0/go.mod h1:cnMvZN8+4oDkjloTZVExlf8ShkMGWbbDb5/D//wLT/k= -github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230711135416-36c3ad3a2dc9 h1:PKPKbjqvgPb3fGeciZZpTIGS3sESplJ5Gm+iAwxjEnY= -github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230711135416-36c3ad3a2dc9/go.mod h1:UJoOzoYi6fZDazRY4r/g4GZnEVGT7DTnD14Wv1WO8Wo= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230712123623-be100dc2f2ed h1:z4It4hMvGwQlyBmiGtouPxR+QKbGRT7SuInlAUDf0Ks= +github.com/multiversx/mx-chain-vm-go v1.5.5-0.20230712123623-be100dc2f2ed/go.mod h1:UJoOzoYi6fZDazRY4r/g4GZnEVGT7DTnD14Wv1WO8Wo= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59 h1:vbsVspKWU0IQBo+mFBH9LCqAtkZqPQy73qdVAhpy2Bc= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.59/go.mod h1:3ABXSSfMOcdPApGoArfnVGz1BfcJgyWd8Ip2D0FZPNE= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.60 h1:1zW2c3lAt7by5fNl3T4u79z2LHyNtgsoMShTucmeNa4= diff --git a/integrationTests/multiShard/smartContract/scCallingSC_test.go b/integrationTests/multiShard/smartContract/scCallingSC_test.go index cf76ffe25f3..2a701688526 100644 --- a/integrationTests/multiShard/smartContract/scCallingSC_test.go +++ b/integrationTests/multiShard/smartContract/scCallingSC_test.go @@ -577,7 +577,6 @@ func TestSCCallingBuiltinAndFails(t *testing.T) { time.Sleep(time.Second) _, _ = integrationTests.WaitOperationToBeDone(t, nodes, 10, nonce, round, idxProposers) - testValue1 := vm.GetIntValueFromSC(nil, sender.AccntState, scAddress, "testValue1", nil) require.NotNil(t, testValue1) require.Equal(t, uint64(255), testValue1.Uint64()) From bbbf244eaa29b0c1c6084e1acc99ab89e80ffad6 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 21 Jul 2023 15:50:03 +0300 Subject: [PATCH 058/120] added support for block coordinates on vm query API --- api/groups/vmValuesGroup.go | 25 ++ api/groups/vmValuesGroup_test.go | 116 +++++++- factory/api/apiResolverFactory.go | 159 +++++++++-- factory/api/apiResolverFactory_test.go | 108 +++----- factory/api/export_test.go | 2 + factory/processing/processComponents.go | 250 ++++++++--------- genesis/process/argGenesisBlockCreator.go | 45 +-- genesis/process/genesisBlockCreator.go | 6 + genesis/process/genesisBlockCreator_test.go | 23 ++ genesis/process/metaGenesisBlockCreator.go | 20 +- genesis/process/shardGenesisBlockCreator.go | 20 +- .../multiShard/hardFork/hardFork_test.go | 6 +- integrationTests/testInitializer.go | 7 +- integrationTests/testProcessorNode.go | 60 ++-- .../vm/mockVM/vmGet/vmGet_test.go | 19 +- integrationTests/vm/testInitializer.go | 60 ++-- integrationTests/vm/wasm/utils.go | 22 +- node/nodeRunner.go | 1 + process/errors.go | 3 + process/interface.go | 4 + process/smartContract/hooks/blockChainHook.go | 5 + process/smartContract/scQueryService.go | 259 +++++++++++++++--- process/smartContract/scQueryService_test.go | 208 +++++++++----- testscommon/blockChainHookStub.go | 10 + 24 files changed, 1027 insertions(+), 411 deletions(-) diff --git a/api/groups/vmValuesGroup.go b/api/groups/vmValuesGroup.go index 0fc8db24cd9..abc9c678156 100644 --- a/api/groups/vmValuesGroup.go +++ b/api/groups/vmValuesGroup.go @@ -8,6 +8,7 @@ import ( "sync" "github.com/gin-gonic/gin" + "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/vm" "github.com/multiversx/mx-chain-go/api/errors" @@ -139,6 +140,11 @@ func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, return nil, "", err } + command.BlockNonce, command.BlockHash, command.BlockRootHash, err = extractBlockCoordinates(context) + if err != nil { + return nil, "", err + } + vmOutputApi, err := vvg.getFacade().ExecuteSCQuery(command) if err != nil { return nil, "", err @@ -152,6 +158,25 @@ func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, return vmOutputApi, vmExecErrMsg, nil } +func extractBlockCoordinates(context *gin.Context) (core.OptionalUint64, []byte, []byte, error) { + blockNonce, err := parseUint64UrlParam(context, urlParamBlockNonce) + if err != nil { + return core.OptionalUint64{}, nil, nil, err + } + + blockHash, err := parseHexBytesUrlParam(context, urlParamBlockHash) + if err != nil { + return core.OptionalUint64{}, nil, nil, err + } + + blockRootHash, err := parseHexBytesUrlParam(context, urlParamBlockRootHash) + if err != nil { + return core.OptionalUint64{}, nil, nil, err + } + + return blockNonce, blockHash, blockRootHash, nil +} + func (vvg *vmValuesGroup) createSCQuery(request *VMValueRequest) (*process.SCQuery, error) { decodedAddress, err := vvg.getFacade().DecodeAddressPubkey(request.ScAddress) if err != nil { diff --git a/api/groups/vmValuesGroup_test.go b/api/groups/vmValuesGroup_test.go index bd140d07b6f..bdfe10e6f15 100644 --- a/api/groups/vmValuesGroup_test.go +++ b/api/groups/vmValuesGroup_test.go @@ -5,12 +5,14 @@ import ( "encoding/hex" "encoding/json" "errors" + "fmt" "math/big" "net/http" "net/http/httptest" "testing" "github.com/gin-gonic/gin" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/vm" apiErrors "github.com/multiversx/mx-chain-go/api/errors" "github.com/multiversx/mx-chain-go/api/groups" @@ -137,18 +139,76 @@ func TestGetInt_ShouldWork(t *testing.T) { require.Equal(t, value, response.Data) } -func TestQuery_ShouldWork(t *testing.T) { +func TestQuery(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + t.Run("invalid block nonce should error", testQueryShouldError("/vm-values/query?blockNonce=invalid_nonce")) + t.Run("invalid block hash should error", testQueryShouldError("/vm-values/query?blockHash=invalid_nonce")) + t.Run("invalid block root hash should error", testQueryShouldError("/vm-values/query?blockRootHash=invalid_nonce")) + t.Run("should work - block nonce", func(t *testing.T) { + t.Parallel() - return &vm.VMOutputApi{ - ReturnData: [][]byte{big.NewInt(42).Bytes()}, - }, nil - }, - } + providedBlockNonce := core.OptionalUint64{ + Value: 123, + HasValue: true, + } + facade := mock.FacadeStub{ + ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + require.Equal(t, providedBlockNonce, query.BlockNonce) + return &vm.VMOutputApi{ + ReturnData: [][]byte{big.NewInt(42).Bytes()}, + }, nil + }, + } + url := fmt.Sprintf("/vm-values/query?blockNonce=%d", providedBlockNonce.Value) + testQueryShouldWork(t, url, &facade) + }) + t.Run("should work - block hash", func(t *testing.T) { + t.Parallel() + + providedBlockHash := []byte("provided hash") + facade := mock.FacadeStub{ + ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + require.Equal(t, providedBlockHash, query.BlockHash) + return &vm.VMOutputApi{ + ReturnData: [][]byte{big.NewInt(42).Bytes()}, + }, nil + }, + } + url := fmt.Sprintf("/vm-values/query?blockHash=%s", hex.EncodeToString(providedBlockHash)) + testQueryShouldWork(t, url, &facade) + }) + t.Run("should work - block root hash", func(t *testing.T) { + t.Parallel() + providedBlockRootHash := []byte("provided root hash") + facade := mock.FacadeStub{ + ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + require.Equal(t, providedBlockRootHash, query.BlockRootHash) + return &vm.VMOutputApi{ + ReturnData: [][]byte{big.NewInt(42).Bytes()}, + }, nil + }, + } + url := fmt.Sprintf("/vm-values/query?blockRootHash=%s", hex.EncodeToString(providedBlockRootHash)) + testQueryShouldWork(t, url, &facade) + }) + t.Run("should work - no block coordinates", func(t *testing.T) { + t.Parallel() + + facade := mock.FacadeStub{ + ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + + return &vm.VMOutputApi{ + ReturnData: [][]byte{big.NewInt(42).Bytes()}, + }, nil + }, + } + testQueryShouldWork(t, "/vm-values/query", &facade) + }) +} + +func testQueryShouldWork(t *testing.T, url string, facade shared.FacadeHandler) { request := groups.VMValueRequest{ ScAddress: dummyScAddress, FuncName: "function", @@ -156,13 +216,49 @@ func TestQuery_ShouldWork(t *testing.T) { } response := vmOutputResponse{} - statusCode := doPost(t, &facade, "/vm-values/query", request, &response) + statusCode := doPost(t, facade, url, request, &response) require.Equal(t, http.StatusOK, statusCode) require.Equal(t, "", response.Error) require.Equal(t, int64(42), big.NewInt(0).SetBytes(response.Data.ReturnData[0]).Int64()) } +func testQueryShouldError(url string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + request := &groups.VMValueRequest{ + ScAddress: dummyScAddress, + FuncName: "function", + Args: []string{}, + } + requestAsBytes, _ := json.Marshal(request) + + facade := mock.FacadeStub{ + ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + return &vm.VMOutputApi{ + ReturnData: [][]byte{big.NewInt(42).Bytes()}, + }, nil + }, + } + + group, err := groups.NewVmValuesGroup(&facade) + require.NoError(t, err) + + server := startWebServer(group, "vm-values", getVmValuesRoutesConfig()) + + httpRequest, _ := http.NewRequest("POST", url, bytes.NewBuffer(requestAsBytes)) + + responseRecorder := httptest.NewRecorder() + server.ServeHTTP(responseRecorder, httpRequest) + + responseI := shared.GenericAPIResponse{} + loadResponse(responseRecorder.Body, &responseI) + require.Equal(t, shared.ReturnCodeRequestError, responseI.Code) + require.NotEmpty(t, responseI.Error) + } +} + func TestCreateSCQuery_ArgumentIsNotHexShouldErr(t *testing.T) { request := groups.VMValueRequest{ ScAddress: dummyScAddress, @@ -280,7 +376,6 @@ func TestAllRoutes_WhenBadJsonShouldErr(t *testing.T) { func TestAllRoutes_DecodeAddressPubkeyFailsShouldErr(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected error") cnt := 0 facade := mock.FacadeStub{ DecodeAddressPubkeyCalled: func(pk string) ([]byte, error) { @@ -384,7 +479,6 @@ func TestVMValuesGroup_UpdateFacade(t *testing.T) { require.Contains(t, "", response.Error) require.Equal(t, hex.EncodeToString(valueBuff), response.Data) - expectedErr := errors.New("expected error") newFacade := &mock.FacadeStub{ ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index 5006002cf71..269612da801 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -10,6 +10,7 @@ import ( "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/facade" "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/node/external" @@ -32,9 +33,14 @@ import ( "github.com/multiversx/mx-chain-go/process/txstatus" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/state" + "github.com/multiversx/mx-chain-go/state/blockInfoProviders" + factoryState "github.com/multiversx/mx-chain-go/state/factory" + "github.com/multiversx/mx-chain-go/state/storagePruningManager" + "github.com/multiversx/mx-chain-go/state/storagePruningManager/evictionWaitingList" "github.com/multiversx/mx-chain-go/state/syncer" storageFactory "github.com/multiversx/mx-chain-go/storage/factory" "github.com/multiversx/mx-chain-go/storage/storageunit" + trieFactory "github.com/multiversx/mx-chain-go/trie/factory" "github.com/multiversx/mx-chain-go/vm" logger "github.com/multiversx/mx-chain-logger-go" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -58,6 +64,7 @@ type ApiResolverArgs struct { GasScheduleNotifier common.GasScheduleNotifierAPI Bootstrapper process.Bootstrapper AllowVMQueriesChan chan struct{} + ProcessingMode common.NodeProcessingMode } type scQueryServiceArgs struct { @@ -75,6 +82,7 @@ type scQueryServiceArgs struct { guardedAccountHandler process.GuardedAccountHandler allowVMQueriesChan chan struct{} workingDir string + processingMode common.NodeProcessingMode } type scQueryElementArgs struct { @@ -84,6 +92,7 @@ type scQueryElementArgs struct { stateComponents factory.StateComponentsHolder dataComponents factory.DataComponentsHolder processComponents factory.ProcessComponentsHolder + statusCoreComponents factory.StatusCoreComponentsHolder gasScheduleNotifier core.GasScheduleNotifier messageSigVerifier vm.MessageSignVerifier systemSCConfig *config.SystemSmartContractsConfig @@ -92,6 +101,7 @@ type scQueryElementArgs struct { allowVMQueriesChan chan struct{} workingDir string index int + processingMode common.NodeProcessingMode } // CreateApiResolver is able to create an ApiResolver instance that will solve the REST API requests through the node facade @@ -99,19 +109,21 @@ type scQueryElementArgs struct { func CreateApiResolver(args *ApiResolverArgs) (facade.ApiResolver, error) { apiWorkingDir := filepath.Join(args.Configs.FlagsConfig.WorkingDir, common.TemporaryPath) argsSCQuery := &scQueryServiceArgs{ - generalConfig: args.Configs.GeneralConfig, - epochConfig: args.Configs.EpochConfig, - coreComponents: args.CoreComponents, - dataComponents: args.DataComponents, - stateComponents: args.StateComponents, - processComponents: args.ProcessComponents, - statusCoreComponents: args.StatusCoreComponents, gasScheduleNotifier: args.GasScheduleNotifier, + generalConfig: args.Configs.GeneralConfig, + epochConfig: args.Configs.EpochConfig, + coreComponents: args.CoreComponents, + dataComponents: args.DataComponents, + stateComponents: args.StateComponents, + processComponents: args.ProcessComponents, + statusCoreComponents: args.StatusCoreComponents, + gasScheduleNotifier: args.GasScheduleNotifier, messageSigVerifier: args.CryptoComponents.MessageSignVerifier(), systemSCConfig: args.Configs.SystemSCConfig, bootstrapper: args.Bootstrapper, guardedAccountHandler: args.BootstrapComponents.GuardedAccountHandler(), allowVMQueriesChan: args.AllowVMQueriesChan, workingDir: apiWorkingDir, + processingMode: args.ProcessingMode, } scQueryService, err := createScQueryService(argsSCQuery) @@ -286,17 +298,19 @@ func createScQueryService( generalConfig: args.generalConfig, epochConfig: args.epochConfig, coreComponents: args.coreComponents, - dataComponents: args.dataComponents, stateComponents: args.stateComponents, + dataComponents: args.dataComponents, processComponents: args.processComponents, + statusCoreComponents: args.statusCoreComponents, gasScheduleNotifier: args.gasScheduleNotifier, messageSigVerifier: args.messageSigVerifier, systemSCConfig: args.systemSCConfig, - workingDir: args.workingDir, bootstrapper: args.bootstrapper, guardedAccountHandler: args.guardedAccountHandler, allowVMQueriesChan: args.allowVMQueriesChan, + workingDir: args.workingDir, index: 0, + processingMode: args.processingMode, } var err error @@ -362,10 +376,15 @@ func createScQueryElement( return nil, err } + accountsAdapterApi, err := createNewAccountsAdapterApi(args) + if err != nil { + return nil, err + } + scStorage := args.generalConfig.SmartContractsStorageForSCQuery scStorage.DB.FilePath += fmt.Sprintf("%d", args.index) argsHook := hooks.ArgBlockChainHook{ - Accounts: args.stateComponents.AccountsAdapterAPI(), + Accounts: accountsAdapterApi, PubkeyConv: args.coreComponents.AddressPubKeyConverter(), StorageService: args.dataComponents.StorageService(), BlockChain: args.dataComponents.Blockchain(), @@ -469,19 +488,123 @@ func createScQueryElement( } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: args.coreComponents.EconomicsData(), - BlockChainHook: vmFactory.BlockChainHookImpl(), - BlockChain: args.dataComponents.Blockchain(), - WasmVMChangeLocker: args.coreComponents.WasmVMChangeLocker(), - Bootstrapper: args.bootstrapper, - AllowExternalQueriesChan: args.allowVMQueriesChan, - MaxGasLimitPerQuery: maxGasForVmQueries, + VmContainer: vmContainer, + EconomicsFee: args.coreComponents.EconomicsData(), + BlockChainHook: vmFactory.BlockChainHookImpl(), + BlockChain: args.dataComponents.Blockchain(), + WasmVMChangeLocker: args.coreComponents.WasmVMChangeLocker(), + Bootstrapper: args.bootstrapper, + AllowExternalQueriesChan: args.allowVMQueriesChan, + MaxGasLimitPerQuery: maxGasForVmQueries, + HistoryRepository: args.processComponents.HistoryRepository(), + ShardCoordinator: args.processComponents.ShardCoordinator(), + StorageService: args.dataComponents.StorageService(), + Marshaller: args.coreComponents.InternalMarshalizer(), + ScheduledTxsExecutionHandler: args.processComponents.ScheduledTxsExecutionHandler(), + Uint64ByteSliceConverter: args.coreComponents.Uint64ByteSliceConverter(), } return smartContract.NewSCQueryService(argsNewSCQueryService) } +func createNewAccountsAdapterApi(args *scQueryElementArgs) (state.AccountsAdapterAPI, error) { + argsAccCreator := factoryState.ArgsAccountCreator{ + Hasher: args.coreComponents.Hasher(), + Marshaller: args.coreComponents.InternalMarshalizer(), + EnableEpochsHandler: args.coreComponents.EnableEpochsHandler(), + } + accountFactory, err := factoryState.NewAccountCreator(argsAccCreator) + if err != nil { + return nil, err + } + + storagePruning, err := newStoragePruningManager(args) + if err != nil { + return nil, err + } + storageService := args.dataComponents.StorageService() + trieStorer, err := storageService.GetStorer(dataRetriever.UserAccountsUnit) + if err != nil { + return nil, err + } + checkpointsStorer, err := storageService.GetStorer(dataRetriever.UserAccountsCheckpointsUnit) + if err != nil { + return nil, err + } + + trieFactoryArgs := trieFactory.TrieFactoryArgs{ + Marshalizer: args.coreComponents.InternalMarshalizer(), + Hasher: args.coreComponents.Hasher(), + PathManager: args.coreComponents.PathHandler(), + TrieStorageManagerConfig: args.generalConfig.TrieStorageManagerConfig, + } + trFactory, err := trieFactory.NewTrieFactory(trieFactoryArgs) + if err != nil { + return nil, err + } + + trieCreatorArgs := trieFactory.TrieCreateArgs{ + MainStorer: trieStorer, + CheckpointsStorer: checkpointsStorer, + PruningEnabled: args.generalConfig.StateTriesConfig.AccountsStatePruningEnabled, + CheckpointsEnabled: args.generalConfig.StateTriesConfig.CheckpointsEnabled, + MaxTrieLevelInMem: args.generalConfig.StateTriesConfig.MaxStateTrieLevelInMemory, + SnapshotsEnabled: args.generalConfig.StateTriesConfig.SnapshotsEnabled, + IdleProvider: args.coreComponents.ProcessStatusHandler(), + Identifier: dataRetriever.UserAccountsUnit.String(), + EnableEpochsHandler: args.coreComponents.EnableEpochsHandler(), + } + _, merkleTrie, err := trFactory.Create(trieCreatorArgs) + if err != nil { + return nil, err + } + + argsAPIAccountsDB := state.ArgsAccountsDB{ + Trie: merkleTrie, + Hasher: args.coreComponents.Hasher(), + Marshaller: args.coreComponents.InternalMarshalizer(), + AccountFactory: accountFactory, + StoragePruningManager: storagePruning, + ProcessingMode: args.processingMode, + ProcessStatusHandler: args.coreComponents.ProcessStatusHandler(), + AppStatusHandler: args.statusCoreComponents.AppStatusHandler(), + AddressConverter: args.coreComponents.AddressPubKeyConverter(), + } + + provider, err := blockInfoProviders.NewCurrentBlockInfo(args.dataComponents.Blockchain()) + if err != nil { + return nil, err + } + + accounts, err := state.NewAccountsDB(argsAPIAccountsDB) + if err != nil { + return nil, err + } + + return state.NewAccountsDBApi(accounts, provider) +} + +func newStoragePruningManager(args *scQueryElementArgs) (state.StoragePruningManager, error) { + argsMemEviction := evictionWaitingList.MemoryEvictionWaitingListArgs{ + RootHashesSize: args.generalConfig.EvictionWaitingList.RootHashesSize, + HashesSize: args.generalConfig.EvictionWaitingList.HashesSize, + } + trieEvictionWaitingList, err := evictionWaitingList.NewMemoryEvictionWaitingList(argsMemEviction) + if err != nil { + return nil, err + } + + storagePruning, err := storagePruningManager.NewStoragePruningManager( + trieEvictionWaitingList, + args.generalConfig.TrieStorageManagerConfig.PruningBufferLen, + ) + if err != nil { + return nil, err + } + + return storagePruning, nil +} + func createBuiltinFuncs( gasScheduleNotifier core.GasScheduleNotifier, marshalizer marshal.Marshalizer, diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index 1fc100b2605..dbac54df0d7 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -30,6 +30,7 @@ import ( "github.com/multiversx/mx-chain-go/testscommon/mainFactoryMocks" "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" stateMocks "github.com/multiversx/mx-chain-go/testscommon/state" + "github.com/multiversx/mx-chain-go/testscommon/statusHandler" "github.com/stretchr/testify/require" ) @@ -180,7 +181,7 @@ func TestCreateApiResolver(t *testing.T) { }) t.Run("DecodeAddresses fails should error", func(t *testing.T) { failingStepsInstance.reset() - failingStepsInstance.addressPublicKeyConverterFailingStep = 2 + failingStepsInstance.addressPublicKeyConverterFailingStep = 3 apiResolver, err := api.CreateApiResolver(failingArgs) require.NotNil(t, err) require.True(t, strings.Contains(strings.ToLower(err.Error()), "public key converter")) @@ -221,7 +222,7 @@ func TestCreateApiResolver(t *testing.T) { }) t.Run("createLogsFacade fails should error", func(t *testing.T) { failingStepsInstance.reset() - failingStepsInstance.marshallerFailingStep = 5 + failingStepsInstance.marshallerFailingStep = 9 apiResolver, err := api.CreateApiResolver(failingArgs) require.NotNil(t, err) require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) @@ -229,7 +230,7 @@ func TestCreateApiResolver(t *testing.T) { }) t.Run("NewOperationDataFieldParser fails should error", func(t *testing.T) { failingStepsInstance.reset() - failingStepsInstance.marshallerFailingStep = 6 + failingStepsInstance.marshallerFailingStep = 10 apiResolver, err := api.CreateApiResolver(failingArgs) require.NotNil(t, err) require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) @@ -237,7 +238,7 @@ func TestCreateApiResolver(t *testing.T) { }) t.Run("NewAPITransactionProcessor fails should error", func(t *testing.T) { failingStepsInstance.reset() - failingStepsInstance.marshallerFailingStep = 7 + failingStepsInstance.marshallerFailingStep = 11 apiResolver, err := api.CreateApiResolver(failingArgs) require.NotNil(t, err) require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) @@ -261,7 +262,7 @@ func TestCreateApiResolver(t *testing.T) { }) t.Run("createAPIBlockProcessorArgs fails because createLogsFacade fails should error", func(t *testing.T) { failingStepsInstance.reset() - failingStepsInstance.marshallerFailingStep = 8 + failingStepsInstance.marshallerFailingStep = 12 apiResolver, err := api.CreateApiResolver(failingArgs) require.NotNil(t, err) require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) @@ -269,7 +270,7 @@ func TestCreateApiResolver(t *testing.T) { }) t.Run("createAPIBlockProcessorArgs fails because NewAlteredAccountsProvider fails should error", func(t *testing.T) { failingStepsInstance.reset() - failingStepsInstance.addressPublicKeyConverterFailingStep = 9 + failingStepsInstance.addressPublicKeyConverterFailingStep = 10 apiResolver, err := api.CreateApiResolver(failingArgs) require.NotNil(t, err) require.True(t, strings.Contains(strings.ToLower(err.Error()), "public key converter")) @@ -294,6 +295,25 @@ func createMockSCQueryElementArgs() api.SCQueryElementArgs { Type: "LRU", Capacity: 100, }, + EvictionWaitingList: config.EvictionWaitingListConfig{ + RootHashesSize: 100, + HashesSize: 10000, + }, + TrieStorageManagerConfig: config.TrieStorageManagerConfig{ + SnapshotsGoroutineNum: 1, + }, + StateTriesConfig: config.StateTriesConfig{ + MaxStateTrieLevelInMemory: 5, + }, + VirtualMachine: config.VirtualMachineServicesConfig{ + Querying: config.QueryVirtualMachineConfig{ + VirtualMachineConfig: config.VirtualMachineConfig{ + WasmVMVersions: []config.WasmVMVersionByEpoch{ + {StartEpoch: 0, Version: "*"}, + }, + }, + }, + }, }, EpochConfig: &config.EpochConfig{}, CoreComponents: &mock.CoreComponentsMock{ @@ -302,15 +322,17 @@ func createMockSCQueryElementArgs() api.SCQueryElementArgs { return []byte(humanReadable), nil }, }, - IntMarsh: &marshallerMock.MarshalizerStub{}, - EpochChangeNotifier: &epochNotifierMock.EpochNotifierStub{}, - EnableEpochsHandlerField: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, - UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, - EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, - NodesConfig: &testscommon.NodesSetupStub{}, - Hash: &testscommon.HasherStub{}, - RatingHandler: &testscommon.RaterMock{}, - WasmVMChangeLockerInternal: &sync.RWMutex{}, + IntMarsh: &marshallerMock.MarshalizerStub{}, + EpochChangeNotifier: &epochNotifierMock.EpochNotifierStub{}, + EnableEpochsHandlerField: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, + UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: &testscommon.NodesSetupStub{}, + Hash: &testscommon.HasherStub{}, + RatingHandler: &testscommon.RaterMock{}, + WasmVMChangeLockerInternal: &sync.RWMutex{}, + PathHdl: &testscommon.PathManagerStub{}, + ProcessStatusHandlerInternal: &testscommon.ProcessStatusHandlerStub{}, }, StateComponents: &mock.StateComponentsHolderStub{ AccountsAdapterAPICalled: func() state.AccountsAdapter { @@ -320,8 +342,13 @@ func createMockSCQueryElementArgs() api.SCQueryElementArgs { return &stateMocks.AccountsStub{} }, }, + StatusCoreComponents: &factory.StatusCoreComponentsStub{ + AppStatusHandlerCalled: func() core.AppStatusHandler { + return &statusHandler.AppStatusHandlerStub{} + }, + }, DataComponents: &mock.DataComponentsMock{ - Storage: &genericMocks.ChainStorerMock{}, + Storage: genericMocks.NewChainStorerMock(0), Blkc: &testscommon.ChainHandlerMock{}, DataPool: &dataRetriever.PoolsHolderMock{}, }, @@ -392,24 +419,6 @@ func TestCreateApiResolver_createScQueryElement(t *testing.T) { require.True(t, strings.Contains(strings.ToLower(err.Error()), "lru")) require.Nil(t, scQueryService) }) - t.Run("metachain - NewBlockChainHookImpl fails", func(t *testing.T) { - t.Parallel() - - args := createMockSCQueryElementArgs() - args.ProcessComponents = &mock.ProcessComponentsMock{ - ShardCoord: &testscommon.ShardsCoordinatorMock{ - SelfIDCalled: func() uint32 { - return common.MetachainShardId - }, - }, - } - dataCompMock := args.DataComponents.(*mock.DataComponentsMock) - dataCompMock.Storage = nil - scQueryService, err := api.CreateScQueryElement(args) - require.NotNil(t, err) - require.True(t, strings.Contains(strings.ToLower(err.Error()), "storage")) - require.Nil(t, scQueryService) - }) t.Run("metachain - NewVMContainerFactory fails", func(t *testing.T) { t.Parallel() @@ -431,37 +440,6 @@ func TestCreateApiResolver_createScQueryElement(t *testing.T) { t.Run("shard - NewVMContainerFactory fails", func(t *testing.T) { t.Parallel() - args := createMockSCQueryElementArgs() - coreCompStub := factory.NewCoreComponentsHolderStubFromRealComponent(args.CoreComponents) - internalMarshaller := args.CoreComponents.InternalMarshalizer() - counter := 0 - coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { - counter++ - if counter > 2 { - return nil - } - return internalMarshaller - } - args.CoreComponents = coreCompStub - scQueryService, err := api.CreateScQueryElement(args) - require.NotNil(t, err) - require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshaller")) - require.Nil(t, scQueryService) - }) - t.Run("shard - NewBlockChainHookImpl fails", func(t *testing.T) { - t.Parallel() - - args := createMockSCQueryElementArgs() - dataCompMock := args.DataComponents.(*mock.DataComponentsMock) - dataCompMock.Storage = nil - scQueryService, err := api.CreateScQueryElement(args) - require.NotNil(t, err) - require.True(t, strings.Contains(strings.ToLower(err.Error()), "storage")) - require.Nil(t, scQueryService) - }) - t.Run("shard - NewVMContainerFactory fails", func(t *testing.T) { - t.Parallel() - args := createMockSCQueryElementArgs() coreCompMock := args.CoreComponents.(*mock.CoreComponentsMock) coreCompMock.Hash = nil diff --git a/factory/api/export_test.go b/factory/api/export_test.go index 85a5c6f08b6..0164c0c2b10 100644 --- a/factory/api/export_test.go +++ b/factory/api/export_test.go @@ -14,6 +14,7 @@ type SCQueryElementArgs struct { EpochConfig *config.EpochConfig CoreComponents factory.CoreComponentsHolder StateComponents factory.StateComponentsHolder + StatusCoreComponents factory.StatusCoreComponentsHolder DataComponents factory.DataComponentsHolder ProcessComponents factory.ProcessComponentsHolder GasScheduleNotifier core.GasScheduleNotifier @@ -35,6 +36,7 @@ func CreateScQueryElement(args SCQueryElementArgs) (process.SCQueryService, erro stateComponents: args.StateComponents, dataComponents: args.DataComponents, processComponents: args.ProcessComponents, + statusCoreComponents: args.StatusCoreComponents, gasScheduleNotifier: args.GasScheduleNotifier, messageSigVerifier: args.MessageSigVerifier, systemSCConfig: args.SystemSCConfig, diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 58031461a18..22b23d1ef89 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -85,51 +85,51 @@ var timeSpanForBadHeaders = time.Minute * 2 // processComponents struct holds the process components type processComponents struct { - nodesCoordinator nodesCoordinator.NodesCoordinator - shardCoordinator sharding.Coordinator + nodesCoordinator nodesCoordinator.NodesCoordinator + shardCoordinator sharding.Coordinator mainInterceptorsContainer process.InterceptorsContainer fullArchiveInterceptorsContainer process.InterceptorsContainer - resolversContainer dataRetriever.ResolversContainer - requestersFinder dataRetriever.RequestersFinder - roundHandler consensus.RoundHandler - epochStartTrigger epochStart.TriggerHandler - epochStartNotifier factory.EpochStartNotifier - forkDetector process.ForkDetector - blockProcessor process.BlockProcessor - blackListHandler process.TimeCacher - bootStorer process.BootStorer - headerSigVerifier process.InterceptedHeaderSigVerifier - headerIntegrityVerifier nodeFactory.HeaderIntegrityVerifierHandler - validatorsStatistics process.ValidatorStatisticsProcessor - validatorsProvider process.ValidatorsProvider - blockTracker process.BlockTracker - pendingMiniBlocksHandler process.PendingMiniBlocksHandler - requestHandler process.RequestHandler - txLogsProcessor process.TransactionLogProcessorDatabase - headerConstructionValidator process.HeaderConstructionValidator + resolversContainer dataRetriever.ResolversContainer + requestersFinder dataRetriever.RequestersFinder + roundHandler consensus.RoundHandler + epochStartTrigger epochStart.TriggerHandler + epochStartNotifier factory.EpochStartNotifier + forkDetector process.ForkDetector + blockProcessor process.BlockProcessor + blackListHandler process.TimeCacher + bootStorer process.BootStorer + headerSigVerifier process.InterceptedHeaderSigVerifier + headerIntegrityVerifier nodeFactory.HeaderIntegrityVerifierHandler + validatorsStatistics process.ValidatorStatisticsProcessor + validatorsProvider process.ValidatorsProvider + blockTracker process.BlockTracker + pendingMiniBlocksHandler process.PendingMiniBlocksHandler + requestHandler process.RequestHandler + txLogsProcessor process.TransactionLogProcessorDatabase + headerConstructionValidator process.HeaderConstructionValidator mainPeerShardMapper process.NetworkShardingCollector fullArchivePeerShardMapper process.NetworkShardingCollector - apiTransactionEvaluator factory.TransactionEvaluator - miniBlocksPoolCleaner process.PoolsCleaner - txsPoolCleaner process.PoolsCleaner - fallbackHeaderValidator process.FallbackHeaderValidator - whiteListHandler process.WhiteListHandler - whiteListerVerifiedTxs process.WhiteListHandler - historyRepository dblookupext.HistoryRepository - importStartHandler update.ImportStartHandler - requestedItemsHandler dataRetriever.RequestedItemsHandler - importHandler update.ImportHandler - nodeRedundancyHandler consensus.NodeRedundancyHandler - currentEpochProvider dataRetriever.CurrentNetworkEpochProviderHandler - vmFactoryForTxSimulator process.VirtualMachinesContainerFactory - vmFactoryForProcessing process.VirtualMachinesContainerFactory - scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler - txsSender process.TxsSenderHandler - hardforkTrigger factory.HardforkTrigger - processedMiniBlocksTracker process.ProcessedMiniBlocksTracker - esdtDataStorageForApi vmcommon.ESDTNFTStorageHandler - accountsParser genesis.AccountsParser - receiptsRepository mainFactory.ReceiptsRepository + apiTransactionEvaluator factory.TransactionEvaluator + miniBlocksPoolCleaner process.PoolsCleaner + txsPoolCleaner process.PoolsCleaner + fallbackHeaderValidator process.FallbackHeaderValidator + whiteListHandler process.WhiteListHandler + whiteListerVerifiedTxs process.WhiteListHandler + historyRepository dblookupext.HistoryRepository + importStartHandler update.ImportStartHandler + requestedItemsHandler dataRetriever.RequestedItemsHandler + importHandler update.ImportHandler + nodeRedundancyHandler consensus.NodeRedundancyHandler + currentEpochProvider dataRetriever.CurrentNetworkEpochProviderHandler + vmFactoryForTxSimulator process.VirtualMachinesContainerFactory + vmFactoryForProcessing process.VirtualMachinesContainerFactory + scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler + txsSender process.TxsSenderHandler + hardforkTrigger factory.HardforkTrigger + processedMiniBlocksTracker process.ProcessedMiniBlocksTracker + esdtDataStorageForApi vmcommon.ESDTNFTStorageHandler + accountsParser genesis.AccountsParser + receiptsRepository mainFactory.ReceiptsRepository } // ProcessComponentsFactoryArgs holds the arguments needed to create a process components factory @@ -340,8 +340,25 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { return nil, err } + scheduledSCRSStorer, err := pcf.data.StorageService().GetStorer(dataRetriever.ScheduledSCRsUnit) + if err != nil { + return nil, err + } + + scheduledTxsExecutionHandler, err := preprocess.NewScheduledTxsExecution( + &disabled.TxProcessor{}, + &disabled.TxCoordinator{}, + scheduledSCRSStorer, + pcf.coreData.InternalMarshalizer(), + pcf.coreData.Hasher(), + pcf.bootstrapComponents.ShardCoordinator(), + ) + if err != nil { + return nil, err + } + pcf.txLogsProcessor = txLogsProcessor - genesisBlocks, initialTxs, err := pcf.generateGenesisHeadersAndApplyInitialBalances() + genesisBlocks, initialTxs, err := pcf.generateGenesisHeadersAndApplyInitialBalances(scheduledTxsExecutionHandler) if err != nil { return nil, err } @@ -557,23 +574,6 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { return nil, err } - scheduledSCRSStorer, err := pcf.data.StorageService().GetStorer(dataRetriever.ScheduledSCRsUnit) - if err != nil { - return nil, err - } - - scheduledTxsExecutionHandler, err := preprocess.NewScheduledTxsExecution( - &disabled.TxProcessor{}, - &disabled.TxCoordinator{}, - scheduledSCRSStorer, - pcf.coreData.InternalMarshalizer(), - pcf.coreData.Hasher(), - pcf.bootstrapComponents.ShardCoordinator(), - ) - if err != nil { - return nil, err - } - esdtDataStorageArgs := vmcommonBuiltInFunctions.ArgsNewESDTDataStorage{ Accounts: pcf.state.AccountsAdapterAPI(), GlobalSettingsHandler: disabled.NewDisabledGlobalSettingHandler(), @@ -684,51 +684,51 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { } return &processComponents{ - nodesCoordinator: pcf.nodesCoordinator, - shardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + nodesCoordinator: pcf.nodesCoordinator, + shardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), mainInterceptorsContainer: mainInterceptorsContainer, fullArchiveInterceptorsContainer: fullArchiveInterceptorsContainer, - resolversContainer: resolversContainer, - requestersFinder: requestersFinder, - roundHandler: pcf.coreData.RoundHandler(), - forkDetector: forkDetector, - blockProcessor: blockProcessorComponents.blockProcessor, - epochStartTrigger: epochStartTrigger, - epochStartNotifier: pcf.coreData.EpochStartNotifierWithConfirm(), - blackListHandler: blackListHandler, - bootStorer: bootStorer, - headerSigVerifier: headerSigVerifier, - validatorsStatistics: validatorStatisticsProcessor, - validatorsProvider: validatorsProvider, - blockTracker: blockTracker, - pendingMiniBlocksHandler: pendingMiniBlocksHandler, - requestHandler: requestHandler, - txLogsProcessor: txLogsProcessor, - headerConstructionValidator: headerValidator, - headerIntegrityVerifier: pcf.bootstrapComponents.HeaderIntegrityVerifier(), + resolversContainer: resolversContainer, + requestersFinder: requestersFinder, + roundHandler: pcf.coreData.RoundHandler(), + forkDetector: forkDetector, + blockProcessor: blockProcessorComponents.blockProcessor, + epochStartTrigger: epochStartTrigger, + epochStartNotifier: pcf.coreData.EpochStartNotifierWithConfirm(), + blackListHandler: blackListHandler, + bootStorer: bootStorer, + headerSigVerifier: headerSigVerifier, + validatorsStatistics: validatorStatisticsProcessor, + validatorsProvider: validatorsProvider, + blockTracker: blockTracker, + pendingMiniBlocksHandler: pendingMiniBlocksHandler, + requestHandler: requestHandler, + txLogsProcessor: txLogsProcessor, + headerConstructionValidator: headerValidator, + headerIntegrityVerifier: pcf.bootstrapComponents.HeaderIntegrityVerifier(), mainPeerShardMapper: mainPeerShardMapper, fullArchivePeerShardMapper: fullArchivePeerShardMapper, - apiTransactionEvaluator: apiTransactionEvaluator, - miniBlocksPoolCleaner: mbsPoolsCleaner, - txsPoolCleaner: txsPoolsCleaner, - fallbackHeaderValidator: fallbackHeaderValidator, - whiteListHandler: pcf.whiteListHandler, - whiteListerVerifiedTxs: pcf.whiteListerVerifiedTxs, - historyRepository: pcf.historyRepo, - importStartHandler: pcf.importStartHandler, - requestedItemsHandler: pcf.requestedItemsHandler, - importHandler: pcf.importHandler, - nodeRedundancyHandler: nodeRedundancyHandler, - currentEpochProvider: currentEpochProvider, - vmFactoryForTxSimulator: vmFactoryForTxSimulate, - vmFactoryForProcessing: blockProcessorComponents.vmFactoryForProcessing, - scheduledTxsExecutionHandler: scheduledTxsExecutionHandler, - txsSender: txsSenderWithAccumulator, - hardforkTrigger: hardforkTrigger, - processedMiniBlocksTracker: processedMiniBlocksTracker, - esdtDataStorageForApi: pcf.esdtNftStorage, - accountsParser: pcf.accountsParser, - receiptsRepository: receiptsRepository, + apiTransactionEvaluator: apiTransactionEvaluator, + miniBlocksPoolCleaner: mbsPoolsCleaner, + txsPoolCleaner: txsPoolsCleaner, + fallbackHeaderValidator: fallbackHeaderValidator, + whiteListHandler: pcf.whiteListHandler, + whiteListerVerifiedTxs: pcf.whiteListerVerifiedTxs, + historyRepository: pcf.historyRepo, + importStartHandler: pcf.importStartHandler, + requestedItemsHandler: pcf.requestedItemsHandler, + importHandler: pcf.importHandler, + nodeRedundancyHandler: nodeRedundancyHandler, + currentEpochProvider: currentEpochProvider, + vmFactoryForTxSimulator: vmFactoryForTxSimulate, + vmFactoryForProcessing: blockProcessorComponents.vmFactoryForProcessing, + scheduledTxsExecutionHandler: scheduledTxsExecutionHandler, + txsSender: txsSenderWithAccumulator, + hardforkTrigger: hardforkTrigger, + processedMiniBlocksTracker: processedMiniBlocksTracker, + esdtDataStorageForApi: pcf.esdtNftStorage, + accountsParser: pcf.accountsParser, + receiptsRepository: receiptsRepository, }, nil } @@ -841,7 +841,9 @@ func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochSt return nil, errors.New("error creating new start of epoch trigger because of invalid shard id") } -func (pcf *processComponentsFactory) generateGenesisHeadersAndApplyInitialBalances() (map[uint32]data.HeaderHandler, map[uint32]*genesis.IndexingData, error) { +func (pcf *processComponentsFactory) generateGenesisHeadersAndApplyInitialBalances( + scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler, +) (map[uint32]data.HeaderHandler, map[uint32]*genesis.IndexingData, error) { genesisVmConfig := pcf.config.VirtualMachine.Execution conversionBase := 10 genesisNodePrice, ok := big.NewInt(0).SetString(pcf.systemSCConfig.StakingSystemSCConfig.GenesisNodePrice, conversionBase) @@ -850,28 +852,30 @@ func (pcf *processComponentsFactory) generateGenesisHeadersAndApplyInitialBalanc } arg := processGenesis.ArgsGenesisBlockCreator{ - Core: pcf.coreData, - Data: pcf.data, - GenesisTime: uint64(pcf.coreData.GenesisNodesSetup().GetStartTime()), - StartEpochNum: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), - Accounts: pcf.state.AccountsAdapter(), - InitialNodesSetup: pcf.coreData.GenesisNodesSetup(), - Economics: pcf.coreData.EconomicsData(), - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - AccountsParser: pcf.accountsParser, - SmartContractParser: pcf.smartContractParser, - ValidatorAccounts: pcf.state.PeerAccounts(), - GasSchedule: pcf.gasSchedule, - VirtualMachineConfig: genesisVmConfig, - TxLogsProcessor: pcf.txLogsProcessor, - HardForkConfig: pcf.config.Hardfork, - TrieStorageManagers: pcf.state.TrieStorageManagers(), - SystemSCConfig: *pcf.systemSCConfig, - BlockSignKeyGen: pcf.crypto.BlockSignKeyGen(), - GenesisString: pcf.config.GeneralSettings.GenesisString, - GenesisNodePrice: genesisNodePrice, - RoundConfig: &pcf.roundConfig, - EpochConfig: &pcf.epochConfig, + GenesisTime: uint64(pcf.coreData.GenesisNodesSetup().GetStartTime()), + StartEpochNum: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), + Data: pcf.data, + Core: pcf.coreData, + Accounts: pcf.state.AccountsAdapter(), + ValidatorAccounts: pcf.state.PeerAccounts(), + InitialNodesSetup: pcf.coreData.GenesisNodesSetup(), + Economics: pcf.coreData.EconomicsData(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + AccountsParser: pcf.accountsParser, + SmartContractParser: pcf.smartContractParser, + GasSchedule: pcf.gasSchedule, + TxLogsProcessor: pcf.txLogsProcessor, + VirtualMachineConfig: genesisVmConfig, + HardForkConfig: pcf.config.Hardfork, + TrieStorageManagers: pcf.state.TrieStorageManagers(), + SystemSCConfig: *pcf.systemSCConfig, + RoundConfig: &pcf.roundConfig, + EpochConfig: &pcf.epochConfig, + BlockSignKeyGen: pcf.crypto.BlockSignKeyGen(), + HistoryRepository: pcf.historyRepo, + ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, + GenesisNodePrice: genesisNodePrice, + GenesisString: pcf.config.GeneralSettings.GenesisString, } gbc, err := processGenesis.NewGenesisBlockCreator(arg) diff --git a/genesis/process/argGenesisBlockCreator.go b/genesis/process/argGenesisBlockCreator.go index b3ede6992ff..d53888b6607 100644 --- a/genesis/process/argGenesisBlockCreator.go +++ b/genesis/process/argGenesisBlockCreator.go @@ -12,6 +12,7 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever" + "github.com/multiversx/mx-chain-go/dblookupext" "github.com/multiversx/mx-chain-go/genesis" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" @@ -42,27 +43,29 @@ type dataComponentsHandler interface { // ArgsGenesisBlockCreator holds the arguments which are needed to create a genesis block type ArgsGenesisBlockCreator struct { - GenesisTime uint64 - StartEpochNum uint32 - Data dataComponentsHandler - Core coreComponentsHandler - Accounts state.AccountsAdapter - ValidatorAccounts state.AccountsAdapter - InitialNodesSetup genesis.InitialNodesHandler - Economics process.EconomicsDataHandler - ShardCoordinator sharding.Coordinator - AccountsParser genesis.AccountsParser - SmartContractParser genesis.InitialSmartContractParser - GasSchedule core.GasScheduleNotifier - TxLogsProcessor process.TransactionLogProcessor - VirtualMachineConfig config.VirtualMachineConfig - HardForkConfig config.HardforkConfig - TrieStorageManagers map[string]common.StorageManager - SystemSCConfig config.SystemSmartContractsConfig - RoundConfig *config.RoundConfig - EpochConfig *config.EpochConfig - WorkingDir string - BlockSignKeyGen crypto.KeyGenerator + GenesisTime uint64 + StartEpochNum uint32 + Data dataComponentsHandler + Core coreComponentsHandler + Accounts state.AccountsAdapter + ValidatorAccounts state.AccountsAdapter + InitialNodesSetup genesis.InitialNodesHandler + Economics process.EconomicsDataHandler + ShardCoordinator sharding.Coordinator + AccountsParser genesis.AccountsParser + SmartContractParser genesis.InitialSmartContractParser + GasSchedule core.GasScheduleNotifier + TxLogsProcessor process.TransactionLogProcessor + VirtualMachineConfig config.VirtualMachineConfig + HardForkConfig config.HardforkConfig + TrieStorageManagers map[string]common.StorageManager + SystemSCConfig config.SystemSmartContractsConfig + RoundConfig *config.RoundConfig + EpochConfig *config.EpochConfig + WorkingDir string + BlockSignKeyGen crypto.KeyGenerator + HistoryRepository dblookupext.HistoryRepository + ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler GenesisNodePrice *big.Int GenesisString string diff --git a/genesis/process/genesisBlockCreator.go b/genesis/process/genesisBlockCreator.go index 02064440ee2..b7d7a52031c 100644 --- a/genesis/process/genesisBlockCreator.go +++ b/genesis/process/genesisBlockCreator.go @@ -193,6 +193,12 @@ func checkArgumentsForBlockCreator(arg ArgsGenesisBlockCreator) error { if arg.RoundConfig == nil { return genesis.ErrNilRoundConfig } + if check.IfNil(arg.HistoryRepository) { + return process.ErrNilHistoryRepository + } + if check.IfNil(arg.ScheduledTxsExecutionHandler) { + return process.ErrNilScheduledTxsExecutionHandler + } return nil } diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index dfde57b17e3..440a4028c74 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -29,6 +29,7 @@ import ( "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" "github.com/multiversx/mx-chain-go/testscommon/genericMocks" @@ -179,6 +180,8 @@ func createMockArgument( }, }, }, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, } arg.ShardCoordinator = &mock.ShardCoordinatorMock{ @@ -444,6 +447,26 @@ func TestNewGenesisBlockCreator(t *testing.T) { require.True(t, errors.Is(err, genesis.ErrInvalidInitialNodePrice)) require.Nil(t, gbc) }) + t.Run("nil HistoryRepository should error", func(t *testing.T) { + t.Parallel() + + arg := createMockArgument(t, "testdata/genesisTest1.json", &mock.InitialNodesHandlerStub{}, big.NewInt(22000)) + arg.HistoryRepository = nil + + gbc, err := NewGenesisBlockCreator(arg) + require.True(t, errors.Is(err, process.ErrNilHistoryRepository)) + require.Nil(t, gbc) + }) + t.Run("nil ScheduledTxsExecutionHandler should error", func(t *testing.T) { + t.Parallel() + + arg := createMockArgument(t, "testdata/genesisTest1.json", &mock.InitialNodesHandlerStub{}, big.NewInt(22000)) + arg.ScheduledTxsExecutionHandler = nil + + gbc, err := NewGenesisBlockCreator(arg) + require.True(t, errors.Is(err, process.ErrNilScheduledTxsExecutionHandler)) + require.Nil(t, gbc) + }) t.Run("should work", func(t *testing.T) { t.Parallel() diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index fa7a07db57c..f13f2f96516 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -551,13 +551,19 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: arg.Economics, - BlockChainHook: virtualMachineFactory.BlockChainHookImpl(), - BlockChain: arg.Data.Blockchain(), - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: vmContainer, + EconomicsFee: arg.Economics, + BlockChainHook: virtualMachineFactory.BlockChainHookImpl(), + BlockChain: arg.Data.Blockchain(), + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: arg.HistoryRepository, + ShardCoordinator: arg.ShardCoordinator, + StorageService: arg.Data.StorageService(), + Marshaller: arg.Core.InternalMarshalizer(), + ScheduledTxsExecutionHandler: arg.ScheduledTxsExecutionHandler, + Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), } queryService, err := smartContract.NewSCQueryService(argsNewSCQueryService) if err != nil { diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index 41d43448e02..96fcc8130ea 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -693,13 +693,19 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: arg.Economics, - BlockChainHook: vmFactoryImpl.BlockChainHookImpl(), - BlockChain: arg.Data.Blockchain(), - WasmVMChangeLocker: genesisWasmVMLocker, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: vmContainer, + EconomicsFee: arg.Economics, + BlockChainHook: vmFactoryImpl.BlockChainHookImpl(), + BlockChain: arg.Data.Blockchain(), + WasmVMChangeLocker: genesisWasmVMLocker, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: arg.HistoryRepository, + ShardCoordinator: arg.ShardCoordinator, + StorageService: arg.Data.StorageService(), + Marshaller: arg.Core.InternalMarshalizer(), + ScheduledTxsExecutionHandler: arg.ScheduledTxsExecutionHandler, + Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), } queryService, err := smartContract.NewSCQueryService(argsNewSCQueryService) if err != nil { diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index a3b3fb9cf4d..3fe05349538 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -20,7 +20,9 @@ import ( "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm" vmFactory "github.com/multiversx/mx-chain-go/process/factory" "github.com/multiversx/mx-chain-go/state" + "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" factoryTests "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/multiversx/mx-chain-go/testscommon/genesisMocks" @@ -488,7 +490,9 @@ func hardForkImport( DelegationSmartContractEnableEpoch: 0, }, }, - RoundConfig: &roundConfig, + RoundConfig: &roundConfig, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, } genesisProcessor, err := process.NewGenesisBlockCreator(argsGenesis) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index ebbf0fff697..a42f4a2fa7d 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -59,6 +59,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/storageunit" "github.com/multiversx/mx-chain-go/testscommon" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" "github.com/multiversx/mx-chain-go/testscommon/guardianMocks" @@ -705,7 +706,9 @@ func CreateFullGenesisBlocks( EpochConfig: &config.EpochConfig{ EnableEpochs: enableEpochsConfig, }, - RoundConfig: &roundsConfig, + RoundConfig: &roundsConfig, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, } genesisProcessor, _ := genesisProcess.NewGenesisBlockCreator(argsGenesis) @@ -809,6 +812,8 @@ func CreateGenesisMetaBlock( EpochConfig: &config.EpochConfig{ EnableEpochs: enableEpochsConfig, }, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, } if shardCoordinator.SelfId() != core.MetachainShardId { diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index a8465c04d6a..98a8f51fe88 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -788,13 +788,19 @@ func (tpn *TestProcessorNode) initTestNodeWithArgs(args ArgTestProcessorNode) { if check.IfNil(args.TrieStore) { argsNewScQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: tpn.VMContainer, - EconomicsFee: tpn.EconomicsData, - BlockChainHook: tpn.BlockchainHook, - BlockChain: tpn.BlockChain, - WasmVMChangeLocker: tpn.WasmVMChangeLocker, - Bootstrapper: tpn.Bootstrapper, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: tpn.VMContainer, + EconomicsFee: tpn.EconomicsData, + BlockChainHook: tpn.BlockchainHook, + BlockChain: tpn.BlockChain, + WasmVMChangeLocker: tpn.WasmVMChangeLocker, + Bootstrapper: tpn.Bootstrapper, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: tpn.HistoryRepository, + ShardCoordinator: tpn.ShardCoordinator, + StorageService: tpn.Storage, + Marshaller: TestMarshaller, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) } else { @@ -973,13 +979,19 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str _ = builtInFuncFactory.SetPayableHandler(vmFactory.BlockChainHookImpl()) argsNewScQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: tpn.EconomicsData, - BlockChainHook: vmFactory.BlockChainHookImpl(), - BlockChain: tpn.BlockChain, - WasmVMChangeLocker: tpn.WasmVMChangeLocker, - Bootstrapper: tpn.Bootstrapper, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: vmContainer, + EconomicsFee: tpn.EconomicsData, + BlockChainHook: vmFactory.BlockChainHookImpl(), + BlockChain: tpn.BlockChain, + WasmVMChangeLocker: tpn.WasmVMChangeLocker, + Bootstrapper: tpn.Bootstrapper, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: tpn.HistoryRepository, + ShardCoordinator: tpn.ShardCoordinator, + StorageService: tpn.Storage, + Marshaller: TestMarshaller, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) } @@ -990,13 +1002,19 @@ func (tpn *TestProcessorNode) InitializeProcessors(gasMap map[string]map[string] tpn.initBlockTracker() tpn.initInnerProcessors(gasMap, getDefaultVMConfig()) argsNewScQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: tpn.VMContainer, - EconomicsFee: tpn.EconomicsData, - BlockChainHook: tpn.BlockchainHook, - BlockChain: tpn.BlockChain, - WasmVMChangeLocker: tpn.WasmVMChangeLocker, - Bootstrapper: tpn.Bootstrapper, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: tpn.VMContainer, + EconomicsFee: tpn.EconomicsData, + BlockChainHook: tpn.BlockchainHook, + BlockChain: tpn.BlockChain, + WasmVMChangeLocker: tpn.WasmVMChangeLocker, + Bootstrapper: tpn.Bootstrapper, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: tpn.HistoryRepository, + ShardCoordinator: tpn.ShardCoordinator, + StorageService: tpn.Storage, + Marshaller: TestMarshaller, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) tpn.initBlockProcessor(stateCheckpointModulus) diff --git a/integrationTests/vm/mockVM/vmGet/vmGet_test.go b/integrationTests/vm/mockVM/vmGet/vmGet_test.go index 34d374bfa64..ff53e84e98b 100644 --- a/integrationTests/vm/mockVM/vmGet/vmGet_test.go +++ b/integrationTests/vm/mockVM/vmGet/vmGet_test.go @@ -19,7 +19,10 @@ import ( "github.com/multiversx/mx-chain-go/process/sync/disabled" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" + "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" + storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -40,11 +43,17 @@ func TestVmGetShouldReturnValue(t *testing.T) { return uint64(math.MaxUint64) }, }, - BlockChainHook: &testscommon.BlockChainHookStub{}, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: disabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + BlockChainHook: &testscommon.BlockChainHookStub{}, + BlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: disabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } service, _ := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index f3db60b50bf..d009c10e8ec 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -55,6 +55,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/txcache" "github.com/multiversx/mx-chain-go/testscommon" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" @@ -253,13 +254,19 @@ func (vmTestContext *VMTestContext) GetVMOutputWithTransientVM(funcName string, } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmTestContext.VMContainer, - EconomicsFee: feeHandler, - BlockChainHook: vmTestContext.BlockchainHook.(process.BlockChainHookHandler), - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: vmTestContext.VMContainer, + EconomicsFee: feeHandler, + BlockChainHook: vmTestContext.BlockchainHook.(process.BlockChainHookHandler), + BlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: integrationTests.TestMarshalizer, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) @@ -1633,7 +1640,12 @@ func GetStringValueFromSC( } // GetVmOutput - -func GetVmOutput(gasSchedule map[string]map[string]uint64, accnts state.AccountsAdapter, scAddressBytes []byte, funcName string, args ...[]byte) *vmcommon.VMOutput { +func GetVmOutput( + gasSchedule map[string]map[string]uint64, + accnts state.AccountsAdapter, + scAddressBytes []byte, + funcName string, + args ...[]byte) *vmcommon.VMOutput { vmConfig := createDefaultVMConfig() gasScheduleNotifier := mock.NewGasScheduleNotifierMock(gasSchedule) epochNotifierInstance := forking.NewGenericEpochNotifier() @@ -1666,13 +1678,19 @@ func GetVmOutput(gasSchedule map[string]map[string]uint64, accnts state.Accounts } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: feeHandler, - BlockChainHook: blockChainHook, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: vmContainer, + EconomicsFee: feeHandler, + BlockChainHook: blockChainHook, + BlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: integrationTests.TestMarshalizer, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) @@ -1720,9 +1738,15 @@ func ComputeGasLimit(gasSchedule map[string]map[string]uint64, testContext *VMTe } }, }, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testContext.ShardCoordinator, + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: integrationTests.TestMarshalizer, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/integrationTests/vm/wasm/utils.go b/integrationTests/vm/wasm/utils.go index d4276fe0735..dbf9e478899 100644 --- a/integrationTests/vm/wasm/utils.go +++ b/integrationTests/vm/wasm/utils.go @@ -47,9 +47,11 @@ import ( "github.com/multiversx/mx-chain-go/storage/txcache" "github.com/multiversx/mx-chain-go/testscommon" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" "github.com/multiversx/mx-chain-go/testscommon/guardianMocks" "github.com/multiversx/mx-chain-go/testscommon/integrationtests" + "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" "github.com/multiversx/mx-chain-go/vm/systemSmartContracts/defaults" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -162,13 +164,19 @@ func SetupTestContextWithGasSchedule(t *testing.T, gasSchedule map[string]map[st context.initTxProcessorWithOneSCExecutorWithVMs() context.ScAddress, _ = context.BlockchainHook.NewAddress(context.Owner.Address, context.Owner.Nonce, factory.WasmVirtualMachine) argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: context.VMContainer, - EconomicsFee: context.EconomicsFee, - BlockChainHook: context.BlockchainHook, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: disabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: context.VMContainer, + EconomicsFee: context.EconomicsFee, + BlockChainHook: context.BlockchainHook, + BlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: disabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } context.QueryService, _ = smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 6a1b1c1e117..078b1e4fbb6 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -709,6 +709,7 @@ func (nr *nodeRunner) createApiFacade( Bootstrapper: currentNode.consensusComponents.Bootstrapper(), AllowVMQueriesChan: allowVMQueriesChan, StatusComponents: currentNode.statusComponents, + ProcessingMode: common.GetNodeProcessingMode(nr.configs.ImportDbConfig), } apiResolver, err := apiComp.CreateApiResolver(apiResolverArgs) diff --git a/process/errors.go b/process/errors.go index 03e53bafbca..be983eb897c 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1217,3 +1217,6 @@ var ErrBuiltinFunctionNotExecutable = errors.New("builtin function not executabl // ErrNilManagedPeersHolder signals that a nil managed peers holder has been provided var ErrNilManagedPeersHolder = errors.New("nil managed peers holder") + +// ErrNilStorageService signals that nil storage service has been provided +var ErrNilStorageService = errors.New("nil storage service") diff --git a/process/interface.go b/process/interface.go index d052c305899..570255cbb4e 100644 --- a/process/interface.go +++ b/process/interface.go @@ -538,6 +538,7 @@ type BlockChainHookHandler interface { GetCounterValues() map[string]uint64 IsInterfaceNil() bool IsBuiltinFunctionName(functionName string) bool + GetAccountsAdapter() state.AccountsAdapter } // Interceptor defines what a data interceptor should do @@ -777,6 +778,9 @@ type SCQuery struct { Arguments [][]byte SameScState bool ShouldBeSynced bool + BlockNonce core.OptionalUint64 + BlockHash []byte + BlockRootHash []byte } // GasHandler is able to perform some gas calculation diff --git a/process/smartContract/hooks/blockChainHook.go b/process/smartContract/hooks/blockChainHook.go index 3097f7fd026..35c3aa7a4ce 100644 --- a/process/smartContract/hooks/blockChainHook.go +++ b/process/smartContract/hooks/blockChainHook.go @@ -902,6 +902,11 @@ func (bh *BlockChainHookImpl) GetCounterValues() map[string]uint64 { return bh.counter.GetCounterValues() } +// GetAccountsAdapter returns the managed accounts adapter +func (bh *BlockChainHookImpl) GetAccountsAdapter() state.AccountsAdapter { + return bh.accounts +} + // IsInterfaceNil returns true if there is no value under the interface func (bh *BlockChainHookImpl) IsInterfaceNil() bool { return bh == nil diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 562e28f5bce..fa3ae772f4e 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -7,13 +7,19 @@ import ( "math/big" "sync" + "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/transaction" + "github.com/multiversx/mx-chain-core-go/data/typeConverters" vmData "github.com/multiversx/mx-chain-core-go/data/vm" + "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/dataRetriever" + "github.com/multiversx/mx-chain-go/dblookupext" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/smartContract/scrCommon" + "github.com/multiversx/mx-chain-go/sharding" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/parsers" ) @@ -22,70 +28,115 @@ var _ process.SCQueryService = (*SCQueryService)(nil) // SCQueryService can execute Get functions over SC to fetch stored values type SCQueryService struct { - vmContainer process.VirtualMachinesContainer - economicsFee process.FeeHandler - mutRunSc sync.Mutex - blockChainHook process.BlockChainHookHandler - blockChain data.ChainHandler - numQueries int - gasForQuery uint64 - wasmVMChangeLocker common.Locker - bootstrapper process.Bootstrapper - allowExternalQueriesChan chan struct{} + vmContainer process.VirtualMachinesContainer + economicsFee process.FeeHandler + mutRunSc sync.Mutex + blockChainHook process.BlockChainHookHandler + blockChain data.ChainHandler + numQueries int + gasForQuery uint64 + wasmVMChangeLocker common.Locker + bootstrapper process.Bootstrapper + allowExternalQueriesChan chan struct{} + historyRepository dblookupext.HistoryRepository + shardCoordinator sharding.Coordinator + storageService dataRetriever.StorageService + marshaller marshal.Marshalizer + scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler + uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter } // ArgsNewSCQueryService defines the arguments needed for the sc query service type ArgsNewSCQueryService struct { - VmContainer process.VirtualMachinesContainer - EconomicsFee process.FeeHandler - BlockChainHook process.BlockChainHookHandler - BlockChain data.ChainHandler - WasmVMChangeLocker common.Locker - Bootstrapper process.Bootstrapper - AllowExternalQueriesChan chan struct{} - MaxGasLimitPerQuery uint64 + VmContainer process.VirtualMachinesContainer + EconomicsFee process.FeeHandler + BlockChainHook process.BlockChainHookHandler + BlockChain data.ChainHandler + WasmVMChangeLocker common.Locker + Bootstrapper process.Bootstrapper + AllowExternalQueriesChan chan struct{} + MaxGasLimitPerQuery uint64 + HistoryRepository dblookupext.HistoryRepository + ShardCoordinator sharding.Coordinator + StorageService dataRetriever.StorageService + Marshaller marshal.Marshalizer + ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler + Uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter } // NewSCQueryService returns a new instance of SCQueryService func NewSCQueryService( args ArgsNewSCQueryService, ) (*SCQueryService, error) { + err := checkArgs(args) + if err != nil { + return nil, err + } + + gasForQuery := uint64(math.MaxUint64) + if args.MaxGasLimitPerQuery > 0 { + gasForQuery = args.MaxGasLimitPerQuery + } + return &SCQueryService{ + vmContainer: args.VmContainer, + economicsFee: args.EconomicsFee, + blockChain: args.BlockChain, + blockChainHook: args.BlockChainHook, + wasmVMChangeLocker: args.WasmVMChangeLocker, + bootstrapper: args.Bootstrapper, + gasForQuery: gasForQuery, + allowExternalQueriesChan: args.AllowExternalQueriesChan, + historyRepository: args.HistoryRepository, + shardCoordinator: args.ShardCoordinator, + storageService: args.StorageService, + marshaller: args.Marshaller, + scheduledTxsExecutionHandler: args.ScheduledTxsExecutionHandler, + uint64ByteSliceConverter: args.Uint64ByteSliceConverter, + }, nil +} + +func checkArgs(args ArgsNewSCQueryService) error { if check.IfNil(args.VmContainer) { - return nil, process.ErrNoVM + return process.ErrNoVM } if check.IfNil(args.EconomicsFee) { - return nil, process.ErrNilEconomicsFeeHandler + return process.ErrNilEconomicsFeeHandler } if check.IfNil(args.BlockChainHook) { - return nil, process.ErrNilBlockChainHook + return process.ErrNilBlockChainHook } if check.IfNil(args.BlockChain) { - return nil, process.ErrNilBlockChain + return process.ErrNilBlockChain } if check.IfNilReflect(args.WasmVMChangeLocker) { - return nil, process.ErrNilLocker + return process.ErrNilLocker } if check.IfNil(args.Bootstrapper) { - return nil, process.ErrNilBootstrapper + return process.ErrNilBootstrapper } if args.AllowExternalQueriesChan == nil { - return nil, process.ErrNilAllowExternalQueriesChan + return process.ErrNilAllowExternalQueriesChan } - - gasForQuery := uint64(math.MaxUint64) - if args.MaxGasLimitPerQuery > 0 { - gasForQuery = args.MaxGasLimitPerQuery + if check.IfNil(args.HistoryRepository) { + return process.ErrNilHistoryRepository } - return &SCQueryService{ - vmContainer: args.VmContainer, - economicsFee: args.EconomicsFee, - blockChain: args.BlockChain, - blockChainHook: args.BlockChainHook, - wasmVMChangeLocker: args.WasmVMChangeLocker, - bootstrapper: args.Bootstrapper, - gasForQuery: gasForQuery, - allowExternalQueriesChan: args.AllowExternalQueriesChan, - }, nil + if check.IfNil(args.ShardCoordinator) { + return process.ErrNilShardCoordinator + } + if check.IfNil(args.StorageService) { + return process.ErrNilStorageService + } + if check.IfNil(args.Marshaller) { + return process.ErrNilMarshalizer + } + if check.IfNil(args.ScheduledTxsExecutionHandler) { + return process.ErrNilScheduledTxsExecutionHandler + } + if check.IfNil(args.Uint64ByteSliceConverter) { + return process.ErrNilUint64Converter + } + + return nil } // ExecuteQuery returns the VMOutput resulted upon running the function on the smart contract @@ -141,6 +192,18 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return nil, err } + accountsAdapter := service.blockChainHook.GetAccountsAdapter() + blockRootHash, err := service.extractBlockRootHash(query) + if err != nil { + return nil, err + } + if len(blockRootHash) > 0 { + err = accountsAdapter.RecreateTrie(blockRootHash) + if err != nil { + return nil, err + } + } + query = prepareScQuery(query) vmInput := service.createVMCallInput(query, gasPrice) vmOutput, err := vm.RunSmartContractCall(vmInput) @@ -168,6 +231,124 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return vmOutput, nil } +func (service *SCQueryService) extractBlockRootHash(query *process.SCQuery) ([]byte, error) { + if len(query.BlockRootHash) > 0 { + return query.BlockRootHash, nil + } + + if len(query.BlockHash) > 0 { + blockHeader, err := service.getBlockHeaderByHash(query.BlockHash) + if err != nil { + return make([]byte, 0), err + } + + return service.getBlockRootHash(query.BlockHash, blockHeader), nil + } + + if query.BlockNonce.HasValue { + blockHeader, blockHash, err := service.getBlockHeaderByNonce(query.BlockNonce.Value) + if err != nil { + return make([]byte, 0), err + } + + return service.getBlockRootHash(blockHash, blockHeader), nil + } + + return make([]byte, 0), nil +} + +func (service *SCQueryService) getBlockHeaderByHash(headerHash []byte) (data.HeaderHandler, error) { + epoch, err := service.getOptionalEpochByHash(headerHash) + if err != nil { + return nil, err + } + + header, err := service.getBlockHeaderInEpochByHash(headerHash, epoch) + if err != nil { + return nil, err + } + + return header, nil +} + +func (service *SCQueryService) getOptionalEpochByHash(hash []byte) (core.OptionalUint32, error) { + if !service.historyRepository.IsEnabled() { + return core.OptionalUint32{}, nil + } + + epoch, err := service.historyRepository.GetEpochByHash(hash) + if err != nil { + return core.OptionalUint32{}, err + } + + return core.OptionalUint32{Value: epoch, HasValue: true}, nil +} + +func (service *SCQueryService) getBlockHeaderInEpochByHash(headerHash []byte, epoch core.OptionalUint32) (data.HeaderHandler, error) { + shardId := service.shardCoordinator.SelfId() + unitType := dataRetriever.GetHeadersDataUnit(shardId) + storer, err := service.storageService.GetStorer(unitType) + if err != nil { + return nil, err + } + + var headerBuffer []byte + + if epoch.HasValue { + headerBuffer, err = storer.GetFromEpoch(headerHash, epoch.Value) + } else { + headerBuffer, err = storer.Get(headerHash) + } + if err != nil { + return nil, err + } + + header, err := process.UnmarshalHeader(shardId, service.marshaller, headerBuffer) + if err != nil { + return nil, err + } + + return header, nil +} + +func (service *SCQueryService) getBlockRootHash(headerHash []byte, header data.HeaderHandler) []byte { + blockRootHash, err := service.scheduledTxsExecutionHandler.GetScheduledRootHashForHeaderWithEpoch( + headerHash, + header.GetEpoch()) + if err != nil { + blockRootHash = header.GetRootHash() + } + + return blockRootHash +} + +func (service *SCQueryService) getBlockHeaderByNonce(nonce uint64) (data.HeaderHandler, []byte, error) { + headerHash, err := service.getBlockHashByNonce(nonce) + if err != nil { + return nil, nil, err + } + + header, err := service.getBlockHeaderByHash(headerHash) + if err != nil { + return nil, nil, err + } + + return header, headerHash, nil +} + +func (service *SCQueryService) getBlockHashByNonce(nonce uint64) ([]byte, error) { + shardId := service.shardCoordinator.SelfId() + hashByNonceUnit := dataRetriever.GetHdrNonceHashDataUnit(shardId) + + return process.GetHeaderHashFromStorageWithNonce( + nonce, + service.storageService, + service.uint64ByteSliceConverter, + service.marshaller, + hashByNonceUnit, + ) +} + func (service *SCQueryService) checkForRootHashChanges(rootHashBefore []byte) error { rootHashAfter := service.blockChain.GetCurrentBlockRootHash() diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 61f7ddfd285..02da57b0f79 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -17,7 +17,10 @@ import ( "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" + "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" + storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,91 +30,156 @@ const DummyScAddress = "00000000000000000500fabd9501b7e5353de57a4e319857c2fb9908 func createMockArgumentsForSCQuery() ArgsNewSCQueryService { return ArgsNewSCQueryService{ - VmContainer: &mock.VMContainerMock{}, - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - BlockChainHook: &testscommon.BlockChainHookStub{}, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: &mock.BootstrapperStub{}, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + VmContainer: &mock.VMContainerMock{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + BlockChainHook: &testscommon.BlockChainHookStub{}, + BlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: &mock.BootstrapperStub{}, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } } -func TestNewSCQueryService_NilVmShouldErr(t *testing.T) { +func TestNewSCQueryService(t *testing.T) { t.Parallel() - args := createMockArgumentsForSCQuery() - args.VmContainer = nil - target, err := NewSCQueryService(args) + t.Run("nil VmContainer should error", func(t *testing.T) { + t.Parallel() - assert.Nil(t, target) - assert.Equal(t, process.ErrNoVM, err) -} + args := createMockArgumentsForSCQuery() + args.VmContainer = nil + target, err := NewSCQueryService(args) -func TestNewSCQueryService_NilFeeHandlerShouldErr(t *testing.T) { - t.Parallel() + assert.Nil(t, target) + assert.Equal(t, process.ErrNoVM, err) + }) + t.Run("nil EconomicsFee should error", func(t *testing.T) { + t.Parallel() - args := createMockArgumentsForSCQuery() - args.EconomicsFee = nil - target, err := NewSCQueryService(args) + args := createMockArgumentsForSCQuery() + args.EconomicsFee = nil + target, err := NewSCQueryService(args) - assert.Nil(t, target) - assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) -} + assert.Nil(t, target) + assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) + }) + t.Run("nil BlockChain should error", func(t *testing.T) { + t.Parallel() -func TestNewSCQueryService_NilBLockChainShouldErr(t *testing.T) { - t.Parallel() + args := createMockArgumentsForSCQuery() + args.BlockChain = nil + target, err := NewSCQueryService(args) - args := createMockArgumentsForSCQuery() - args.BlockChain = nil - target, err := NewSCQueryService(args) + assert.Nil(t, target) + assert.Equal(t, process.ErrNilBlockChain, err) + }) + t.Run("nil BlockChainHook should error", func(t *testing.T) { + t.Parallel() - assert.Nil(t, target) - assert.Equal(t, process.ErrNilBlockChain, err) -} + args := createMockArgumentsForSCQuery() + args.BlockChainHook = nil + target, err := NewSCQueryService(args) -func TestNewSCQueryService_NilBLockChainHookShouldErr(t *testing.T) { - t.Parallel() + assert.Nil(t, target) + assert.Equal(t, process.ErrNilBlockChainHook, err) + }) - args := createMockArgumentsForSCQuery() - args.BlockChainHook = nil - target, err := NewSCQueryService(args) + t.Run("nil WasmVMChangeLocker should error", func(t *testing.T) { + t.Parallel() - assert.Nil(t, target) - assert.Equal(t, process.ErrNilBlockChainHook, err) -} + args := createMockArgumentsForSCQuery() + args.WasmVMChangeLocker = nil + target, err := NewSCQueryService(args) -func TestNewSCQueryService_NilWasmVMLockerShouldErr(t *testing.T) { - t.Parallel() + assert.Nil(t, target) + assert.Equal(t, process.ErrNilLocker, err) + }) + t.Run("nil Bootstrapper should error", func(t *testing.T) { + t.Parallel() - args := createMockArgumentsForSCQuery() - args.WasmVMChangeLocker = nil - target, err := NewSCQueryService(args) + args := createMockArgumentsForSCQuery() + args.Bootstrapper = nil + target, err := NewSCQueryService(args) - assert.Nil(t, target) - assert.Equal(t, process.ErrNilLocker, err) -} + assert.Nil(t, target) + assert.Equal(t, process.ErrNilBootstrapper, err) + }) + t.Run("nil HistoryRepository should error", func(t *testing.T) { + t.Parallel() -func TestNewSCQueryService_NilBootstrapperShouldErr(t *testing.T) { - t.Parallel() + args := createMockArgumentsForSCQuery() + args.HistoryRepository = nil + target, err := NewSCQueryService(args) - args := createMockArgumentsForSCQuery() - args.Bootstrapper = nil - target, err := NewSCQueryService(args) + assert.Nil(t, target) + assert.Equal(t, process.ErrNilHistoryRepository, err) + }) + t.Run("nil ShardCoordinator should error", func(t *testing.T) { + t.Parallel() - assert.Nil(t, target) - assert.Equal(t, process.ErrNilBootstrapper, err) -} + args := createMockArgumentsForSCQuery() + args.ShardCoordinator = nil + target, err := NewSCQueryService(args) -func TestNewSCQueryService_ShouldWork(t *testing.T) { - t.Parallel() + assert.Nil(t, target) + assert.Equal(t, process.ErrNilShardCoordinator, err) + }) + t.Run("nil StorageService should error", func(t *testing.T) { + t.Parallel() - args := createMockArgumentsForSCQuery() - target, err := NewSCQueryService(args) + args := createMockArgumentsForSCQuery() + args.StorageService = nil + target, err := NewSCQueryService(args) - assert.NotNil(t, target) - assert.Nil(t, err) - assert.False(t, target.IsInterfaceNil()) + assert.Nil(t, target) + assert.Equal(t, process.ErrNilStorageService, err) + }) + t.Run("nil Marshaller should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgumentsForSCQuery() + args.Marshaller = nil + target, err := NewSCQueryService(args) + + assert.Nil(t, target) + assert.Equal(t, process.ErrNilMarshalizer, err) + }) + t.Run("nil ScheduledTxsExecutionHandler should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgumentsForSCQuery() + args.ScheduledTxsExecutionHandler = nil + target, err := NewSCQueryService(args) + + assert.Nil(t, target) + assert.Equal(t, process.ErrNilScheduledTxsExecutionHandler, err) + }) + t.Run("nil Uint64ByteSliceConverter should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgumentsForSCQuery() + args.Uint64ByteSliceConverter = nil + target, err := NewSCQueryService(args) + + assert.Nil(t, target) + assert.Equal(t, process.ErrNilUint64Converter, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := createMockArgumentsForSCQuery() + target, err := NewSCQueryService(args) + + assert.NotNil(t, target) + assert.Nil(t, err) + assert.False(t, target.IsInterfaceNil()) + }) } func TestExecuteQuery_GetNilAddressShouldErr(t *testing.T) { @@ -740,12 +808,18 @@ func TestNewSCQueryService_CloseShouldWork(t *testing.T) { return nil }, }, - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - BlockChainHook: &testscommon.BlockChainHookStub{}, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: &mock.BootstrapperStub{}, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + BlockChainHook: &testscommon.BlockChainHookStub{}, + BlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: &mock.BootstrapperStub{}, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } target, _ := NewSCQueryService(argsNewSCQueryService) diff --git a/testscommon/blockChainHookStub.go b/testscommon/blockChainHookStub.go index f6250870a55..bb0ce046f2a 100644 --- a/testscommon/blockChainHookStub.go +++ b/testscommon/blockChainHookStub.go @@ -4,6 +4,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/esdt" "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/state" vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) @@ -52,6 +53,7 @@ type BlockChainHookStub struct { IsLimitedTransferCalled func(_ []byte) bool ExecuteSmartContractCallOnOtherVMCalled func(input *vmcommon.ContractCallInput) (*vmcommon.VMOutput, error) SetVMContainerCalled func(vmContainer process.VirtualMachinesContainer) error + GetAccountsAdapterCalled func() state.AccountsAdapter } // GetCode - @@ -434,3 +436,11 @@ func (stub *BlockChainHookStub) IsLimitedTransfer(arg []byte) bool { return false } + +// GetAccountsAdapter - +func (stub *BlockChainHookStub) GetAccountsAdapter() state.AccountsAdapter { + if stub.GetAccountsAdapterCalled != nil { + return stub.GetAccountsAdapterCalled() + } + return nil +} From fa303bf58dd8cfa0bf4b3883aeb828be2b65d0f0 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Jul 2023 14:08:18 +0300 Subject: [PATCH 059/120] added functionality on accountsDBApi RecreateTrie --- state/accountsDBApi.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/state/accountsDBApi.go b/state/accountsDBApi.go index c91fecdda64..38260841be7 100644 --- a/state/accountsDBApi.go +++ b/state/accountsDBApi.go @@ -164,9 +164,10 @@ func (accountsDB *accountsDBApi) RootHash() ([]byte, error) { return blockInfo.GetRootHash(), nil } -// RecreateTrie is a not permitted operation in this implementation and thus, will return an error -func (accountsDB *accountsDBApi) RecreateTrie(_ []byte) error { - return ErrOperationNotPermitted +// RecreateTrie is used to reload the trie based on an existing rootHash +func (accountsDB *accountsDBApi) RecreateTrie(rootHash []byte) error { + _, err := accountsDB.doRecreateTrieWithBlockInfo(holders.NewBlockInfo([]byte{}, 0, rootHash)) + return err } // RecreateTrieFromEpoch is a not permitted operation in this implementation and thus, will return an error From b3897a142607688d68e2239663d4cb52d9dd653a Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 25 Jul 2023 13:33:36 +0300 Subject: [PATCH 060/120] added new chain handler for api --- dataRetriever/blockchain/apiBlockchain.go | 95 +++++ .../blockchain/apiBlockchain_test.go | 188 +++++++++ dataRetriever/blockchain/errors.go | 9 +- factory/api/apiResolverFactory.go | 17 +- integrationTests/testProcessorNode.go | 7 +- process/smartContract/scQueryService.go | 3 + process/smartContract/scQueryService_test.go | 363 ++++++++++++++++-- state/accountsDBApi_test.go | 18 +- 8 files changed, 653 insertions(+), 47 deletions(-) create mode 100644 dataRetriever/blockchain/apiBlockchain.go create mode 100644 dataRetriever/blockchain/apiBlockchain_test.go diff --git a/dataRetriever/blockchain/apiBlockchain.go b/dataRetriever/blockchain/apiBlockchain.go new file mode 100644 index 00000000000..bf144410106 --- /dev/null +++ b/dataRetriever/blockchain/apiBlockchain.go @@ -0,0 +1,95 @@ +package blockchain + +import ( + "sync" + + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-core-go/data" +) + +type apiBlockchain struct { + mainBlockchain data.ChainHandler + currentRootHash []byte + mut sync.RWMutex +} + +// NewApiBlockchain returns a new instance of apiBlockchain +func NewApiBlockchain(mainBlockchain data.ChainHandler) (*apiBlockchain, error) { + if check.IfNil(mainBlockchain) { + return nil, ErrNilBlockChain + } + + return &apiBlockchain{ + mainBlockchain: mainBlockchain, + }, nil +} + +// GetGenesisHeader returns the genesis header from the main chain handler +func (abc *apiBlockchain) GetGenesisHeader() data.HeaderHandler { + return abc.mainBlockchain.GetGenesisHeader() +} + +// SetGenesisHeader returns an error +func (abc *apiBlockchain) SetGenesisHeader(_ data.HeaderHandler) error { + return ErrOperationNotPermitted +} + +// GetGenesisHeaderHash returns the genesis header hash from the main chain handler +func (abc *apiBlockchain) GetGenesisHeaderHash() []byte { + return abc.mainBlockchain.GetGenesisHeaderHash() +} + +// SetGenesisHeaderHash does nothing +func (abc *apiBlockchain) SetGenesisHeaderHash(_ []byte) { +} + +// GetCurrentBlockHeader returns the current block header from the main chain handler +func (abc *apiBlockchain) GetCurrentBlockHeader() data.HeaderHandler { + return abc.mainBlockchain.GetCurrentBlockHeader() +} + +// SetCurrentBlockHeaderAndRootHash saves the root hash locally, which will be returned until a further call with an empty rootHash is made +func (abc *apiBlockchain) SetCurrentBlockHeaderAndRootHash(_ data.HeaderHandler, rootHash []byte) error { + abc.mut.Lock() + abc.currentRootHash = rootHash + abc.mut.Unlock() + + return nil +} + +// GetCurrentBlockHeaderHash returns the current block header hash from the main chain handler +func (abc *apiBlockchain) GetCurrentBlockHeaderHash() []byte { + return abc.mainBlockchain.GetCurrentBlockHeaderHash() +} + +// SetCurrentBlockHeaderHash does nothing +func (abc *apiBlockchain) SetCurrentBlockHeaderHash(_ []byte) { +} + +// GetCurrentBlockRootHash returns the current block root hash from the main chain handler, if no local root hash is set +// if there is a local root hash, it will be returned until its reset +func (abc *apiBlockchain) GetCurrentBlockRootHash() []byte { + abc.mut.RLock() + if len(abc.currentRootHash) > 0 { + defer abc.mut.RUnlock() + return abc.currentRootHash + } + + abc.mut.RUnlock() + + return abc.mainBlockchain.GetCurrentBlockRootHash() +} + +// SetFinalBlockInfo does nothing +func (abc *apiBlockchain) SetFinalBlockInfo(_ uint64, _ []byte, _ []byte) { +} + +// GetFinalBlockInfo returns the final block header hash from the main chain handler +func (abc *apiBlockchain) GetFinalBlockInfo() (nonce uint64, blockHash []byte, rootHash []byte) { + return abc.mainBlockchain.GetFinalBlockInfo() +} + +// IsInterfaceNil returns true if there is no value under the interface +func (abc *apiBlockchain) IsInterfaceNil() bool { + return abc == nil +} diff --git a/dataRetriever/blockchain/apiBlockchain_test.go b/dataRetriever/blockchain/apiBlockchain_test.go new file mode 100644 index 00000000000..e30bd8b8bae --- /dev/null +++ b/dataRetriever/blockchain/apiBlockchain_test.go @@ -0,0 +1,188 @@ +package blockchain + +import ( + "fmt" + "testing" + + "github.com/multiversx/mx-chain-core-go/data" + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/stretchr/testify/require" +) + +func TestNewApiBlockchain(t *testing.T) { + t.Parallel() + + t.Run("nil main chain handler should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewApiBlockchain(nil) + require.Equal(t, ErrNilBlockChain, err) + require.Nil(t, instance) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) + require.NoError(t, err) + require.NotNil(t, instance) + }) +} + +func TestApiBlockchain_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var instance *apiBlockchain + require.True(t, instance.IsInterfaceNil()) + + instance, _ = NewApiBlockchain(&testscommon.ChainHandlerStub{}) + require.False(t, instance.IsInterfaceNil()) +} + +func TestApiBlockchain_GetGenesisHeader(t *testing.T) { + t.Parallel() + + providedHeader := &testscommon.HeaderHandlerStub{} + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ + GetGenesisHeaderCalled: func() data.HeaderHandler { + return providedHeader + }, + }) + require.NoError(t, err) + + header := instance.GetGenesisHeader() + require.Equal(t, providedHeader, header) +} + +func TestApiBlockchain_SetGenesisHeader(t *testing.T) { + t.Parallel() + + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) + require.NoError(t, err) + + err = instance.SetGenesisHeader(&testscommon.HeaderHandlerStub{}) + require.Equal(t, ErrOperationNotPermitted, err) +} + +func TestApiBlockchain_GetGenesisHeaderHash(t *testing.T) { + t.Parallel() + + providedHash := []byte("provided hash") + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ + GetGenesisHeaderHashCalled: func() []byte { + return providedHash + }, + }) + require.NoError(t, err) + + hash := instance.GetGenesisHeaderHash() + require.Equal(t, providedHash, hash) +} + +func TestApiBlockchain_GetCurrentBlockHeader(t *testing.T) { + t.Parallel() + + providedHeader := &testscommon.HeaderHandlerStub{} + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ + GetCurrentBlockHeaderCalled: func() data.HeaderHandler { + return providedHeader + }, + }) + require.NoError(t, err) + + header := instance.GetCurrentBlockHeader() + require.Equal(t, providedHeader, header) +} + +func TestApiBlockchain_SetCurrentBlockHeaderAndRootHash(t *testing.T) { + t.Parallel() + + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) + require.NoError(t, err) + + providedRootHash := []byte("provided root hash") + err = instance.SetCurrentBlockHeaderAndRootHash(&testscommon.HeaderHandlerStub{}, providedRootHash) + require.NoError(t, err) + + instance.mut.RLock() + rootHash := instance.currentRootHash + instance.mut.RUnlock() + require.Equal(t, providedRootHash, rootHash) +} + +func TestApiBlockchain_GetCurrentBlockHeaderHash(t *testing.T) { + t.Parallel() + + providedHash := []byte("provided hash") + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ + GetCurrentBlockHeaderHashCalled: func() []byte { + return providedHash + }, + }) + require.NoError(t, err) + + hash := instance.GetCurrentBlockHeaderHash() + require.Equal(t, providedHash, hash) +} + +func TestApiBlockchain_GetCurrentBlockRootHash(t *testing.T) { + t.Parallel() + + providedRootHashFromMain := []byte("provided root hash from main") + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ + GetCurrentBlockRootHashCalled: func() []byte { + return providedRootHashFromMain + }, + }) + require.NoError(t, err) + + rootHash := instance.GetCurrentBlockRootHash() + require.Equal(t, providedRootHashFromMain, rootHash) + + // set a local root hash which should be returned instead + providedRootHash := []byte("provided root hash") + _ = instance.SetCurrentBlockHeaderAndRootHash(&testscommon.HeaderHandlerStub{}, providedRootHash) + rootHash = instance.GetCurrentBlockRootHash() + require.Equal(t, providedRootHash, rootHash) + + // resetting the local root hash should return the one from main block chain + _ = instance.SetCurrentBlockHeaderAndRootHash(&testscommon.HeaderHandlerStub{}, make([]byte, 0)) + rootHash = instance.GetCurrentBlockRootHash() + require.Equal(t, providedRootHashFromMain, rootHash) +} + +func TestApiBlockchain_GetFinalBlockInfo(t *testing.T) { + t.Parallel() + + providedNonce := uint64(123) + providedHash := []byte("hash") + providedRootHash := []byte("root hash") + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ + GetFinalBlockInfoCalled: func() (nonce uint64, blockHash []byte, rootHash []byte) { + return providedNonce, providedHash, providedRootHash + }, + }) + require.NoError(t, err) + + nonce, hash, rootHash := instance.GetFinalBlockInfo() + require.Equal(t, providedNonce, nonce) + require.Equal(t, providedHash, hash) + require.Equal(t, providedRootHash, rootHash) +} + +func TestApiBlockchain_EmptyMethodsShouldNotPanic(t *testing.T) { + t.Parallel() + + defer func() { + r := recover() + if r != nil { + require.Fail(t, fmt.Sprintf("should have not panicked %v", r)) + } + }() + + instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) + require.NoError(t, err) + + instance.SetGenesisHeaderHash(nil) + instance.SetCurrentBlockHeaderHash(nil) + instance.SetFinalBlockInfo(0, nil, nil) +} diff --git a/dataRetriever/blockchain/errors.go b/dataRetriever/blockchain/errors.go index 6215e716bcf..280dc1a8bdd 100644 --- a/dataRetriever/blockchain/errors.go +++ b/dataRetriever/blockchain/errors.go @@ -4,9 +4,6 @@ import ( "errors" ) -// ErrBadBlocksCacheNil defines the error for using a nil cache for bad blocks -var ErrBadBlocksCacheNil = errors.New("badBlocksCache nil") - // ErrHeaderUnitNil defines the error for using a nil storage unit for block headers var ErrHeaderUnitNil = errors.New("header unit nil") @@ -15,3 +12,9 @@ var ErrWrongTypeInSet = errors.New("wrong type in setter") // ErrNilAppStatusHandler defines the error for setting a nil AppStatusHandler var ErrNilAppStatusHandler = errors.New("nil AppStatusHandler") + +// ErrOperationNotPermitted signals that operation is not permitted +var ErrOperationNotPermitted = errors.New("operation not permitted") + +// ErrNilBlockChain signals that a nil blockchain has been provided +var ErrNilBlockChain = errors.New("nil block chain") diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index 269612da801..977bbaedd8a 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -7,10 +7,12 @@ import ( "sync" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever" + "github.com/multiversx/mx-chain-go/dataRetriever/blockchain" "github.com/multiversx/mx-chain-go/facade" "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/node/external" @@ -376,7 +378,12 @@ func createScQueryElement( return nil, err } - accountsAdapterApi, err := createNewAccountsAdapterApi(args) + apiBlockchain, err := blockchain.NewApiBlockchain(args.dataComponents.Blockchain()) + if err != nil { + return nil, err + } + + accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) if err != nil { return nil, err } @@ -387,7 +394,7 @@ func createScQueryElement( Accounts: accountsAdapterApi, PubkeyConv: args.coreComponents.AddressPubKeyConverter(), StorageService: args.dataComponents.StorageService(), - BlockChain: args.dataComponents.Blockchain(), + BlockChain: apiBlockchain, ShardCoordinator: args.processComponents.ShardCoordinator(), Marshalizer: args.coreComponents.InternalMarshalizer(), Uint64Converter: args.coreComponents.Uint64ByteSliceConverter(), @@ -491,7 +498,7 @@ func createScQueryElement( VmContainer: vmContainer, EconomicsFee: args.coreComponents.EconomicsData(), BlockChainHook: vmFactory.BlockChainHookImpl(), - BlockChain: args.dataComponents.Blockchain(), + BlockChain: apiBlockchain, WasmVMChangeLocker: args.coreComponents.WasmVMChangeLocker(), Bootstrapper: args.bootstrapper, AllowExternalQueriesChan: args.allowVMQueriesChan, @@ -507,7 +514,7 @@ func createScQueryElement( return smartContract.NewSCQueryService(argsNewSCQueryService) } -func createNewAccountsAdapterApi(args *scQueryElementArgs) (state.AccountsAdapterAPI, error) { +func createNewAccountsAdapterApi(args *scQueryElementArgs, chainHandler data.ChainHandler) (state.AccountsAdapterAPI, error) { argsAccCreator := factoryState.ArgsAccountCreator{ Hasher: args.coreComponents.Hasher(), Marshaller: args.coreComponents.InternalMarshalizer(), @@ -571,7 +578,7 @@ func createNewAccountsAdapterApi(args *scQueryElementArgs) (state.AccountsAdapte AddressConverter: args.coreComponents.AddressPubKeyConverter(), } - provider, err := blockInfoProviders.NewCurrentBlockInfo(args.dataComponents.Blockchain()) + provider, err := blockInfoProviders.NewCurrentBlockInfo(chainHandler) if err != nil { return nil, err } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 98a8f51fe88..668f679c8e6 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -40,6 +40,7 @@ import ( "github.com/multiversx/mx-chain-go/consensus" "github.com/multiversx/mx-chain-go/consensus/spos/sposFactory" "github.com/multiversx/mx-chain-go/dataRetriever" + "github.com/multiversx/mx-chain-go/dataRetriever/blockchain" "github.com/multiversx/mx-chain-go/dataRetriever/factory/containers" requesterscontainer "github.com/multiversx/mx-chain-go/dataRetriever/factory/requestersContainer" "github.com/multiversx/mx-chain-go/dataRetriever/factory/resolverscontainer" @@ -2463,10 +2464,12 @@ func (tpn *TestProcessorNode) initNode() { stateComponents.Accounts = tpn.AccntState stateComponents.AccountsAPI = tpn.AccntState - finalProvider, _ := blockInfoProviders.NewFinalBlockInfo(dataComponents.BlockChain) + finalAPIBlockchain, _ := blockchain.NewApiBlockchain(dataComponents.BlockChain) + finalProvider, _ := blockInfoProviders.NewFinalBlockInfo(finalAPIBlockchain) finalAccountsApi, _ := state.NewAccountsDBApi(tpn.AccntState, finalProvider) - currentProvider, _ := blockInfoProviders.NewCurrentBlockInfo(dataComponents.BlockChain) + currentAPIBlockchain, _ := blockchain.NewApiBlockchain(dataComponents.BlockChain) + currentProvider, _ := blockInfoProviders.NewCurrentBlockInfo(currentAPIBlockchain) currentAccountsApi, _ := state.NewAccountsDBApi(tpn.AccntState, currentProvider) historicalAccountsApi, _ := state.NewAccountsDBApiWithHistory(tpn.AccntState) diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index fa3ae772f4e..29e4d308fee 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -202,12 +202,15 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui if err != nil { return nil, err } + + _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, blockRootHash) } query = prepareScQuery(query) vmInput := service.createVMCallInput(query, gasPrice) vmOutput, err := vm.RunSmartContractCall(vmInput) service.wasmVMChangeLocker.RUnlock() + _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) if err != nil { return nil, err } diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 02da57b0f79..4d553aa7ea7 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -10,16 +10,21 @@ import ( "testing" "time" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/transaction" "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/mock" + "github.com/multiversx/mx-chain-go/state" + "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" + stateMocks "github.com/multiversx/mx-chain-go/testscommon/state" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/assert" @@ -293,47 +298,333 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { funcName := "function" scAddress := []byte(DummyScAddress) args := []*big.Int{big.NewInt(42), big.NewInt(43)} - runWasCalled := false + t.Run("no block coordinates", func(t *testing.T) { + t.Parallel() - mockVM := &mock.VMExecutionHandlerStub{ - RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { - runWasCalled = true - assert.Equal(t, int64(42), big.NewInt(0).SetBytes(input.Arguments[0]).Int64()) - assert.Equal(t, int64(43), big.NewInt(0).SetBytes(input.Arguments[1]).Int64()) - assert.Equal(t, scAddress, input.CallerAddr) - assert.Equal(t, funcName, input.Function) + runWasCalled := false - return &vmcommon.VMOutput{ - ReturnCode: vmcommon.Ok, - }, nil - }, - } - argsNewSCQuery := createMockArgumentsForSCQuery() - argsNewSCQuery.VmContainer = &mock.VMContainerMock{ - GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { - return mockVM, nil - }, - } - argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ - MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { - return uint64(math.MaxUint64) - }, - } + mockVM := &mock.VMExecutionHandlerStub{ + RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { + runWasCalled = true + assert.Equal(t, int64(42), big.NewInt(0).SetBytes(input.Arguments[0]).Int64()) + assert.Equal(t, int64(43), big.NewInt(0).SetBytes(input.Arguments[1]).Int64()) + assert.Equal(t, scAddress, input.CallerAddr) + assert.Equal(t, funcName, input.Function) + + return &vmcommon.VMOutput{ + ReturnCode: vmcommon.Ok, + }, nil + }, + } + argsNewSCQuery := createMockArgumentsForSCQuery() + argsNewSCQuery.VmContainer = &mock.VMContainerMock{ + GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { + return mockVM, nil + }, + } + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { + return uint64(math.MaxUint64) + }, + } - target, _ := NewSCQueryService(argsNewSCQuery) + target, _ := NewSCQueryService(argsNewSCQuery) - dataArgs := make([][]byte, len(args)) - for i, arg := range args { - dataArgs[i] = append(dataArgs[i], arg.Bytes()...) - } - query := process.SCQuery{ - ScAddress: scAddress, - FuncName: funcName, - Arguments: dataArgs, - } + dataArgs := make([][]byte, len(args)) + for i, arg := range args { + dataArgs[i] = append(dataArgs[i], arg.Bytes()...) + } + query := process.SCQuery{ + ScAddress: scAddress, + FuncName: funcName, + Arguments: dataArgs, + } + + _, _ = target.ExecuteQuery(&query) + assert.True(t, runWasCalled) + }) + t.Run("block root hash, but recreate trie returns error", func(t *testing.T) { + t.Parallel() + + mockVM := &mock.VMExecutionHandlerStub{ + RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { + assert.Fail(t, "should have not been called") + + return &vmcommon.VMOutput{ + ReturnCode: vmcommon.Ok, + }, nil + }, + } + argsNewSCQuery := createMockArgumentsForSCQuery() + argsNewSCQuery.VmContainer = &mock.VMContainerMock{ + GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { + return mockVM, nil + }, + } + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { + return uint64(math.MaxUint64) + }, + } + expectedErr := errors.New("expected error") + providedAccountsAdapter := &stateMocks.AccountsStub{ + RecreateTrieCalled: func(rootHash []byte) error { + return expectedErr + }, + } + argsNewSCQuery.BlockChainHook = &testscommon.BlockChainHookStub{ + GetAccountsAdapterCalled: func() state.AccountsAdapter { + return providedAccountsAdapter + }, + } + + target, _ := NewSCQueryService(argsNewSCQuery) + + dataArgs := make([][]byte, len(args)) + for i, arg := range args { + dataArgs[i] = append(dataArgs[i], arg.Bytes()...) + } + query := process.SCQuery{ + ScAddress: scAddress, + FuncName: funcName, + Arguments: dataArgs, + BlockRootHash: []byte("root hash"), + } + + _, err := target.ExecuteQuery(&query) + assert.Equal(t, expectedErr, err) + }) + t.Run("block root hash should work", func(t *testing.T) { + t.Parallel() + + runWasCalled := false + + mockVM := &mock.VMExecutionHandlerStub{ + RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { + runWasCalled = true + assert.Equal(t, int64(42), big.NewInt(0).SetBytes(input.Arguments[0]).Int64()) + assert.Equal(t, int64(43), big.NewInt(0).SetBytes(input.Arguments[1]).Int64()) + assert.Equal(t, scAddress, input.CallerAddr) + assert.Equal(t, funcName, input.Function) + + return &vmcommon.VMOutput{ + ReturnCode: vmcommon.Ok, + }, nil + }, + } + argsNewSCQuery := createMockArgumentsForSCQuery() + argsNewSCQuery.VmContainer = &mock.VMContainerMock{ + GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { + return mockVM, nil + }, + } + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { + return uint64(math.MaxUint64) + }, + } + providedRootHash := []byte("provided root hash") + wasRecreateTrieCalled := false + providedAccountsAdapter := &stateMocks.AccountsStub{ + RecreateTrieCalled: func(rootHash []byte) error { + wasRecreateTrieCalled = true + assert.Equal(t, providedRootHash, rootHash) + return nil + }, + } + argsNewSCQuery.BlockChainHook = &testscommon.BlockChainHookStub{ + GetAccountsAdapterCalled: func() state.AccountsAdapter { + return providedAccountsAdapter + }, + } + + target, _ := NewSCQueryService(argsNewSCQuery) + + dataArgs := make([][]byte, len(args)) + for i, arg := range args { + dataArgs[i] = append(dataArgs[i], arg.Bytes()...) + } + query := process.SCQuery{ + ScAddress: scAddress, + FuncName: funcName, + Arguments: dataArgs, + BlockRootHash: providedRootHash, + } + + _, _ = target.ExecuteQuery(&query) + assert.True(t, runWasCalled) + assert.True(t, wasRecreateTrieCalled) + }) + t.Run("block hash should work", func(t *testing.T) { + t.Parallel() + + runWasCalled := false + + mockVM := &mock.VMExecutionHandlerStub{ + RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { + runWasCalled = true + assert.Equal(t, int64(42), big.NewInt(0).SetBytes(input.Arguments[0]).Int64()) + assert.Equal(t, int64(43), big.NewInt(0).SetBytes(input.Arguments[1]).Int64()) + assert.Equal(t, scAddress, input.CallerAddr) + assert.Equal(t, funcName, input.Function) + + return &vmcommon.VMOutput{ + ReturnCode: vmcommon.Ok, + }, nil + }, + } + argsNewSCQuery := createMockArgumentsForSCQuery() + argsNewSCQuery.VmContainer = &mock.VMContainerMock{ + GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { + return mockVM, nil + }, + } + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { + return uint64(math.MaxUint64) + }, + } + argsNewSCQuery.StorageService = &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { + return &storageStubs.StorerStub{}, nil + }, + } + providedHash := []byte("provided hash") + providedRootHash := []byte("provided root hash") + argsNewSCQuery.ScheduledTxsExecutionHandler = &testscommon.ScheduledTxsExecutionStub{ + GetScheduledRootHashForHeaderWithEpochCalled: func(headerHash []byte, epoch uint32) ([]byte, error) { + return providedRootHash, nil + }, + } + argsNewSCQuery.HistoryRepository = &dblookupext.HistoryRepositoryStub{ + IsEnabledCalled: func() bool { + return true + }, + GetEpochByHashCalled: func(hash []byte) (uint32, error) { + require.Equal(t, providedHash, hash) + return 12, nil + }, + } + wasRecreateTrieCalled := false + providedAccountsAdapter := &stateMocks.AccountsStub{ + RecreateTrieCalled: func(rootHash []byte) error { + wasRecreateTrieCalled = true + assert.Equal(t, providedRootHash, rootHash) + return nil + }, + } + argsNewSCQuery.BlockChainHook = &testscommon.BlockChainHookStub{ + GetAccountsAdapterCalled: func() state.AccountsAdapter { + return providedAccountsAdapter + }, + } - _, _ = target.ExecuteQuery(&query) - assert.True(t, runWasCalled) + target, _ := NewSCQueryService(argsNewSCQuery) + + dataArgs := make([][]byte, len(args)) + for i, arg := range args { + dataArgs[i] = append(dataArgs[i], arg.Bytes()...) + } + query := process.SCQuery{ + ScAddress: scAddress, + FuncName: funcName, + Arguments: dataArgs, + BlockHash: providedHash, + } + + _, _ = target.ExecuteQuery(&query) + assert.True(t, runWasCalled) + assert.True(t, wasRecreateTrieCalled) + }) + t.Run("block nonce should work", func(t *testing.T) { + t.Parallel() + + runWasCalled := false + + mockVM := &mock.VMExecutionHandlerStub{ + RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { + runWasCalled = true + assert.Equal(t, int64(42), big.NewInt(0).SetBytes(input.Arguments[0]).Int64()) + assert.Equal(t, int64(43), big.NewInt(0).SetBytes(input.Arguments[1]).Int64()) + assert.Equal(t, scAddress, input.CallerAddr) + assert.Equal(t, funcName, input.Function) + + return &vmcommon.VMOutput{ + ReturnCode: vmcommon.Ok, + }, nil + }, + } + argsNewSCQuery := createMockArgumentsForSCQuery() + argsNewSCQuery.VmContainer = &mock.VMContainerMock{ + GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { + return mockVM, nil + }, + } + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { + return uint64(math.MaxUint64) + }, + } + providedHash := []byte("provided hash") + providedRootHash := []byte("provided root hash") + providedNonce := uint64(123) + argsNewSCQuery.StorageService = &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { + return &storageStubs.StorerStub{ + GetCalled: func(key []byte) ([]byte, error) { + return providedHash, nil + }, + }, nil + }, + } + argsNewSCQuery.ScheduledTxsExecutionHandler = &testscommon.ScheduledTxsExecutionStub{ + GetScheduledRootHashForHeaderWithEpochCalled: func(headerHash []byte, epoch uint32) ([]byte, error) { + return providedRootHash, nil + }, + } + argsNewSCQuery.HistoryRepository = &dblookupext.HistoryRepositoryStub{ + IsEnabledCalled: func() bool { + return true + }, + GetEpochByHashCalled: func(hash []byte) (uint32, error) { + require.Equal(t, providedHash, hash) + return 12, nil + }, + } + wasRecreateTrieCalled := false + providedAccountsAdapter := &stateMocks.AccountsStub{ + RecreateTrieCalled: func(rootHash []byte) error { + wasRecreateTrieCalled = true + assert.Equal(t, providedRootHash, rootHash) + return nil + }, + } + argsNewSCQuery.BlockChainHook = &testscommon.BlockChainHookStub{ + GetAccountsAdapterCalled: func() state.AccountsAdapter { + return providedAccountsAdapter + }, + } + + target, _ := NewSCQueryService(argsNewSCQuery) + + dataArgs := make([][]byte, len(args)) + for i, arg := range args { + dataArgs[i] = append(dataArgs[i], arg.Bytes()...) + } + query := process.SCQuery{ + ScAddress: scAddress, + FuncName: funcName, + Arguments: dataArgs, + BlockNonce: core.OptionalUint64{ + Value: providedNonce, + HasValue: true, + }, + } + + _, _ = target.ExecuteQuery(&query) + assert.True(t, runWasCalled) + assert.True(t, wasRecreateTrieCalled) + }) } func TestExecuteQuery_ReturnsCorrectly(t *testing.T) { diff --git a/state/accountsDBApi_test.go b/state/accountsDBApi_test.go index f2d29cf3ce2..0f83c4205e9 100644 --- a/state/accountsDBApi_test.go +++ b/state/accountsDBApi_test.go @@ -195,7 +195,7 @@ func TestAccountsDBApi_NotPermittedOperations(t *testing.T) { assert.Equal(t, state.ErrOperationNotPermitted, accountsApi.SaveAccount(nil)) assert.Equal(t, state.ErrOperationNotPermitted, accountsApi.RemoveAccount(nil)) assert.Equal(t, state.ErrOperationNotPermitted, accountsApi.RevertToSnapshot(0)) - assert.Equal(t, state.ErrOperationNotPermitted, accountsApi.RecreateTrie(nil)) + assert.Equal(t, state.ErrOperationNotPermitted, accountsApi.RecreateTrieFromEpoch(nil)) buff, err := accountsApi.CommitInEpoch(0, 0) assert.Nil(t, buff) @@ -210,6 +210,22 @@ func TestAccountsDBApi_NotPermittedOperations(t *testing.T) { assert.Equal(t, state.ErrOperationNotPermitted, err) } +func TestAccountsDBApi_RecreateTrie(t *testing.T) { + t.Parallel() + + wasCalled := false + accountsApi, _ := state.NewAccountsDBApi(&mockState.AccountsStub{ + RecreateTrieCalled: func(rootHash []byte) error { + wasCalled = true + return nil + }, + }, createBlockInfoProviderStub(dummyRootHash)) + + err := accountsApi.RecreateTrie(nil) + assert.NoError(t, err) + assert.True(t, wasCalled) +} + func TestAccountsDBApi_EmptyMethodsShouldNotPanic(t *testing.T) { t.Parallel() From 11c4e9faad4d9719da40f7dfde2b3faf669f2441 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 26 Jul 2023 11:25:26 +0300 Subject: [PATCH 061/120] fixed tests --- integrationTests/testProcessorNode.go | 11 +++++++---- process/smartContract/scQueryService.go | 9 ++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 668f679c8e6..ec951b15fa9 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -788,11 +788,12 @@ func (tpn *TestProcessorNode) initTestNodeWithArgs(args ArgTestProcessorNode) { tpn.initInnerProcessors(gasMap, vmConfig) if check.IfNil(args.TrieStore) { + apiBlockchain, _ := blockchain.NewApiBlockchain(tpn.BlockChain) argsNewScQueryService := smartContract.ArgsNewSCQueryService{ VmContainer: tpn.VMContainer, EconomicsFee: tpn.EconomicsData, BlockChainHook: tpn.BlockchainHook, - BlockChain: tpn.BlockChain, + BlockChain: apiBlockchain, WasmVMChangeLocker: tpn.WasmVMChangeLocker, Bootstrapper: tpn.Bootstrapper, AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), @@ -867,11 +868,12 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str smartContractsCache := testscommon.NewCacherMock() + apiBlockchain, _ := blockchain.NewApiBlockchain(tpn.BlockChain) argsHook := hooks.ArgBlockChainHook{ Accounts: tpn.AccntState, PubkeyConv: TestAddressPubkeyConverter, StorageService: tpn.Storage, - BlockChain: tpn.BlockChain, + BlockChain: apiBlockchain, ShardCoordinator: tpn.ShardCoordinator, Marshalizer: TestMarshalizer, Uint64Converter: TestUint64Converter, @@ -983,7 +985,7 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str VmContainer: vmContainer, EconomicsFee: tpn.EconomicsData, BlockChainHook: vmFactory.BlockChainHookImpl(), - BlockChain: tpn.BlockChain, + BlockChain: apiBlockchain, WasmVMChangeLocker: tpn.WasmVMChangeLocker, Bootstrapper: tpn.Bootstrapper, AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), @@ -1002,11 +1004,12 @@ func (tpn *TestProcessorNode) InitializeProcessors(gasMap map[string]map[string] tpn.initValidatorStatistics() tpn.initBlockTracker() tpn.initInnerProcessors(gasMap, getDefaultVMConfig()) + apiBlockchain, _ := blockchain.NewApiBlockchain(tpn.BlockChain) argsNewScQueryService := smartContract.ArgsNewSCQueryService{ VmContainer: tpn.VMContainer, EconomicsFee: tpn.EconomicsData, BlockChainHook: tpn.BlockchainHook, - BlockChain: tpn.BlockChain, + BlockChain: apiBlockchain, WasmVMChangeLocker: tpn.WasmVMChangeLocker, Bootstrapper: tpn.Bootstrapper, AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 29e4d308fee..ebbfd6bfed7 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -203,6 +203,7 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return nil, err } + // Temporary setting the root hash to the desired one until the sc call is ready _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, blockRootHash) } @@ -210,8 +211,9 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui vmInput := service.createVMCallInput(query, gasPrice) vmOutput, err := vm.RunSmartContractCall(vmInput) service.wasmVMChangeLocker.RUnlock() - _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) if err != nil { + // Cleaning the current root hash so the real one would be returned further + _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) return nil, err } @@ -220,10 +222,15 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui vmOutput, err = vm.RunSmartContractCall(vmInput) if err != nil { + // Cleaning the current root hash so the real one would be returned further + _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) return nil, err } } + // Cleaning the current root hash so the real one would be returned further + _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) + if query.SameScState { err = service.checkForRootHashChanges(rootHashBeforeExecution) if err != nil { From 923be2c5da884e90deca6e1ae8ee8bea5aa4cf05 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 4 Aug 2023 17:13:58 +0300 Subject: [PATCH 062/120] fixes after review --- api/groups/vmValuesGroup.go | 15 +- api/groups/vmValuesGroup_test.go | 16 -- dataRetriever/blockchain/apiBlockchain.go | 95 ------- .../blockchain/apiBlockchain_test.go | 188 ------------- epochStart/errors.go | 2 +- factory/api/apiResolverFactory.go | 68 +++-- factory/api/apiResolverFactory_test.go | 2 +- factory/processing/processComponents.go | 53 ++-- genesis/process/argGenesisBlockCreator.go | 45 ++- genesis/process/genesisBlockCreator.go | 3 - genesis/process/genesisBlockCreator_test.go | 13 +- genesis/process/metaGenesisBlockCreator.go | 33 ++- genesis/process/shardGenesisBlockCreator.go | 33 ++- .../multiShard/hardFork/hardFork_test.go | 6 +- integrationTests/testInitializer.go | 8 +- integrationTests/testProcessorNode.go | 107 ++++---- .../vm/mockVM/vmGet/vmGet_test.go | 22 +- integrationTests/vm/testInitializer.go | 72 ++--- integrationTests/vm/wasm/utils.go | 26 +- process/errors.go | 2 +- process/interface.go | 1 - process/smartContract/scQueryService.go | 174 ++++++------ process/smartContract/scQueryService_test.go | 256 ++++++------------ 23 files changed, 434 insertions(+), 806 deletions(-) delete mode 100644 dataRetriever/blockchain/apiBlockchain.go delete mode 100644 dataRetriever/blockchain/apiBlockchain_test.go diff --git a/api/groups/vmValuesGroup.go b/api/groups/vmValuesGroup.go index abc9c678156..fcc8ca1c4bc 100644 --- a/api/groups/vmValuesGroup.go +++ b/api/groups/vmValuesGroup.go @@ -140,7 +140,7 @@ func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, return nil, "", err } - command.BlockNonce, command.BlockHash, command.BlockRootHash, err = extractBlockCoordinates(context) + command.BlockNonce, command.BlockHash, err = extractBlockCoordinates(context) if err != nil { return nil, "", err } @@ -158,23 +158,18 @@ func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, return vmOutputApi, vmExecErrMsg, nil } -func extractBlockCoordinates(context *gin.Context) (core.OptionalUint64, []byte, []byte, error) { +func extractBlockCoordinates(context *gin.Context) (core.OptionalUint64, []byte, error) { blockNonce, err := parseUint64UrlParam(context, urlParamBlockNonce) if err != nil { - return core.OptionalUint64{}, nil, nil, err + return core.OptionalUint64{}, nil, fmt.Errorf("%w for block nonce", err) } blockHash, err := parseHexBytesUrlParam(context, urlParamBlockHash) if err != nil { - return core.OptionalUint64{}, nil, nil, err + return core.OptionalUint64{}, nil, fmt.Errorf("%w for block hash", err) } - blockRootHash, err := parseHexBytesUrlParam(context, urlParamBlockRootHash) - if err != nil { - return core.OptionalUint64{}, nil, nil, err - } - - return blockNonce, blockHash, blockRootHash, nil + return blockNonce, blockHash, nil } func (vvg *vmValuesGroup) createSCQuery(request *VMValueRequest) (*process.SCQuery, error) { diff --git a/api/groups/vmValuesGroup_test.go b/api/groups/vmValuesGroup_test.go index bdfe10e6f15..6ccab7ea903 100644 --- a/api/groups/vmValuesGroup_test.go +++ b/api/groups/vmValuesGroup_test.go @@ -144,7 +144,6 @@ func TestQuery(t *testing.T) { t.Run("invalid block nonce should error", testQueryShouldError("/vm-values/query?blockNonce=invalid_nonce")) t.Run("invalid block hash should error", testQueryShouldError("/vm-values/query?blockHash=invalid_nonce")) - t.Run("invalid block root hash should error", testQueryShouldError("/vm-values/query?blockRootHash=invalid_nonce")) t.Run("should work - block nonce", func(t *testing.T) { t.Parallel() @@ -178,21 +177,6 @@ func TestQuery(t *testing.T) { url := fmt.Sprintf("/vm-values/query?blockHash=%s", hex.EncodeToString(providedBlockHash)) testQueryShouldWork(t, url, &facade) }) - t.Run("should work - block root hash", func(t *testing.T) { - t.Parallel() - - providedBlockRootHash := []byte("provided root hash") - facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - require.Equal(t, providedBlockRootHash, query.BlockRootHash) - return &vm.VMOutputApi{ - ReturnData: [][]byte{big.NewInt(42).Bytes()}, - }, nil - }, - } - url := fmt.Sprintf("/vm-values/query?blockRootHash=%s", hex.EncodeToString(providedBlockRootHash)) - testQueryShouldWork(t, url, &facade) - }) t.Run("should work - no block coordinates", func(t *testing.T) { t.Parallel() diff --git a/dataRetriever/blockchain/apiBlockchain.go b/dataRetriever/blockchain/apiBlockchain.go deleted file mode 100644 index bf144410106..00000000000 --- a/dataRetriever/blockchain/apiBlockchain.go +++ /dev/null @@ -1,95 +0,0 @@ -package blockchain - -import ( - "sync" - - "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/data" -) - -type apiBlockchain struct { - mainBlockchain data.ChainHandler - currentRootHash []byte - mut sync.RWMutex -} - -// NewApiBlockchain returns a new instance of apiBlockchain -func NewApiBlockchain(mainBlockchain data.ChainHandler) (*apiBlockchain, error) { - if check.IfNil(mainBlockchain) { - return nil, ErrNilBlockChain - } - - return &apiBlockchain{ - mainBlockchain: mainBlockchain, - }, nil -} - -// GetGenesisHeader returns the genesis header from the main chain handler -func (abc *apiBlockchain) GetGenesisHeader() data.HeaderHandler { - return abc.mainBlockchain.GetGenesisHeader() -} - -// SetGenesisHeader returns an error -func (abc *apiBlockchain) SetGenesisHeader(_ data.HeaderHandler) error { - return ErrOperationNotPermitted -} - -// GetGenesisHeaderHash returns the genesis header hash from the main chain handler -func (abc *apiBlockchain) GetGenesisHeaderHash() []byte { - return abc.mainBlockchain.GetGenesisHeaderHash() -} - -// SetGenesisHeaderHash does nothing -func (abc *apiBlockchain) SetGenesisHeaderHash(_ []byte) { -} - -// GetCurrentBlockHeader returns the current block header from the main chain handler -func (abc *apiBlockchain) GetCurrentBlockHeader() data.HeaderHandler { - return abc.mainBlockchain.GetCurrentBlockHeader() -} - -// SetCurrentBlockHeaderAndRootHash saves the root hash locally, which will be returned until a further call with an empty rootHash is made -func (abc *apiBlockchain) SetCurrentBlockHeaderAndRootHash(_ data.HeaderHandler, rootHash []byte) error { - abc.mut.Lock() - abc.currentRootHash = rootHash - abc.mut.Unlock() - - return nil -} - -// GetCurrentBlockHeaderHash returns the current block header hash from the main chain handler -func (abc *apiBlockchain) GetCurrentBlockHeaderHash() []byte { - return abc.mainBlockchain.GetCurrentBlockHeaderHash() -} - -// SetCurrentBlockHeaderHash does nothing -func (abc *apiBlockchain) SetCurrentBlockHeaderHash(_ []byte) { -} - -// GetCurrentBlockRootHash returns the current block root hash from the main chain handler, if no local root hash is set -// if there is a local root hash, it will be returned until its reset -func (abc *apiBlockchain) GetCurrentBlockRootHash() []byte { - abc.mut.RLock() - if len(abc.currentRootHash) > 0 { - defer abc.mut.RUnlock() - return abc.currentRootHash - } - - abc.mut.RUnlock() - - return abc.mainBlockchain.GetCurrentBlockRootHash() -} - -// SetFinalBlockInfo does nothing -func (abc *apiBlockchain) SetFinalBlockInfo(_ uint64, _ []byte, _ []byte) { -} - -// GetFinalBlockInfo returns the final block header hash from the main chain handler -func (abc *apiBlockchain) GetFinalBlockInfo() (nonce uint64, blockHash []byte, rootHash []byte) { - return abc.mainBlockchain.GetFinalBlockInfo() -} - -// IsInterfaceNil returns true if there is no value under the interface -func (abc *apiBlockchain) IsInterfaceNil() bool { - return abc == nil -} diff --git a/dataRetriever/blockchain/apiBlockchain_test.go b/dataRetriever/blockchain/apiBlockchain_test.go deleted file mode 100644 index e30bd8b8bae..00000000000 --- a/dataRetriever/blockchain/apiBlockchain_test.go +++ /dev/null @@ -1,188 +0,0 @@ -package blockchain - -import ( - "fmt" - "testing" - - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-go/testscommon" - "github.com/stretchr/testify/require" -) - -func TestNewApiBlockchain(t *testing.T) { - t.Parallel() - - t.Run("nil main chain handler should error", func(t *testing.T) { - t.Parallel() - - instance, err := NewApiBlockchain(nil) - require.Equal(t, ErrNilBlockChain, err) - require.Nil(t, instance) - }) - t.Run("should work", func(t *testing.T) { - t.Parallel() - - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) - require.NoError(t, err) - require.NotNil(t, instance) - }) -} - -func TestApiBlockchain_IsInterfaceNil(t *testing.T) { - t.Parallel() - - var instance *apiBlockchain - require.True(t, instance.IsInterfaceNil()) - - instance, _ = NewApiBlockchain(&testscommon.ChainHandlerStub{}) - require.False(t, instance.IsInterfaceNil()) -} - -func TestApiBlockchain_GetGenesisHeader(t *testing.T) { - t.Parallel() - - providedHeader := &testscommon.HeaderHandlerStub{} - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ - GetGenesisHeaderCalled: func() data.HeaderHandler { - return providedHeader - }, - }) - require.NoError(t, err) - - header := instance.GetGenesisHeader() - require.Equal(t, providedHeader, header) -} - -func TestApiBlockchain_SetGenesisHeader(t *testing.T) { - t.Parallel() - - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) - require.NoError(t, err) - - err = instance.SetGenesisHeader(&testscommon.HeaderHandlerStub{}) - require.Equal(t, ErrOperationNotPermitted, err) -} - -func TestApiBlockchain_GetGenesisHeaderHash(t *testing.T) { - t.Parallel() - - providedHash := []byte("provided hash") - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ - GetGenesisHeaderHashCalled: func() []byte { - return providedHash - }, - }) - require.NoError(t, err) - - hash := instance.GetGenesisHeaderHash() - require.Equal(t, providedHash, hash) -} - -func TestApiBlockchain_GetCurrentBlockHeader(t *testing.T) { - t.Parallel() - - providedHeader := &testscommon.HeaderHandlerStub{} - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ - GetCurrentBlockHeaderCalled: func() data.HeaderHandler { - return providedHeader - }, - }) - require.NoError(t, err) - - header := instance.GetCurrentBlockHeader() - require.Equal(t, providedHeader, header) -} - -func TestApiBlockchain_SetCurrentBlockHeaderAndRootHash(t *testing.T) { - t.Parallel() - - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) - require.NoError(t, err) - - providedRootHash := []byte("provided root hash") - err = instance.SetCurrentBlockHeaderAndRootHash(&testscommon.HeaderHandlerStub{}, providedRootHash) - require.NoError(t, err) - - instance.mut.RLock() - rootHash := instance.currentRootHash - instance.mut.RUnlock() - require.Equal(t, providedRootHash, rootHash) -} - -func TestApiBlockchain_GetCurrentBlockHeaderHash(t *testing.T) { - t.Parallel() - - providedHash := []byte("provided hash") - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ - GetCurrentBlockHeaderHashCalled: func() []byte { - return providedHash - }, - }) - require.NoError(t, err) - - hash := instance.GetCurrentBlockHeaderHash() - require.Equal(t, providedHash, hash) -} - -func TestApiBlockchain_GetCurrentBlockRootHash(t *testing.T) { - t.Parallel() - - providedRootHashFromMain := []byte("provided root hash from main") - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ - GetCurrentBlockRootHashCalled: func() []byte { - return providedRootHashFromMain - }, - }) - require.NoError(t, err) - - rootHash := instance.GetCurrentBlockRootHash() - require.Equal(t, providedRootHashFromMain, rootHash) - - // set a local root hash which should be returned instead - providedRootHash := []byte("provided root hash") - _ = instance.SetCurrentBlockHeaderAndRootHash(&testscommon.HeaderHandlerStub{}, providedRootHash) - rootHash = instance.GetCurrentBlockRootHash() - require.Equal(t, providedRootHash, rootHash) - - // resetting the local root hash should return the one from main block chain - _ = instance.SetCurrentBlockHeaderAndRootHash(&testscommon.HeaderHandlerStub{}, make([]byte, 0)) - rootHash = instance.GetCurrentBlockRootHash() - require.Equal(t, providedRootHashFromMain, rootHash) -} - -func TestApiBlockchain_GetFinalBlockInfo(t *testing.T) { - t.Parallel() - - providedNonce := uint64(123) - providedHash := []byte("hash") - providedRootHash := []byte("root hash") - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{ - GetFinalBlockInfoCalled: func() (nonce uint64, blockHash []byte, rootHash []byte) { - return providedNonce, providedHash, providedRootHash - }, - }) - require.NoError(t, err) - - nonce, hash, rootHash := instance.GetFinalBlockInfo() - require.Equal(t, providedNonce, nonce) - require.Equal(t, providedHash, hash) - require.Equal(t, providedRootHash, rootHash) -} - -func TestApiBlockchain_EmptyMethodsShouldNotPanic(t *testing.T) { - t.Parallel() - - defer func() { - r := recover() - if r != nil { - require.Fail(t, fmt.Sprintf("should have not panicked %v", r)) - } - }() - - instance, err := NewApiBlockchain(&testscommon.ChainHandlerStub{}) - require.NoError(t, err) - - instance.SetGenesisHeaderHash(nil) - instance.SetCurrentBlockHeaderHash(nil) - instance.SetFinalBlockInfo(0, nil, nil) -} diff --git a/epochStart/errors.go b/epochStart/errors.go index bb3c68e0e43..c882275f433 100644 --- a/epochStart/errors.go +++ b/epochStart/errors.go @@ -65,7 +65,7 @@ var ErrNilDataPoolsHolder = errors.New("nil data pools holder") // ErrNilProtocolSustainabilityAddress signals that a nil protocol sustainability address was provided var ErrNilProtocolSustainabilityAddress = errors.New("nil protocol sustainability address") -// ErrNilStorageService signals that nil storage service has been provided +// ErrNilStorageService signals that a nil storage service has been provided var ErrNilStorageService = errors.New("nil storage service") // ErrNilRequestHandler signals that nil request handler has been provided diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index 977bbaedd8a..fa0f429192d 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -10,6 +10,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/disabled" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/dataRetriever/blockchain" @@ -378,23 +379,11 @@ func createScQueryElement( return nil, err } - apiBlockchain, err := blockchain.NewApiBlockchain(args.dataComponents.Blockchain()) - if err != nil { - return nil, err - } - - accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) - if err != nil { - return nil, err - } - scStorage := args.generalConfig.SmartContractsStorageForSCQuery scStorage.DB.FilePath += fmt.Sprintf("%d", args.index) argsHook := hooks.ArgBlockChainHook{ - Accounts: accountsAdapterApi, PubkeyConv: args.coreComponents.AddressPubKeyConverter(), StorageService: args.dataComponents.StorageService(), - BlockChain: apiBlockchain, ShardCoordinator: args.processComponents.ShardCoordinator(), Marshalizer: args.coreComponents.InternalMarshalizer(), Uint64Converter: args.coreComponents.Uint64ByteSliceConverter(), @@ -413,8 +402,22 @@ func createScQueryElement( MissingTrieNodesNotifier: syncer.NewMissingTrieNodesNotifier(), } + var apiBlockchain data.ChainHandler maxGasForVmQueries := args.generalConfig.VirtualMachine.GasConfig.ShardMaxGasPerVmQuery if args.processComponents.ShardCoordinator().SelfId() == core.MetachainShardId { + apiBlockchain, err = blockchain.NewMetaChain(disabled.NewAppStatusHandler()) + if err != nil { + return nil, err + } + + accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) + if err != nil { + return nil, err + } + + argsHook.BlockChain = apiBlockchain + argsHook.Accounts = accountsAdapterApi + maxGasForVmQueries = args.generalConfig.VirtualMachine.GasConfig.MetaMaxGasPerVmQuery blockChainHookImpl, errBlockChainHook := hooks.NewBlockChainHookImpl(argsHook) @@ -443,6 +446,19 @@ func createScQueryElement( return nil, err } } else { + apiBlockchain, err = blockchain.NewBlockChain(disabled.NewAppStatusHandler()) + if err != nil { + return nil, err + } + + accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) + if err != nil { + return nil, err + } + + argsHook.BlockChain = apiBlockchain + argsHook.Accounts = accountsAdapterApi + queryVirtualMachineConfig := args.generalConfig.VirtualMachine.Querying.VirtualMachineConfig esdtTransferParser, errParser := parsers.NewESDTTransferParser(args.coreComponents.InternalMarshalizer()) if errParser != nil { @@ -495,20 +511,20 @@ func createScQueryElement( } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: args.coreComponents.EconomicsData(), - BlockChainHook: vmFactory.BlockChainHookImpl(), - BlockChain: apiBlockchain, - WasmVMChangeLocker: args.coreComponents.WasmVMChangeLocker(), - Bootstrapper: args.bootstrapper, - AllowExternalQueriesChan: args.allowVMQueriesChan, - MaxGasLimitPerQuery: maxGasForVmQueries, - HistoryRepository: args.processComponents.HistoryRepository(), - ShardCoordinator: args.processComponents.ShardCoordinator(), - StorageService: args.dataComponents.StorageService(), - Marshaller: args.coreComponents.InternalMarshalizer(), - ScheduledTxsExecutionHandler: args.processComponents.ScheduledTxsExecutionHandler(), - Uint64ByteSliceConverter: args.coreComponents.Uint64ByteSliceConverter(), + VmContainer: vmContainer, + EconomicsFee: args.coreComponents.EconomicsData(), + BlockChainHook: vmFactory.BlockChainHookImpl(), + MainBlockChain: args.dataComponents.Blockchain(), + APIBlockChain: apiBlockchain, + WasmVMChangeLocker: args.coreComponents.WasmVMChangeLocker(), + Bootstrapper: args.bootstrapper, + AllowExternalQueriesChan: args.allowVMQueriesChan, + MaxGasLimitPerQuery: maxGasForVmQueries, + HistoryRepository: args.processComponents.HistoryRepository(), + ShardCoordinator: args.processComponents.ShardCoordinator(), + StorageService: args.dataComponents.StorageService(), + Marshaller: args.coreComponents.InternalMarshalizer(), + Uint64ByteSliceConverter: args.coreComponents.Uint64ByteSliceConverter(), } return smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index dbac54df0d7..591ea31b79f 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -197,7 +197,7 @@ func TestCreateApiResolver(t *testing.T) { }) t.Run("NewESDTTransferParser fails should error", func(t *testing.T) { failingStepsInstance.reset() - failingStepsInstance.marshallerFailingStep = 4 + failingStepsInstance.marshallerFailingStep = 5 apiResolver, err := api.CreateApiResolver(failingArgs) require.NotNil(t, err) println(err.Error()) diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 22b23d1ef89..c85c0d3d028 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -358,7 +358,7 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { } pcf.txLogsProcessor = txLogsProcessor - genesisBlocks, initialTxs, err := pcf.generateGenesisHeadersAndApplyInitialBalances(scheduledTxsExecutionHandler) + genesisBlocks, initialTxs, err := pcf.generateGenesisHeadersAndApplyInitialBalances() if err != nil { return nil, err } @@ -841,9 +841,7 @@ func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochSt return nil, errors.New("error creating new start of epoch trigger because of invalid shard id") } -func (pcf *processComponentsFactory) generateGenesisHeadersAndApplyInitialBalances( - scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler, -) (map[uint32]data.HeaderHandler, map[uint32]*genesis.IndexingData, error) { +func (pcf *processComponentsFactory) generateGenesisHeadersAndApplyInitialBalances() (map[uint32]data.HeaderHandler, map[uint32]*genesis.IndexingData, error) { genesisVmConfig := pcf.config.VirtualMachine.Execution conversionBase := 10 genesisNodePrice, ok := big.NewInt(0).SetString(pcf.systemSCConfig.StakingSystemSCConfig.GenesisNodePrice, conversionBase) @@ -852,30 +850,29 @@ func (pcf *processComponentsFactory) generateGenesisHeadersAndApplyInitialBalanc } arg := processGenesis.ArgsGenesisBlockCreator{ - GenesisTime: uint64(pcf.coreData.GenesisNodesSetup().GetStartTime()), - StartEpochNum: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), - Data: pcf.data, - Core: pcf.coreData, - Accounts: pcf.state.AccountsAdapter(), - ValidatorAccounts: pcf.state.PeerAccounts(), - InitialNodesSetup: pcf.coreData.GenesisNodesSetup(), - Economics: pcf.coreData.EconomicsData(), - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - AccountsParser: pcf.accountsParser, - SmartContractParser: pcf.smartContractParser, - GasSchedule: pcf.gasSchedule, - TxLogsProcessor: pcf.txLogsProcessor, - VirtualMachineConfig: genesisVmConfig, - HardForkConfig: pcf.config.Hardfork, - TrieStorageManagers: pcf.state.TrieStorageManagers(), - SystemSCConfig: *pcf.systemSCConfig, - RoundConfig: &pcf.roundConfig, - EpochConfig: &pcf.epochConfig, - BlockSignKeyGen: pcf.crypto.BlockSignKeyGen(), - HistoryRepository: pcf.historyRepo, - ScheduledTxsExecutionHandler: scheduledTxsExecutionHandler, - GenesisNodePrice: genesisNodePrice, - GenesisString: pcf.config.GeneralSettings.GenesisString, + GenesisTime: uint64(pcf.coreData.GenesisNodesSetup().GetStartTime()), + StartEpochNum: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), + Data: pcf.data, + Core: pcf.coreData, + Accounts: pcf.state.AccountsAdapter(), + ValidatorAccounts: pcf.state.PeerAccounts(), + InitialNodesSetup: pcf.coreData.GenesisNodesSetup(), + Economics: pcf.coreData.EconomicsData(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + AccountsParser: pcf.accountsParser, + SmartContractParser: pcf.smartContractParser, + GasSchedule: pcf.gasSchedule, + TxLogsProcessor: pcf.txLogsProcessor, + VirtualMachineConfig: genesisVmConfig, + HardForkConfig: pcf.config.Hardfork, + TrieStorageManagers: pcf.state.TrieStorageManagers(), + SystemSCConfig: *pcf.systemSCConfig, + RoundConfig: &pcf.roundConfig, + EpochConfig: &pcf.epochConfig, + BlockSignKeyGen: pcf.crypto.BlockSignKeyGen(), + HistoryRepository: pcf.historyRepo, + GenesisNodePrice: genesisNodePrice, + GenesisString: pcf.config.GeneralSettings.GenesisString, } gbc, err := processGenesis.NewGenesisBlockCreator(arg) diff --git a/genesis/process/argGenesisBlockCreator.go b/genesis/process/argGenesisBlockCreator.go index d53888b6607..82e4bd5e502 100644 --- a/genesis/process/argGenesisBlockCreator.go +++ b/genesis/process/argGenesisBlockCreator.go @@ -43,29 +43,28 @@ type dataComponentsHandler interface { // ArgsGenesisBlockCreator holds the arguments which are needed to create a genesis block type ArgsGenesisBlockCreator struct { - GenesisTime uint64 - StartEpochNum uint32 - Data dataComponentsHandler - Core coreComponentsHandler - Accounts state.AccountsAdapter - ValidatorAccounts state.AccountsAdapter - InitialNodesSetup genesis.InitialNodesHandler - Economics process.EconomicsDataHandler - ShardCoordinator sharding.Coordinator - AccountsParser genesis.AccountsParser - SmartContractParser genesis.InitialSmartContractParser - GasSchedule core.GasScheduleNotifier - TxLogsProcessor process.TransactionLogProcessor - VirtualMachineConfig config.VirtualMachineConfig - HardForkConfig config.HardforkConfig - TrieStorageManagers map[string]common.StorageManager - SystemSCConfig config.SystemSmartContractsConfig - RoundConfig *config.RoundConfig - EpochConfig *config.EpochConfig - WorkingDir string - BlockSignKeyGen crypto.KeyGenerator - HistoryRepository dblookupext.HistoryRepository - ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler + GenesisTime uint64 + StartEpochNum uint32 + Data dataComponentsHandler + Core coreComponentsHandler + Accounts state.AccountsAdapter + ValidatorAccounts state.AccountsAdapter + InitialNodesSetup genesis.InitialNodesHandler + Economics process.EconomicsDataHandler + ShardCoordinator sharding.Coordinator + AccountsParser genesis.AccountsParser + SmartContractParser genesis.InitialSmartContractParser + GasSchedule core.GasScheduleNotifier + TxLogsProcessor process.TransactionLogProcessor + VirtualMachineConfig config.VirtualMachineConfig + HardForkConfig config.HardforkConfig + TrieStorageManagers map[string]common.StorageManager + SystemSCConfig config.SystemSmartContractsConfig + RoundConfig *config.RoundConfig + EpochConfig *config.EpochConfig + WorkingDir string + BlockSignKeyGen crypto.KeyGenerator + HistoryRepository dblookupext.HistoryRepository GenesisNodePrice *big.Int GenesisString string diff --git a/genesis/process/genesisBlockCreator.go b/genesis/process/genesisBlockCreator.go index b7d7a52031c..2ae339af0aa 100644 --- a/genesis/process/genesisBlockCreator.go +++ b/genesis/process/genesisBlockCreator.go @@ -196,9 +196,6 @@ func checkArgumentsForBlockCreator(arg ArgsGenesisBlockCreator) error { if check.IfNil(arg.HistoryRepository) { return process.ErrNilHistoryRepository } - if check.IfNil(arg.ScheduledTxsExecutionHandler) { - return process.ErrNilScheduledTxsExecutionHandler - } return nil } diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index 440a4028c74..ad316b083eb 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -180,8 +180,7 @@ func createMockArgument( }, }, }, - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, } arg.ShardCoordinator = &mock.ShardCoordinatorMock{ @@ -457,16 +456,6 @@ func TestNewGenesisBlockCreator(t *testing.T) { require.True(t, errors.Is(err, process.ErrNilHistoryRepository)) require.Nil(t, gbc) }) - t.Run("nil ScheduledTxsExecutionHandler should error", func(t *testing.T) { - t.Parallel() - - arg := createMockArgument(t, "testdata/genesisTest1.json", &mock.InitialNodesHandlerStub{}, big.NewInt(22000)) - arg.ScheduledTxsExecutionHandler = nil - - gbc, err := NewGenesisBlockCreator(arg) - require.True(t, errors.Is(err, process.ErrNilScheduledTxsExecutionHandler)) - require.Nil(t, gbc) - }) t.Run("should work", func(t *testing.T) { t.Parallel() diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index f13f2f96516..d3cb54f6c9c 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -16,10 +16,12 @@ import ( "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + disabledCommon "github.com/multiversx/mx-chain-go/common/disabled" "github.com/multiversx/mx-chain-go/common/enablers" "github.com/multiversx/mx-chain-go/common/forking" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever" + "github.com/multiversx/mx-chain-go/dataRetriever/blockchain" "github.com/multiversx/mx-chain-go/genesis" "github.com/multiversx/mx-chain-go/genesis/process/disabled" "github.com/multiversx/mx-chain-go/process" @@ -550,20 +552,25 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc return nil, err } + apiBlockchain, err := blockchain.NewMetaChain(disabledCommon.NewAppStatusHandler()) + if err != nil { + return nil, err + } + argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: arg.Economics, - BlockChainHook: virtualMachineFactory.BlockChainHookImpl(), - BlockChain: arg.Data.Blockchain(), - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: arg.HistoryRepository, - ShardCoordinator: arg.ShardCoordinator, - StorageService: arg.Data.StorageService(), - Marshaller: arg.Core.InternalMarshalizer(), - ScheduledTxsExecutionHandler: arg.ScheduledTxsExecutionHandler, - Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), + VmContainer: vmContainer, + EconomicsFee: arg.Economics, + BlockChainHook: virtualMachineFactory.BlockChainHookImpl(), + MainBlockChain: arg.Data.Blockchain(), + APIBlockChain: apiBlockchain, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: arg.HistoryRepository, + ShardCoordinator: arg.ShardCoordinator, + StorageService: arg.Data.StorageService(), + Marshaller: arg.Core.InternalMarshalizer(), + Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), } queryService, err := smartContract.NewSCQueryService(argsNewSCQueryService) if err != nil { diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index 96fcc8130ea..a6c360ac09a 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -13,9 +13,11 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" dataBlock "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-go/common" + disabledCommon "github.com/multiversx/mx-chain-go/common/disabled" "github.com/multiversx/mx-chain-go/common/enablers" "github.com/multiversx/mx-chain-go/common/forking" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/dataRetriever/blockchain" "github.com/multiversx/mx-chain-go/genesis" "github.com/multiversx/mx-chain-go/genesis/process/disabled" "github.com/multiversx/mx-chain-go/genesis/process/intermediate" @@ -692,20 +694,25 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo return nil, err } + apiBlockchain, err := blockchain.NewBlockChain(disabledCommon.NewAppStatusHandler()) + if err != nil { + return nil, err + } + argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: arg.Economics, - BlockChainHook: vmFactoryImpl.BlockChainHookImpl(), - BlockChain: arg.Data.Blockchain(), - WasmVMChangeLocker: genesisWasmVMLocker, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: arg.HistoryRepository, - ShardCoordinator: arg.ShardCoordinator, - StorageService: arg.Data.StorageService(), - Marshaller: arg.Core.InternalMarshalizer(), - ScheduledTxsExecutionHandler: arg.ScheduledTxsExecutionHandler, - Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), + VmContainer: vmContainer, + EconomicsFee: arg.Economics, + BlockChainHook: vmFactoryImpl.BlockChainHookImpl(), + MainBlockChain: arg.Data.Blockchain(), + APIBlockChain: apiBlockchain, + WasmVMChangeLocker: genesisWasmVMLocker, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: arg.HistoryRepository, + ShardCoordinator: arg.ShardCoordinator, + StorageService: arg.Data.StorageService(), + Marshaller: arg.Core.InternalMarshalizer(), + Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), } queryService, err := smartContract.NewSCQueryService(argsNewSCQueryService) if err != nil { diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index 3fe05349538..7f6afd25caa 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -20,7 +20,6 @@ import ( "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm" vmFactory "github.com/multiversx/mx-chain-go/process/factory" "github.com/multiversx/mx-chain-go/state" - "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" "github.com/multiversx/mx-chain-go/testscommon/dblookupext" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" @@ -490,9 +489,8 @@ func hardForkImport( DelegationSmartContractEnableEpoch: 0, }, }, - RoundConfig: &roundConfig, - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + RoundConfig: &roundConfig, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, } genesisProcessor, err := process.NewGenesisBlockCreator(argsGenesis) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index a42f4a2fa7d..c2832fd1d3c 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -706,9 +706,8 @@ func CreateFullGenesisBlocks( EpochConfig: &config.EpochConfig{ EnableEpochs: enableEpochsConfig, }, - RoundConfig: &roundsConfig, - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + RoundConfig: &roundsConfig, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, } genesisProcessor, _ := genesisProcess.NewGenesisBlockCreator(argsGenesis) @@ -812,8 +811,7 @@ func CreateGenesisMetaBlock( EpochConfig: &config.EpochConfig{ EnableEpochs: enableEpochsConfig, }, - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, } if shardCoordinator.SelfId() != core.MetachainShardId { diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index ec951b15fa9..7f6e5685ab6 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -788,21 +788,26 @@ func (tpn *TestProcessorNode) initTestNodeWithArgs(args ArgTestProcessorNode) { tpn.initInnerProcessors(gasMap, vmConfig) if check.IfNil(args.TrieStore) { - apiBlockchain, _ := blockchain.NewApiBlockchain(tpn.BlockChain) + var apiBlockchain data.ChainHandler + if tpn.ShardCoordinator.SelfId() == core.MetachainShardId { + apiBlockchain, _ = blockchain.NewMetaChain(statusHandlerMock.NewAppStatusHandlerMock()) + } else { + apiBlockchain, _ = blockchain.NewBlockChain(statusHandlerMock.NewAppStatusHandlerMock()) + } argsNewScQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: tpn.VMContainer, - EconomicsFee: tpn.EconomicsData, - BlockChainHook: tpn.BlockchainHook, - BlockChain: apiBlockchain, - WasmVMChangeLocker: tpn.WasmVMChangeLocker, - Bootstrapper: tpn.Bootstrapper, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: tpn.HistoryRepository, - ShardCoordinator: tpn.ShardCoordinator, - StorageService: tpn.Storage, - Marshaller: TestMarshaller, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: TestUint64Converter, + VmContainer: tpn.VMContainer, + EconomicsFee: tpn.EconomicsData, + BlockChainHook: tpn.BlockchainHook, + MainBlockChain: tpn.BlockChain, + APIBlockChain: apiBlockchain, + WasmVMChangeLocker: tpn.WasmVMChangeLocker, + Bootstrapper: tpn.Bootstrapper, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: tpn.HistoryRepository, + ShardCoordinator: tpn.ShardCoordinator, + StorageService: tpn.Storage, + Marshaller: TestMarshaller, + Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) } else { @@ -868,12 +873,10 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str smartContractsCache := testscommon.NewCacherMock() - apiBlockchain, _ := blockchain.NewApiBlockchain(tpn.BlockChain) argsHook := hooks.ArgBlockChainHook{ Accounts: tpn.AccntState, PubkeyConv: TestAddressPubkeyConverter, StorageService: tpn.Storage, - BlockChain: apiBlockchain, ShardCoordinator: tpn.ShardCoordinator, Marshalizer: TestMarshalizer, Uint64Converter: TestUint64Converter, @@ -890,7 +893,11 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str MissingTrieNodesNotifier: &testscommon.MissingTrieNodesNotifierStub{}, } + var apiBlockchain data.ChainHandler if tpn.ShardCoordinator.SelfId() == core.MetachainShardId { + apiBlockchain, _ = blockchain.NewMetaChain(statusHandlerMock.NewAppStatusHandlerMock()) + argsHook.BlockChain = apiBlockchain + tpn.EnableEpochs = config.EnableEpochs{} sigVerifier, _ := disabled.NewMessageSignVerifier(&mock.KeyGenMock{}) @@ -961,6 +968,9 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str }) vmFactory, _ = metaProcess.NewVMContainerFactory(argsNewVmFactory) } else { + apiBlockchain, _ = blockchain.NewBlockChain(statusHandlerMock.NewAppStatusHandlerMock()) + argsHook.BlockChain = apiBlockchain + esdtTransferParser, _ := parsers.NewESDTTransferParser(TestMarshalizer) blockChainHookImpl, _ := hooks.NewBlockChainHookImpl(argsHook) argsNewVMFactory := shard.ArgVMContainerFactory{ @@ -982,19 +992,19 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str _ = builtInFuncFactory.SetPayableHandler(vmFactory.BlockChainHookImpl()) argsNewScQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: tpn.EconomicsData, - BlockChainHook: vmFactory.BlockChainHookImpl(), - BlockChain: apiBlockchain, - WasmVMChangeLocker: tpn.WasmVMChangeLocker, - Bootstrapper: tpn.Bootstrapper, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: tpn.HistoryRepository, - ShardCoordinator: tpn.ShardCoordinator, - StorageService: tpn.Storage, - Marshaller: TestMarshaller, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: TestUint64Converter, + VmContainer: vmContainer, + EconomicsFee: tpn.EconomicsData, + BlockChainHook: vmFactory.BlockChainHookImpl(), + MainBlockChain: tpn.BlockChain, + APIBlockChain: apiBlockchain, + WasmVMChangeLocker: tpn.WasmVMChangeLocker, + Bootstrapper: tpn.Bootstrapper, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: tpn.HistoryRepository, + ShardCoordinator: tpn.ShardCoordinator, + StorageService: tpn.Storage, + Marshaller: TestMarshaller, + Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) } @@ -1004,21 +1014,26 @@ func (tpn *TestProcessorNode) InitializeProcessors(gasMap map[string]map[string] tpn.initValidatorStatistics() tpn.initBlockTracker() tpn.initInnerProcessors(gasMap, getDefaultVMConfig()) - apiBlockchain, _ := blockchain.NewApiBlockchain(tpn.BlockChain) + var apiBlockchain data.ChainHandler + if tpn.ShardCoordinator.SelfId() == core.MetachainShardId { + apiBlockchain, _ = blockchain.NewMetaChain(statusHandlerMock.NewAppStatusHandlerMock()) + } else { + apiBlockchain, _ = blockchain.NewBlockChain(statusHandlerMock.NewAppStatusHandlerMock()) + } argsNewScQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: tpn.VMContainer, - EconomicsFee: tpn.EconomicsData, - BlockChainHook: tpn.BlockchainHook, - BlockChain: apiBlockchain, - WasmVMChangeLocker: tpn.WasmVMChangeLocker, - Bootstrapper: tpn.Bootstrapper, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: tpn.HistoryRepository, - ShardCoordinator: tpn.ShardCoordinator, - StorageService: tpn.Storage, - Marshaller: TestMarshaller, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: TestUint64Converter, + VmContainer: tpn.VMContainer, + EconomicsFee: tpn.EconomicsData, + BlockChainHook: tpn.BlockchainHook, + MainBlockChain: tpn.BlockChain, + APIBlockChain: apiBlockchain, + WasmVMChangeLocker: tpn.WasmVMChangeLocker, + Bootstrapper: tpn.Bootstrapper, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: tpn.HistoryRepository, + ShardCoordinator: tpn.ShardCoordinator, + StorageService: tpn.Storage, + Marshaller: TestMarshaller, + Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) tpn.initBlockProcessor(stateCheckpointModulus) @@ -2467,12 +2482,10 @@ func (tpn *TestProcessorNode) initNode() { stateComponents.Accounts = tpn.AccntState stateComponents.AccountsAPI = tpn.AccntState - finalAPIBlockchain, _ := blockchain.NewApiBlockchain(dataComponents.BlockChain) - finalProvider, _ := blockInfoProviders.NewFinalBlockInfo(finalAPIBlockchain) + finalProvider, _ := blockInfoProviders.NewFinalBlockInfo(dataComponents.BlockChain) finalAccountsApi, _ := state.NewAccountsDBApi(tpn.AccntState, finalProvider) - currentAPIBlockchain, _ := blockchain.NewApiBlockchain(dataComponents.BlockChain) - currentProvider, _ := blockInfoProviders.NewCurrentBlockInfo(currentAPIBlockchain) + currentProvider, _ := blockInfoProviders.NewCurrentBlockInfo(dataComponents.BlockChain) currentAccountsApi, _ := state.NewAccountsDBApi(tpn.AccntState, currentProvider) historicalAccountsApi, _ := state.NewAccountsDBApiWithHistory(tpn.AccntState) diff --git a/integrationTests/vm/mockVM/vmGet/vmGet_test.go b/integrationTests/vm/mockVM/vmGet/vmGet_test.go index ff53e84e98b..ff0b3487399 100644 --- a/integrationTests/vm/mockVM/vmGet/vmGet_test.go +++ b/integrationTests/vm/mockVM/vmGet/vmGet_test.go @@ -43,17 +43,17 @@ func TestVmGetShouldReturnValue(t *testing.T) { return uint64(math.MaxUint64) }, }, - BlockChainHook: &testscommon.BlockChainHookStub{}, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: disabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), - StorageService: &storageStubs.ChainStorerStub{}, - Marshaller: &marshallerMock.MarshalizerStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, + BlockChainHook: &testscommon.BlockChainHookStub{}, + MainBlockChain: &testscommon.ChainHandlerStub{}, + APIBlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: disabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } service, _ := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index d009c10e8ec..5f3b6a9d40a 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -254,19 +254,19 @@ func (vmTestContext *VMTestContext) GetVMOutputWithTransientVM(funcName string, } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmTestContext.VMContainer, - EconomicsFee: feeHandler, - BlockChainHook: vmTestContext.BlockchainHook.(process.BlockChainHookHandler), - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), - StorageService: &storageStubs.ChainStorerStub{}, - Marshaller: integrationTests.TestMarshalizer, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: integrationTests.TestUint64Converter, + VmContainer: vmTestContext.VMContainer, + EconomicsFee: feeHandler, + BlockChainHook: vmTestContext.BlockchainHook.(process.BlockChainHookHandler), + MainBlockChain: &testscommon.ChainHandlerStub{}, + APIBlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: integrationTests.TestMarshalizer, + Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) @@ -1678,19 +1678,19 @@ func GetVmOutput( } argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: vmContainer, - EconomicsFee: feeHandler, - BlockChainHook: blockChainHook, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), - StorageService: &storageStubs.ChainStorerStub{}, - Marshaller: integrationTests.TestMarshalizer, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: integrationTests.TestUint64Converter, + VmContainer: vmContainer, + EconomicsFee: feeHandler, + BlockChainHook: blockChainHook, + MainBlockChain: &testscommon.ChainHandlerStub{}, + APIBlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: integrationTests.TestMarshalizer, + Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) @@ -1731,22 +1731,22 @@ func ComputeGasLimit(gasSchedule map[string]map[string]uint64, testContext *VMTe VmContainer: vmContainer, EconomicsFee: testContext.EconomicsData, BlockChainHook: blockChainHook, - BlockChain: &testscommon.ChainHandlerStub{ + MainBlockChain: &testscommon.ChainHandlerStub{ GetCurrentBlockHeaderCalled: func() data.HeaderHandler { return &block.Header{ ShardID: testContext.ShardCoordinator.SelfId(), } }, }, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: syncDisabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ShardCoordinator: testContext.ShardCoordinator, - StorageService: &storageStubs.ChainStorerStub{}, - Marshaller: integrationTests.TestMarshalizer, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: integrationTests.TestUint64Converter, + APIBlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: syncDisabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testContext.ShardCoordinator, + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: integrationTests.TestMarshalizer, + Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/integrationTests/vm/wasm/utils.go b/integrationTests/vm/wasm/utils.go index dbf9e478899..4abd924e81c 100644 --- a/integrationTests/vm/wasm/utils.go +++ b/integrationTests/vm/wasm/utils.go @@ -164,19 +164,19 @@ func SetupTestContextWithGasSchedule(t *testing.T, gasSchedule map[string]map[st context.initTxProcessorWithOneSCExecutorWithVMs() context.ScAddress, _ = context.BlockchainHook.NewAddress(context.Owner.Address, context.Owner.Nonce, factory.WasmVirtualMachine) argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ - VmContainer: context.VMContainer, - EconomicsFee: context.EconomicsFee, - BlockChainHook: context.BlockchainHook, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: disabled.NewDisabledBootstrapper(), - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), - StorageService: &storageStubs.ChainStorerStub{}, - Marshaller: &marshallerMock.MarshalizerStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, + VmContainer: context.VMContainer, + EconomicsFee: context.EconomicsFee, + BlockChainHook: context.BlockchainHook, + MainBlockChain: &testscommon.ChainHandlerStub{}, + APIBlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: disabled.NewDisabledBootstrapper(), + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } context.QueryService, _ = smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/process/errors.go b/process/errors.go index be983eb897c..a16c78b81fb 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1218,5 +1218,5 @@ var ErrBuiltinFunctionNotExecutable = errors.New("builtin function not executabl // ErrNilManagedPeersHolder signals that a nil managed peers holder has been provided var ErrNilManagedPeersHolder = errors.New("nil managed peers holder") -// ErrNilStorageService signals that nil storage service has been provided +// ErrNilStorageService signals that a nil storage service has been provided var ErrNilStorageService = errors.New("nil storage service") diff --git a/process/interface.go b/process/interface.go index 570255cbb4e..577faf509cf 100644 --- a/process/interface.go +++ b/process/interface.go @@ -780,7 +780,6 @@ type SCQuery struct { ShouldBeSynced bool BlockNonce core.OptionalUint64 BlockHash []byte - BlockRootHash []byte } // GasHandler is able to perform some gas calculation diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index ebbfd6bfed7..55efce1cb16 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -3,6 +3,7 @@ package smartContract import ( "bytes" "errors" + "fmt" "math" "math/big" "sync" @@ -28,40 +29,40 @@ var _ process.SCQueryService = (*SCQueryService)(nil) // SCQueryService can execute Get functions over SC to fetch stored values type SCQueryService struct { - vmContainer process.VirtualMachinesContainer - economicsFee process.FeeHandler - mutRunSc sync.Mutex - blockChainHook process.BlockChainHookHandler - blockChain data.ChainHandler - numQueries int - gasForQuery uint64 - wasmVMChangeLocker common.Locker - bootstrapper process.Bootstrapper - allowExternalQueriesChan chan struct{} - historyRepository dblookupext.HistoryRepository - shardCoordinator sharding.Coordinator - storageService dataRetriever.StorageService - marshaller marshal.Marshalizer - scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler - uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter + vmContainer process.VirtualMachinesContainer + economicsFee process.FeeHandler + mutRunSc sync.Mutex + blockChainHook process.BlockChainHookHandler + mainBlockChain data.ChainHandler + apiBlockChain data.ChainHandler + numQueries int + gasForQuery uint64 + wasmVMChangeLocker common.Locker + bootstrapper process.Bootstrapper + allowExternalQueriesChan chan struct{} + historyRepository dblookupext.HistoryRepository + shardCoordinator sharding.Coordinator + storageService dataRetriever.StorageService + marshaller marshal.Marshalizer + uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter } // ArgsNewSCQueryService defines the arguments needed for the sc query service type ArgsNewSCQueryService struct { - VmContainer process.VirtualMachinesContainer - EconomicsFee process.FeeHandler - BlockChainHook process.BlockChainHookHandler - BlockChain data.ChainHandler - WasmVMChangeLocker common.Locker - Bootstrapper process.Bootstrapper - AllowExternalQueriesChan chan struct{} - MaxGasLimitPerQuery uint64 - HistoryRepository dblookupext.HistoryRepository - ShardCoordinator sharding.Coordinator - StorageService dataRetriever.StorageService - Marshaller marshal.Marshalizer - ScheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler - Uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter + VmContainer process.VirtualMachinesContainer + EconomicsFee process.FeeHandler + BlockChainHook process.BlockChainHookHandler + MainBlockChain data.ChainHandler + APIBlockChain data.ChainHandler + WasmVMChangeLocker common.Locker + Bootstrapper process.Bootstrapper + AllowExternalQueriesChan chan struct{} + MaxGasLimitPerQuery uint64 + HistoryRepository dblookupext.HistoryRepository + ShardCoordinator sharding.Coordinator + StorageService dataRetriever.StorageService + Marshaller marshal.Marshalizer + Uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter } // NewSCQueryService returns a new instance of SCQueryService @@ -78,20 +79,20 @@ func NewSCQueryService( gasForQuery = args.MaxGasLimitPerQuery } return &SCQueryService{ - vmContainer: args.VmContainer, - economicsFee: args.EconomicsFee, - blockChain: args.BlockChain, - blockChainHook: args.BlockChainHook, - wasmVMChangeLocker: args.WasmVMChangeLocker, - bootstrapper: args.Bootstrapper, - gasForQuery: gasForQuery, - allowExternalQueriesChan: args.AllowExternalQueriesChan, - historyRepository: args.HistoryRepository, - shardCoordinator: args.ShardCoordinator, - storageService: args.StorageService, - marshaller: args.Marshaller, - scheduledTxsExecutionHandler: args.ScheduledTxsExecutionHandler, - uint64ByteSliceConverter: args.Uint64ByteSliceConverter, + vmContainer: args.VmContainer, + economicsFee: args.EconomicsFee, + mainBlockChain: args.MainBlockChain, + apiBlockChain: args.APIBlockChain, + blockChainHook: args.BlockChainHook, + wasmVMChangeLocker: args.WasmVMChangeLocker, + bootstrapper: args.Bootstrapper, + gasForQuery: gasForQuery, + allowExternalQueriesChan: args.AllowExternalQueriesChan, + historyRepository: args.HistoryRepository, + shardCoordinator: args.ShardCoordinator, + storageService: args.StorageService, + marshaller: args.Marshaller, + uint64ByteSliceConverter: args.Uint64ByteSliceConverter, }, nil } @@ -105,8 +106,11 @@ func checkArgs(args ArgsNewSCQueryService) error { if check.IfNil(args.BlockChainHook) { return process.ErrNilBlockChainHook } - if check.IfNil(args.BlockChain) { - return process.ErrNilBlockChain + if check.IfNil(args.MainBlockChain) { + return fmt.Errorf("%w for main blockchain", process.ErrNilBlockChain) + } + if check.IfNil(args.APIBlockChain) { + return fmt.Errorf("%w for api blockchain", process.ErrNilBlockChain) } if check.IfNilReflect(args.WasmVMChangeLocker) { return process.ErrNilLocker @@ -129,9 +133,6 @@ func checkArgs(args ArgsNewSCQueryService) error { if check.IfNil(args.Marshaller) { return process.ErrNilMarshalizer } - if check.IfNil(args.ScheduledTxsExecutionHandler) { - return process.ErrNilScheduledTxsExecutionHandler - } if check.IfNil(args.Uint64ByteSliceConverter) { return process.ErrNilUint64Converter } @@ -176,14 +177,32 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return nil, process.ErrNodeIsNotSynced } + blockHeader, blockRootHash, err := service.extractBlockHeaderAndRootHash(query) + if err != nil { + return nil, err + } + + if len(blockRootHash) > 0 { + err = service.apiBlockChain.SetCurrentBlockHeaderAndRootHash(blockHeader, blockRootHash) + if err != nil { + return nil, err + } + + accountsAdapter := service.blockChainHook.GetAccountsAdapter() + err = accountsAdapter.RecreateTrie(blockRootHash) + if err != nil { + return nil, err + } + } + shouldCheckRootHashChanges := query.SameScState rootHashBeforeExecution := make([]byte, 0) if shouldCheckRootHashChanges { - rootHashBeforeExecution = service.blockChain.GetCurrentBlockRootHash() + rootHashBeforeExecution = service.mainBlockChain.GetCurrentBlockRootHash() } - service.blockChainHook.SetCurrentHeader(service.blockChain.GetCurrentBlockHeader()) + service.blockChainHook.SetCurrentHeader(service.mainBlockChain.GetCurrentBlockHeader()) service.wasmVMChangeLocker.RLock() vm, _, err := scrCommon.FindVMByScAddress(service.vmContainer, query.ScAddress) @@ -192,28 +211,11 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return nil, err } - accountsAdapter := service.blockChainHook.GetAccountsAdapter() - blockRootHash, err := service.extractBlockRootHash(query) - if err != nil { - return nil, err - } - if len(blockRootHash) > 0 { - err = accountsAdapter.RecreateTrie(blockRootHash) - if err != nil { - return nil, err - } - - // Temporary setting the root hash to the desired one until the sc call is ready - _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, blockRootHash) - } - query = prepareScQuery(query) vmInput := service.createVMCallInput(query, gasPrice) vmOutput, err := vm.RunSmartContractCall(vmInput) service.wasmVMChangeLocker.RUnlock() if err != nil { - // Cleaning the current root hash so the real one would be returned further - _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) return nil, err } @@ -222,15 +224,10 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui vmOutput, err = vm.RunSmartContractCall(vmInput) if err != nil { - // Cleaning the current root hash so the real one would be returned further - _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) return nil, err } } - // Cleaning the current root hash so the real one would be returned further - _ = service.blockChain.SetCurrentBlockHeaderAndRootHash(nil, nil) - if query.SameScState { err = service.checkForRootHashChanges(rootHashBeforeExecution) if err != nil { @@ -241,30 +238,29 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return vmOutput, nil } -func (service *SCQueryService) extractBlockRootHash(query *process.SCQuery) ([]byte, error) { - if len(query.BlockRootHash) > 0 { - return query.BlockRootHash, nil - } +func (service *SCQueryService) extractBlockHeaderAndRootHash(query *process.SCQuery) (data.HeaderHandler, []byte, error) { if len(query.BlockHash) > 0 { blockHeader, err := service.getBlockHeaderByHash(query.BlockHash) if err != nil { - return make([]byte, 0), err + return nil, make([]byte, 0), err } - return service.getBlockRootHash(query.BlockHash, blockHeader), nil + header := service.getBlockHeader(blockHeader) + return header, header.GetRootHash(), nil } if query.BlockNonce.HasValue { - blockHeader, blockHash, err := service.getBlockHeaderByNonce(query.BlockNonce.Value) + blockHeader, _, err := service.getBlockHeaderByNonce(query.BlockNonce.Value) if err != nil { - return make([]byte, 0), err + return nil, make([]byte, 0), err } - return service.getBlockRootHash(blockHash, blockHeader), nil + header := service.getBlockHeader(blockHeader) + return header, header.GetRootHash(), nil } - return make([]byte, 0), nil + return service.mainBlockChain.GetCurrentBlockHeader(), service.mainBlockChain.GetCurrentBlockRootHash(), nil } func (service *SCQueryService) getBlockHeaderByHash(headerHash []byte) (data.HeaderHandler, error) { @@ -321,15 +317,13 @@ func (service *SCQueryService) getBlockHeaderInEpochByHash(headerHash []byte, ep return header, nil } -func (service *SCQueryService) getBlockRootHash(headerHash []byte, header data.HeaderHandler) []byte { - blockRootHash, err := service.scheduledTxsExecutionHandler.GetScheduledRootHashForHeaderWithEpoch( - headerHash, - header.GetEpoch()) +func (service *SCQueryService) getBlockHeader(currentHeader data.HeaderHandler) data.HeaderHandler { + header, _, err := service.getBlockHeaderByNonce(currentHeader.GetNonce() + 1) if err != nil { - blockRootHash = header.GetRootHash() + return currentHeader } - return blockRootHash + return header } func (service *SCQueryService) getBlockHeaderByNonce(nonce uint64) (data.HeaderHandler, []byte, error) { @@ -360,7 +354,7 @@ func (service *SCQueryService) getBlockHashByNonce(nonce uint64) ([]byte, error) } func (service *SCQueryService) checkForRootHashChanges(rootHashBefore []byte) error { - rootHashAfter := service.blockChain.GetCurrentBlockRootHash() + rootHashAfter := service.mainBlockChain.GetCurrentBlockRootHash() if bytes.Equal(rootHashBefore, rootHashAfter) { return nil diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 4d553aa7ea7..bd632989d33 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -3,6 +3,7 @@ package smartContract import ( "bytes" "errors" + "fmt" "math" "math/big" "sync" @@ -35,19 +36,23 @@ const DummyScAddress = "00000000000000000500fabd9501b7e5353de57a4e319857c2fb9908 func createMockArgumentsForSCQuery() ArgsNewSCQueryService { return ArgsNewSCQueryService{ - VmContainer: &mock.VMContainerMock{}, - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - BlockChainHook: &testscommon.BlockChainHookStub{}, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: &mock.BootstrapperStub{}, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), - StorageService: &storageStubs.ChainStorerStub{}, - Marshaller: &marshallerMock.MarshalizerStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, + VmContainer: &mock.VMContainerMock{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + BlockChainHook: &testscommon.BlockChainHookStub{ + GetAccountsAdapterCalled: func() state.AccountsAdapter { + return &stateMocks.AccountsStub{} + }, + }, + MainBlockChain: &testscommon.ChainHandlerStub{}, + APIBlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: &mock.BootstrapperStub{}, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } } @@ -74,15 +79,25 @@ func TestNewSCQueryService(t *testing.T) { assert.Nil(t, target) assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) }) - t.Run("nil BlockChain should error", func(t *testing.T) { + t.Run("nil main BlockChain should error", func(t *testing.T) { t.Parallel() args := createMockArgumentsForSCQuery() - args.BlockChain = nil + args.MainBlockChain = nil target, err := NewSCQueryService(args) assert.Nil(t, target) - assert.Equal(t, process.ErrNilBlockChain, err) + assert.True(t, errors.Is(err, process.ErrNilBlockChain)) + }) + t.Run("nil api BlockChain should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgumentsForSCQuery() + args.APIBlockChain = nil + target, err := NewSCQueryService(args) + + assert.Nil(t, target) + assert.True(t, errors.Is(err, process.ErrNilBlockChain)) }) t.Run("nil BlockChainHook should error", func(t *testing.T) { t.Parallel() @@ -155,16 +170,6 @@ func TestNewSCQueryService(t *testing.T) { assert.Nil(t, target) assert.Equal(t, process.ErrNilMarshalizer, err) }) - t.Run("nil ScheduledTxsExecutionHandler should error", func(t *testing.T) { - t.Parallel() - - args := createMockArgumentsForSCQuery() - args.ScheduledTxsExecutionHandler = nil - target, err := NewSCQueryService(args) - - assert.Nil(t, target) - assert.Equal(t, process.ErrNilScheduledTxsExecutionHandler, err) - }) t.Run("nil Uint64ByteSliceConverter should error", func(t *testing.T) { t.Parallel() @@ -343,118 +348,6 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { _, _ = target.ExecuteQuery(&query) assert.True(t, runWasCalled) }) - t.Run("block root hash, but recreate trie returns error", func(t *testing.T) { - t.Parallel() - - mockVM := &mock.VMExecutionHandlerStub{ - RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { - assert.Fail(t, "should have not been called") - - return &vmcommon.VMOutput{ - ReturnCode: vmcommon.Ok, - }, nil - }, - } - argsNewSCQuery := createMockArgumentsForSCQuery() - argsNewSCQuery.VmContainer = &mock.VMContainerMock{ - GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { - return mockVM, nil - }, - } - argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ - MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { - return uint64(math.MaxUint64) - }, - } - expectedErr := errors.New("expected error") - providedAccountsAdapter := &stateMocks.AccountsStub{ - RecreateTrieCalled: func(rootHash []byte) error { - return expectedErr - }, - } - argsNewSCQuery.BlockChainHook = &testscommon.BlockChainHookStub{ - GetAccountsAdapterCalled: func() state.AccountsAdapter { - return providedAccountsAdapter - }, - } - - target, _ := NewSCQueryService(argsNewSCQuery) - - dataArgs := make([][]byte, len(args)) - for i, arg := range args { - dataArgs[i] = append(dataArgs[i], arg.Bytes()...) - } - query := process.SCQuery{ - ScAddress: scAddress, - FuncName: funcName, - Arguments: dataArgs, - BlockRootHash: []byte("root hash"), - } - - _, err := target.ExecuteQuery(&query) - assert.Equal(t, expectedErr, err) - }) - t.Run("block root hash should work", func(t *testing.T) { - t.Parallel() - - runWasCalled := false - - mockVM := &mock.VMExecutionHandlerStub{ - RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { - runWasCalled = true - assert.Equal(t, int64(42), big.NewInt(0).SetBytes(input.Arguments[0]).Int64()) - assert.Equal(t, int64(43), big.NewInt(0).SetBytes(input.Arguments[1]).Int64()) - assert.Equal(t, scAddress, input.CallerAddr) - assert.Equal(t, funcName, input.Function) - - return &vmcommon.VMOutput{ - ReturnCode: vmcommon.Ok, - }, nil - }, - } - argsNewSCQuery := createMockArgumentsForSCQuery() - argsNewSCQuery.VmContainer = &mock.VMContainerMock{ - GetCalled: func(key []byte) (handler vmcommon.VMExecutionHandler, e error) { - return mockVM, nil - }, - } - argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ - MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { - return uint64(math.MaxUint64) - }, - } - providedRootHash := []byte("provided root hash") - wasRecreateTrieCalled := false - providedAccountsAdapter := &stateMocks.AccountsStub{ - RecreateTrieCalled: func(rootHash []byte) error { - wasRecreateTrieCalled = true - assert.Equal(t, providedRootHash, rootHash) - return nil - }, - } - argsNewSCQuery.BlockChainHook = &testscommon.BlockChainHookStub{ - GetAccountsAdapterCalled: func() state.AccountsAdapter { - return providedAccountsAdapter - }, - } - - target, _ := NewSCQueryService(argsNewSCQuery) - - dataArgs := make([][]byte, len(args)) - for i, arg := range args { - dataArgs[i] = append(dataArgs[i], arg.Bytes()...) - } - query := process.SCQuery{ - ScAddress: scAddress, - FuncName: funcName, - Arguments: dataArgs, - BlockRootHash: providedRootHash, - } - - _, _ = target.ExecuteQuery(&query) - assert.True(t, runWasCalled) - assert.True(t, wasRecreateTrieCalled) - }) t.Run("block hash should work", func(t *testing.T) { t.Parallel() @@ -484,16 +377,25 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { return uint64(math.MaxUint64) }, } - argsNewSCQuery.StorageService = &storageStubs.ChainStorerStub{ - GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { - return &storageStubs.StorerStub{}, nil - }, - } providedHash := []byte("provided hash") providedRootHash := []byte("provided root hash") - argsNewSCQuery.ScheduledTxsExecutionHandler = &testscommon.ScheduledTxsExecutionStub{ - GetScheduledRootHashForHeaderWithEpochCalled: func(headerHash []byte, epoch uint32) ([]byte, error) { - return providedRootHash, nil + argsNewSCQuery.Marshaller = &marshallerMock.MarshalizerMock{} + counter := 0 + argsNewSCQuery.StorageService = &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { + return &storageStubs.StorerStub{ + GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { + counter++ + if counter > 1 { + return nil, fmt.Errorf("no scheduled") + } + hdr := &block.Header{ + RootHash: providedRootHash, + } + buff, _ := argsNewSCQuery.Marshaller.Marshal(hdr) + return buff, nil + }, + }, nil }, } argsNewSCQuery.HistoryRepository = &dblookupext.HistoryRepositoryStub{ @@ -501,7 +403,6 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { return true }, GetEpochByHashCalled: func(hash []byte) (uint32, error) { - require.Equal(t, providedHash, hash) return 12, nil }, } @@ -568,20 +469,28 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { providedHash := []byte("provided hash") providedRootHash := []byte("provided root hash") providedNonce := uint64(123) + argsNewSCQuery.Marshaller = &marshallerMock.MarshalizerMock{} + counter := 0 argsNewSCQuery.StorageService = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { return &storageStubs.StorerStub{ GetCalled: func(key []byte) ([]byte, error) { return providedHash, nil }, + GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { + counter++ + if counter > 1 { + return nil, fmt.Errorf("no scheduled") + } + hdr := &block.Header{ + RootHash: providedRootHash, + } + buff, _ := argsNewSCQuery.Marshaller.Marshal(hdr) + return buff, nil + }, }, nil }, } - argsNewSCQuery.ScheduledTxsExecutionHandler = &testscommon.ScheduledTxsExecutionStub{ - GetScheduledRootHashForHeaderWithEpochCalled: func(headerHash []byte, epoch uint32) ([]byte, error) { - return providedRootHash, nil - }, - } argsNewSCQuery.HistoryRepository = &dblookupext.HistoryRepositoryStub{ IsEnabledCalled: func() bool { return true @@ -968,12 +877,21 @@ func TestSCQueryService_ShouldFailIfStateChanged(t *testing.T) { t.Parallel() args := createMockArgumentsForSCQuery() + args.BlockChainHook = &testscommon.BlockChainHookStub{ + GetAccountsAdapterCalled: func() state.AccountsAdapter { + return &stateMocks.AccountsStub{ + RecreateTrieCalled: func(rootHash []byte) error { + return nil + }, + } + }, + } - rootHashCalled := false - args.BlockChain = &testscommon.ChainHandlerStub{ + rootHashCalledCounter := 0 + args.MainBlockChain = &testscommon.ChainHandlerStub{ GetCurrentBlockRootHashCalled: func() []byte { - if !rootHashCalled { - rootHashCalled = true + rootHashCalledCounter++ + if rootHashCalledCounter <= 2 { // first call is during root hash extraction for recreate trie return []byte("first root hash") } @@ -997,7 +915,7 @@ func TestSCQueryService_ShouldWorkIfStateDidntChange(t *testing.T) { args := createMockArgumentsForSCQuery() - args.BlockChain = &testscommon.ChainHandlerStub{ + args.MainBlockChain = &testscommon.ChainHandlerStub{ GetCurrentBlockHeaderCalled: func() data.HeaderHandler { return &block.Header{ RootHash: []byte("same root hash"), @@ -1099,18 +1017,18 @@ func TestNewSCQueryService_CloseShouldWork(t *testing.T) { return nil }, }, - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - BlockChainHook: &testscommon.BlockChainHookStub{}, - BlockChain: &testscommon.ChainHandlerStub{}, - WasmVMChangeLocker: &sync.RWMutex{}, - Bootstrapper: &mock.BootstrapperStub{}, - AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), - HistoryRepository: &dblookupext.HistoryRepositoryStub{}, - ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), - StorageService: &storageStubs.ChainStorerStub{}, - Marshaller: &marshallerMock.MarshalizerStub{}, - ScheduledTxsExecutionHandler: &testscommon.ScheduledTxsExecutionStub{}, - Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + BlockChainHook: &testscommon.BlockChainHookStub{}, + MainBlockChain: &testscommon.ChainHandlerStub{}, + APIBlockChain: &testscommon.ChainHandlerStub{}, + WasmVMChangeLocker: &sync.RWMutex{}, + Bootstrapper: &mock.BootstrapperStub{}, + AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), + HistoryRepository: &dblookupext.HistoryRepositoryStub{}, + ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), + StorageService: &storageStubs.ChainStorerStub{}, + Marshaller: &marshallerMock.MarshalizerStub{}, + Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } target, _ := NewSCQueryService(argsNewSCQueryService) From a715d6137a4c1443ec9a2a562642ce2d47cb29b0 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 4 Aug 2023 18:28:50 +0300 Subject: [PATCH 063/120] added block info on vm query response --- api/groups/vmValuesGroup.go | 29 +++++---- api/groups/vmValuesGroup_test.go | 65 ++++++++++--------- api/mock/facadeStub.go | 4 +- api/shared/interface.go | 2 +- facade/initial/initialNodeFacade.go | 4 +- facade/initial/initialNodeFacade_test.go | 2 +- facade/interface.go | 2 +- facade/mock/apiResolverStub.go | 6 +- facade/nodeFacade.go | 20 ++++-- facade/nodeFacade_test.go | 18 ++--- genesis/mock/queryServiceStub.go | 7 +- .../process/intermediate/deployProcessor.go | 2 +- .../intermediate/deployProcessor_test.go | 13 ++-- .../standardDelegationProcessor.go | 4 +- .../standardDelegationProcessor_test.go | 13 ++-- genesis/process/metaGenesisBlockCreator.go | 2 +- .../frontend/staking/staking_test.go | 2 +- integrationTests/interface.go | 2 +- .../multiShard/relayedTx/relayedTx_test.go | 4 +- .../multiShard/smartContract/dns/dns_test.go | 2 +- .../polynetworkbridge/bridge_test.go | 2 +- .../smartContract/scCallingSC_test.go | 14 ++-- .../vm/delegation/delegationMulti_test.go | 2 +- .../vm/delegation/delegationScenarios_test.go | 10 +-- integrationTests/vm/esdt/common.go | 6 +- .../vm/esdt/multisign/esdtMultisign_test.go | 4 +- .../vm/esdt/process/esdtProcess_test.go | 18 ++--- .../vm/mockVM/vmGet/vmGet_test.go | 2 +- integrationTests/vm/testInitializer.go | 4 +- .../vm/wasm/delegation/testRunner.go | 4 +- .../vm/wasm/upgrades/upgrades_test.go | 2 +- integrationTests/vm/wasm/utils.go | 2 +- node/external/interface.go | 2 +- node/external/nodeApiResolver.go | 2 +- node/external/nodeApiResolver_test.go | 6 +- node/mock/scQueryServiceStub.go | 5 +- node/trieIterators/commonStakingProcessor.go | 2 +- node/trieIterators/delegatedListProcessor.go | 4 +- .../delegatedListProcessor_test.go | 25 +++---- .../directStakedListProcessor_test.go | 10 +-- .../stakeValuesProcessor_test.go | 12 ++-- process/interface.go | 2 +- process/mock/scQueryStub.go | 7 +- process/smartContract/scQueryService.go | 59 ++++++++++------- .../smartContract/scQueryServiceDispatcher.go | 3 +- .../scQueryServiceDispatcher_test.go | 25 +++---- process/smartContract/scQueryService_test.go | 40 ++++++------ 47 files changed, 256 insertions(+), 221 deletions(-) diff --git a/api/groups/vmValuesGroup.go b/api/groups/vmValuesGroup.go index fcc8ca1c4bc..2b88a3f2632 100644 --- a/api/groups/vmValuesGroup.go +++ b/api/groups/vmValuesGroup.go @@ -10,6 +10,7 @@ import ( "github.com/gin-gonic/gin" "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" + apiData "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-core-go/data/vm" "github.com/multiversx/mx-chain-go/api/errors" "github.com/multiversx/mx-chain-go/api/shared" @@ -26,7 +27,7 @@ const ( // vmValuesFacadeHandler defines the methods to be implemented by a facade for vm-values requests type vmValuesFacadeHandler interface { - ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, error) + ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, apiData.BlockInfo, error) DecodeAddressPubkey(pk string) ([]byte, error) IsInterfaceNil() bool } @@ -102,7 +103,7 @@ func (vvg *vmValuesGroup) getInt(context *gin.Context) { } func (vvg *vmValuesGroup) doGetVMValue(context *gin.Context, asType vm.ReturnDataKind) { - vmOutput, execErrMsg, err := vvg.doExecuteQuery(context) + vmOutput, execErrMsg, blockInfo, err := vvg.doExecuteQuery(context) if err != nil { vvg.returnBadRequest(context, "doGetVMValue", err) @@ -114,40 +115,40 @@ func (vvg *vmValuesGroup) doGetVMValue(context *gin.Context, asType vm.ReturnDat execErrMsg += " " + err.Error() } - vvg.returnOkResponse(context, returnData, execErrMsg) + vvg.returnOkResponse(context, returnData, execErrMsg, blockInfo) } // executeQuery returns the data as string func (vvg *vmValuesGroup) executeQuery(context *gin.Context) { - vmOutput, execErrMsg, err := vvg.doExecuteQuery(context) + vmOutput, execErrMsg, blockInfo, err := vvg.doExecuteQuery(context) if err != nil { vvg.returnBadRequest(context, "executeQuery", err) return } - vvg.returnOkResponse(context, vmOutput, execErrMsg) + vvg.returnOkResponse(context, vmOutput, execErrMsg, blockInfo) } -func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, string, error) { +func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, string, apiData.BlockInfo, error) { request := VMValueRequest{} err := context.ShouldBindJSON(&request) if err != nil { - return nil, "", errors.ErrInvalidJSONRequest + return nil, "", apiData.BlockInfo{}, errors.ErrInvalidJSONRequest } command, err := vvg.createSCQuery(&request) if err != nil { - return nil, "", err + return nil, "", apiData.BlockInfo{}, err } command.BlockNonce, command.BlockHash, err = extractBlockCoordinates(context) if err != nil { - return nil, "", err + return nil, "", apiData.BlockInfo{}, err } - vmOutputApi, err := vvg.getFacade().ExecuteSCQuery(command) + vmOutputApi, blockInfo, err := vvg.getFacade().ExecuteSCQuery(command) if err != nil { - return nil, "", err + return nil, "", apiData.BlockInfo{}, err } vmExecErrMsg := "" @@ -155,7 +156,7 @@ func (vvg *vmValuesGroup) doExecuteQuery(context *gin.Context) (*vm.VMOutputApi, vmExecErrMsg = vmOutputApi.ReturnCode + ":" + vmOutputApi.ReturnMessage } - return vmOutputApi, vmExecErrMsg, nil + return vmOutputApi, vmExecErrMsg, blockInfo, nil } func extractBlockCoordinates(context *gin.Context) (core.OptionalUint64, []byte, error) { @@ -229,11 +230,11 @@ func (vvg *vmValuesGroup) returnBadRequest(context *gin.Context, errScope string ) } -func (vvg *vmValuesGroup) returnOkResponse(context *gin.Context, data interface{}, errorMsg string) { +func (vvg *vmValuesGroup) returnOkResponse(context *gin.Context, data interface{}, errorMsg string, blockInfo apiData.BlockInfo) { context.JSON( http.StatusOK, shared.GenericAPIResponse{ - Data: gin.H{"data": data}, + Data: gin.H{"data": data, "blockInfo": blockInfo}, Error: errorMsg, Code: shared.ReturnCodeSuccess, }, diff --git a/api/groups/vmValuesGroup_test.go b/api/groups/vmValuesGroup_test.go index 6ccab7ea903..ea8bf117a96 100644 --- a/api/groups/vmValuesGroup_test.go +++ b/api/groups/vmValuesGroup_test.go @@ -13,6 +13,7 @@ import ( "github.com/gin-gonic/gin" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-core-go/data/vm" apiErrors "github.com/multiversx/mx-chain-go/api/errors" "github.com/multiversx/mx-chain-go/api/groups" @@ -62,10 +63,10 @@ func TestGetHex_ShouldWork(t *testing.T) { valueBuff, _ := hex.DecodeString("DEADBEEF") facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return &vm.VMOutputApi{ ReturnData: [][]byte{valueBuff}, - }, nil + }, api.BlockInfo{}, nil }, } @@ -89,10 +90,10 @@ func TestGetString_ShouldWork(t *testing.T) { valueBuff := "DEADBEEF" facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return &vm.VMOutputApi{ ReturnData: [][]byte{[]byte(valueBuff)}, - }, nil + }, api.BlockInfo{}, nil }, } @@ -116,12 +117,12 @@ func TestGetInt_ShouldWork(t *testing.T) { value := "1234567" facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { returnData := big.NewInt(0) returnData.SetString(value, 10) return &vm.VMOutputApi{ ReturnData: [][]byte{returnData.Bytes()}, - }, nil + }, api.BlockInfo{}, nil }, } @@ -152,11 +153,11 @@ func TestQuery(t *testing.T) { HasValue: true, } facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { require.Equal(t, providedBlockNonce, query.BlockNonce) return &vm.VMOutputApi{ ReturnData: [][]byte{big.NewInt(42).Bytes()}, - }, nil + }, api.BlockInfo{}, nil }, } url := fmt.Sprintf("/vm-values/query?blockNonce=%d", providedBlockNonce.Value) @@ -167,11 +168,11 @@ func TestQuery(t *testing.T) { providedBlockHash := []byte("provided hash") facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { require.Equal(t, providedBlockHash, query.BlockHash) return &vm.VMOutputApi{ ReturnData: [][]byte{big.NewInt(42).Bytes()}, - }, nil + }, api.BlockInfo{}, nil }, } url := fmt.Sprintf("/vm-values/query?blockHash=%s", hex.EncodeToString(providedBlockHash)) @@ -181,11 +182,11 @@ func TestQuery(t *testing.T) { t.Parallel() facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return &vm.VMOutputApi{ ReturnData: [][]byte{big.NewInt(42).Bytes()}, - }, nil + }, api.BlockInfo{}, nil }, } testQueryShouldWork(t, "/vm-values/query", &facade) @@ -219,10 +220,10 @@ func testQueryShouldError(url string) func(t *testing.T) { requestAsBytes, _ := json.Marshal(request) facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return &vm.VMOutputApi{ ReturnData: [][]byte{big.NewInt(42).Bytes()}, - }, nil + }, api.BlockInfo{}, nil }, } @@ -261,8 +262,8 @@ func TestAllRoutes_FacadeErrorsShouldErr(t *testing.T) { errExpected := errors.New("some random error") facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - return nil, errExpected + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return nil, api.BlockInfo{}, errExpected }, } @@ -280,8 +281,8 @@ func TestAllRoutes_WhenBadAddressShouldErr(t *testing.T) { errExpected := errors.New("not a valid address") facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - return &vm.VMOutputApi{}, nil + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return &vm.VMOutputApi{}, api.BlockInfo{}, nil }, } @@ -299,8 +300,8 @@ func TestAllRoutes_WhenBadArgumentsShouldErr(t *testing.T) { errExpected := errors.New("not a valid hex string") facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - return &vm.VMOutputApi{}, nil + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return &vm.VMOutputApi{}, api.BlockInfo{}, nil }, } @@ -318,8 +319,8 @@ func TestAllRoutes_WhenNoVMReturnDataShouldErr(t *testing.T) { errExpected := errors.New("no return data") facade := &mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - return &vm.VMOutputApi{}, nil + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return &vm.VMOutputApi{}, api.BlockInfo{}, nil }, } @@ -349,8 +350,8 @@ func TestAllRoutes_WhenBadJsonShouldErr(t *testing.T) { t.Parallel() facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - return &vm.VMOutputApi{}, nil + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return &vm.VMOutputApi{}, api.BlockInfo{}, nil }, } @@ -369,8 +370,8 @@ func TestAllRoutes_DecodeAddressPubkeyFailsShouldErr(t *testing.T) { } return hex.DecodeString(pk) }, - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - return &vm.VMOutputApi{}, nil + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return &vm.VMOutputApi{}, api.BlockInfo{}, nil }, } @@ -387,8 +388,8 @@ func TestAllRoutes_SetStringFailsShouldErr(t *testing.T) { t.Parallel() facade := mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { - return &vm.VMOutputApi{}, nil + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return &vm.VMOutputApi{}, api.BlockInfo{}, nil }, } @@ -428,12 +429,12 @@ func TestVMValuesGroup_UpdateFacade(t *testing.T) { valueBuff, _ := hex.DecodeString("DEADBEEF") facade := &mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return &vm.VMOutputApi{ ReturnData: [][]byte{valueBuff}, ReturnCode: "NOK", // coverage - }, nil + }, api.BlockInfo{}, nil }, } @@ -464,11 +465,11 @@ func TestVMValuesGroup_UpdateFacade(t *testing.T) { require.Equal(t, hex.EncodeToString(valueBuff), response.Data) newFacade := &mock.FacadeStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return &vm.VMOutputApi{ ReturnData: nil, - }, expectedErr + }, api.BlockInfo{}, expectedErr }, } diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index d8955decd9a..366af9dd218 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -34,7 +34,7 @@ type FacadeStub struct { ValidateTransactionHandler func(tx *transaction.Transaction) error ValidateTransactionForSimulationHandler func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) - ExecuteSCQueryHandler func(query *process.SCQuery) (*vm.VMOutputApi, error) + ExecuteSCQueryHandler func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) StatusMetricsHandler func() external.StatusMetricsHandler ValidatorStatisticsHandler func() (map[string]*accounts.ValidatorApiResponse, error) ComputeTransactionGasLimitHandler func(tx *transaction.Transaction) (*transaction.CostResponse, error) @@ -331,7 +331,7 @@ func (f *FacadeStub) ValidatorStatisticsApi() (map[string]*accounts.ValidatorApi } // ExecuteSCQuery is a mock implementation. -func (f *FacadeStub) ExecuteSCQuery(query *process.SCQuery) (*vm.VMOutputApi, error) { +func (f *FacadeStub) ExecuteSCQuery(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return f.ExecuteSCQueryHandler(query) } diff --git a/api/shared/interface.go b/api/shared/interface.go index e7bd44595d7..0b199393b96 100644 --- a/api/shared/interface.go +++ b/api/shared/interface.go @@ -115,7 +115,7 @@ type FacadeHandler interface { ComputeTransactionGasLimit(tx *transaction.Transaction) (*transaction.CostResponse, error) EncodeAddressPubkey(pk []byte) (string, error) ValidatorStatisticsApi() (map[string]*accounts.ValidatorApiResponse, error) - ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, error) + ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) DecodeAddressPubkey(pk string) ([]byte, error) RestApiInterface() string RestAPIServerDebugMode() bool diff --git a/facade/initial/initialNodeFacade.go b/facade/initial/initialNodeFacade.go index 6951c73cdf8..a8e04f2c0bd 100644 --- a/facade/initial/initialNodeFacade.go +++ b/facade/initial/initialNodeFacade.go @@ -202,8 +202,8 @@ func (inf *initialNodeFacade) GetTotalStakedValue() (*api.StakeValues, error) { } // ExecuteSCQuery returns nil and error -func (inf *initialNodeFacade) ExecuteSCQuery(_ *process.SCQuery) (*vm.VMOutputApi, error) { - return nil, errNodeStarting +func (inf *initialNodeFacade) ExecuteSCQuery(_ *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { + return nil, api.BlockInfo{}, errNodeStarting } // PprofEnabled returns false diff --git a/facade/initial/initialNodeFacade_test.go b/facade/initial/initialNodeFacade_test.go index 7ee2e26de2e..7298b001ba3 100644 --- a/facade/initial/initialNodeFacade_test.go +++ b/facade/initial/initialNodeFacade_test.go @@ -109,7 +109,7 @@ func TestInitialNodeFacade_AllMethodsShouldNotPanic(t *testing.T) { sm := inf.StatusMetrics() assert.NotNil(t, sm) - vo, err := inf.ExecuteSCQuery(nil) + vo, _, err := inf.ExecuteSCQuery(nil) assert.Nil(t, vo) assert.Equal(t, errNodeStarting, err) diff --git a/facade/interface.go b/facade/interface.go index 9e2f909781f..910948b57a7 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -112,7 +112,7 @@ type TransactionSimulatorProcessor interface { // ApiResolver defines a structure capable of resolving REST API requests type ApiResolver interface { - ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) + ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) ComputeTransactionGasLimit(tx *transaction.Transaction) (*transaction.CostResponse, error) SimulateTransactionExecution(tx *transaction.Transaction) (*txSimData.SimulationResultsWithVMOutput, error) StatusMetrics() external.StatusMetricsHandler diff --git a/facade/mock/apiResolverStub.go b/facade/mock/apiResolverStub.go index ec25012b049..ef71463c320 100644 --- a/facade/mock/apiResolverStub.go +++ b/facade/mock/apiResolverStub.go @@ -16,7 +16,7 @@ import ( // ApiResolverStub - type ApiResolverStub struct { - ExecuteSCQueryHandler func(query *process.SCQuery) (*vmcommon.VMOutput, error) + ExecuteSCQueryHandler func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) StatusMetricsHandler func() external.StatusMetricsHandler ComputeTransactionGasLimitHandler func(tx *transaction.Transaction) (*transaction.CostResponse, error) SimulateTransactionExecutionHandler func(tx *transaction.Transaction) (*txSimData.SimulationResultsWithVMOutput, error) @@ -96,12 +96,12 @@ func (ars *ApiResolverStub) GetAlteredAccountsForBlock(options api.GetAlteredAcc } // ExecuteSCQuery - -func (ars *ApiResolverStub) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) { +func (ars *ApiResolverStub) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { if ars.ExecuteSCQueryHandler != nil { return ars.ExecuteSCQueryHandler(query) } - return nil, nil + return nil, nil, nil } // StatusMetrics - diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index a8318c7a03d..1e5acd3642a 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -412,13 +412,13 @@ func (nf *nodeFacade) GetDelegatorsList() ([]*apiData.Delegator, error) { } // ExecuteSCQuery retrieves data from existing SC trie -func (nf *nodeFacade) ExecuteSCQuery(query *process.SCQuery) (*vm.VMOutputApi, error) { - vmOutput, err := nf.apiResolver.ExecuteSCQuery(query) +func (nf *nodeFacade) ExecuteSCQuery(query *process.SCQuery) (*vm.VMOutputApi, apiData.BlockInfo, error) { + vmOutput, blockInfo, err := nf.apiResolver.ExecuteSCQuery(query) if err != nil { - return nil, err + return nil, apiData.BlockInfo{}, err } - return nf.convertVmOutputToApiResponse(vmOutput), nil + return nf.convertVmOutputToApiResponse(vmOutput), queryBlockInfoToApiResource(blockInfo), nil } // PprofEnabled returns if profiling mode should be active or not on the application @@ -687,6 +687,18 @@ func (nf *nodeFacade) convertVmOutputToApiResponse(input *vmcommon.VMOutput) *vm } } +func queryBlockInfoToApiResource(info common.BlockInfo) apiData.BlockInfo { + if check.IfNil(info) { + return apiData.BlockInfo{} + } + + return apiData.BlockInfo{ + Nonce: info.GetNonce(), + Hash: hex.EncodeToString(info.GetHash()), + RootHash: hex.EncodeToString(info.GetRootHash()), + } +} + // GetGenesisNodesPubKeys will return genesis nodes public keys by shard func (nf *nodeFacade) GetGenesisNodesPubKeys() (map[uint32][]string, map[uint32][]string, error) { eligible, waiting := nf.apiResolver.GetGenesisNodesPubKeys() diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 8380e747103..49139daafaf 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -513,15 +513,15 @@ func TestNodeFacade_GetDataValue(t *testing.T) { wasCalled := false arg := createMockArguments() arg.ApiResolver = &mock.ApiResolverStub{ - ExecuteSCQueryHandler: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { wasCalled = true - return &vmcommon.VMOutput{}, nil + return &vmcommon.VMOutput{}, nil, nil }, } nf, err := NewNodeFacade(arg) require.NoError(t, err) - _, _ = nf.ExecuteSCQuery(nil) + _, _, _ = nf.ExecuteSCQuery(nil) require.True(t, wasCalled) } @@ -1240,14 +1240,14 @@ func TestNodeFacade_ExecuteSCQuery(t *testing.T) { arg := createMockArguments() arg.ApiResolver = &mock.ApiResolverStub{ - ExecuteSCQueryHandler: func(_ *process.SCQuery) (*vmcommon.VMOutput, error) { - return nil, expectedErr + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { + return nil, nil, expectedErr }, } nf, _ := NewNodeFacade(arg) - _, err := nf.ExecuteSCQuery(&process.SCQuery{}) + _, _, err := nf.ExecuteSCQuery(&process.SCQuery{}) require.Equal(t, expectedErr, err) }) t.Run("should work", func(t *testing.T) { @@ -1269,15 +1269,15 @@ func TestNodeFacade_ExecuteSCQuery(t *testing.T) { }, } arg.ApiResolver = &mock.ApiResolverStub{ - ExecuteSCQueryHandler: func(_ *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteSCQueryHandler: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { executeScQueryHandlerWasCalled = true - return expectedVmOutput, nil + return expectedVmOutput, nil, nil }, } nf, _ := NewNodeFacade(arg) - apiVmOutput, err := nf.ExecuteSCQuery(&process.SCQuery{}) + apiVmOutput, _, err := nf.ExecuteSCQuery(&process.SCQuery{}) require.NoError(t, err) require.True(t, executeScQueryHandlerWasCalled) require.Equal(t, expectedVmOutput.ReturnData, apiVmOutput.ReturnData) diff --git a/genesis/mock/queryServiceStub.go b/genesis/mock/queryServiceStub.go index d4ad816b303..4bf7eef7026 100644 --- a/genesis/mock/queryServiceStub.go +++ b/genesis/mock/queryServiceStub.go @@ -2,6 +2,7 @@ package mock import ( "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process" vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) @@ -9,7 +10,7 @@ import ( // QueryServiceStub - type QueryServiceStub struct { ComputeScCallGasLimitCalled func(tx *transaction.Transaction) (uint64, error) - ExecuteQueryCalled func(query *process.SCQuery) (*vmcommon.VMOutput, error) + ExecuteQueryCalled func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) CloseCalled func() error } @@ -23,12 +24,12 @@ func (qss *QueryServiceStub) ComputeScCallGasLimit(tx *transaction.Transaction) } // ExecuteQuery - -func (qss *QueryServiceStub) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) { +func (qss *QueryServiceStub) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { if qss.ExecuteQueryCalled != nil { return qss.ExecuteQueryCalled(query) } - return &vmcommon.VMOutput{}, nil + return &vmcommon.VMOutput{}, nil, nil } // Close - diff --git a/genesis/process/intermediate/deployProcessor.go b/genesis/process/intermediate/deployProcessor.go index 47029a0b6aa..3687c511fca 100644 --- a/genesis/process/intermediate/deployProcessor.go +++ b/genesis/process/intermediate/deployProcessor.go @@ -104,7 +104,7 @@ func (dp *deployProcessor) checkVersion(sc genesis.InitialSmartContractHandler, Arguments: [][]byte{}, } - vmOutputVersion, err := dp.scQueryService.ExecuteQuery(scQueryVersion) + vmOutputVersion, _, err := dp.scQueryService.ExecuteQuery(scQueryVersion) if err != nil { return err } diff --git a/genesis/process/intermediate/deployProcessor_test.go b/genesis/process/intermediate/deployProcessor_test.go index 9f3918586f2..aebbdbcee68 100644 --- a/genesis/process/intermediate/deployProcessor_test.go +++ b/genesis/process/intermediate/deployProcessor_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/genesis" "github.com/multiversx/mx-chain-go/genesis/data" "github.com/multiversx/mx-chain-go/genesis/mock" @@ -221,8 +222,8 @@ func TestDeployProcessor_DeployExecuteQueryFailureShouldError(t *testing.T) { }, } arg.QueryService = &mock.QueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { - return nil, expectedErr + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { + return nil, nil, expectedErr }, } dp, _ := NewDeployProcessor(arg) @@ -275,10 +276,10 @@ func TestDeployProcessor_DeployExecuteQueryReturnsMultipleReturnDataShouldError( }, } arg.QueryService = &mock.QueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { return &vmcommon.VMOutput{ ReturnData: [][]byte{[]byte("return data 1"), []byte("return data 2")}, - }, nil + }, nil, nil }, } dp, _ := NewDeployProcessor(arg) @@ -357,10 +358,10 @@ func TestDeployProcessor_DeployShouldWork(t *testing.T) { }, } arg.QueryService = &mock.QueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { return &vmcommon.VMOutput{ ReturnData: [][]byte{[]byte(version)}, - }, nil + }, nil, nil }, } dp, _ := NewDeployProcessor(arg) diff --git a/genesis/process/intermediate/standardDelegationProcessor.go b/genesis/process/intermediate/standardDelegationProcessor.go index 7df5451d6f1..efcbbd96435 100644 --- a/genesis/process/intermediate/standardDelegationProcessor.go +++ b/genesis/process/intermediate/standardDelegationProcessor.go @@ -437,7 +437,7 @@ func (sdp *standardDelegationProcessor) checkDelegator( FuncName: "getUserStake", Arguments: [][]byte{delegator.AddressBytes()}, } - vmOutputStakeValue, err := sdp.queryService.ExecuteQuery(scQueryStakeValue) + vmOutputStakeValue, _, err := sdp.queryService.ExecuteQuery(scQueryStakeValue) if err != nil { return err } @@ -489,7 +489,7 @@ func (sdp *standardDelegationProcessor) verifyOneNode( Arguments: [][]byte{node.PubKeyBytes()}, } - vmOutput, err := sdp.queryService.ExecuteQuery(scQueryBlsKeys) + vmOutput, _, err := sdp.queryService.ExecuteQuery(scQueryBlsKeys) if err != nil { return err } diff --git a/genesis/process/intermediate/standardDelegationProcessor_test.go b/genesis/process/intermediate/standardDelegationProcessor_test.go index 34e20637745..ab5cd9216ce 100644 --- a/genesis/process/intermediate/standardDelegationProcessor_test.go +++ b/genesis/process/intermediate/standardDelegationProcessor_test.go @@ -9,6 +9,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" coreData "github.com/multiversx/mx-chain-core-go/data" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/genesis" "github.com/multiversx/mx-chain-go/genesis/data" "github.com/multiversx/mx-chain-go/genesis/mock" @@ -250,30 +251,30 @@ func TestStandardDelegationProcessor_ExecuteDelegationStakeShouldWork(t *testing }, } arg.QueryService = &mock.QueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { if query.FuncName == "getUserStake" { if bytes.Equal(query.Arguments[0], staker1.AddressBytes()) { return &vmcommon.VMOutput{ ReturnData: [][]byte{staker1.Delegation.Value.Bytes()}, - }, nil + }, nil, nil } if bytes.Equal(query.Arguments[0], staker2.AddressBytes()) { return &vmcommon.VMOutput{ ReturnData: [][]byte{staker2.Delegation.Value.Bytes()}, - }, nil + }, nil, nil } return &vmcommon.VMOutput{ ReturnData: make([][]byte, 0), - }, nil + }, nil, nil } if query.FuncName == "getNodeSignature" { return &vmcommon.VMOutput{ ReturnData: [][]byte{genesisSignature}, - }, nil + }, nil, nil } - return nil, fmt.Errorf("unexpected function") + return nil, nil, fmt.Errorf("unexpected function") }, } arg.NodesListSplitter = &mock.NodesListSplitterStub{ diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index d3cb54f6c9c..f98b748901c 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -676,7 +676,7 @@ func setStakedData( } scQueryBlsKeys.Arguments = [][]byte{nodeInfo.PubKeyBytes()} - vmOutput, err := processors.queryService.ExecuteQuery(scQueryBlsKeys) + vmOutput, _, err := processors.queryService.ExecuteQuery(scQueryBlsKeys) if err != nil { return nil, err } diff --git a/integrationTests/frontend/staking/staking_test.go b/integrationTests/frontend/staking/staking_test.go index b11b65eb931..8cba29bd032 100644 --- a/integrationTests/frontend/staking/staking_test.go +++ b/integrationTests/frontend/staking/staking_test.go @@ -131,7 +131,7 @@ func checkStakeOnNode(t *testing.T, n *integrationTests.TestProcessorNode, blsKe Arguments: [][]byte{blsKey}, } - vmOutput, err := n.SCQueryService.ExecuteQuery(query) + vmOutput, _, err := n.SCQueryService.ExecuteQuery(query) require.Nil(t, err) require.NotNil(t, vmOutput) require.Equal(t, 1, len(vmOutput.ReturnData)) diff --git a/integrationTests/interface.go b/integrationTests/interface.go index a1b64756f9c..ddce1ebf3d4 100644 --- a/integrationTests/interface.go +++ b/integrationTests/interface.go @@ -96,7 +96,7 @@ type Facade interface { EncodeAddressPubkey(pk []byte) (string, error) GetThrottlerForEndpoint(endpoint string) (core.Throttler, bool) ValidatorStatisticsApi() (map[string]*accounts.ValidatorApiResponse, error) - ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, error) + ExecuteSCQuery(*process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) DecodeAddressPubkey(pk string) ([]byte, error) GetProof(rootHash string, address string) (*common.GetProofResponse, error) GetProofDataTrie(rootHash string, address string, key string) (*common.GetProofResponse, *common.GetProofResponse, error) diff --git a/integrationTests/multiShard/relayedTx/relayedTx_test.go b/integrationTests/multiShard/relayedTx/relayedTx_test.go index bd1575bfcf0..acbdeb9b367 100644 --- a/integrationTests/multiShard/relayedTx/relayedTx_test.go +++ b/integrationTests/multiShard/relayedTx/relayedTx_test.go @@ -357,7 +357,7 @@ func checkAttestedPublicKeys( userAddress []byte, ) { scQuery := node.SCQueryService - vmOutput, err := scQuery.ExecuteQuery(&process.SCQuery{ + vmOutput, _, err := scQuery.ExecuteQuery(&process.SCQuery{ ScAddress: scAddress, FuncName: "getPublicKey", Arguments: [][]byte{obfuscatedData}, @@ -369,7 +369,7 @@ func checkAttestedPublicKeys( func checkSCBalance(t *testing.T, node *integrationTests.TestProcessorNode, scAddress []byte, userAddress []byte, balance *big.Int) { scQuery := node.SCQueryService - vmOutput, err := scQuery.ExecuteQuery(&process.SCQuery{ + vmOutput, _, err := scQuery.ExecuteQuery(&process.SCQuery{ ScAddress: scAddress, FuncName: "balanceOf", Arguments: [][]byte{userAddress}, diff --git a/integrationTests/multiShard/smartContract/dns/dns_test.go b/integrationTests/multiShard/smartContract/dns/dns_test.go index 2288a37857f..4265eba8515 100644 --- a/integrationTests/multiShard/smartContract/dns/dns_test.go +++ b/integrationTests/multiShard/smartContract/dns/dns_test.go @@ -276,7 +276,7 @@ func checkUserNamesAreSetCorrectly( continue } - vmOutput, _ := node.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, _ := node.SCQueryService.ExecuteQuery(scQuery) require.NotNil(t, vmOutput) require.Equal(t, vmcommon.Ok, vmOutput.ReturnCode) diff --git a/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go b/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go index 5c28c7525fc..8c36ace890d 100644 --- a/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go +++ b/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go @@ -118,7 +118,7 @@ func TestBridgeSetupAndBurn(t *testing.T) { FuncName: "getWrappedEgldTokenIdentifier", Arguments: [][]byte{}, } - vmOutput, err := ownerNode.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, err := ownerNode.SCQueryService.ExecuteQuery(scQuery) require.Nil(t, err) require.NotNil(t, vmOutput) require.NotZero(t, len(vmOutput.ReturnData[0])) diff --git a/integrationTests/multiShard/smartContract/scCallingSC_test.go b/integrationTests/multiShard/smartContract/scCallingSC_test.go index cf76ffe25f3..b7892cdb989 100644 --- a/integrationTests/multiShard/smartContract/scCallingSC_test.go +++ b/integrationTests/multiShard/smartContract/scCallingSC_test.go @@ -679,7 +679,7 @@ func TestSCCallingInCrossShardDelegationMock(t *testing.T) { FuncName: "isStaked", Arguments: [][]byte{stakerBLSKey}, } - vmOutput, _ := n.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, _ := n.SCQueryService.ExecuteQuery(scQuery) assert.NotNil(t, vmOutput) if vmOutput != nil { @@ -770,7 +770,7 @@ func TestSCCallingInCrossShardDelegation(t *testing.T) { FuncName: "version", Arguments: [][]byte{}, } - vmOutputVersion, _ := shardNode.SCQueryService.ExecuteQuery(scQueryVersion) + vmOutputVersion, _, _ := shardNode.SCQueryService.ExecuteQuery(scQueryVersion) assert.NotNil(t, vmOutputVersion) assert.Equal(t, len(vmOutputVersion.ReturnData), 1) require.True(t, bytes.Contains(vmOutputVersion.ReturnData[0], []byte("0.3."))) @@ -818,7 +818,7 @@ func TestSCCallingInCrossShardDelegation(t *testing.T) { FuncName: "getNumNodes", Arguments: [][]byte{}, } - vmOutput1, _ := shardNode.SCQueryService.ExecuteQuery(scQuery1) + vmOutput1, _, _ := shardNode.SCQueryService.ExecuteQuery(scQuery1) require.NotNil(t, vmOutput1) require.Equal(t, len(vmOutput1.ReturnData), 1) require.True(t, bytes.Equal(vmOutput1.ReturnData[0], []byte{1})) @@ -829,7 +829,7 @@ func TestSCCallingInCrossShardDelegation(t *testing.T) { FuncName: "getNodeSignature", Arguments: [][]byte{stakerBLSKey}, } - vmOutput2, _ := shardNode.SCQueryService.ExecuteQuery(scQuery2) + vmOutput2, _, _ := shardNode.SCQueryService.ExecuteQuery(scQuery2) require.NotNil(t, vmOutput2) require.Equal(t, len(vmOutput2.ReturnData), 1) require.True(t, bytes.Equal(stakerBLSSignature, vmOutput2.ReturnData[0])) @@ -840,7 +840,7 @@ func TestSCCallingInCrossShardDelegation(t *testing.T) { FuncName: "getUserStake", Arguments: [][]byte{delegateSCOwner}, } - vmOutput3, _ := shardNode.SCQueryService.ExecuteQuery(scQuery3) + vmOutput3, _, _ := shardNode.SCQueryService.ExecuteQuery(scQuery3) require.NotNil(t, vmOutput3) require.Equal(t, len(vmOutput3.ReturnData), 1) require.True(t, totalStake.Cmp(big.NewInt(0).SetBytes(vmOutput3.ReturnData[0])) == 0) @@ -851,7 +851,7 @@ func TestSCCallingInCrossShardDelegation(t *testing.T) { FuncName: "getUserActiveStake", Arguments: [][]byte{delegateSCOwner}, } - vmOutput4, _ := shardNode.SCQueryService.ExecuteQuery(scQuery4) + vmOutput4, _, _ := shardNode.SCQueryService.ExecuteQuery(scQuery4) require.NotNil(t, vmOutput4) require.Equal(t, len(vmOutput4.ReturnData), 1) require.True(t, totalStake.Cmp(big.NewInt(0).SetBytes(vmOutput4.ReturnData[0])) == 0) @@ -866,7 +866,7 @@ func TestSCCallingInCrossShardDelegation(t *testing.T) { FuncName: "isStaked", Arguments: [][]byte{stakerBLSKey}, } - vmOutput, _ := n.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, _ := n.SCQueryService.ExecuteQuery(scQuery) assert.NotNil(t, vmOutput) if vmOutput != nil { diff --git a/integrationTests/vm/delegation/delegationMulti_test.go b/integrationTests/vm/delegation/delegationMulti_test.go index 3d87dec1e08..c6c43e0ee06 100644 --- a/integrationTests/vm/delegation/delegationMulti_test.go +++ b/integrationTests/vm/delegation/delegationMulti_test.go @@ -254,7 +254,7 @@ func checkClaimMultiReturn( CallValue: big.NewInt(0), Arguments: arguments, } - vmOutput, err := tpn.SCQueryService.ExecuteQuery(query) + vmOutput, _, err := tpn.SCQueryService.ExecuteQuery(query) assert.Nil(t, err) require.Equal(t, vmcommon.Ok, vmOutput.ReturnCode) require.Equal(t, big.NewInt(expectedRewards).Bytes(), vmOutput.ReturnData[0]) diff --git a/integrationTests/vm/delegation/delegationScenarios_test.go b/integrationTests/vm/delegation/delegationScenarios_test.go index e5d55775229..facb4969f04 100644 --- a/integrationTests/vm/delegation/delegationScenarios_test.go +++ b/integrationTests/vm/delegation/delegationScenarios_test.go @@ -273,7 +273,7 @@ func TestDelegationChangeConfig(t *testing.T) { CallValue: big.NewInt(0), Arguments: make([][]byte, 0), } - vmOutput, err := tpn.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, err := tpn.SCQueryService.ExecuteQuery(scQuery) require.Nil(t, err) assert.Equal(t, newMinDelegationAmount.Bytes(), vmOutput.ReturnData[5]) @@ -1159,7 +1159,7 @@ func verifyUserUndelegatedList( Arguments: [][]byte{delegator}, CallValue: big.NewInt(0), } - vmOutput, err := tpn.SCQueryService.ExecuteQuery(query) + vmOutput, _, err := tpn.SCQueryService.ExecuteQuery(query) assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, vmOutput.ReturnCode) assert.Equal(t, len(values)*2, len(vmOutput.ReturnData)) @@ -1192,7 +1192,7 @@ func verifyValidatorSCStake( CallValue: big.NewInt(0), Arguments: [][]byte{delegationAddr}, } - vmOutput, err := tpn.SCQueryService.ExecuteQuery(query) + vmOutput, _, err := tpn.SCQueryService.ExecuteQuery(query) assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, vmOutput.ReturnCode) assert.Equal(t, string(vmOutput.ReturnData[0]), expectedRes.String()) @@ -1291,7 +1291,7 @@ func verifyDelegatorIsDeleted( CallValue: big.NewInt(0), Arguments: [][]byte{address}, } - vmOutput, err := tpn.SCQueryService.ExecuteQuery(query) + vmOutput, _, err := tpn.SCQueryService.ExecuteQuery(query) assert.Nil(t, err) assert.Equal(t, vmOutput.ReturnMessage, "view function works only for existing delegators") assert.Equal(t, vmOutput.ReturnCode, vmcommon.UserError) @@ -1375,7 +1375,7 @@ func getReturnDataFromQuery( CallValue: big.NewInt(0), Arguments: arguments, } - vmOutput, err := tpn.SCQueryService.ExecuteQuery(query) + vmOutput, _, err := tpn.SCQueryService.ExecuteQuery(query) assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, vmOutput.ReturnCode) diff --git a/integrationTests/vm/esdt/common.go b/integrationTests/vm/esdt/common.go index aa1b9f56329..3287641d0e6 100644 --- a/integrationTests/vm/esdt/common.go +++ b/integrationTests/vm/esdt/common.go @@ -294,7 +294,7 @@ func CheckNumCallBacks( CallValue: big.NewInt(0), Arguments: [][]byte{}, } - vmOutput, err := node.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, err := node.SCQueryService.ExecuteQuery(scQuery) require.Nil(t, err) require.NotNil(t, vmOutput) require.Equal(t, vmOutput.ReturnCode, vmcommon.Ok) @@ -325,7 +325,7 @@ func CheckForwarderRawSavedCallbackArgs( {byte(callbackIndex)}, }, } - vmOutputArgs, err := node.SCQueryService.ExecuteQuery(scQueryArgs) + vmOutputArgs, _, err := node.SCQueryService.ExecuteQuery(scQueryArgs) require.Nil(t, err) require.Equal(t, vmcommon.Ok, vmOutputArgs.ReturnCode) require.GreaterOrEqual(t, len(vmOutputArgs.ReturnData), 1) @@ -364,7 +364,7 @@ func CheckForwarderRawSavedCallbackPayments( if node.ShardCoordinator.SelfId() != contractID { continue } - vmOutputPayment, err := node.SCQueryService.ExecuteQuery(scQueryPayment) + vmOutputPayment, _, err := node.SCQueryService.ExecuteQuery(scQueryPayment) require.Nil(t, err) require.Equal(t, vmcommon.Ok, vmOutputPayment.ReturnCode) diff --git a/integrationTests/vm/esdt/multisign/esdtMultisign_test.go b/integrationTests/vm/esdt/multisign/esdtMultisign_test.go index 3e221267888..d0869022aed 100644 --- a/integrationTests/vm/esdt/multisign/esdtMultisign_test.go +++ b/integrationTests/vm/esdt/multisign/esdtMultisign_test.go @@ -143,7 +143,7 @@ func checkCallBackWasSaved(t *testing.T, nodes []*integrationTests.TestProcessor CallValue: big.NewInt(0), Arguments: [][]byte{}, } - vmOutput, err := node.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, err := node.SCQueryService.ExecuteQuery(scQuery) assert.Nil(t, err) assert.Equal(t, vmOutput.ReturnCode, vmcommon.Ok) assert.Equal(t, 1, len(vmOutput.ReturnData)) @@ -253,7 +253,7 @@ func getActionID(t *testing.T, nodes []*integrationTests.TestProcessorNode, mult Arguments: make([][]byte, 0), } - vmOutput, err := node.SCQueryService.ExecuteQuery(query) + vmOutput, _, err := node.SCQueryService.ExecuteQuery(query) require.Nil(t, err) require.Equal(t, 1, len(vmOutput.ReturnData)) diff --git a/integrationTests/vm/esdt/process/esdtProcess_test.go b/integrationTests/vm/esdt/process/esdtProcess_test.go index 277d13de903..7d3ac145a73 100644 --- a/integrationTests/vm/esdt/process/esdtProcess_test.go +++ b/integrationTests/vm/esdt/process/esdtProcess_test.go @@ -588,7 +588,7 @@ func TestESDTcallsSC(t *testing.T) { FuncName: "getCurrentFunds", Arguments: [][]byte{}, } - vmOutput1, _ := nodes[0].SCQueryService.ExecuteQuery(scQuery1) + vmOutput1, _, _ := nodes[0].SCQueryService.ExecuteQuery(scQuery1) require.Equal(t, big.NewInt(60).Bytes(), vmOutput1.ReturnData[0]) nodesBalance := valueToSend - valueToSendToSc @@ -1380,7 +1380,7 @@ func TestScACallsScBWithExecOnDestScAPerformsAsyncCall_NoCallbackInScB(t *testin Arguments: [][]byte{}, } - res, err := scQuery.ExecuteQuery(childScAddressQuery) + res, _, err := scQuery.ExecuteQuery(childScAddressQuery) require.Nil(t, err) receiverScAddress := res.ReturnData[0] @@ -1393,7 +1393,7 @@ func TestScACallsScBWithExecOnDestScAPerformsAsyncCall_NoCallbackInScB(t *testin Arguments: [][]byte{}, } - res, err = scQuery.ExecuteQuery(tokenIdQuery) + res, _, err = scQuery.ExecuteQuery(tokenIdQuery) require.Nil(t, err) require.True(t, strings.Contains(string(res.ReturnData[0]), ticker)) @@ -1568,7 +1568,7 @@ func TestExecOnDestWithTokenTransferFromScAtoScBWithIntermediaryExecOnDest_NotEn Arguments: [][]byte{}, } - res, err := scQuery.ExecuteQuery(tokenIdQuery) + res, _, err := scQuery.ExecuteQuery(tokenIdQuery) require.Nil(t, err) tokenIdStr := string(res.ReturnData[0]) require.True(t, strings.Contains(tokenIdStr, ticker)) @@ -1858,7 +1858,7 @@ func TestExecOnDestWithTokenTransferFromScAtoScBWithScCall_GasUsedMismatch(t *te Arguments: [][]byte{}, } - res, err := scQuery.ExecuteQuery(tokenIdQuery) + res, _, err := scQuery.ExecuteQuery(tokenIdQuery) require.Nil(t, err) tokenIdStrLendBusd := string(res.ReturnData[0]) require.True(t, strings.Contains(tokenIdStrLendBusd, ticker)) @@ -1872,7 +1872,7 @@ func TestExecOnDestWithTokenTransferFromScAtoScBWithScCall_GasUsedMismatch(t *te Arguments: [][]byte{}, } - res, err = scQuery.ExecuteQuery(tokenIdQuery) + res, _, err = scQuery.ExecuteQuery(tokenIdQuery) require.Nil(t, err) tokenIdStrBorrow := string(res.ReturnData[0]) require.True(t, strings.Contains(tokenIdStrBorrow, ticker)) @@ -1919,12 +1919,12 @@ func TestExecOnDestWithTokenTransferFromScAtoScBWithScCall_GasUsedMismatch(t *te Arguments: [][]byte{}, } - res, err = scQuery.ExecuteQuery(borrowWEGLDtokenIdQuery) + res, _, err = scQuery.ExecuteQuery(borrowWEGLDtokenIdQuery) require.Nil(t, err) tokenIdStr := string(res.ReturnData[0]) require.True(t, strings.Contains(tokenIdStr, tickerWEGLD)) - res, err = scQuery.ExecuteQuery(lendWEGLDtokenIdQuery) + res, _, err = scQuery.ExecuteQuery(lendWEGLDtokenIdQuery) require.Nil(t, err) tokenIdStr = string(res.ReturnData[0]) require.True(t, strings.Contains(tokenIdStr, tickerWEGLD)) @@ -2209,7 +2209,7 @@ func TestIssueAndBurnESDT_MaxGasPerBlockExceeded(t *testing.T) { CallValue: big.NewInt(0), Arguments: [][]byte{[]byte(tokenIdentifier)}, } - vmOutput, err := n.SCQueryService.ExecuteQuery(scQuery) + vmOutput, _, err := n.SCQueryService.ExecuteQuery(scQuery) require.Nil(t, err) require.Equal(t, vmOutput.ReturnCode, vmcommon.Ok) diff --git a/integrationTests/vm/mockVM/vmGet/vmGet_test.go b/integrationTests/vm/mockVM/vmGet/vmGet_test.go index ff0b3487399..c9fd44eaa16 100644 --- a/integrationTests/vm/mockVM/vmGet/vmGet_test.go +++ b/integrationTests/vm/mockVM/vmGet/vmGet_test.go @@ -64,7 +64,7 @@ func TestVmGetShouldReturnValue(t *testing.T) { Arguments: [][]byte{}, } - vmOutput, err := service.ExecuteQuery(&query) + vmOutput, _, err := service.ExecuteQuery(&query) assert.Nil(t, err) returnData, _ := vmOutput.GetFirstReturnData(vmData.AsBigInt) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 5f3b6a9d40a..eab7cd30c9b 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -270,7 +270,7 @@ func (vmTestContext *VMTestContext) GetVMOutputWithTransientVM(funcName string, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) - vmOutput, err := scQueryService.ExecuteQuery(&process.SCQuery{ + vmOutput, _, err := scQueryService.ExecuteQuery(&process.SCQuery{ ScAddress: scAddressBytes, FuncName: funcName, Arguments: args, @@ -1694,7 +1694,7 @@ func GetVmOutput( } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) - vmOutput, err := scQueryService.ExecuteQuery(&process.SCQuery{ + vmOutput, _, err := scQueryService.ExecuteQuery(&process.SCQuery{ ScAddress: scAddressBytes, FuncName: funcName, Arguments: args, diff --git a/integrationTests/vm/wasm/delegation/testRunner.go b/integrationTests/vm/wasm/delegation/testRunner.go index 6d9d94bae5c..00833c38de8 100644 --- a/integrationTests/vm/wasm/delegation/testRunner.go +++ b/integrationTests/vm/wasm/delegation/testRunner.go @@ -159,14 +159,14 @@ func RunDelegationStressTest( getClaimableRewards.Arguments = [][]byte{copiedAddresses[j]} getUserStakeByType.Arguments = [][]byte{copiedAddresses[j]} - _, localErrQuery := scQuery.ExecuteQuery(getClaimableRewards) + _, _, localErrQuery := scQuery.ExecuteQuery(getClaimableRewards) if localErrQuery != nil { mutExecutionError.Lock() executionError = localErrQuery mutExecutionError.Unlock() } - _, localErrQuery = scQuery.ExecuteQuery(getUserStakeByType) + _, _, localErrQuery = scQuery.ExecuteQuery(getUserStakeByType) if localErrQuery != nil { mutExecutionError.Lock() executionError = localErrQuery diff --git a/integrationTests/vm/wasm/upgrades/upgrades_test.go b/integrationTests/vm/wasm/upgrades/upgrades_test.go index 2b2baa0f88f..26ced0d1963 100644 --- a/integrationTests/vm/wasm/upgrades/upgrades_test.go +++ b/integrationTests/vm/wasm/upgrades/upgrades_test.go @@ -342,7 +342,7 @@ func TestUpgrades_CounterTrialAndError(t *testing.T) { func query(t *testing.T, node *integrationTests.TestProcessorNode, scAddress []byte, function string) []byte { scQuery := node.SCQueryService - vmOutput, err := scQuery.ExecuteQuery(&process.SCQuery{ + vmOutput, _, err := scQuery.ExecuteQuery(&process.SCQuery{ ScAddress: scAddress, FuncName: function, Arguments: [][]byte{}, diff --git a/integrationTests/vm/wasm/utils.go b/integrationTests/vm/wasm/utils.go index 4abd924e81c..3193072531e 100644 --- a/integrationTests/vm/wasm/utils.go +++ b/integrationTests/vm/wasm/utils.go @@ -736,7 +736,7 @@ func (context *TestContext) querySC(function string, args [][]byte) []byte { Arguments: args, } - vmOutput, err := context.QueryService.ExecuteQuery(&query) + vmOutput, _, err := context.QueryService.ExecuteQuery(&query) require.Nil(context.T, err) firstResult := vmOutput.ReturnData[0] diff --git a/node/external/interface.go b/node/external/interface.go index c83ff94730c..a12ef177ce1 100644 --- a/node/external/interface.go +++ b/node/external/interface.go @@ -13,7 +13,7 @@ import ( // SCQueryService defines how data should be get from a SC account type SCQueryService interface { - ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) + ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) ComputeScCallGasLimit(tx *transaction.Transaction) (uint64, error) Close() error IsInterfaceNil() bool diff --git a/node/external/nodeApiResolver.go b/node/external/nodeApiResolver.go index 3561db2d4a0..15d7f445962 100644 --- a/node/external/nodeApiResolver.go +++ b/node/external/nodeApiResolver.go @@ -124,7 +124,7 @@ func NewNodeApiResolver(arg ArgNodeApiResolver) (*nodeApiResolver, error) { } // ExecuteSCQuery retrieves data stored in a SC account through a VM -func (nar *nodeApiResolver) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) { +func (nar *nodeApiResolver) ExecuteSCQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { return nar.scQueryService.ExecuteQuery(query) } diff --git a/node/external/nodeApiResolver_test.go b/node/external/nodeApiResolver_test.go index 595c01cfac7..207ff020400 100644 --- a/node/external/nodeApiResolver_test.go +++ b/node/external/nodeApiResolver_test.go @@ -158,14 +158,14 @@ func TestNodeApiResolver_GetDataValueShouldCall(t *testing.T) { arg := createMockArgs() wasCalled := false arg.SCQueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (vmOutput *vmcommon.VMOutput, e error) { + ExecuteQueryCalled: func(query *process.SCQuery) (vmOutput *vmcommon.VMOutput, info common.BlockInfo, e error) { wasCalled = true - return &vmcommon.VMOutput{}, nil + return &vmcommon.VMOutput{}, info, nil }, } nar, _ := external.NewNodeApiResolver(arg) - _, _ = nar.ExecuteSCQuery(&process.SCQuery{ + _, _, _ = nar.ExecuteSCQuery(&process.SCQuery{ ScAddress: []byte{0}, FuncName: "", }) diff --git a/node/mock/scQueryServiceStub.go b/node/mock/scQueryServiceStub.go index 64367ba2060..dcc1c01884e 100644 --- a/node/mock/scQueryServiceStub.go +++ b/node/mock/scQueryServiceStub.go @@ -2,19 +2,20 @@ package mock import ( "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process" vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) // SCQueryServiceStub - type SCQueryServiceStub struct { - ExecuteQueryCalled func(*process.SCQuery) (*vmcommon.VMOutput, error) + ExecuteQueryCalled func(*process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) ComputeScCallGasLimitHandler func(tx *transaction.Transaction) (uint64, error) CloseCalled func() error } // ExecuteQuery - -func (serviceStub *SCQueryServiceStub) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) { +func (serviceStub *SCQueryServiceStub) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { return serviceStub.ExecuteQueryCalled(query) } diff --git a/node/trieIterators/commonStakingProcessor.go b/node/trieIterators/commonStakingProcessor.go index db6137b8daa..e6518ae7601 100644 --- a/node/trieIterators/commonStakingProcessor.go +++ b/node/trieIterators/commonStakingProcessor.go @@ -30,7 +30,7 @@ func (csp *commonStakingProcessor) getValidatorInfoFromSC(validatorAddress []byt Arguments: [][]byte{validatorAddress}, } - vmOutput, err := csp.queryService.ExecuteQuery(scQuery) + vmOutput, _, err := csp.queryService.ExecuteQuery(scQuery) if err != nil { return nil, err } diff --git a/node/trieIterators/delegatedListProcessor.go b/node/trieIterators/delegatedListProcessor.go index db83f3d1b92..e53076f385f 100644 --- a/node/trieIterators/delegatedListProcessor.go +++ b/node/trieIterators/delegatedListProcessor.go @@ -69,7 +69,7 @@ func (dlp *delegatedListProcessor) getAllDelegationContractAddresses() ([][]byte Arguments: make([][]byte, 0), } - vmOutput, err := dlp.queryService.ExecuteQuery(scQuery) + vmOutput, _, err := dlp.queryService.ExecuteQuery(scQuery) if err != nil { return nil, err } @@ -172,7 +172,7 @@ func (dlp *delegatedListProcessor) getActiveFund(delegationSC []byte, delegator Arguments: [][]byte{delegator}, } - vmOutput, err := dlp.queryService.ExecuteQuery(scQuery) + vmOutput, _, err := dlp.queryService.ExecuteQuery(scQuery) if err != nil { return nil, err } diff --git a/node/trieIterators/delegatedListProcessor_test.go b/node/trieIterators/delegatedListProcessor_test.go index 97eea67188b..4718349dcf7 100644 --- a/node/trieIterators/delegatedListProcessor_test.go +++ b/node/trieIterators/delegatedListProcessor_test.go @@ -10,6 +10,7 @@ import ( "time" "github.com/multiversx/mx-chain-core-go/data/api" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/epochStart" "github.com/multiversx/mx-chain-go/node/mock" "github.com/multiversx/mx-chain-go/process" @@ -59,8 +60,8 @@ func TestDelegatedListProc_GetDelegatorsListGetAllContractAddressesFailsShouldEr expectedErr := errors.New("expected error") arg := createMockArgs() arg.QueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { - return nil, expectedErr + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { + return nil, nil, expectedErr }, } dlp, _ := NewDelegatedListProcessor(arg) @@ -71,10 +72,10 @@ func TestDelegatedListProc_GetDelegatorsListGetAllContractAddressesFailsShouldEr arg = createMockArgs() arg.QueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { return &vmcommon.VMOutput{ ReturnCode: vmcommon.UserError, - }, nil + }, nil, nil }, } dlp, _ = NewDelegatedListProcessor(arg) @@ -93,24 +94,24 @@ func TestDelegatedListProc_GetDelegatorsListContextShouldTimeout(t *testing.T) { arg.PublicKeyConverter = testscommon.NewPubkeyConverterMock(10) delegationSc := [][]byte{[]byte("delegationSc1"), []byte("delegationSc2")} arg.QueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { switch query.FuncName { case "getAllContractAddresses": return &vmcommon.VMOutput{ ReturnData: delegationSc, - }, nil + }, nil, nil case "getUserActiveStake": for index, delegator := range delegators { if bytes.Equal(delegator, query.Arguments[0]) { value := big.NewInt(int64(index + 1)) return &vmcommon.VMOutput{ ReturnData: [][]byte{value.Bytes()}, - }, nil + }, nil, nil } } } - return nil, fmt.Errorf("not an expected call") + return nil, nil, fmt.Errorf("not an expected call") }, } arg.Accounts.AccountsAdapter = &stateMock.AccountsStub{ @@ -140,24 +141,24 @@ func TestDelegatedListProc_GetDelegatorsListShouldWork(t *testing.T) { arg.PublicKeyConverter = testscommon.NewPubkeyConverterMock(10) delegationSc := [][]byte{[]byte("delegationSc1"), []byte("delegationSc2")} arg.QueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { switch query.FuncName { case "getAllContractAddresses": return &vmcommon.VMOutput{ ReturnData: delegationSc, - }, nil + }, nil, nil case "getUserActiveStake": for index, delegator := range delegators { if bytes.Equal(delegator, query.Arguments[0]) { value := big.NewInt(int64(index + 1)) return &vmcommon.VMOutput{ ReturnData: [][]byte{value.Bytes()}, - }, nil + }, nil, nil } } } - return nil, fmt.Errorf("not an expected call") + return nil, nil, fmt.Errorf("not an expected call") }, } arg.Accounts.AccountsAdapter = &stateMock.AccountsStub{ diff --git a/node/trieIterators/directStakedListProcessor_test.go b/node/trieIterators/directStakedListProcessor_test.go index bce97a0fc27..552ce65d218 100644 --- a/node/trieIterators/directStakedListProcessor_test.go +++ b/node/trieIterators/directStakedListProcessor_test.go @@ -65,8 +65,8 @@ func TestDirectStakedListProc_GetDelegatorsListContextShouldTimeout(t *testing.T arg := createMockArgs() arg.PublicKeyConverter = testscommon.NewPubkeyConverterMock(10) arg.QueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { - return nil, fmt.Errorf("not an expected call") + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { + return nil, nil, fmt.Errorf("not an expected call") }, } arg.Accounts.AccountsAdapter = &stateMock.AccountsStub{ @@ -95,7 +95,7 @@ func TestDirectStakedListProc_GetDelegatorsListShouldWork(t *testing.T) { arg := createMockArgs() arg.PublicKeyConverter = testscommon.NewPubkeyConverterMock(10) arg.QueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { switch query.FuncName { case "getTotalStakedTopUpStakedBlsKeys": for index, validator := range validators { @@ -105,12 +105,12 @@ func TestDirectStakedListProc_GetDelegatorsListShouldWork(t *testing.T) { return &vmcommon.VMOutput{ ReturnData: [][]byte{topUpValue.Bytes(), totalStakedValue.Bytes(), make([]byte, 0)}, - }, nil + }, nil, nil } } } - return nil, fmt.Errorf("not an expected call") + return nil, nil, fmt.Errorf("not an expected call") }, } arg.Accounts.AccountsAdapter = &stateMock.AccountsStub{ diff --git a/node/trieIterators/stakeValuesProcessor_test.go b/node/trieIterators/stakeValuesProcessor_test.go index 3bd51935238..43c991ff6d7 100644 --- a/node/trieIterators/stakeValuesProcessor_test.go +++ b/node/trieIterators/stakeValuesProcessor_test.go @@ -332,32 +332,32 @@ func TestTotalStakedValueProcessor_GetTotalStakedValue(t *testing.T) { }, } arg.QueryService = &mock.SCQueryServiceStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { switch string(query.Arguments[0]) { case leafKey3: return &vmcommon.VMOutput{ ReturnCode: vmcommon.UserError, - }, nil + }, nil, nil case leafKey4: - return &vmcommon.VMOutput{}, nil + return &vmcommon.VMOutput{}, nil, nil case leafKey5: return &vmcommon.VMOutput{ ReturnData: [][]byte{ big.NewInt(50).Bytes(), big.NewInt(100).Bytes(), big.NewInt(0).Bytes(), }, - }, nil + }, nil, nil case leafKey6: return &vmcommon.VMOutput{ ReturnData: [][]byte{ big.NewInt(60).Bytes(), big.NewInt(500).Bytes(), big.NewInt(0).Bytes(), }, - }, nil + }, nil, nil default: - return nil, expectedErr + return nil, nil, expectedErr } }, } diff --git a/process/interface.go b/process/interface.go index 577faf509cf..7e92bf5e2ab 100644 --- a/process/interface.go +++ b/process/interface.go @@ -920,7 +920,7 @@ type PeerValidatorMapper interface { // SCQueryService defines how data should be get from a SC account type SCQueryService interface { - ExecuteQuery(query *SCQuery) (*vmcommon.VMOutput, error) + ExecuteQuery(query *SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) ComputeScCallGasLimit(tx *transaction.Transaction) (uint64, error) Close() error IsInterfaceNil() bool diff --git a/process/mock/scQueryStub.go b/process/mock/scQueryStub.go index dc34004fc40..c2840a4314f 100644 --- a/process/mock/scQueryStub.go +++ b/process/mock/scQueryStub.go @@ -2,23 +2,24 @@ package mock import ( "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process" vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) // ScQueryStub - type ScQueryStub struct { - ExecuteQueryCalled func(query *process.SCQuery) (*vmcommon.VMOutput, error) + ExecuteQueryCalled func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) ComputeScCallGasLimitHandler func(tx *transaction.Transaction) (uint64, error) CloseCalled func() error } // ExecuteQuery - -func (s *ScQueryStub) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) { +func (s *ScQueryStub) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { if s.ExecuteQueryCalled != nil { return s.ExecuteQueryCalled(query) } - return &vmcommon.VMOutput{}, nil + return &vmcommon.VMOutput{}, nil, nil } // ComputeScCallGasLimit - diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 55efce1cb16..7c62d2b97de 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -16,6 +16,7 @@ import ( vmData "github.com/multiversx/mx-chain-core-go/data/vm" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/holders" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/dblookupext" "github.com/multiversx/mx-chain-go/process" @@ -141,16 +142,16 @@ func checkArgs(args ArgsNewSCQueryService) error { } // ExecuteQuery returns the VMOutput resulted upon running the function on the smart contract -func (service *SCQueryService) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) { +func (service *SCQueryService) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { if !service.shouldAllowQueriesExecution() { - return nil, process.ErrQueriesNotAllowedYet + return nil, nil, process.ErrQueriesNotAllowedYet } if query.ScAddress == nil { - return nil, process.ErrNilScAddress + return nil, nil, process.ErrNilScAddress } if len(query.FuncName) == 0 { - return nil, process.ErrEmptyFunctionName + return nil, nil, process.ErrEmptyFunctionName } service.mutRunSc.Lock() @@ -168,30 +169,41 @@ func (service *SCQueryService) shouldAllowQueriesExecution() bool { } } -func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice uint64) (*vmcommon.VMOutput, error) { +func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice uint64) (*vmcommon.VMOutput, common.BlockInfo, error) { log.Trace("executeScCall", "function", query.FuncName, "numQueries", service.numQueries) service.numQueries++ shouldEarlyExitBecauseOfSyncState := query.ShouldBeSynced && service.bootstrapper.GetNodeState() == common.NsNotSynchronized if shouldEarlyExitBecauseOfSyncState { - return nil, process.ErrNodeIsNotSynced + return nil, nil, process.ErrNodeIsNotSynced } - blockHeader, blockRootHash, err := service.extractBlockHeaderAndRootHash(query) + blockHeader, err := service.extractBlockHeader(query) if err != nil { - return nil, err + return nil, nil, err } + var blockRootHash, blockHash []byte + var blockNonce uint64 + + if !check.IfNil(blockHeader) { + blockRootHash = blockHeader.GetRootHash() + blockNonce = blockHeader.GetNonce() + blockHash, err = service.blockChainHook.GetBlockhash(blockNonce) + if err != nil { + return nil, nil, err + } + } if len(blockRootHash) > 0 { err = service.apiBlockChain.SetCurrentBlockHeaderAndRootHash(blockHeader, blockRootHash) if err != nil { - return nil, err + return nil, nil, err } accountsAdapter := service.blockChainHook.GetAccountsAdapter() err = accountsAdapter.RecreateTrie(blockRootHash) if err != nil { - return nil, err + return nil, nil, err } } @@ -208,7 +220,7 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui vm, _, err := scrCommon.FindVMByScAddress(service.vmContainer, query.ScAddress) if err != nil { service.wasmVMChangeLocker.RUnlock() - return nil, err + return nil, nil, err } query = prepareScQuery(query) @@ -216,7 +228,7 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui vmOutput, err := vm.RunSmartContractCall(vmInput) service.wasmVMChangeLocker.RUnlock() if err != nil { - return nil, err + return nil, nil, err } if service.hasRetriableExecutionError(vmOutput) { @@ -224,43 +236,44 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui vmOutput, err = vm.RunSmartContractCall(vmInput) if err != nil { - return nil, err + return nil, nil, err } } if query.SameScState { err = service.checkForRootHashChanges(rootHashBeforeExecution) if err != nil { - return nil, err + return nil, nil, err } } - return vmOutput, nil + blockInfo := holders.NewBlockInfo(blockHash, blockNonce, blockRootHash) + return vmOutput, blockInfo, nil } -func (service *SCQueryService) extractBlockHeaderAndRootHash(query *process.SCQuery) (data.HeaderHandler, []byte, error) { +// TODO: extract duplicated code with nodeBlocks.go +func (service *SCQueryService) extractBlockHeader(query *process.SCQuery) (data.HeaderHandler, error) { if len(query.BlockHash) > 0 { blockHeader, err := service.getBlockHeaderByHash(query.BlockHash) if err != nil { - return nil, make([]byte, 0), err + return nil, err } header := service.getBlockHeader(blockHeader) - return header, header.GetRootHash(), nil + return header, nil } if query.BlockNonce.HasValue { blockHeader, _, err := service.getBlockHeaderByNonce(query.BlockNonce.Value) if err != nil { - return nil, make([]byte, 0), err + return nil, err } - header := service.getBlockHeader(blockHeader) - return header, header.GetRootHash(), nil + return service.getBlockHeader(blockHeader), nil } - return service.mainBlockChain.GetCurrentBlockHeader(), service.mainBlockChain.GetCurrentBlockRootHash(), nil + return service.mainBlockChain.GetCurrentBlockHeader(), nil } func (service *SCQueryService) getBlockHeaderByHash(headerHash []byte) (data.HeaderHandler, error) { @@ -417,7 +430,7 @@ func (service *SCQueryService) ComputeScCallGasLimit(tx *transaction.Transaction service.mutRunSc.Lock() defer service.mutRunSc.Unlock() - vmOutput, err := service.executeScCall(query, 1) + vmOutput, _, err := service.executeScCall(query, 1) if err != nil { return 0, err } diff --git a/process/smartContract/scQueryServiceDispatcher.go b/process/smartContract/scQueryServiceDispatcher.go index b5efa9fba5a..2c51b47d55d 100644 --- a/process/smartContract/scQueryServiceDispatcher.go +++ b/process/smartContract/scQueryServiceDispatcher.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process" vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) @@ -38,7 +39,7 @@ func NewScQueryServiceDispatcher(list []process.SCQueryService) (*scQueryService } // ExecuteQuery will call this method on one of the element from provided list -func (sqsd *scQueryServiceDispatcher) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, error) { +func (sqsd *scQueryServiceDispatcher) ExecuteQuery(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { index := sqsd.getNewIndex() sqsd.mutList.RLock() diff --git a/process/smartContract/scQueryServiceDispatcher_test.go b/process/smartContract/scQueryServiceDispatcher_test.go index 26d7667ae3b..d738b0887d1 100644 --- a/process/smartContract/scQueryServiceDispatcher_test.go +++ b/process/smartContract/scQueryServiceDispatcher_test.go @@ -8,6 +8,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/mock" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -57,24 +58,24 @@ func TestScQueryServiceDispatcher_ExecuteQueryShouldCallInRoundRobinFashion(t *t calledElement2 := 0 sqsd, _ := NewScQueryServiceDispatcher([]process.SCQueryService{ &mock.ScQueryStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { calledElement1++ - return nil, nil + return nil, nil, nil }, }, &mock.ScQueryStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { calledElement2++ - return nil, nil + return nil, nil, nil }, }, }) - _, _ = sqsd.ExecuteQuery(nil) - _, _ = sqsd.ExecuteQuery(nil) - _, _ = sqsd.ExecuteQuery(nil) + _, _, _ = sqsd.ExecuteQuery(nil) + _, _, _ = sqsd.ExecuteQuery(nil) + _, _, _ = sqsd.ExecuteQuery(nil) assert.Equal(t, 2, calledElement1) assert.Equal(t, 1, calledElement2) @@ -117,10 +118,10 @@ func TestScQueryServiceDispatcher_ShouldWorkInAConcurrentManner(t *testing.T) { calledElement2 := uint32(0) sqsd, _ := NewScQueryServiceDispatcher([]process.SCQueryService{ &mock.ScQueryStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { atomic.AddUint32(&calledElement1, 1) - return nil, nil + return nil, nil, nil }, ComputeScCallGasLimitHandler: func(tx *transaction.Transaction) (uint64, error) { atomic.AddUint32(&calledElement1, 1) @@ -129,10 +130,10 @@ func TestScQueryServiceDispatcher_ShouldWorkInAConcurrentManner(t *testing.T) { }, }, &mock.ScQueryStub{ - ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, error) { + ExecuteQueryCalled: func(query *process.SCQuery) (*vmcommon.VMOutput, common.BlockInfo, error) { atomic.AddUint32(&calledElement2, 1) - return nil, nil + return nil, nil, nil }, ComputeScCallGasLimitHandler: func(tx *transaction.Transaction) (uint64, error) { atomic.AddUint32(&calledElement2, 1) @@ -147,7 +148,7 @@ func TestScQueryServiceDispatcher_ShouldWorkInAConcurrentManner(t *testing.T) { wg.Add(numCalls * 2) for i := 0; i < numCalls; i++ { go func() { - _, _ = sqsd.ExecuteQuery(nil) + _, _, _ = sqsd.ExecuteQuery(nil) wg.Done() }() go func() { diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index bd632989d33..0d715e0014a 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -204,7 +204,7 @@ func TestExecuteQuery_GetNilAddressShouldErr(t *testing.T) { Arguments: [][]byte{}, } - output, err := target.ExecuteQuery(&query) + output, _, err := target.ExecuteQuery(&query) assert.Nil(t, output) assert.Equal(t, process.ErrNilScAddress, err) @@ -222,7 +222,7 @@ func TestExecuteQuery_EmptyFunctionShouldErr(t *testing.T) { Arguments: [][]byte{}, } - output, err := target.ExecuteQuery(&query) + output, _, err := target.ExecuteQuery(&query) assert.Nil(t, output) assert.Equal(t, process.ErrEmptyFunctionName, err) @@ -242,12 +242,12 @@ func TestExecuteQuery_ShouldPerformActionsInRegardsToAllowanceChannel(t *testing Arguments: [][]byte{}, } - output, err := target.ExecuteQuery(&query) + output, _, err := target.ExecuteQuery(&query) assert.Equal(t, process.ErrQueriesNotAllowedYet, err) assert.Nil(t, output) close(chanAllowedQueries) - _, err = target.ExecuteQuery(&query) + _, _, err = target.ExecuteQuery(&query) assert.NoError(t, err) } @@ -283,10 +283,10 @@ func TestExecuteQuery_AllowanceChannelShouldWorkUnderConcurrentRequests(t *testi go func(idx int) { select { case <-chanAllowedQueries: - _, err := target.ExecuteQuery(&query) + _, _, err := target.ExecuteQuery(&query) assert.NoError(t, err) default: - output, err := target.ExecuteQuery(&query) + output, _, err := target.ExecuteQuery(&query) assert.Equal(t, process.ErrQueriesNotAllowedYet, err) assert.Nil(t, output) } @@ -345,7 +345,7 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { Arguments: dataArgs, } - _, _ = target.ExecuteQuery(&query) + _, _, _ = target.ExecuteQuery(&query) assert.True(t, runWasCalled) }) t.Run("block hash should work", func(t *testing.T) { @@ -433,7 +433,7 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { BlockHash: providedHash, } - _, _ = target.ExecuteQuery(&query) + _, _, _ = target.ExecuteQuery(&query) assert.True(t, runWasCalled) assert.True(t, wasRecreateTrieCalled) }) @@ -530,7 +530,7 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { }, } - _, _ = target.ExecuteQuery(&query) + _, _, _ = target.ExecuteQuery(&query) assert.True(t, runWasCalled) assert.True(t, wasRecreateTrieCalled) }) @@ -570,7 +570,7 @@ func TestExecuteQuery_ReturnsCorrectly(t *testing.T) { Arguments: [][]byte{}, } - vmOutput, err := target.ExecuteQuery(&query) + vmOutput, _, err := target.ExecuteQuery(&query) assert.Nil(t, err) assert.Equal(t, d[0], vmOutput.ReturnData[0]) @@ -611,7 +611,7 @@ func TestExecuteQuery_GasProvidedShouldBeApplied(t *testing.T) { Arguments: [][]byte{}, } - _, err := target.ExecuteQuery(&query) + _, _, err := target.ExecuteQuery(&query) require.Nil(t, err) require.True(t, runSCWasCalled) }) @@ -650,7 +650,7 @@ func TestExecuteQuery_GasProvidedShouldBeApplied(t *testing.T) { Arguments: [][]byte{}, } - _, err := target.ExecuteQuery(&query) + _, _, err := target.ExecuteQuery(&query) require.Nil(t, err) require.True(t, runSCWasCalled) }) @@ -687,7 +687,7 @@ func TestExecuteQuery_WhenNotOkCodeShouldNotErr(t *testing.T) { Arguments: [][]byte{}, } - returnedData, err := target.ExecuteQuery(&query) + returnedData, _, err := target.ExecuteQuery(&query) assert.Nil(t, err) assert.NotNil(t, returnedData) @@ -739,7 +739,7 @@ func TestExecuteQuery_ShouldCallRunScSequentially(t *testing.T) { Arguments: [][]byte{}, } - _, _ = target.ExecuteQuery(&query) + _, _, _ = target.ExecuteQuery(&query) wg.Done() }() } @@ -782,7 +782,7 @@ func TestSCQueryService_ExecuteQueryShouldNotIncludeCallerAddressAndValue(t *tes Arguments: [][]byte{}, } - _, err := target.ExecuteQuery(&query) + _, _, err := target.ExecuteQuery(&query) require.NoError(t, err) require.True(t, callerAddressAndCallValueAreNotSet) } @@ -826,7 +826,7 @@ func TestSCQueryService_ExecuteQueryShouldIncludeCallerAddressAndValue(t *testin Arguments: [][]byte{}, } - _, err := target.ExecuteQuery(&query) + _, _, err := target.ExecuteQuery(&query) require.NoError(t, err) require.True(t, callerAddressAndCallValueAreSet) } @@ -843,7 +843,7 @@ func TestSCQueryService_ShouldFailIfNodeIsNotSynced(t *testing.T) { qs, _ := NewSCQueryService(args) - res, err := qs.ExecuteQuery(&process.SCQuery{ + res, _, err := qs.ExecuteQuery(&process.SCQuery{ ShouldBeSynced: true, ScAddress: []byte(DummyScAddress), FuncName: "function", @@ -864,7 +864,7 @@ func TestSCQueryService_ShouldWorkIfNodeIsSynced(t *testing.T) { qs, _ := NewSCQueryService(args) - res, err := qs.ExecuteQuery(&process.SCQuery{ + res, _, err := qs.ExecuteQuery(&process.SCQuery{ ShouldBeSynced: true, ScAddress: []byte(DummyScAddress), FuncName: "function", @@ -901,7 +901,7 @@ func TestSCQueryService_ShouldFailIfStateChanged(t *testing.T) { qs, _ := NewSCQueryService(args) - res, err := qs.ExecuteQuery(&process.SCQuery{ + res, _, err := qs.ExecuteQuery(&process.SCQuery{ SameScState: true, ScAddress: []byte(DummyScAddress), FuncName: "function", @@ -926,7 +926,7 @@ func TestSCQueryService_ShouldWorkIfStateDidntChange(t *testing.T) { qs, _ := NewSCQueryService(args) - res, err := qs.ExecuteQuery(&process.SCQuery{ + res, _, err := qs.ExecuteQuery(&process.SCQuery{ SameScState: true, ScAddress: []byte(DummyScAddress), FuncName: "function", From a92a5d6d1dcf2975794d5a5b826cbd2b578bea66 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 7 Aug 2023 10:40:43 +0300 Subject: [PATCH 064/120] fix tests --- process/smartContract/scQueryService.go | 18 +++++++++--------- process/smartContract/scQueryService_test.go | 6 +++++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 7c62d2b97de..19aac72101d 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -178,16 +178,15 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return nil, nil, process.ErrNodeIsNotSynced } - blockHeader, err := service.extractBlockHeader(query) + blockHeader, blockRootHash, err := service.extractBlockHeaderAndRootHash(query) if err != nil { return nil, nil, err } - var blockRootHash, blockHash []byte + var blockHash []byte var blockNonce uint64 if !check.IfNil(blockHeader) { - blockRootHash = blockHeader.GetRootHash() blockNonce = blockHeader.GetNonce() blockHash, err = service.blockChainHook.GetBlockhash(blockNonce) if err != nil { @@ -252,28 +251,29 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui } // TODO: extract duplicated code with nodeBlocks.go -func (service *SCQueryService) extractBlockHeader(query *process.SCQuery) (data.HeaderHandler, error) { +func (service *SCQueryService) extractBlockHeaderAndRootHash(query *process.SCQuery) (data.HeaderHandler, []byte, error) { if len(query.BlockHash) > 0 { blockHeader, err := service.getBlockHeaderByHash(query.BlockHash) if err != nil { - return nil, err + return nil, nil, err } header := service.getBlockHeader(blockHeader) - return header, nil + return header, header.GetRootHash(), nil } if query.BlockNonce.HasValue { blockHeader, _, err := service.getBlockHeaderByNonce(query.BlockNonce.Value) if err != nil { - return nil, err + return nil, nil, err } - return service.getBlockHeader(blockHeader), nil + header := service.getBlockHeader(blockHeader) + return header, header.GetRootHash(), nil } - return service.mainBlockChain.GetCurrentBlockHeader(), nil + return service.mainBlockChain.GetCurrentBlockHeader(), service.mainBlockChain.GetCurrentBlockRootHash(), nil } func (service *SCQueryService) getBlockHeaderByHash(headerHash []byte) (data.HeaderHandler, error) { diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 0d715e0014a..4dc212ae515 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -40,7 +40,11 @@ func createMockArgumentsForSCQuery() ArgsNewSCQueryService { EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, BlockChainHook: &testscommon.BlockChainHookStub{ GetAccountsAdapterCalled: func() state.AccountsAdapter { - return &stateMocks.AccountsStub{} + return &stateMocks.AccountsStub{ + RecreateTrieCalled: func(rootHash []byte) error { + return nil + }, + } }, }, MainBlockChain: &testscommon.ChainHandlerStub{}, From 6ebc69bca04627ba9d3750c3cc081a3aba9358b5 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 7 Aug 2023 11:36:09 +0300 Subject: [PATCH 065/120] fixed get header hash --- process/smartContract/scQueryService.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 19aac72101d..515b056d81b 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -188,7 +188,7 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui if !check.IfNil(blockHeader) { blockNonce = blockHeader.GetNonce() - blockHash, err = service.blockChainHook.GetBlockhash(blockNonce) + blockHash, err = service.getBlockHashByNonce(blockNonce) if err != nil { return nil, nil, err } From 36d361dbce6fcc3b72cb230a27802f7a690a463a Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 7 Aug 2023 12:32:15 +0300 Subject: [PATCH 066/120] fixed more tests --- integrationTests/vm/testInitializer.go | 6 +++++- process/smartContract/scQueryService_test.go | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index eab7cd30c9b..bdeffc105fc 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -1744,7 +1744,11 @@ func ComputeGasLimit(gasSchedule map[string]map[string]uint64, testContext *VMTe AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), HistoryRepository: &dblookupext.HistoryRepositoryStub{}, ShardCoordinator: testContext.ShardCoordinator, - StorageService: &storageStubs.ChainStorerStub{}, + StorageService: &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { + return &storageStubs.StorerStub{}, nil + }, + }, Marshaller: integrationTests.TestMarshalizer, Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 4dc212ae515..0cef17f6c60 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -54,7 +54,11 @@ func createMockArgumentsForSCQuery() ArgsNewSCQueryService { AllowExternalQueriesChan: common.GetClosedUnbufferedChannel(), HistoryRepository: &dblookupext.HistoryRepositoryStub{}, ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), - StorageService: &storageStubs.ChainStorerStub{}, + StorageService: &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { + return &storageStubs.StorerStub{}, nil + }, + }, Marshaller: &marshallerMock.MarshalizerStub{}, Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } From 2d20a97fd6fa07a4837d2a1d40da70fbf2653d04 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 7 Aug 2023 14:24:04 +0300 Subject: [PATCH 067/120] fixes after review --- api/groups/vmValuesGroup_test.go | 26 ++- factory/api/apiResolverFactory.go | 185 ++++++++++-------- genesis/process/metaGenesisBlockCreator.go | 1 + genesis/process/shardGenesisBlockCreator.go | 1 + integrationTests/testProcessorNode.go | 3 + .../vm/mockVM/vmGet/vmGet_test.go | 1 + integrationTests/vm/testInitializer.go | 2 + integrationTests/vm/wasm/utils.go | 1 + process/smartContract/scQueryService.go | 26 ++- process/smartContract/scQueryService_test.go | 12 ++ 10 files changed, 159 insertions(+), 99 deletions(-) diff --git a/api/groups/vmValuesGroup_test.go b/api/groups/vmValuesGroup_test.go index ea8bf117a96..f568b7ed1e3 100644 --- a/api/groups/vmValuesGroup_test.go +++ b/api/groups/vmValuesGroup_test.go @@ -47,8 +47,9 @@ type simpleResponse struct { } type vmOutputResponse struct { - Data *vmcommon.VMOutput `json:"data"` - Error string `json:"error"` + Data *vmcommon.VMOutput `json:"data"` + BlockInfo api.BlockInfo `json:"blockInfo"` + Error string `json:"error"` } func init() { @@ -181,15 +182,32 @@ func TestQuery(t *testing.T) { t.Run("should work - no block coordinates", func(t *testing.T) { t.Parallel() + providedBlockInfo := api.BlockInfo{ + Nonce: 12, + Hash: "provided hash", + RootHash: "provided root hash", + } facade := mock.FacadeStub{ ExecuteSCQueryHandler: func(query *process.SCQuery) (*vm.VMOutputApi, api.BlockInfo, error) { return &vm.VMOutputApi{ ReturnData: [][]byte{big.NewInt(42).Bytes()}, - }, api.BlockInfo{}, nil + }, providedBlockInfo, nil }, } - testQueryShouldWork(t, "/vm-values/query", &facade) + request := groups.VMValueRequest{ + ScAddress: dummyScAddress, + FuncName: "function", + Args: []string{}, + } + + response := vmOutputResponse{} + statusCode := doPost(t, &facade, "/vm-values/query", request, &response) + + require.Equal(t, http.StatusOK, statusCode) + require.Equal(t, "", response.Error) + require.Equal(t, int64(42), big.NewInt(0).SetBytes(response.Data.ReturnData[0]).Int64()) + require.Equal(t, providedBlockInfo, response.BlockInfo) }) } diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index fa0f429192d..bd5c1d4abc9 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -341,7 +341,6 @@ func createScQueryService( func createScQueryElement( args *scQueryElementArgs, ) (process.SCQueryService, error) { - var vmFactory process.VirtualMachinesContainerFactory var err error pkConverter := args.coreComponents.AddressPubKeyConverter() @@ -403,94 +402,16 @@ func createScQueryElement( } var apiBlockchain data.ChainHandler + var vmFactory process.VirtualMachinesContainerFactory maxGasForVmQueries := args.generalConfig.VirtualMachine.GasConfig.ShardMaxGasPerVmQuery if args.processComponents.ShardCoordinator().SelfId() == core.MetachainShardId { - apiBlockchain, err = blockchain.NewMetaChain(disabled.NewAppStatusHandler()) - if err != nil { - return nil, err - } - - accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) - if err != nil { - return nil, err - } - - argsHook.BlockChain = apiBlockchain - argsHook.Accounts = accountsAdapterApi - maxGasForVmQueries = args.generalConfig.VirtualMachine.GasConfig.MetaMaxGasPerVmQuery - - blockChainHookImpl, errBlockChainHook := hooks.NewBlockChainHookImpl(argsHook) - if errBlockChainHook != nil { - return nil, errBlockChainHook - } - - argsNewVmFactory := metachain.ArgsNewVMContainerFactory{ - BlockChainHook: blockChainHookImpl, - PubkeyConv: argsHook.PubkeyConv, - Economics: args.coreComponents.EconomicsData(), - MessageSignVerifier: args.messageSigVerifier, - GasSchedule: args.gasScheduleNotifier, - NodesConfigProvider: args.coreComponents.GenesisNodesSetup(), - Hasher: args.coreComponents.Hasher(), - Marshalizer: args.coreComponents.InternalMarshalizer(), - SystemSCConfig: args.systemSCConfig, - ValidatorAccountsDB: args.stateComponents.PeerAccounts(), - UserAccountsDB: args.stateComponents.AccountsAdapterAPI(), - ChanceComputer: args.coreComponents.Rater(), - ShardCoordinator: args.processComponents.ShardCoordinator(), - EnableEpochsHandler: args.coreComponents.EnableEpochsHandler(), - } - vmFactory, err = metachain.NewVMContainerFactory(argsNewVmFactory) - if err != nil { - return nil, err - } + apiBlockchain, vmFactory, err = createMetaVmContainerFactory(args, argsHook) } else { - apiBlockchain, err = blockchain.NewBlockChain(disabled.NewAppStatusHandler()) - if err != nil { - return nil, err - } - - accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) - if err != nil { - return nil, err - } - - argsHook.BlockChain = apiBlockchain - argsHook.Accounts = accountsAdapterApi - - queryVirtualMachineConfig := args.generalConfig.VirtualMachine.Querying.VirtualMachineConfig - esdtTransferParser, errParser := parsers.NewESDTTransferParser(args.coreComponents.InternalMarshalizer()) - if errParser != nil { - return nil, errParser - } - - blockChainHookImpl, errBlockChainHook := hooks.NewBlockChainHookImpl(argsHook) - if errBlockChainHook != nil { - return nil, errBlockChainHook - } - - argsNewVMFactory := shard.ArgVMContainerFactory{ - BlockChainHook: blockChainHookImpl, - BuiltInFunctions: argsHook.BuiltInFunctions, - Config: queryVirtualMachineConfig, - BlockGasLimit: args.coreComponents.EconomicsData().MaxGasLimitPerBlock(args.processComponents.ShardCoordinator().SelfId()), - GasSchedule: args.gasScheduleNotifier, - EpochNotifier: args.coreComponents.EpochNotifier(), - EnableEpochsHandler: args.coreComponents.EnableEpochsHandler(), - WasmVMChangeLocker: args.coreComponents.WasmVMChangeLocker(), - ESDTTransferParser: esdtTransferParser, - Hasher: args.coreComponents.Hasher(), - } - - log.Debug("apiResolver: enable epoch for sc deploy", "epoch", args.epochConfig.EnableEpochs.SCDeployEnableEpoch) - log.Debug("apiResolver: enable epoch for ahead of time gas usage", "epoch", args.epochConfig.EnableEpochs.AheadOfTimeGasUsageEnableEpoch) - log.Debug("apiResolver: enable epoch for repair callback", "epoch", args.epochConfig.EnableEpochs.RepairCallbackEnableEpoch) - - vmFactory, err = shard.NewVMContainerFactory(argsNewVMFactory) - if err != nil { - return nil, err - } + apiBlockchain, vmFactory, err = createShardVmContainerFactory(args, argsHook) + } + if err != nil { + return nil, err } log.Debug("maximum gas per VM Query", "value", maxGasForVmQueries) @@ -524,12 +445,106 @@ func createScQueryElement( ShardCoordinator: args.processComponents.ShardCoordinator(), StorageService: args.dataComponents.StorageService(), Marshaller: args.coreComponents.InternalMarshalizer(), + Hasher: args.coreComponents.Hasher(), Uint64ByteSliceConverter: args.coreComponents.Uint64ByteSliceConverter(), } return smartContract.NewSCQueryService(argsNewSCQueryService) } +func createMetaVmContainerFactory(args *scQueryElementArgs, argsHook hooks.ArgBlockChainHook) (data.ChainHandler, process.VirtualMachinesContainerFactory, error) { + apiBlockchain, err := blockchain.NewMetaChain(disabled.NewAppStatusHandler()) + if err != nil { + return nil, nil, err + } + + accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) + if err != nil { + return nil, nil, err + } + + argsHook.BlockChain = apiBlockchain + argsHook.Accounts = accountsAdapterApi + + blockChainHookImpl, errBlockChainHook := hooks.NewBlockChainHookImpl(argsHook) + if errBlockChainHook != nil { + return nil, nil, errBlockChainHook + } + + argsNewVmFactory := metachain.ArgsNewVMContainerFactory{ + BlockChainHook: blockChainHookImpl, + PubkeyConv: argsHook.PubkeyConv, + Economics: args.coreComponents.EconomicsData(), + MessageSignVerifier: args.messageSigVerifier, + GasSchedule: args.gasScheduleNotifier, + NodesConfigProvider: args.coreComponents.GenesisNodesSetup(), + Hasher: args.coreComponents.Hasher(), + Marshalizer: args.coreComponents.InternalMarshalizer(), + SystemSCConfig: args.systemSCConfig, + ValidatorAccountsDB: args.stateComponents.PeerAccounts(), + UserAccountsDB: args.stateComponents.AccountsAdapterAPI(), + ChanceComputer: args.coreComponents.Rater(), + ShardCoordinator: args.processComponents.ShardCoordinator(), + EnableEpochsHandler: args.coreComponents.EnableEpochsHandler(), + } + vmFactory, err := metachain.NewVMContainerFactory(argsNewVmFactory) + if err != nil { + return nil, nil, err + } + + return apiBlockchain, vmFactory, nil +} + +func createShardVmContainerFactory(args *scQueryElementArgs, argsHook hooks.ArgBlockChainHook) (data.ChainHandler, process.VirtualMachinesContainerFactory, error) { + apiBlockchain, err := blockchain.NewBlockChain(disabled.NewAppStatusHandler()) + if err != nil { + return nil, nil, err + } + + accountsAdapterApi, err := createNewAccountsAdapterApi(args, apiBlockchain) + if err != nil { + return nil, nil, err + } + + argsHook.BlockChain = apiBlockchain + argsHook.Accounts = accountsAdapterApi + + queryVirtualMachineConfig := args.generalConfig.VirtualMachine.Querying.VirtualMachineConfig + esdtTransferParser, errParser := parsers.NewESDTTransferParser(args.coreComponents.InternalMarshalizer()) + if errParser != nil { + return nil, nil, errParser + } + + blockChainHookImpl, errBlockChainHook := hooks.NewBlockChainHookImpl(argsHook) + if errBlockChainHook != nil { + return nil, nil, errBlockChainHook + } + + argsNewVMFactory := shard.ArgVMContainerFactory{ + BlockChainHook: blockChainHookImpl, + BuiltInFunctions: argsHook.BuiltInFunctions, + Config: queryVirtualMachineConfig, + BlockGasLimit: args.coreComponents.EconomicsData().MaxGasLimitPerBlock(args.processComponents.ShardCoordinator().SelfId()), + GasSchedule: args.gasScheduleNotifier, + EpochNotifier: args.coreComponents.EpochNotifier(), + EnableEpochsHandler: args.coreComponents.EnableEpochsHandler(), + WasmVMChangeLocker: args.coreComponents.WasmVMChangeLocker(), + ESDTTransferParser: esdtTransferParser, + Hasher: args.coreComponents.Hasher(), + } + + log.Debug("apiResolver: enable epoch for sc deploy", "epoch", args.epochConfig.EnableEpochs.SCDeployEnableEpoch) + log.Debug("apiResolver: enable epoch for ahead of time gas usage", "epoch", args.epochConfig.EnableEpochs.AheadOfTimeGasUsageEnableEpoch) + log.Debug("apiResolver: enable epoch for repair callback", "epoch", args.epochConfig.EnableEpochs.RepairCallbackEnableEpoch) + + vmFactory, err := shard.NewVMContainerFactory(argsNewVMFactory) + if err != nil { + return nil, nil, err + } + + return apiBlockchain, vmFactory, nil +} + func createNewAccountsAdapterApi(args *scQueryElementArgs, chainHandler data.ChainHandler) (state.AccountsAdapterAPI, error) { argsAccCreator := factoryState.ArgsAccountCreator{ Hasher: args.coreComponents.Hasher(), diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index f98b748901c..f6be1cf5a8d 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -570,6 +570,7 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc ShardCoordinator: arg.ShardCoordinator, StorageService: arg.Data.StorageService(), Marshaller: arg.Core.InternalMarshalizer(), + Hasher: arg.Core.Hasher(), Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), } queryService, err := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index a6c360ac09a..9891eba85bc 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -712,6 +712,7 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo ShardCoordinator: arg.ShardCoordinator, StorageService: arg.Data.StorageService(), Marshaller: arg.Core.InternalMarshalizer(), + Hasher: arg.Core.Hasher(), Uint64ByteSliceConverter: arg.Core.Uint64ByteSliceConverter(), } queryService, err := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 7f6e5685ab6..6a452eea1d2 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -807,6 +807,7 @@ func (tpn *TestProcessorNode) initTestNodeWithArgs(args ArgTestProcessorNode) { ShardCoordinator: tpn.ShardCoordinator, StorageService: tpn.Storage, Marshaller: TestMarshaller, + Hasher: TestHasher, Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) @@ -1004,6 +1005,7 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str ShardCoordinator: tpn.ShardCoordinator, StorageService: tpn.Storage, Marshaller: TestMarshaller, + Hasher: TestHasher, Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) @@ -1033,6 +1035,7 @@ func (tpn *TestProcessorNode) InitializeProcessors(gasMap map[string]map[string] ShardCoordinator: tpn.ShardCoordinator, StorageService: tpn.Storage, Marshaller: TestMarshaller, + Hasher: TestHasher, Uint64ByteSliceConverter: TestUint64Converter, } tpn.SCQueryService, _ = smartContract.NewSCQueryService(argsNewScQueryService) diff --git a/integrationTests/vm/mockVM/vmGet/vmGet_test.go b/integrationTests/vm/mockVM/vmGet/vmGet_test.go index c9fd44eaa16..bd818df6884 100644 --- a/integrationTests/vm/mockVM/vmGet/vmGet_test.go +++ b/integrationTests/vm/mockVM/vmGet/vmGet_test.go @@ -53,6 +53,7 @@ func TestVmGetShouldReturnValue(t *testing.T) { ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), StorageService: &storageStubs.ChainStorerStub{}, Marshaller: &marshallerMock.MarshalizerStub{}, + Hasher: &testscommon.HasherStub{}, Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } service, _ := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index bdeffc105fc..451a4241040 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -1690,6 +1690,7 @@ func GetVmOutput( ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), StorageService: &storageStubs.ChainStorerStub{}, Marshaller: integrationTests.TestMarshalizer, + Hasher: integrationtests.TestHasher, Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) @@ -1750,6 +1751,7 @@ func ComputeGasLimit(gasSchedule map[string]map[string]uint64, testContext *VMTe }, }, Marshaller: integrationTests.TestMarshalizer, + Hasher: integrationtests.TestHasher, Uint64ByteSliceConverter: integrationTests.TestUint64Converter, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/integrationTests/vm/wasm/utils.go b/integrationTests/vm/wasm/utils.go index 3193072531e..a2a24b72335 100644 --- a/integrationTests/vm/wasm/utils.go +++ b/integrationTests/vm/wasm/utils.go @@ -176,6 +176,7 @@ func SetupTestContextWithGasSchedule(t *testing.T, gasSchedule map[string]map[st ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), StorageService: &storageStubs.ChainStorerStub{}, Marshaller: &marshallerMock.MarshalizerStub{}, + Hasher: &testscommon.HasherStub{}, Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } context.QueryService, _ = smartContract.NewSCQueryService(argsNewSCQueryService) diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 515b056d81b..43d484b83de 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -14,6 +14,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-core-go/data/typeConverters" vmData "github.com/multiversx/mx-chain-core-go/data/vm" + "github.com/multiversx/mx-chain-core-go/hashing" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/common/holders" @@ -45,6 +46,7 @@ type SCQueryService struct { shardCoordinator sharding.Coordinator storageService dataRetriever.StorageService marshaller marshal.Marshalizer + hasher hashing.Hasher uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter } @@ -63,6 +65,7 @@ type ArgsNewSCQueryService struct { ShardCoordinator sharding.Coordinator StorageService dataRetriever.StorageService Marshaller marshal.Marshalizer + Hasher hashing.Hasher Uint64ByteSliceConverter typeConverters.Uint64ByteSliceConverter } @@ -93,6 +96,7 @@ func NewSCQueryService( shardCoordinator: args.ShardCoordinator, storageService: args.StorageService, marshaller: args.Marshaller, + hasher: args.Hasher, uint64ByteSliceConverter: args.Uint64ByteSliceConverter, }, nil } @@ -134,6 +138,9 @@ func checkArgs(args ArgsNewSCQueryService) error { if check.IfNil(args.Marshaller) { return process.ErrNilMarshalizer } + if check.IfNil(args.Hasher) { + return process.ErrNilHasher + } if check.IfNil(args.Uint64ByteSliceConverter) { return process.ErrNilUint64Converter } @@ -183,16 +190,6 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui return nil, nil, err } - var blockHash []byte - var blockNonce uint64 - - if !check.IfNil(blockHeader) { - blockNonce = blockHeader.GetNonce() - blockHash, err = service.getBlockHashByNonce(blockNonce) - if err != nil { - return nil, nil, err - } - } if len(blockRootHash) > 0 { err = service.apiBlockChain.SetCurrentBlockHeaderAndRootHash(blockHeader, blockRootHash) if err != nil { @@ -246,6 +243,15 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui } } + var blockHash []byte + var blockNonce uint64 + if !check.IfNil(blockHeader) { + blockNonce = blockHeader.GetNonce() + blockHash, err = core.CalculateHash(service.marshaller, service.hasher, blockHeader) + if err != nil { + return nil, nil, err + } + } blockInfo := holders.NewBlockInfo(blockHash, blockNonce, blockRootHash) return vmOutput, blockInfo, nil } diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 0cef17f6c60..8c07c283f7d 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -60,6 +60,7 @@ func createMockArgumentsForSCQuery() ArgsNewSCQueryService { }, }, Marshaller: &marshallerMock.MarshalizerStub{}, + Hasher: &testscommon.HasherStub{}, Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } } @@ -178,6 +179,16 @@ func TestNewSCQueryService(t *testing.T) { assert.Nil(t, target) assert.Equal(t, process.ErrNilMarshalizer, err) }) + t.Run("nil Hasher should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgumentsForSCQuery() + args.Hasher = nil + target, err := NewSCQueryService(args) + + assert.Nil(t, target) + assert.Equal(t, process.ErrNilHasher, err) + }) t.Run("nil Uint64ByteSliceConverter should error", func(t *testing.T) { t.Parallel() @@ -1036,6 +1047,7 @@ func TestNewSCQueryService_CloseShouldWork(t *testing.T) { ShardCoordinator: testscommon.NewMultiShardsCoordinatorMock(1), StorageService: &storageStubs.ChainStorerStub{}, Marshaller: &marshallerMock.MarshalizerStub{}, + Hasher: &testscommon.HasherStub{}, Uint64ByteSliceConverter: &mock.Uint64ByteSliceConverterMock{}, } From 22138565e8e6c48bd949d426818f3cab7763b7ec Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 11 Aug 2023 12:20:30 +0300 Subject: [PATCH 068/120] update libp2p version --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index cb4e6410e6b..92da9e55380 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.3.20 github.com/multiversx/mx-chain-logger-go v1.0.11 - github.com/multiversx/mx-chain-p2p-go v1.0.17 + github.com/multiversx/mx-chain-p2p-go v1.0.18-0.20230811091637-b7cd26e03c0e github.com/multiversx/mx-chain-storage-go v1.0.7 github.com/multiversx/mx-chain-vm-common-go v1.3.42 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54 @@ -92,7 +92,7 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect github.com/libp2p/go-flow-metrics v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.28.1 // indirect + github.com/libp2p/go-libp2p v0.28.2 // indirect github.com/libp2p/go-libp2p-asn-util v0.3.0 // indirect github.com/libp2p/go-libp2p-kad-dht v0.23.0 // indirect github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect @@ -140,8 +140,8 @@ require ( github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/quic-go/qpack v0.4.0 // indirect - github.com/quic-go/qtls-go1-19 v0.3.2 // indirect - github.com/quic-go/qtls-go1-20 v0.2.2 // indirect + github.com/quic-go/qtls-go1-19 v0.3.3 // indirect + github.com/quic-go/qtls-go1-20 v0.2.3 // indirect github.com/quic-go/quic-go v0.33.0 // indirect github.com/quic-go/webtransport-go v0.5.3 // indirect github.com/raulk/go-watchdog v1.3.0 // indirect diff --git a/go.sum b/go.sum index 0456f878ac5..a602eff451c 100644 --- a/go.sum +++ b/go.sum @@ -281,8 +281,8 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= -github.com/libp2p/go-libp2p v0.28.1 h1:YurK+ZAI6cKfASLJBVFkpVBdl3wGhFi6fusOt725ii8= -github.com/libp2p/go-libp2p v0.28.1/go.mod h1:s3Xabc9LSwOcnv9UD4nORnXKTsWkPMkIMB/JIGXVnzk= +github.com/libp2p/go-libp2p v0.28.2 h1:lO/g0ccVru6nUVHyLE7C1VRr7B2AFp9cvHhf+l+Te6w= +github.com/libp2p/go-libp2p v0.28.2/go.mod h1:fOLgCNgLiWFdmtXyQBwmuCpukaYOA+yw4rnBiScDNmI= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-asn-util v0.3.0/go.mod h1:B1mcOrKUE35Xq/ASTmQ4tN3LNzVVaMNmq2NACuqyB9w= github.com/libp2p/go-libp2p-kad-dht v0.23.0 h1:sxE6LxLopp79eLeV695n7+c77V/Vn4AMF28AdM/XFqM= @@ -377,8 +377,8 @@ github.com/multiversx/mx-chain-es-indexer-go v1.3.20 h1:/82eDBsjlEm6dNgW44WQOBqK github.com/multiversx/mx-chain-es-indexer-go v1.3.20/go.mod h1:B8ahv6M93qHallA9fN+yknQFzdrDhHDgVlCy/0PVcG0= github.com/multiversx/mx-chain-logger-go v1.0.11 h1:DFsHa+sc5fKwhDR50I8uBM99RTDTEW68ESyr5ALRDwE= github.com/multiversx/mx-chain-logger-go v1.0.11/go.mod h1:1srDkP0DQucWQ+rYfaq0BX2qLnULsUdRPADpYUTM6dA= -github.com/multiversx/mx-chain-p2p-go v1.0.17 h1:ijAwm/J4TqcDJvbWpGW9cQDNzfeaN/KfJYEVaTvM5c0= -github.com/multiversx/mx-chain-p2p-go v1.0.17/go.mod h1:Z7zPjv7adFUembS0XgxfecvvJTJOaGy09jT5JGqFyf0= +github.com/multiversx/mx-chain-p2p-go v1.0.18-0.20230811091637-b7cd26e03c0e h1:tXA7RocQRrYmO69weBOzuA8o0FvMV2tR9xIqpdVzI10= +github.com/multiversx/mx-chain-p2p-go v1.0.18-0.20230811091637-b7cd26e03c0e/go.mod h1:Xy1B8X+AaGafDNcI6QZsTxO6bBf4akEyq+WdGRWSCpI= github.com/multiversx/mx-chain-storage-go v1.0.7 h1:UqLo/OLTD3IHiE/TB/SEdNRV1GG2f1R6vIP5ehHwCNw= github.com/multiversx/mx-chain-storage-go v1.0.7/go.mod h1:gtKoV32Cg2Uy8deHzF8Ud0qAl0zv92FvWgPSYIP0Zmg= github.com/multiversx/mx-chain-vm-common-go v1.3.42 h1:avhgUwi6f+wpHqaBk76j6islLzUlSRBXwisKoZnUXpk= @@ -446,10 +446,10 @@ github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJf github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= +github.com/quic-go/qtls-go1-19 v0.3.3 h1:wznEHvJwd+2X3PqftRha0SUKmGsnb6dfArMhy9PeJVE= +github.com/quic-go/qtls-go1-19 v0.3.3/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI= +github.com/quic-go/qtls-go1-20 v0.2.3 h1:m575dovXn1y2ATOb1XrRFcrv0F+EQmlowTkoraNkDPI= +github.com/quic-go/qtls-go1-20 v0.2.3/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM= github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= github.com/quic-go/quic-go v0.33.0/go.mod h1:YMuhaAV9/jIu0XclDXwZPAsP/2Kgr5yMYhe9oxhhOFA= github.com/quic-go/webtransport-go v0.5.3 h1:5XMlzemqB4qmOlgIus5zB45AcZ2kCgCy2EptUrfOPWU= From 80074d825395ec30c937f04e3e67ada5e3cf01e6 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 11 Aug 2023 12:23:42 +0300 Subject: [PATCH 069/120] update GitHub actions compiler version to go v1.20.7 --- .github/workflows/build_and_test.yml | 4 ++-- .github/workflows/check-cli-md.yml | 4 ++-- .github/workflows/code-coverage.yml | 4 ++-- .github/workflows/create_release.yml | 4 ++-- .github/workflows/golangci-lint.yml | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 1465c7861e1..10feacf5ef4 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -15,10 +15,10 @@ jobs: runs-on: ${{ matrix.runs-on }} name: Build steps: - - name: Set up Go 1.20.5 + - name: Set up Go 1.20.7 uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.7 id: go - name: Check out code into the Go module directory diff --git a/.github/workflows/check-cli-md.yml b/.github/workflows/check-cli-md.yml index 84b09a59efc..b72067e9704 100644 --- a/.github/workflows/check-cli-md.yml +++ b/.github/workflows/check-cli-md.yml @@ -15,10 +15,10 @@ jobs: runs-on: ${{ matrix.runs-on }} name: Check CLI.md steps: - - name: Set up Go 1.20.5 + - name: Set up Go 1.20.7 uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.7 id: go - name: Check out code into the Go module directory diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index b073be0add4..f4042a169a4 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -17,10 +17,10 @@ jobs: runs-on: ${{ matrix.runs-on }} name: Build steps: - - name: Set up Go 1.20.5 + - name: Set up Go 1.20.7 uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.7 id: go - name: Check out code into the Go module directory diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 804ce84df47..8ef45792c80 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -19,10 +19,10 @@ jobs: runs-on: ${{ matrix.runs-on }} name: Build steps: - - name: Set up Go 1.20.5 + - name: Set up Go 1.20.7 uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.7 id: go - name: Check out code into the Go module directory diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 3398482e281..611fadc3d08 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -16,7 +16,7 @@ jobs: steps: - uses: actions/setup-go@v3 with: - go-version: 1.20.5 + go-version: 1.20.7 - uses: actions/checkout@v3 - name: golangci-lint uses: golangci/golangci-lint-action@v3 From 2f4c11fa3e186adc895bcd315f4a18decfb85ee0 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 11 Aug 2023 12:54:54 +0300 Subject: [PATCH 070/120] update dockerfiles --- docker/keygenerator/Dockerfile | 2 +- docker/multiversx/Dockerfile | 2 +- docker/seednode/Dockerfile | 2 +- docker/termui/Dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/keygenerator/Dockerfile b/docker/keygenerator/Dockerfile index 4b2cfdcd7cf..6dbb88f9a93 100644 --- a/docker/keygenerator/Dockerfile +++ b/docker/keygenerator/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.17.6 as builder +FROM golang:1.20.7 as builder RUN apt-get update && apt-get install -y WORKDIR /go/mx-chain-go diff --git a/docker/multiversx/Dockerfile b/docker/multiversx/Dockerfile index 8038974457b..7e241c66451 100644 --- a/docker/multiversx/Dockerfile +++ b/docker/multiversx/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.17.6 as builder +FROM golang:1.20.7 as builder RUN apt-get update && apt-get install -y WORKDIR /go/mx-chain-go diff --git a/docker/seednode/Dockerfile b/docker/seednode/Dockerfile index 28af5a1bde1..1a8ae14eec9 100644 --- a/docker/seednode/Dockerfile +++ b/docker/seednode/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.17.6 as builder +FROM golang:1.20.7 as builder RUN apt-get update && apt-get install -y WORKDIR /go/mx-chain-go diff --git a/docker/termui/Dockerfile b/docker/termui/Dockerfile index e691bc1b71e..4ba731a54a2 100644 --- a/docker/termui/Dockerfile +++ b/docker/termui/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.17.6 as builder +FROM golang:1.20.7 as builder RUN apt-get update && apt-get install -y WORKDIR /go/mx-chain-go COPY . . From 828bfb7ca35a0711d7c524285807803de6f11822 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 11 Aug 2023 13:08:17 +0300 Subject: [PATCH 071/120] update dockerfiles --- docker/multiversx/Dockerfile | 2 +- docker/termui/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/multiversx/Dockerfile b/docker/multiversx/Dockerfile index 7e241c66451..0a041e532ac 100644 --- a/docker/multiversx/Dockerfile +++ b/docker/multiversx/Dockerfile @@ -6,7 +6,7 @@ COPY . . RUN GO111MODULE=on go mod tidy # Multiversx node WORKDIR /go/mx-chain-go/cmd/node -RUN go build -i -v -ldflags="-X main.appVersion=$(git describe --tags --long --dirty)" +RUN go build -v -ldflags="-X main.appVersion=$(git describe --tags --long --dirty)" RUN cp /go/pkg/mod/github.com/multiversx/$(cat /go/mx-chain-go/go.mod | grep mx-chain-vm-v | sort -n | tail -n -1| awk -F '/' '{print$3}'| sed 's/ /@/g')/wasmer/libwasmer_linux_amd64.so /lib/libwasmer_linux_amd64.so WORKDIR /go/mx-chain-go/cmd/node diff --git a/docker/termui/Dockerfile b/docker/termui/Dockerfile index 4ba731a54a2..bcc670e3ce3 100644 --- a/docker/termui/Dockerfile +++ b/docker/termui/Dockerfile @@ -3,7 +3,7 @@ RUN apt-get update && apt-get install -y WORKDIR /go/mx-chain-go COPY . . WORKDIR /go/mx-chain-go/cmd/termui -RUN go build -i -v +RUN go build -v RUN cp /go/pkg/mod/github.com/multiversx/$(cat /go/mx-chain-go/go.mod | grep mx-chain-vm-v | sort -n | tail -n -1| awk -F '/' '{print$3}'| sed 's/ /@/g')/wasmer/libwasmer_linux_amd64.so /lib/libwasmer_linux_amd64.so # ===== SECOND STAGE ====== From c4d6354a07b16eea8fa84f79621ff34d18efcfbd Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 11 Aug 2023 17:14:34 +0300 Subject: [PATCH 072/120] proper tag for mx-chain-p2p-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 92da9e55380..2ac1aa518af 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.3.20 github.com/multiversx/mx-chain-logger-go v1.0.11 - github.com/multiversx/mx-chain-p2p-go v1.0.18-0.20230811091637-b7cd26e03c0e + github.com/multiversx/mx-chain-p2p-go v1.0.18 github.com/multiversx/mx-chain-storage-go v1.0.7 github.com/multiversx/mx-chain-vm-common-go v1.3.42 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.54 diff --git a/go.sum b/go.sum index a602eff451c..f57095c7e0c 100644 --- a/go.sum +++ b/go.sum @@ -377,8 +377,8 @@ github.com/multiversx/mx-chain-es-indexer-go v1.3.20 h1:/82eDBsjlEm6dNgW44WQOBqK github.com/multiversx/mx-chain-es-indexer-go v1.3.20/go.mod h1:B8ahv6M93qHallA9fN+yknQFzdrDhHDgVlCy/0PVcG0= github.com/multiversx/mx-chain-logger-go v1.0.11 h1:DFsHa+sc5fKwhDR50I8uBM99RTDTEW68ESyr5ALRDwE= github.com/multiversx/mx-chain-logger-go v1.0.11/go.mod h1:1srDkP0DQucWQ+rYfaq0BX2qLnULsUdRPADpYUTM6dA= -github.com/multiversx/mx-chain-p2p-go v1.0.18-0.20230811091637-b7cd26e03c0e h1:tXA7RocQRrYmO69weBOzuA8o0FvMV2tR9xIqpdVzI10= -github.com/multiversx/mx-chain-p2p-go v1.0.18-0.20230811091637-b7cd26e03c0e/go.mod h1:Xy1B8X+AaGafDNcI6QZsTxO6bBf4akEyq+WdGRWSCpI= +github.com/multiversx/mx-chain-p2p-go v1.0.18 h1:Dc+ngk8AV1UdBeZMzZP2MkxDyfoNrD/vY77umvo3SqQ= +github.com/multiversx/mx-chain-p2p-go v1.0.18/go.mod h1:Xy1B8X+AaGafDNcI6QZsTxO6bBf4akEyq+WdGRWSCpI= github.com/multiversx/mx-chain-storage-go v1.0.7 h1:UqLo/OLTD3IHiE/TB/SEdNRV1GG2f1R6vIP5ehHwCNw= github.com/multiversx/mx-chain-storage-go v1.0.7/go.mod h1:gtKoV32Cg2Uy8deHzF8Ud0qAl0zv92FvWgPSYIP0Zmg= github.com/multiversx/mx-chain-vm-common-go v1.3.42 h1:avhgUwi6f+wpHqaBk76j6islLzUlSRBXwisKoZnUXpk= From 7256aaf8ff6c573e1bd82815e7f98f67c3ab2179 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 16 Aug 2023 11:07:50 +0300 Subject: [PATCH 073/120] fixes after review --- integrationTests/mock/vmFactoryMock.go | 2 +- integrationTests/vm/testInitializer.go | 2 +- node/mock/vmMachinesContainerFactoryMock.go | 2 +- .../factory/metachain/vmContainerFactory.go | 6 +-- process/factory/shard/vmContainerFactory.go | 6 +-- process/interface.go | 7 ++- process/smartContract/scQueryService.go | 47 +++++++++++-------- process/smartContract/scQueryService_test.go | 9 ++-- 8 files changed, 48 insertions(+), 33 deletions(-) diff --git a/integrationTests/mock/vmFactoryMock.go b/integrationTests/mock/vmFactoryMock.go index 240f9faa520..098b1abae4d 100644 --- a/integrationTests/mock/vmFactoryMock.go +++ b/integrationTests/mock/vmFactoryMock.go @@ -20,7 +20,7 @@ func (v *VmMachinesContainerFactoryMock) Close() error { } // BlockChainHookImpl - -func (v *VmMachinesContainerFactoryMock) BlockChainHookImpl() process.BlockChainHookHandler { +func (v *VmMachinesContainerFactoryMock) BlockChainHookImpl() process.BlockChainHookWithAccountsAdapter { return &testscommon.BlockChainHookStub{} } diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 451a4241040..69089efb00e 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -256,7 +256,7 @@ func (vmTestContext *VMTestContext) GetVMOutputWithTransientVM(funcName string, argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ VmContainer: vmTestContext.VMContainer, EconomicsFee: feeHandler, - BlockChainHook: vmTestContext.BlockchainHook.(process.BlockChainHookHandler), + BlockChainHook: vmTestContext.BlockchainHook.(process.BlockChainHookWithAccountsAdapter), MainBlockChain: &testscommon.ChainHandlerStub{}, APIBlockChain: &testscommon.ChainHandlerStub{}, WasmVMChangeLocker: &sync.RWMutex{}, diff --git a/node/mock/vmMachinesContainerFactoryMock.go b/node/mock/vmMachinesContainerFactoryMock.go index 240f9faa520..098b1abae4d 100644 --- a/node/mock/vmMachinesContainerFactoryMock.go +++ b/node/mock/vmMachinesContainerFactoryMock.go @@ -20,7 +20,7 @@ func (v *VmMachinesContainerFactoryMock) Close() error { } // BlockChainHookImpl - -func (v *VmMachinesContainerFactoryMock) BlockChainHookImpl() process.BlockChainHookHandler { +func (v *VmMachinesContainerFactoryMock) BlockChainHookImpl() process.BlockChainHookWithAccountsAdapter { return &testscommon.BlockChainHookStub{} } diff --git a/process/factory/metachain/vmContainerFactory.go b/process/factory/metachain/vmContainerFactory.go index 2b072a3b0ed..c3dbb17e4e6 100644 --- a/process/factory/metachain/vmContainerFactory.go +++ b/process/factory/metachain/vmContainerFactory.go @@ -30,7 +30,7 @@ type vmContainerFactory struct { chanceComputer nodesCoordinator.ChanceComputer validatorAccountsDB state.AccountsAdapter userAccountsDB state.AccountsAdapter - blockChainHook process.BlockChainHookHandler + blockChainHook process.BlockChainHookWithAccountsAdapter cryptoHook vmcommon.CryptoHook systemContracts vm.SystemSCContainer economics process.EconomicsDataHandler @@ -60,7 +60,7 @@ type ArgsNewVMContainerFactory struct { ChanceComputer nodesCoordinator.ChanceComputer ShardCoordinator sharding.Coordinator PubkeyConv core.PubkeyConverter - BlockChainHook process.BlockChainHookHandler + BlockChainHook process.BlockChainHookWithAccountsAdapter EnableEpochsHandler common.EnableEpochsHandler } @@ -263,7 +263,7 @@ func (vmf *vmContainerFactory) createSystemVMForGenesis() (vmcommon.VMExecutionH } // BlockChainHookImpl returns the created blockChainHookImpl -func (vmf *vmContainerFactory) BlockChainHookImpl() process.BlockChainHookHandler { +func (vmf *vmContainerFactory) BlockChainHookImpl() process.BlockChainHookWithAccountsAdapter { return vmf.blockChainHook } diff --git a/process/factory/shard/vmContainerFactory.go b/process/factory/shard/vmContainerFactory.go index 6c56100262f..92eb6292008 100644 --- a/process/factory/shard/vmContainerFactory.go +++ b/process/factory/shard/vmContainerFactory.go @@ -32,7 +32,7 @@ var logVMContainerFactory = logger.GetOrCreate("vmContainerFactory") type vmContainerFactory struct { config config.VirtualMachineConfig - blockChainHook process.BlockChainHookHandler + blockChainHook process.BlockChainHookWithAccountsAdapter cryptoHook vmcommon.CryptoHook blockGasLimit uint64 gasSchedule core.GasScheduleNotifier @@ -56,7 +56,7 @@ type ArgVMContainerFactory struct { WasmVMChangeLocker common.Locker ESDTTransferParser vmcommon.ESDTTransferParser BuiltInFunctions vmcommon.BuiltInFunctionContainer - BlockChainHook process.BlockChainHookHandler + BlockChainHook process.BlockChainHookWithAccountsAdapter Hasher hashing.Hasher } @@ -368,7 +368,7 @@ func (vmf *vmContainerFactory) closePreviousVM(vm vmcommon.VMExecutionHandler) { } // BlockChainHookImpl returns the created blockChainHookImpl -func (vmf *vmContainerFactory) BlockChainHookImpl() process.BlockChainHookHandler { +func (vmf *vmContainerFactory) BlockChainHookImpl() process.BlockChainHookWithAccountsAdapter { return vmf.blockChainHook } diff --git a/process/interface.go b/process/interface.go index 7e92bf5e2ab..b95903c6ba6 100644 --- a/process/interface.go +++ b/process/interface.go @@ -455,7 +455,7 @@ type VirtualMachinesContainer interface { type VirtualMachinesContainerFactory interface { Create() (VirtualMachinesContainer, error) Close() error - BlockChainHookImpl() BlockChainHookHandler + BlockChainHookImpl() BlockChainHookWithAccountsAdapter IsInterfaceNil() bool } @@ -538,6 +538,11 @@ type BlockChainHookHandler interface { GetCounterValues() map[string]uint64 IsInterfaceNil() bool IsBuiltinFunctionName(functionName string) bool +} + +// BlockChainHookWithAccountsAdapter defines an extension of BlockChainHookHandler with the AccountsAdapter exposed +type BlockChainHookWithAccountsAdapter interface { + BlockChainHookHandler GetAccountsAdapter() state.AccountsAdapter } diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 43d484b83de..7006b2e1931 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -34,7 +34,7 @@ type SCQueryService struct { vmContainer process.VirtualMachinesContainer economicsFee process.FeeHandler mutRunSc sync.Mutex - blockChainHook process.BlockChainHookHandler + blockChainHook process.BlockChainHookWithAccountsAdapter mainBlockChain data.ChainHandler apiBlockChain data.ChainHandler numQueries int @@ -54,7 +54,7 @@ type SCQueryService struct { type ArgsNewSCQueryService struct { VmContainer process.VirtualMachinesContainer EconomicsFee process.FeeHandler - BlockChainHook process.BlockChainHookHandler + BlockChainHook process.BlockChainHookWithAccountsAdapter MainBlockChain data.ChainHandler APIBlockChain data.ChainHandler WasmVMChangeLocker common.Locker @@ -207,7 +207,7 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui rootHashBeforeExecution := make([]byte, 0) if shouldCheckRootHashChanges { - rootHashBeforeExecution = service.mainBlockChain.GetCurrentBlockRootHash() + rootHashBeforeExecution = service.apiBlockChain.GetCurrentBlockRootHash() } service.blockChainHook.SetCurrentHeader(service.mainBlockChain.GetCurrentBlockHeader()) @@ -260,23 +260,41 @@ func (service *SCQueryService) executeScCall(query *process.SCQuery, gasPrice ui func (service *SCQueryService) extractBlockHeaderAndRootHash(query *process.SCQuery) (data.HeaderHandler, []byte, error) { if len(query.BlockHash) > 0 { - blockHeader, err := service.getBlockHeaderByHash(query.BlockHash) + currentHeader, err := service.getBlockHeaderByHash(query.BlockHash) if err != nil { return nil, nil, err } - header := service.getBlockHeader(blockHeader) - return header, header.GetRootHash(), nil + blockHeader, _, err := service.getBlockHeaderByNonce(currentHeader.GetNonce() + 1) + if err != nil { + return nil, nil, err + } + + additionalData := blockHeader.GetAdditionalData() + if check.IfNil(additionalData) { + return currentHeader, currentHeader.GetRootHash(), nil + } + + return blockHeader, additionalData.GetScheduledRootHash(), nil } if query.BlockNonce.HasValue { - blockHeader, _, err := service.getBlockHeaderByNonce(query.BlockNonce.Value) + currentHeader, _, err := service.getBlockHeaderByNonce(query.BlockNonce.Value) if err != nil { return nil, nil, err } - header := service.getBlockHeader(blockHeader) - return header, header.GetRootHash(), nil + blockHeader, _, err := service.getBlockHeaderByNonce(currentHeader.GetNonce() + 1) + if err != nil { + return nil, nil, err + } + + additionalData := blockHeader.GetAdditionalData() + if check.IfNil(additionalData) { + return currentHeader, currentHeader.GetRootHash(), nil + } + + return blockHeader, additionalData.GetScheduledRootHash(), nil } return service.mainBlockChain.GetCurrentBlockHeader(), service.mainBlockChain.GetCurrentBlockRootHash(), nil @@ -336,15 +354,6 @@ func (service *SCQueryService) getBlockHeaderInEpochByHash(headerHash []byte, ep return header, nil } -func (service *SCQueryService) getBlockHeader(currentHeader data.HeaderHandler) data.HeaderHandler { - header, _, err := service.getBlockHeaderByNonce(currentHeader.GetNonce() + 1) - if err != nil { - return currentHeader - } - - return header -} - func (service *SCQueryService) getBlockHeaderByNonce(nonce uint64) (data.HeaderHandler, []byte, error) { headerHash, err := service.getBlockHashByNonce(nonce) if err != nil { @@ -373,7 +382,7 @@ func (service *SCQueryService) getBlockHashByNonce(nonce uint64) ([]byte, error) } func (service *SCQueryService) checkForRootHashChanges(rootHashBefore []byte) error { - rootHashAfter := service.mainBlockChain.GetCurrentBlockRootHash() + rootHashAfter := service.apiBlockChain.GetCurrentBlockRootHash() if bytes.Equal(rootHashBefore, rootHashAfter) { return nil diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 8c07c283f7d..c26827488c6 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -405,7 +405,7 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { return &storageStubs.StorerStub{ GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { counter++ - if counter > 1 { + if counter > 2 { return nil, fmt.Errorf("no scheduled") } hdr := &block.Header{ @@ -498,7 +498,7 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { }, GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { counter++ - if counter > 1 { + if counter > 2 { return nil, fmt.Errorf("no scheduled") } hdr := &block.Header{ @@ -907,10 +907,11 @@ func TestSCQueryService_ShouldFailIfStateChanged(t *testing.T) { } rootHashCalledCounter := 0 - args.MainBlockChain = &testscommon.ChainHandlerStub{ + args.APIBlockChain = &testscommon.ChainHandlerStub{ GetCurrentBlockRootHashCalled: func() []byte { rootHashCalledCounter++ - if rootHashCalledCounter <= 2 { // first call is during root hash extraction for recreate trie + println(rootHashCalledCounter) + if rootHashCalledCounter < 2 { // first call is during root hash extraction for recreate trie return []byte("first root hash") } From 613c37d458d7d8a8015dc6937486bb6fd355213a Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Wed, 16 Aug 2023 12:12:49 +0300 Subject: [PATCH 074/120] fixes after merge --- factory/processing/processComponents.go | 2 +- factory/processing/processComponents_test.go | 2 + .../realcomponents/processorRunner.go | 42 ++++--- outport/mock/executionOrderHandlerStub.go | 20 ---- outport/process/executionOrder/dtos.go | 0 outport/process/executionOrder/scrs.go | 0 outport/process/executionOrder/scrs_test.go | 0 .../transactionsExecutionOrder.go | 0 .../transactionsExecutionOrder_test.go | 0 outport/process/interface.go | 10 -- outport/process/outportDataProvider.go | 72 ++++++------ outport/process/outportDataProvider_test.go | 108 +++++++----------- .../preprocess/rewardTxPreProcessor_test.go | 1 + .../preprocess/scheduledTxsExecution_test.go | 4 +- .../preprocess/smartContractResults_test.go | 3 +- .../preProcessorsContainerFactory_test.go | 4 +- .../preProcessorsContainerFactory_test.go | 4 +- 17 files changed, 107 insertions(+), 165 deletions(-) delete mode 100644 outport/mock/executionOrderHandlerStub.go delete mode 100644 outport/process/executionOrder/dtos.go delete mode 100644 outport/process/executionOrder/scrs.go delete mode 100644 outport/process/executionOrder/scrs_test.go delete mode 100644 outport/process/executionOrder/transactionsExecutionOrder.go delete mode 100644 outport/process/executionOrder/transactionsExecutionOrder_test.go diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 299e95af3a7..5f0b02ea16b 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -1967,7 +1967,7 @@ func checkProcessComponentsArgs(args ProcessComponentsFactoryArgs) error { return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilStatusCoreComponents) } if check.IfNil(args.TxExecutionOrderHandler) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilTxExecutionOrderHandler) + return fmt.Errorf("%s: %w", baseErrMessage, process.ErrNilTxExecutionOrderHandler) } return nil diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index b99036be033..bb629016728 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -33,6 +33,7 @@ import ( "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/bootstrapMocks" + txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" @@ -237,6 +238,7 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto StatusCoreComponents: &factoryMocks.StatusCoreComponentsStub{ AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, }, + TxExecutionOrderHandler: &txExecOrderStub.TxExecutionOrderHandlerStub{}, } args.State = components.GetStateComponents(args.CoreData) diff --git a/integrationTests/realcomponents/processorRunner.go b/integrationTests/realcomponents/processorRunner.go index 38d786c333e..f72a4af5a91 100644 --- a/integrationTests/realcomponents/processorRunner.go +++ b/integrationTests/realcomponents/processorRunner.go @@ -15,6 +15,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/common/forking" + "github.com/multiversx/mx-chain-go/common/ordering" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever" dbLookupFactory "github.com/multiversx/mx-chain-go/dblookupext/factory" @@ -401,6 +402,8 @@ func (pr *ProcessorRunner) createProcessComponents(tb testing.TB) { importStartHandler, err := trigger.NewImportStartHandler(filepath.Join(pr.Config.FlagsConfig.DbDir, common.DefaultDBPath), pr.Config.FlagsConfig.Version) require.Nil(tb, err) + txExecutionOrderHandler := ordering.NewOrderedCollection() + argsProcess := factoryProcessing.ProcessComponentsFactoryArgs{ Config: *pr.Config.GeneralConfig, EpochConfig: *pr.Config.EpochConfig, @@ -410,25 +413,26 @@ func (pr *ProcessorRunner) createProcessComponents(tb testing.TB) { Version: "test", WorkingDir: pr.Config.FlagsConfig.WorkingDir, }, - AccountsParser: accountsParser, - SmartContractParser: smartContractParser, - GasSchedule: gasScheduleNotifier, - NodesCoordinator: pr.NodesCoordinator, - RequestedItemsHandler: requestedItemsHandler, - WhiteListHandler: whiteListRequest, - WhiteListerVerifiedTxs: whiteListerVerifiedTxs, - MaxRating: pr.Config.RatingsConfig.General.MaxRating, - SystemSCConfig: pr.Config.SystemSCConfig, - ImportStartHandler: importStartHandler, - HistoryRepo: historyRepository, - Data: pr.DataComponents, - CoreData: pr.CoreComponents, - Crypto: pr.CryptoComponents, - State: pr.StateComponents, - Network: pr.NetworkComponents, - BootstrapComponents: pr.BootstrapComponents, - StatusComponents: pr.StatusComponents, - StatusCoreComponents: pr.StatusCoreComponents, + AccountsParser: accountsParser, + SmartContractParser: smartContractParser, + GasSchedule: gasScheduleNotifier, + NodesCoordinator: pr.NodesCoordinator, + RequestedItemsHandler: requestedItemsHandler, + WhiteListHandler: whiteListRequest, + WhiteListerVerifiedTxs: whiteListerVerifiedTxs, + MaxRating: pr.Config.RatingsConfig.General.MaxRating, + SystemSCConfig: pr.Config.SystemSCConfig, + ImportStartHandler: importStartHandler, + HistoryRepo: historyRepository, + Data: pr.DataComponents, + CoreData: pr.CoreComponents, + Crypto: pr.CryptoComponents, + State: pr.StateComponents, + Network: pr.NetworkComponents, + BootstrapComponents: pr.BootstrapComponents, + StatusComponents: pr.StatusComponents, + StatusCoreComponents: pr.StatusCoreComponents, + TxExecutionOrderHandler: txExecutionOrderHandler, } processFactory, err := factoryProcessing.NewProcessComponentsFactory(argsProcess) diff --git a/outport/mock/executionOrderHandlerStub.go b/outport/mock/executionOrderHandlerStub.go deleted file mode 100644 index 96db500f223..00000000000 --- a/outport/mock/executionOrderHandlerStub.go +++ /dev/null @@ -1,20 +0,0 @@ -package mock - -import ( - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/outport" -) - -// ExecutionOrderHandlerStub - -type ExecutionOrderHandlerStub struct { -} - -// PutExecutionOrderInTransactionPool - -func (e *ExecutionOrderHandlerStub) PutExecutionOrderInTransactionPool( - _ *outport.TransactionPool, - _ data.HeaderHandler, - _ data.BodyHandler, - _ data.HeaderHandler, -) ([]string, []string, error) { - return nil, nil, nil -} diff --git a/outport/process/executionOrder/dtos.go b/outport/process/executionOrder/dtos.go deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/outport/process/executionOrder/scrs.go b/outport/process/executionOrder/scrs.go deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/outport/process/executionOrder/scrs_test.go b/outport/process/executionOrder/scrs_test.go deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/outport/process/executionOrder/transactionsExecutionOrder.go b/outport/process/executionOrder/transactionsExecutionOrder.go deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/outport/process/executionOrder/transactionsExecutionOrder_test.go b/outport/process/executionOrder/transactionsExecutionOrder_test.go deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/outport/process/interface.go b/outport/process/interface.go index 25f675975ce..abcbbe10fec 100644 --- a/outport/process/interface.go +++ b/outport/process/interface.go @@ -38,13 +38,3 @@ type EconomicsDataHandler interface { IsInterfaceNil() bool MaxGasLimitPerBlock(shardID uint32) uint64 } - -// ExecutionOrderHandler defines the interface for the execution order handler -type ExecutionOrderHandler interface { - PutExecutionOrderInTransactionPool( - pool *outport.TransactionPool, - header data.HeaderHandler, - body data.BodyHandler, - prevHeader data.HeaderHandler, - ) ([]string, []string, error) -} diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 537807f87ba..d9614ce9d1f 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -36,7 +36,6 @@ type ArgOutportDataProvider struct { NodesCoordinator nodesCoordinator.NodesCoordinator GasConsumedProvider GasConsumedProvider EconomicsData EconomicsDataHandler - ExecutionOrderHandler ExecutionOrderHandler Marshaller marshal.Marshalizer Hasher hashing.Hasher ExecutionOrderHandler common.ExecutionOrderGetter @@ -218,29 +217,33 @@ func extractExecutedTxsFromMb(mbHeader data.MiniBlockHeaderHandler, miniBlock *b } func (odp *outportDataProvider) setExecutionOrderInTransactionPool( - pool *outportcore.Pool, + pool *outportcore.TransactionPool, ) ([][]byte, int) { orderedTxHashes := odp.executionOrderHandler.GetItems() if pool == nil { return orderedTxHashes, 0 } - txGroups := []map[string]data.TransactionHandlerWithGasUsedAndFee{ - pool.Txs, - pool.Scrs, + txGroups := map[string]data.TxWithExecutionOrderHandler{} + for txHash, txInfo := range pool.Transactions { + txGroups[txHash] = txInfo + } + for scrHash, scrInfo := range pool.SmartContractResults { + txGroups[scrHash] = scrInfo } if odp.shardID != core.MetachainShardId { - txGroups = append(txGroups, pool.Rewards) + for txHash, rewardInfo := range pool.Rewards { + txGroups[txHash] = rewardInfo + } } foundTxHashes := 0 - for i, txHash := range orderedTxHashes { - for _, group := range txGroups { - if setExecutionOrderIfFound(txHash, group, i) { - foundTxHashes++ - break - } + for order, txHash := range orderedTxHashes { + tx, found := txGroups[hex.EncodeToString(txHash)] + if found { + tx.SetExecutionOrder(uint32(order)) + foundTxHashes++ } } @@ -279,19 +282,6 @@ func checkBodyTransactionsHaveOrder(orderedTxHashes [][]byte, executedTxHashes m return nil } -func setExecutionOrderIfFound( - txHash []byte, - transactionHandlers map[string]data.TransactionHandlerWithGasUsedAndFee, - order int, -) bool { - tx, ok := transactionHandlers[string(txHash)] - if ok { - tx.SetExecutionOrder(order) - } - - return ok -} - func (odp *outportDataProvider) computeEpoch(header data.HeaderHandler) uint32 { epoch := header.GetEpoch() shouldDecreaseEpoch := header.IsStartOfEpochBlock() && epoch > 0 && odp.shardID != core.MetachainShardId @@ -544,35 +534,37 @@ func (odp *outportDataProvider) filterOutDuplicatedMiniBlocks(miniBlocksFromBody return filteredMiniBlocks, nil } -func printPool(pool *outportcore.Pool) { - printMapTxs := func(txs map[string]data.TransactionHandlerWithGasUsedAndFee) { - for hash, tx := range txs { - log.Warn(hex.EncodeToString([]byte(hash)), "order", tx.GetExecutionOrder()) - } - } - - total := len(pool.Txs) + len(pool.Invalid) + len(pool.Scrs) + len(pool.Rewards) +func printPool(pool *outportcore.TransactionPool) { + total := len(pool.Transactions) + len(pool.InvalidTxs) + len(pool.SmartContractResults) + len(pool.Rewards) if total > 0 { log.Warn("###################################") } - if len(pool.Txs) > 0 { + if len(pool.Transactions) > 0 { log.Warn("############### NORMAL TXS ####################") - printMapTxs(pool.Txs) + for hash, tx := range pool.Transactions { + log.Warn(hash, "order", tx.GetExecutionOrder()) + } } - if len(pool.Invalid) > 0 { + if len(pool.InvalidTxs) > 0 { log.Warn("############### INVALID ####################") - printMapTxs(pool.Invalid) + for hash, tx := range pool.Transactions { + log.Warn(hash, "order", tx.GetExecutionOrder()) + } } - if len(pool.Scrs) > 0 { + if len(pool.SmartContractResults) > 0 { log.Warn("############### SCRS ####################") - printMapTxs(pool.Scrs) + for hash, tx := range pool.SmartContractResults { + log.Warn(hash, "order", tx.GetExecutionOrder()) + } } if len(pool.Rewards) > 0 { log.Warn("############### REWARDS ####################") - printMapTxs(pool.Rewards) + for hash, tx := range pool.Rewards { + log.Warn(hash, "order", tx.GetExecutionOrder()) + } } if total > 0 { log.Warn("###################################") diff --git a/outport/process/outportDataProvider_test.go b/outport/process/outportDataProvider_test.go index 5e8e3054620..c240fe50ab7 100644 --- a/outport/process/outportDataProvider_test.go +++ b/outport/process/outportDataProvider_test.go @@ -2,11 +2,11 @@ package process import ( "crypto/rand" + "encoding/hex" "errors" "fmt" "testing" - "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" outportcore "github.com/multiversx/mx-chain-core-go/data/outport" "github.com/multiversx/mx-chain-core-go/data/rewardTx" @@ -275,10 +275,10 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { t.Run("nil pool txs, scrs, rewards", func(t *testing.T) { args := createArgOutportDataProvider() odp, _ := NewOutportDataProvider(args) - pool := &outportcore.Pool{ - Txs: nil, - Scrs: nil, - Rewards: nil, + pool := &outportcore.TransactionPool{ + Transactions: nil, + SmartContractResults: nil, + Rewards: nil, } txHashes := createRandTxHashes(10) @@ -295,24 +295,24 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { t.Run("transactions not found in pool txs, scrs or rewards", func(t *testing.T) { args := createArgOutportDataProvider() odp, _ := NewOutportDataProvider(args) - pool := &outportcore.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - "tx1": &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{ + pool := &outportcore.TransactionPool{ + Transactions: map[string]*outportcore.TxInfo{ + "tx1": { + Transaction: &transaction.Transaction{ Nonce: 0, }, }, }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - "scr1": &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{ + SmartContractResults: map[string]*outportcore.SCRInfo{ + "scr1": { + SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 0, }, }, }, - Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ - "reward1": &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &rewardTx.RewardTx{ + Rewards: map[string]*outportcore.RewardInfo{ + "reward1": { + Reward: &rewardTx.RewardTx{ Epoch: 0, }, }, @@ -335,24 +335,24 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { args := createArgOutportDataProvider() odp, _ := NewOutportDataProvider(args) txHashes := createRandTxHashes(10) - pool := &outportcore.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashes[0]): &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{ + pool := &outportcore.TransactionPool{ + Transactions: map[string]*outportcore.TxInfo{ + hex.EncodeToString(txHashes[0]): { + Transaction: &transaction.Transaction{ Nonce: 0, }, }, }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashes[1]): &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{ + SmartContractResults: map[string]*outportcore.SCRInfo{ + hex.EncodeToString(txHashes[1]): { + SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 0, }, }, }, - Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashes[2]): &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &rewardTx.RewardTx{ + Rewards: map[string]*outportcore.RewardInfo{ + hex.EncodeToString(txHashes[2]): { + Reward: &rewardTx.RewardTx{ Epoch: 0, }, }, @@ -367,33 +367,33 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { orderedHashes, numProcessed := odp.setExecutionOrderInTransactionPool(pool) require.Equal(t, 3, numProcessed) - require.Equal(t, pool.Txs[string(txHashes[0])].GetExecutionOrder(), 0) - require.Equal(t, pool.Scrs[string(txHashes[1])].GetExecutionOrder(), 1) - require.Equal(t, pool.Rewards[string(txHashes[2])].GetExecutionOrder(), 2) + require.Equal(t, uint32(0), pool.Transactions[hex.EncodeToString(txHashes[0])].GetExecutionOrder()) + require.Equal(t, uint32(1), pool.SmartContractResults[hex.EncodeToString(txHashes[1])].GetExecutionOrder()) + require.Equal(t, uint32(2), pool.Rewards[hex.EncodeToString(txHashes[2])].GetExecutionOrder()) require.Equal(t, len(txHashes), len(orderedHashes)) }) t.Run("transactions partially found (last txs in list) in pool txs, scrs or rewards", func(t *testing.T) { args := createArgOutportDataProvider() odp, _ := NewOutportDataProvider(args) txHashes := createRandTxHashes(10) - pool := &outportcore.Pool{ - Txs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashes[7]): &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{ + pool := &outportcore.TransactionPool{ + Transactions: map[string]*outportcore.TxInfo{ + hex.EncodeToString(txHashes[7]): { + Transaction: &transaction.Transaction{ Nonce: 0, }, }, }, - Scrs: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashes[8]): &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &smartContractResult.SmartContractResult{ + SmartContractResults: map[string]*outportcore.SCRInfo{ + hex.EncodeToString(txHashes[8]): { + SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 0, }, }, }, - Rewards: map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHashes[9]): &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &rewardTx.RewardTx{ + Rewards: map[string]*outportcore.RewardInfo{ + hex.EncodeToString(txHashes[9]): { + Reward: &rewardTx.RewardTx{ Epoch: 0, }, }, @@ -408,9 +408,9 @@ func Test_setExecutionOrderInTransactionPool(t *testing.T) { orderedHashes, numProcessed := odp.setExecutionOrderInTransactionPool(pool) require.Equal(t, 3, numProcessed) - require.Equal(t, pool.Txs[string(txHashes[7])].GetExecutionOrder(), 7) - require.Equal(t, pool.Scrs[string(txHashes[8])].GetExecutionOrder(), 8) - require.Equal(t, pool.Rewards[string(txHashes[9])].GetExecutionOrder(), 9) + require.Equal(t, uint32(7), pool.Transactions[hex.EncodeToString(txHashes[7])].GetExecutionOrder()) + require.Equal(t, uint32(8), pool.SmartContractResults[hex.EncodeToString(txHashes[8])].GetExecutionOrder()) + require.Equal(t, uint32(9), pool.Rewards[hex.EncodeToString(txHashes[9])].GetExecutionOrder()) require.Equal(t, len(txHashes), len(orderedHashes)) }) } @@ -493,32 +493,6 @@ func Test_checkBodyTransactionsHaveOrder(t *testing.T) { }) } -func Test_setExecutionOrderIfFound(t *testing.T) { - t.Parallel() - - t.Run("transaction not found", func(t *testing.T) { - txHash := []byte("txHash") - transactionHandlers := make(map[string]data.TransactionHandlerWithGasUsedAndFee) - order := 0 - - found := setExecutionOrderIfFound(txHash, transactionHandlers, order) - require.False(t, found) - require.Len(t, transactionHandlers, 0) - }) - t.Run("transaction found", func(t *testing.T) { - txHash := []byte("txHash") - transactionHandlers := map[string]data.TransactionHandlerWithGasUsedAndFee{ - string(txHash): &outportcore.TransactionHandlerWithGasAndFee{ - TransactionHandler: &transaction.Transaction{}, - }, - } - - res := setExecutionOrderIfFound(txHash, transactionHandlers, 0) - require.True(t, res) - require.Equal(t, 0, transactionHandlers[string(txHash)].GetExecutionOrder()) - }) -} - func Test_collectExecutedTxHashes(t *testing.T) { t.Parallel() diff --git a/process/block/preprocess/rewardTxPreProcessor_test.go b/process/block/preprocess/rewardTxPreProcessor_test.go index 0905702244a..4497c76f63b 100644 --- a/process/block/preprocess/rewardTxPreProcessor_test.go +++ b/process/block/preprocess/rewardTxPreProcessor_test.go @@ -752,6 +752,7 @@ func TestRewardTxPreprocessor_ProcessBlockTransactionsMissingTrieNode(t *testing &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) txHashes := [][]byte{[]byte(txHash)} diff --git a/process/block/preprocess/scheduledTxsExecution_test.go b/process/block/preprocess/scheduledTxsExecution_test.go index 828387a2684..19717346806 100644 --- a/process/block/preprocess/scheduledTxsExecution_test.go +++ b/process/block/preprocess/scheduledTxsExecution_test.go @@ -9,9 +9,6 @@ import ( "testing" "time" - "github.com/multiversx/mx-chain-go/testscommon/common" - "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" - "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" @@ -23,6 +20,7 @@ import ( "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/genericMocks" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" diff --git a/process/block/preprocess/smartContractResults_test.go b/process/block/preprocess/smartContractResults_test.go index e437d13e6c6..c7e61d57acd 100644 --- a/process/block/preprocess/smartContractResults_test.go +++ b/process/block/preprocess/smartContractResults_test.go @@ -491,7 +491,7 @@ func TestNewSmartContractResult_NilTxExecutionOrderHandlerShouldErr(t *testing.T createMockPubkeyConverter(), &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, - &testscommon.EnableEpochsHandlerStub{}, + &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, nil, ) @@ -1286,6 +1286,7 @@ func TestScrsPreprocessor_ProcessBlockTransactionsMissingTrieNode(t *testing.T) &testscommon.BalanceComputationStub{}, &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, + &common.TxExecutionOrderHandlerStub{}, ) body := &block.Body{} diff --git a/process/factory/metachain/preProcessorsContainerFactory_test.go b/process/factory/metachain/preProcessorsContainerFactory_test.go index 296de13abfb..f49ee25e372 100644 --- a/process/factory/metachain/preProcessorsContainerFactory_test.go +++ b/process/factory/metachain/preProcessorsContainerFactory_test.go @@ -561,13 +561,13 @@ func TestNewPreProcessorsContainerFactory_NilTxExecutionOrderHandler(t *testing. &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, - &testscommon.EnableEpochsHandlerStub{}, + &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, diff --git a/process/factory/shard/preProcessorsContainerFactory_test.go b/process/factory/shard/preProcessorsContainerFactory_test.go index 3bfd2d8a48a..f273a5e64f3 100644 --- a/process/factory/shard/preProcessorsContainerFactory_test.go +++ b/process/factory/shard/preProcessorsContainerFactory_test.go @@ -709,12 +709,12 @@ func TestNewPreProcessorsContainerFactory_NilTxExecutionOrderHandler(t *testing. &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, - &testscommon.EnableEpochsHandlerStub{}, + &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &testscommon.ScheduledTxsExecutionStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, From 8d0059a56c6f81bde58b7c7ffe1561e309675b57 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 18 Aug 2023 13:57:33 +0300 Subject: [PATCH 075/120] update go mod --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index cf61831ef02..af706346b59 100644 --- a/go.mod +++ b/go.mod @@ -14,17 +14,17 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-communication-go v1.0.6 - github.com/multiversx/mx-chain-core-go v1.2.13 + github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736 github.com/multiversx/mx-chain-crypto-go v1.2.8 github.com/multiversx/mx-chain-es-indexer-go v1.4.9 github.com/multiversx/mx-chain-logger-go v1.0.13 github.com/multiversx/mx-chain-scenario-go v1.2.1 github.com/multiversx/mx-chain-storage-go v1.0.12 - github.com/multiversx/mx-chain-vm-common-go v1.5.2 - github.com/multiversx/mx-chain-vm-go v1.5.5 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87 + github.com/multiversx/mx-chain-vm-common-go v1.5.3-0.20230817123414-d332d9044473 + github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88-0.20230817130100-3e5270010759 github.com/pelletier/go-toml v1.9.3 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index 2c300b84a93..485a5d4d9a5 100644 --- a/go.sum +++ b/go.sum @@ -378,8 +378,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.0.6 h1:f2bizRoVuJXBWc32px7pCuzMx4Pgi2tKhUt8BkFV1Fg= github.com/multiversx/mx-chain-communication-go v1.0.6/go.mod h1:+oaUowpq+SqrEmAsMPGwhz44g7L81loWb6AiNQU9Ms4= -github.com/multiversx/mx-chain-core-go v1.2.13 h1:4Svi23hdsoibStFXv0i7lbBWus3kDJPc6CFhrxrKIZ4= -github.com/multiversx/mx-chain-core-go v1.2.13/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= +github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736 h1:8n/X21jjR/XjAliLxSPz3K2ukImXGJV127FfjLTXfTY= +github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= github.com/multiversx/mx-chain-crypto-go v1.2.8 h1:wOgVlUaO5X4L8iEbFjcQcL8SZvv6WZ7LqH73BiRPhxU= github.com/multiversx/mx-chain-crypto-go v1.2.8/go.mod h1:fkaWKp1rbQN9wPKya5jeoRyC+c/SyN/NfggreyeBw+8= github.com/multiversx/mx-chain-es-indexer-go v1.4.9 h1:rL+8P+X279/9xY8a6t1ynWhhOzJya0LmBAm5ZNCosik= @@ -390,16 +390,16 @@ github.com/multiversx/mx-chain-scenario-go v1.2.1 h1:9eC6VcOEAKRRKZ7EbSWPLzCdNIM github.com/multiversx/mx-chain-scenario-go v1.2.1/go.mod h1:EuZY7DpNFHVNSxJR8dKE1z2I8gBYfEFFPSwNUOXptqE= github.com/multiversx/mx-chain-storage-go v1.0.12 h1:FrkgHPV38BO8cwdK0GUYHxVkUyOhyBBIhPz0P1e72NA= github.com/multiversx/mx-chain-storage-go v1.0.12/go.mod h1:/8VrMbO9CbIi0Ym3F1QPY6EENGcUq5DpEBPDt4evn9Q= -github.com/multiversx/mx-chain-vm-common-go v1.5.2 h1:iRWJNlogjkq9w+pJZIfkVkXQFmMoRxZr6pzCfg2/K68= -github.com/multiversx/mx-chain-vm-common-go v1.5.2/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= -github.com/multiversx/mx-chain-vm-go v1.5.5 h1:/ROeFnd44/vRGtnzlfUJZMBX/g3bNwxPpLTXo52XLbY= -github.com/multiversx/mx-chain-vm-go v1.5.5/go.mod h1:5d5GC+Ibz8X27+W8TYqbsMXh8n4F/kHUbdr0bVz8o8Y= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60 h1:YYElal1woAT3gwcVGe2JUEqBlzMXt963BSdQHuJpTMk= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.60/go.mod h1:3X3V/nj4G2ziTIijSEiucGn3r3S8v3CRIg5/szOtCLY= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61 h1:z1LkUlVNwc6mfWqFu+VTpPorDd0/Pj7/SMNXmNDdkK4= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.61/go.mod h1:xEuUbnbD1uVxxGEUbNUWLlbACFbOcJz3Hm8gz8MnOKQ= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87 h1:eu/Y+7BF6PkJRWPz3zJao6Tyheosg3OpXVfXDsh4NkA= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.87/go.mod h1:NnejM+yccfDq7jtxOvB6ujD1iAFaIH25nQj1wRjh8wE= +github.com/multiversx/mx-chain-vm-common-go v1.5.3-0.20230817123414-d332d9044473 h1:Lw2w84sF8FiFaXmuZ2wNOr8foBMXmyaKHiPgpkL7Hkw= +github.com/multiversx/mx-chain-vm-common-go v1.5.3-0.20230817123414-d332d9044473/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= +github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676 h1:T++epWNPrIs+1zqLSMQNZDjKgiemRmBbMZ0WdSRntwY= +github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676/go.mod h1:taHBYMfZx/R5QxOfObDJ0wPBW44vnefdr9eQk+MmG/0= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 h1:AtJY/By1Zx/bb5C7sKypriggw7QpkbVCJ/fX9nTOPDU= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61/go.mod h1:JZ52LHZgxMh3uxMVzzmOucAVOqTwanbFKEmB21PyoOE= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd h1:BAiE4ZjfeigqeK+fHotv9NccJCdwx3Dp38FVfOdMXMU= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd/go.mod h1:p5zH9C3Xlqm+KRfM/Yg8epSMbDD3ph074jB0ngPVLMg= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88-0.20230817130100-3e5270010759 h1:dUr5ZERaVisWBA73mpJR/3Ac5WtQmryYZytSdtTvEcw= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88-0.20230817130100-3e5270010759/go.mod h1:n5bzraW8/tzxS6IzRBQAbEpkJ5qLuJnABNI0h46uFL0= github.com/multiversx/mx-components-big-int v1.0.0 h1:Wkr8lSzK2nDqixOrrBa47VNuqdhV1m/aJhaP1EMaiS8= github.com/multiversx/mx-components-big-int v1.0.0/go.mod h1:maIEMgHlNE2u78JaDD0oLzri+ShgU4okHfzP3LWGdQM= github.com/multiversx/protobuf v1.3.2 h1:RaNkxvGTGbA0lMcnHAN24qE1G1i+Xs5yHA6MDvQ4mSM= From 342c99b79d81a736061e45952dff2a6bdbac6798 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 21 Aug 2023 10:27:46 +0300 Subject: [PATCH 076/120] fix after review --- process/smartContract/scQueryService.go | 36 +++++++++++-------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 7006b2e1931..3f528571886 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -265,17 +265,7 @@ func (service *SCQueryService) extractBlockHeaderAndRootHash(query *process.SCQu return nil, nil, err } - blockHeader, _, err := service.getBlockHeaderByNonce(currentHeader.GetNonce() + 1) - if err != nil { - return nil, nil, err - } - - additionalData := blockHeader.GetAdditionalData() - if check.IfNil(additionalData) { - return currentHeader, currentHeader.GetRootHash(), nil - } - - return blockHeader, additionalData.GetScheduledRootHash(), nil + return service.getRootHashForBlock(currentHeader) } if query.BlockNonce.HasValue { @@ -284,20 +274,24 @@ func (service *SCQueryService) extractBlockHeaderAndRootHash(query *process.SCQu return nil, nil, err } - blockHeader, _, err := service.getBlockHeaderByNonce(currentHeader.GetNonce() + 1) - if err != nil { - return nil, nil, err - } + return service.getRootHashForBlock(currentHeader) + } - additionalData := blockHeader.GetAdditionalData() - if check.IfNil(additionalData) { - return currentHeader, currentHeader.GetRootHash(), nil - } + return service.mainBlockChain.GetCurrentBlockHeader(), service.mainBlockChain.GetCurrentBlockRootHash(), nil +} - return blockHeader, additionalData.GetScheduledRootHash(), nil +func (service *SCQueryService) getRootHashForBlock(currentHeader data.HeaderHandler) (data.HeaderHandler, []byte, error) { + blockHeader, _, err := service.getBlockHeaderByNonce(currentHeader.GetNonce() + 1) + if err != nil { + return nil, nil, err } - return service.mainBlockChain.GetCurrentBlockHeader(), service.mainBlockChain.GetCurrentBlockRootHash(), nil + additionalData := blockHeader.GetAdditionalData() + if check.IfNil(additionalData) { + return currentHeader, currentHeader.GetRootHash(), nil + } + + return blockHeader, additionalData.GetScheduledRootHash(), nil } func (service *SCQueryService) getBlockHeaderByHash(headerHash []byte) (data.HeaderHandler, error) { From ef7cef3a3c40de46c1ce1a2db2d44ce6c11367ab Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 21 Aug 2023 14:10:39 +0300 Subject: [PATCH 077/120] - fixed go build commands --- .github/workflows/create_release.yml | 8 ++++---- cmd/node/main.go | 4 ++-- docker/multiversx/Dockerfile | 2 +- docker/termui/Dockerfile | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index 804ce84df47..9d4e5bff8c1 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -59,10 +59,10 @@ jobs: - name: Build run: | mkdir -p ${BUILD_DIR} - cd ${GITHUB_WORKSPACE}/cmd/node && go build -o "${BUILD_DIR}/node" -a -i -ldflags="-X main.appVersion=${APP_VER}" - cd ${GITHUB_WORKSPACE}/cmd/keygenerator && go build -o "${BUILD_DIR}/keygenerator" -a -i -ldflags="-X main.appVersion=${APP_VER}" - cd ${GITHUB_WORKSPACE}/cmd/logviewer && go build -o "${BUILD_DIR}/logviewer" -a -i -ldflags="-X main.appVersion=${APP_VER}" - cd ${GITHUB_WORKSPACE}/cmd/termui && go build -o "${BUILD_DIR}/termui" -a -i -ldflags="-X main.appVersion=${APP_VER}" + cd ${GITHUB_WORKSPACE}/cmd/node && go build -o "${BUILD_DIR}/node" -a -ldflags="-X main.appVersion=${APP_VER}" + cd ${GITHUB_WORKSPACE}/cmd/keygenerator && go build -o "${BUILD_DIR}/keygenerator" -a -ldflags="-X main.appVersion=${APP_VER}" + cd ${GITHUB_WORKSPACE}/cmd/logviewer && go build -o "${BUILD_DIR}/logviewer" -a -ldflags="-X main.appVersion=${APP_VER}" + cd ${GITHUB_WORKSPACE}/cmd/termui && go build -o "${BUILD_DIR}/termui" -a -ldflags="-X main.appVersion=${APP_VER}" - name: Package run: | diff --git a/cmd/node/main.go b/cmd/node/main.go index 0d080a7864c..cfc2b5df38e 100644 --- a/cmd/node/main.go +++ b/cmd/node/main.go @@ -46,10 +46,10 @@ VERSION: // appVersion should be populated at build time using ldflags // Usage examples: // linux/mac: -// go build -i -v -ldflags="-X main.appVersion=$(git describe --tags --long --dirty)" +// go build -v -ldflags="-X main.appVersion=$(git describe --tags --long --dirty)" // windows: // for /f %i in ('git describe --tags --long --dirty') do set VERS=%i -// go build -i -v -ldflags="-X main.appVersion=%VERS%" +// go build -v -ldflags="-X main.appVersion=%VERS%" var appVersion = common.UnVersionedAppString func main() { diff --git a/docker/multiversx/Dockerfile b/docker/multiversx/Dockerfile index 8038974457b..776389df5b1 100644 --- a/docker/multiversx/Dockerfile +++ b/docker/multiversx/Dockerfile @@ -6,7 +6,7 @@ COPY . . RUN GO111MODULE=on go mod tidy # Multiversx node WORKDIR /go/mx-chain-go/cmd/node -RUN go build -i -v -ldflags="-X main.appVersion=$(git describe --tags --long --dirty)" +RUN go build -v -ldflags="-X main.appVersion=$(git describe --tags --long --dirty)" RUN cp /go/pkg/mod/github.com/multiversx/$(cat /go/mx-chain-go/go.mod | grep mx-chain-vm-v | sort -n | tail -n -1| awk -F '/' '{print$3}'| sed 's/ /@/g')/wasmer/libwasmer_linux_amd64.so /lib/libwasmer_linux_amd64.so WORKDIR /go/mx-chain-go/cmd/node diff --git a/docker/termui/Dockerfile b/docker/termui/Dockerfile index e691bc1b71e..ce77235f63f 100644 --- a/docker/termui/Dockerfile +++ b/docker/termui/Dockerfile @@ -3,7 +3,7 @@ RUN apt-get update && apt-get install -y WORKDIR /go/mx-chain-go COPY . . WORKDIR /go/mx-chain-go/cmd/termui -RUN go build -i -v +RUN go build -v RUN cp /go/pkg/mod/github.com/multiversx/$(cat /go/mx-chain-go/go.mod | grep mx-chain-vm-v | sort -n | tail -n -1| awk -F '/' '{print$3}'| sed 's/ /@/g')/wasmer/libwasmer_linux_amd64.so /lib/libwasmer_linux_amd64.so # ===== SECOND STAGE ====== From fd92d1082dc0f804863fd0710d2e17e8df17986c Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 21 Aug 2023 17:20:08 +0300 Subject: [PATCH 078/120] integrate multiTransfer v2 log --- factory/api/apiResolverFactory.go | 1 + .../alteredAccountsProvider.go | 18 ++- .../alteredAccountsProvider_test.go | 106 ++++++++++++++++++ .../alteredaccounts/tokensProcessor.go | 84 +++++++++----- .../alteredaccounts/tokensProcessor_test.go | 60 ++++++++++ .../factory/outportDataProviderFactory.go | 1 + 6 files changed, 237 insertions(+), 33 deletions(-) create mode 100644 outport/process/alteredaccounts/tokensProcessor_test.go diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index 5006002cf71..c22a399d314 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -553,6 +553,7 @@ func createAPIBlockProcessorArgs(args *ApiResolverArgs, apiTransactionHandler ex AddressConverter: args.CoreComponents.AddressPubKeyConverter(), AccountsDB: args.StateComponents.AccountsAdapterAPI(), EsdtDataStorageHandler: args.ProcessComponents.ESDTDataStorageHandlerForAPI(), + EnabledEpochsHandler: args.CoreComponents.EnableEpochsHandler(), }) if err != nil { return nil, err diff --git a/outport/process/alteredaccounts/alteredAccountsProvider.go b/outport/process/alteredaccounts/alteredAccountsProvider.go index b3ba2418de3..6372b32c2c8 100644 --- a/outport/process/alteredaccounts/alteredAccountsProvider.go +++ b/outport/process/alteredaccounts/alteredAccountsProvider.go @@ -12,6 +12,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/alteredAccount" "github.com/multiversx/mx-chain-core-go/data/esdt" outportcore "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/outport/process/alteredaccounts/shared" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" @@ -42,9 +43,11 @@ type ArgsAlteredAccountsProvider struct { AddressConverter core.PubkeyConverter AccountsDB state.AccountsAdapter EsdtDataStorageHandler vmcommon.ESDTNFTStorageHandler + EnabledEpochsHandler common.EnableEpochsHandler } type alteredAccountsProvider struct { + enabledEpochsHandler common.EnableEpochsHandler shardCoordinator sharding.Coordinator addressConverter core.PubkeyConverter accountsDB state.AccountsAdapter @@ -64,7 +67,7 @@ func NewAlteredAccountsProvider(args ArgsAlteredAccountsProvider) (*alteredAccou shardCoordinator: args.ShardCoordinator, addressConverter: args.AddressConverter, accountsDB: args.AccountsDB, - tokensProc: newTokensProcessor(args.ShardCoordinator), + tokensProc: newTokensProcessor(args.ShardCoordinator, args.EnabledEpochsHandler), esdtDataStorageHandler: args.EsdtDataStorageHandler, }, nil } @@ -359,19 +362,22 @@ func (aap *alteredAccountsProvider) IsInterfaceNil() bool { return aap == nil } -func checkArgAlteredAccountsProvider(arg ArgsAlteredAccountsProvider) error { - if check.IfNil(arg.ShardCoordinator) { +func checkArgAlteredAccountsProvider(args ArgsAlteredAccountsProvider) error { + if check.IfNil(args.ShardCoordinator) { return errNilShardCoordinator } - if check.IfNil(arg.AddressConverter) { + if check.IfNil(args.AddressConverter) { return ErrNilPubKeyConverter } - if check.IfNil(arg.AccountsDB) { + if check.IfNil(args.AccountsDB) { return ErrNilAccountsDB } - if check.IfNil(arg.EsdtDataStorageHandler) { + if check.IfNil(args.EsdtDataStorageHandler) { return ErrNilESDTDataStorageHandler } + if check.IfNil(args.EnabledEpochsHandler) { + return core.ErrNilEnableEpochsHandler + } return nil } diff --git a/outport/process/alteredaccounts/alteredAccountsProvider_test.go b/outport/process/alteredaccounts/alteredAccountsProvider_test.go index f548bc8bb10..137054eed4d 100644 --- a/outport/process/alteredaccounts/alteredAccountsProvider_test.go +++ b/outport/process/alteredaccounts/alteredAccountsProvider_test.go @@ -16,6 +16,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/outport/process/alteredaccounts/shared" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/multiversx/mx-chain-go/testscommon/trie" @@ -150,6 +151,7 @@ func TestAlteredAccountsProvider_ExtractAlteredAccountsFromPool(t *testing.T) { t.Run("should include receiver from tokens logs", testExtractAlteredAccountsFromPoolShouldIncludeDestinationFromTokensLogsTopics) t.Run("should work when an address has balance changes, esdt and nft", testExtractAlteredAccountsFromPoolAddressHasBalanceChangeEsdtAndfNft) t.Run("should work when an address has multiple nfts with different nonces", testExtractAlteredAccountsFromPoolAddressHasMultipleNfts) + t.Run("should work for multi transfer v2", testExtractAlteredAccountsFromPoolMultiTransferEventV2) t.Run("should not return balanceChanged for a receiver on an ESDTTransfer", testExtractAlteredAccountsFromPoolESDTTransferBalanceNotChanged) t.Run("should return balanceChanged for sender and receiver", testExtractAlteredAccountsFromPoolReceiverShouldHaveBalanceChanged) t.Run("should return balanceChanged only for sender", testExtractAlteredAccountsFromPoolOnlySenderShouldHaveBalanceChanged) @@ -886,6 +888,109 @@ func testExtractAlteredAccountsFromPoolAddressHasBalanceChangeEsdtAndfNft(t *tes require.Len(t, res[encodedAddr].Tokens, 2) } +func testExtractAlteredAccountsFromPoolMultiTransferEventV2(t *testing.T) { + t.Parallel() + + expectedToken1 := esdt.ESDigitalToken{ + Value: big.NewInt(37), + TokenMetaData: &esdt.MetaData{ + Nonce: 1, + }, + } + expectedToken2 := &esdt.ESDigitalToken{ + Value: big.NewInt(10), + TokenMetaData: &esdt.MetaData{ + Nonce: 1, + }, + } + args := getMockArgs() + args.EnabledEpochsHandler = &enableEpochsHandlerMock.EnableEpochsHandlerStub{ + IsScToScEventLogEnabledField: true, + } + + args.EsdtDataStorageHandler = &testscommon.EsdtStorageHandlerStub{ + GetESDTNFTTokenOnDestinationCalled: func(acnt vmcommon.UserAccountHandler, esdtTokenKey []byte, nonce uint64) (*esdt.ESDigitalToken, bool, error) { + if string(acnt.AddressBytes()) == "rcv" { + return expectedToken2, false, nil + } + return &expectedToken1, false, nil + }, + } + args.AccountsDB = &state.AccountsStub{ + LoadAccountCalled: func(addr []byte) (vmcommon.AccountHandler, error) { + return state.NewAccountWrapMock(addr), nil + }, + } + aap, _ := NewAlteredAccountsProvider(args) + + res, err := aap.ExtractAlteredAccountsFromPool(&outportcore.TransactionPool{ + Transactions: map[string]*outportcore.TxInfo{ + "hash0": { + Transaction: &transaction.Transaction{ + SndAddr: []byte("addr"), + Value: big.NewInt(0), + }, + FeeInfo: &outportcore.FeeInfo{ + Fee: big.NewInt(0), + }, + }, + }, + Logs: []*outportcore.LogData{ + { + TxHash: "hash0", + Log: &transaction.Log{ + Address: []byte("addr"), + Events: []*transaction.Event{ + { + Address: []byte("addr"), + Identifier: []byte(core.BuiltInFunctionMultiESDTNFTTransfer), + Topics: [][]byte{ + []byte("esdt"), + big.NewInt(1).Bytes(), + big.NewInt(10).Bytes(), + []byte("rcv"), + }, + }, + }, + }, + }, + }, + }, shared.AlteredAccountsOptions{}) + require.NoError(t, err) + + encodedAddr1, _ := args.AddressConverter.Encode([]byte("addr")) + require.Equal(t, &alteredAccount.AlteredAccount{ + Address: encodedAddr1, + Balance: "0", + Tokens: []*alteredAccount.AccountTokenData{ + { + Nonce: 1, + Identifier: "esdt", + Balance: "37", + MetaData: &alteredAccount.TokenMetaData{ + Nonce: 1, + }, + }, + }, + }, res[encodedAddr1]) + + encodedAddr2, _ := args.AddressConverter.Encode([]byte("rcv")) + require.Equal(t, &alteredAccount.AlteredAccount{ + Address: encodedAddr2, + Balance: "0", + Tokens: []*alteredAccount.AccountTokenData{ + { + Nonce: 1, + Identifier: "esdt", + Balance: "10", + MetaData: &alteredAccount.TokenMetaData{ + Nonce: 1, + }, + }, + }, + }, res[encodedAddr2]) +} + func testExtractAlteredAccountsFromPoolAddressHasMultipleNfts(t *testing.T) { t.Parallel() @@ -1385,5 +1490,6 @@ func getMockArgs() ArgsAlteredAccountsProvider { AddressConverter: &testscommon.PubkeyConverterMock{}, AccountsDB: &state.AccountsStub{}, EsdtDataStorageHandler: &testscommon.EsdtStorageHandlerStub{}, + EnabledEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, } } diff --git a/outport/process/alteredaccounts/tokensProcessor.go b/outport/process/alteredaccounts/tokensProcessor.go index a6f0ef4b276..177132284ff 100644 --- a/outport/process/alteredaccounts/tokensProcessor.go +++ b/outport/process/alteredaccounts/tokensProcessor.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data" outportcore "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/sharding" ) @@ -13,14 +14,16 @@ const ( idxTokenIDInTopics = 0 idxTokenNonceInTopics = 1 idxReceiverAddressInTopics = 3 + minTopicsMultiTransferV2 = 4 ) type tokensProcessor struct { - shardCoordinator sharding.Coordinator - tokensIdentifier map[string]struct{} + enableEpochsHandler common.EnableEpochsHandler + shardCoordinator sharding.Coordinator + tokensIdentifier map[string]struct{} } -func newTokensProcessor(shardCoordinator sharding.Coordinator) *tokensProcessor { +func newTokensProcessor(shardCoordinator sharding.Coordinator, enableEpochsHandler common.EnableEpochsHandler) *tokensProcessor { return &tokensProcessor{ tokensIdentifier: map[string]struct{}{ core.BuiltInFunctionESDTTransfer: {}, @@ -36,7 +39,8 @@ func newTokensProcessor(shardCoordinator sharding.Coordinator) *tokensProcessor core.BuiltInFunctionESDTFreeze: {}, core.BuiltInFunctionESDTUnFreeze: {}, }, - shardCoordinator: shardCoordinator, + shardCoordinator: shardCoordinator, + enableEpochsHandler: enableEpochsHandler, } } @@ -44,13 +48,9 @@ func (tp *tokensProcessor) extractESDTAccounts( txPool *outportcore.TransactionPool, markedAlteredAccounts map[string]*markedAlteredAccount, ) error { - var err error for _, txLog := range txPool.Logs { for _, event := range txLog.Log.Events { - err = tp.processEvent(event, markedAlteredAccounts) - if err != nil { - return err - } + tp.processEvent(event, markedAlteredAccounts) } } @@ -60,15 +60,22 @@ func (tp *tokensProcessor) extractESDTAccounts( func (tp *tokensProcessor) processEvent( event data.EventHandler, markedAlteredAccounts map[string]*markedAlteredAccount, -) error { - _, isESDT := tp.tokensIdentifier[string(event.GetIdentifier())] +) { + eventIdentifier := string(event.GetIdentifier()) + _, isESDT := tp.tokensIdentifier[eventIdentifier] if !isESDT { - return nil + return } topics := event.GetTopics() if len(topics) < idxTokenNonceInTopics+1 { - return nil + return + } + + isMultiTransferEventV2 := eventIdentifier == core.BuiltInFunctionMultiESDTNFTTransfer && tp.enableEpochsHandler.IsScToScEventLogEnabled() + if isMultiTransferEventV2 { + tp.processMultiTransferEventV2(event, markedAlteredAccounts) + return } nonce := topics[idxTokenNonceInTopics] @@ -76,10 +83,10 @@ func (tp *tokensProcessor) processEvent( err := tp.extractEsdtData(event, nonceBigInt, markedAlteredAccounts) if err != nil { log.Debug("cannot extract esdt data", "error", err) - return nil + return } - return nil + return } func (tp *tokensProcessor) extractEsdtData( @@ -96,10 +103,7 @@ func (tp *tokensProcessor) extractEsdtData( identifier := string(event.GetIdentifier()) isNFTCreate := identifier == core.BuiltInFunctionESDTNFTCreate tokenID := topics[idxTokenIDInTopics] - err := tp.processEsdtDataForAddress(address, nonce, string(tokenID), markedAlteredAccounts, isNFTCreate) - if err != nil { - return err - } + tp.processEsdtDataForAddress(address, nonce, string(tokenID), markedAlteredAccounts, isNFTCreate) // in case of esdt transfer, nft transfer, wipe or multi esdt transfers, the 3rd index of the topics contains the destination address eventShouldContainReceiverAddress := identifier == core.BuiltInFunctionESDTTransfer || @@ -111,24 +115,50 @@ func (tp *tokensProcessor) extractEsdtData( if eventShouldContainReceiverAddress && len(topics) > idxReceiverAddressInTopics { destinationAddress := topics[idxReceiverAddressInTopics] - err = tp.processEsdtDataForAddress(destinationAddress, nonce, string(tokenID), markedAlteredAccounts, false) - if err != nil { - return err - } + tp.processEsdtDataForAddress(destinationAddress, nonce, string(tokenID), markedAlteredAccounts, false) } return nil } +func (tp *tokensProcessor) processMultiTransferEventV2(event data.EventHandler, markedAlteredAccounts map[string]*markedAlteredAccount) { + topics := event.GetTopics() + // MultiESDTNFTTransfer V2 event + // N = len(topics) + // i := 0; i < N-1; i+=3 + // { + // topics[i] --- token identifier + // topics[i+1] --- token nonce + // topics[i+2] --- transferred value + // } + // topics[N-1] --- destination address + if len(topics) < minTopicsMultiTransferV2 { + return + } + + address := event.GetAddress() + numOfTopics := len(topics) + destinationAddress := topics[numOfTopics-1] + for i := 0; i < numOfTopics-1; i += 3 { + tokenID := topics[i] + nonceBigInt := big.NewInt(0).SetBytes(topics[i+1]) + // process event for the sender address + tp.processEsdtDataForAddress(address, nonceBigInt, string(tokenID), markedAlteredAccounts, false) + + // process event for the destination address + tp.processEsdtDataForAddress(destinationAddress, nonceBigInt, string(tokenID), markedAlteredAccounts, false) + } +} + func (tp *tokensProcessor) processEsdtDataForAddress( address []byte, nonce *big.Int, tokenID string, markedAlteredAccounts map[string]*markedAlteredAccount, isNFTCreate bool, -) error { +) { if !tp.isSameShard(address) { - return nil + return } addressStr := string(address) @@ -146,7 +176,7 @@ func (tp *tokensProcessor) processEsdtDataForAddress( _, alreadyExists := markedAccount.tokens[tokenKey] if alreadyExists { markedAccount.tokens[tokenKey].isNFTCreate = markedAccount.tokens[tokenKey].isNFTCreate || isNFTCreate - return nil + return } markedAccount.tokens[tokenKey] = &markedAlteredAccountToken{ @@ -155,7 +185,7 @@ func (tp *tokensProcessor) processEsdtDataForAddress( isNFTCreate: isNFTCreate, } - return nil + return } func (tp *tokensProcessor) isSameShard(address []byte) bool { diff --git a/outport/process/alteredaccounts/tokensProcessor_test.go b/outport/process/alteredaccounts/tokensProcessor_test.go new file mode 100644 index 00000000000..7850cb48072 --- /dev/null +++ b/outport/process/alteredaccounts/tokensProcessor_test.go @@ -0,0 +1,60 @@ +package alteredaccounts + +import ( + "math/big" + "testing" + + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/process/mock" + "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" + "github.com/stretchr/testify/require" +) + +func TestTokenProcessorProcessEventNotEnoughTopics(t *testing.T) { + t.Parallel() + + enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{} + enableEpochsHandler.IsScToScEventLogEnabledField = true + tp := newTokensProcessor(&mock.ShardCoordinatorStub{}, enableEpochsHandler) + + markedAccounts := make(map[string]*markedAlteredAccount) + tp.processEvent(&transaction.Event{ + Identifier: []byte(core.BuiltInFunctionMultiESDTNFTTransfer), + Address: []byte("addr"), + Topics: [][]byte{[]byte("0"), []byte("1"), []byte("2")}, + }, markedAccounts) + + require.Equal(t, 0, len(markedAccounts)) +} + +func TestTokenProcessorProcessEventMultiTransferV2(t *testing.T) { + t.Parallel() + + enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{} + enableEpochsHandler.IsScToScEventLogEnabledField = true + tp := newTokensProcessor(&mock.ShardCoordinatorStub{}, enableEpochsHandler) + + markedAccounts := make(map[string]*markedAlteredAccount) + tp.processEvent(&transaction.Event{ + Identifier: []byte(core.BuiltInFunctionMultiESDTNFTTransfer), + Address: []byte("addr"), + Topics: [][]byte{[]byte("token1"), big.NewInt(0).Bytes(), []byte("2"), []byte("token2"), big.NewInt(1).Bytes(), []byte("3"), []byte("receiver")}, + }, markedAccounts) + + require.Equal(t, 2, len(markedAccounts)) + markedAccount := &markedAlteredAccount{ + tokens: map[string]*markedAlteredAccountToken{ + "token1": { + identifier: "token1", + nonce: 0, + }, + "token2" + string(big.NewInt(1).Bytes()): { + identifier: "token2", + nonce: 1, + }, + }, + } + require.Equal(t, markedAccount, markedAccounts["addr"]) + require.Equal(t, markedAccount, markedAccounts["receiver"]) +} diff --git a/outport/process/factory/outportDataProviderFactory.go b/outport/process/factory/outportDataProviderFactory.go index 014ce6ddae4..add24bfb6e6 100644 --- a/outport/process/factory/outportDataProviderFactory.go +++ b/outport/process/factory/outportDataProviderFactory.go @@ -54,6 +54,7 @@ func CreateOutportDataProvider(arg ArgOutportDataProviderFactory) (outport.DataP AddressConverter: arg.AddressConverter, AccountsDB: arg.AccountsDB, EsdtDataStorageHandler: arg.EsdtDataStorageHandler, + EnabledEpochsHandler: arg.EnableEpochsHandler, }) if err != nil { return nil, err From 604b83360746438886d9922749693a7589ef2ca6 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 21 Aug 2023 17:29:15 +0300 Subject: [PATCH 079/120] fix linter --- outport/process/alteredaccounts/alteredAccountsProvider.go | 1 - 1 file changed, 1 deletion(-) diff --git a/outport/process/alteredaccounts/alteredAccountsProvider.go b/outport/process/alteredaccounts/alteredAccountsProvider.go index 6372b32c2c8..db2278b9f69 100644 --- a/outport/process/alteredaccounts/alteredAccountsProvider.go +++ b/outport/process/alteredaccounts/alteredAccountsProvider.go @@ -47,7 +47,6 @@ type ArgsAlteredAccountsProvider struct { } type alteredAccountsProvider struct { - enabledEpochsHandler common.EnableEpochsHandler shardCoordinator sharding.Coordinator addressConverter core.PubkeyConverter accountsDB state.AccountsAdapter From 312dda34f648d07576d8abb66316c37fdb645b95 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 21 Aug 2023 17:32:26 +0300 Subject: [PATCH 080/120] fix linter 2 --- outport/process/alteredaccounts/tokensProcessor.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/outport/process/alteredaccounts/tokensProcessor.go b/outport/process/alteredaccounts/tokensProcessor.go index 177132284ff..46babc67029 100644 --- a/outport/process/alteredaccounts/tokensProcessor.go +++ b/outport/process/alteredaccounts/tokensProcessor.go @@ -85,8 +85,6 @@ func (tp *tokensProcessor) processEvent( log.Debug("cannot extract esdt data", "error", err) return } - - return } func (tp *tokensProcessor) extractEsdtData( @@ -184,8 +182,6 @@ func (tp *tokensProcessor) processEsdtDataForAddress( nonce: nonce.Uint64(), isNFTCreate: isNFTCreate, } - - return } func (tp *tokensProcessor) isSameShard(address []byte) bool { From 8c685c8e00fc731f2bf63acfb7b2d96b56c7e7a5 Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 22 Aug 2023 12:03:20 +0300 Subject: [PATCH 081/120] - compacted configs --- cmd/node/config/enableEpochs.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 86dc062dbb3..5ab8b069946 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -249,7 +249,7 @@ SetGuardianEnableEpoch = 1 # DeterministicSortOnValidatorsInfoEnableEpoch represents the epoch when the deterministic sorting on validators info is enabled - DeterministicSortOnValidatorsInfoEnableEpoch = 2 + DeterministicSortOnValidatorsInfoEnableEpoch = 1 # BLSMultiSignerEnableEpoch represents the activation epoch for different types of BLS multi-signers BLSMultiSignerEnableEpoch = [ From d0987f7c5cabbfd127767c086452465a1efc1983 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 22 Aug 2023 13:36:07 +0300 Subject: [PATCH 082/120] fixes after review --- factory/api/apiResolverFactory.go | 1 - .../alteredAccountsProvider.go | 7 +--- .../alteredAccountsProvider_test.go | 5 --- .../alteredaccounts/tokensProcessor.go | 39 ++++++++----------- .../alteredaccounts/tokensProcessor_test.go | 19 +++++---- .../factory/outportDataProviderFactory.go | 1 - 6 files changed, 28 insertions(+), 44 deletions(-) diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index c22a399d314..5006002cf71 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -553,7 +553,6 @@ func createAPIBlockProcessorArgs(args *ApiResolverArgs, apiTransactionHandler ex AddressConverter: args.CoreComponents.AddressPubKeyConverter(), AccountsDB: args.StateComponents.AccountsAdapterAPI(), EsdtDataStorageHandler: args.ProcessComponents.ESDTDataStorageHandlerForAPI(), - EnabledEpochsHandler: args.CoreComponents.EnableEpochsHandler(), }) if err != nil { return nil, err diff --git a/outport/process/alteredaccounts/alteredAccountsProvider.go b/outport/process/alteredaccounts/alteredAccountsProvider.go index db2278b9f69..3125d4f372a 100644 --- a/outport/process/alteredaccounts/alteredAccountsProvider.go +++ b/outport/process/alteredaccounts/alteredAccountsProvider.go @@ -12,7 +12,6 @@ import ( "github.com/multiversx/mx-chain-core-go/data/alteredAccount" "github.com/multiversx/mx-chain-core-go/data/esdt" outportcore "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/outport/process/alteredaccounts/shared" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" @@ -43,7 +42,6 @@ type ArgsAlteredAccountsProvider struct { AddressConverter core.PubkeyConverter AccountsDB state.AccountsAdapter EsdtDataStorageHandler vmcommon.ESDTNFTStorageHandler - EnabledEpochsHandler common.EnableEpochsHandler } type alteredAccountsProvider struct { @@ -66,7 +64,7 @@ func NewAlteredAccountsProvider(args ArgsAlteredAccountsProvider) (*alteredAccou shardCoordinator: args.ShardCoordinator, addressConverter: args.AddressConverter, accountsDB: args.AccountsDB, - tokensProc: newTokensProcessor(args.ShardCoordinator, args.EnabledEpochsHandler), + tokensProc: newTokensProcessor(args.ShardCoordinator), esdtDataStorageHandler: args.EsdtDataStorageHandler, }, nil } @@ -374,9 +372,6 @@ func checkArgAlteredAccountsProvider(args ArgsAlteredAccountsProvider) error { if check.IfNil(args.EsdtDataStorageHandler) { return ErrNilESDTDataStorageHandler } - if check.IfNil(args.EnabledEpochsHandler) { - return core.ErrNilEnableEpochsHandler - } return nil } diff --git a/outport/process/alteredaccounts/alteredAccountsProvider_test.go b/outport/process/alteredaccounts/alteredAccountsProvider_test.go index 137054eed4d..51864ae0f14 100644 --- a/outport/process/alteredaccounts/alteredAccountsProvider_test.go +++ b/outport/process/alteredaccounts/alteredAccountsProvider_test.go @@ -16,7 +16,6 @@ import ( "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/outport/process/alteredaccounts/shared" "github.com/multiversx/mx-chain-go/testscommon" - "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" "github.com/multiversx/mx-chain-go/testscommon/marshallerMock" "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/multiversx/mx-chain-go/testscommon/trie" @@ -904,9 +903,6 @@ func testExtractAlteredAccountsFromPoolMultiTransferEventV2(t *testing.T) { }, } args := getMockArgs() - args.EnabledEpochsHandler = &enableEpochsHandlerMock.EnableEpochsHandlerStub{ - IsScToScEventLogEnabledField: true, - } args.EsdtDataStorageHandler = &testscommon.EsdtStorageHandlerStub{ GetESDTNFTTokenOnDestinationCalled: func(acnt vmcommon.UserAccountHandler, esdtTokenKey []byte, nonce uint64) (*esdt.ESDigitalToken, bool, error) { @@ -1490,6 +1486,5 @@ func getMockArgs() ArgsAlteredAccountsProvider { AddressConverter: &testscommon.PubkeyConverterMock{}, AccountsDB: &state.AccountsStub{}, EsdtDataStorageHandler: &testscommon.EsdtStorageHandlerStub{}, - EnabledEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{}, } } diff --git a/outport/process/alteredaccounts/tokensProcessor.go b/outport/process/alteredaccounts/tokensProcessor.go index 46babc67029..bc49c61058f 100644 --- a/outport/process/alteredaccounts/tokensProcessor.go +++ b/outport/process/alteredaccounts/tokensProcessor.go @@ -6,7 +6,6 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data" outportcore "github.com/multiversx/mx-chain-core-go/data/outport" - "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/sharding" ) @@ -14,16 +13,15 @@ const ( idxTokenIDInTopics = 0 idxTokenNonceInTopics = 1 idxReceiverAddressInTopics = 3 - minTopicsMultiTransferV2 = 4 + minTopicsMultiTransfer = 4 ) type tokensProcessor struct { - enableEpochsHandler common.EnableEpochsHandler - shardCoordinator sharding.Coordinator - tokensIdentifier map[string]struct{} + shardCoordinator sharding.Coordinator + tokensIdentifier map[string]struct{} } -func newTokensProcessor(shardCoordinator sharding.Coordinator, enableEpochsHandler common.EnableEpochsHandler) *tokensProcessor { +func newTokensProcessor(shardCoordinator sharding.Coordinator) *tokensProcessor { return &tokensProcessor{ tokensIdentifier: map[string]struct{}{ core.BuiltInFunctionESDTTransfer: {}, @@ -39,8 +37,7 @@ func newTokensProcessor(shardCoordinator sharding.Coordinator, enableEpochsHandl core.BuiltInFunctionESDTFreeze: {}, core.BuiltInFunctionESDTUnFreeze: {}, }, - shardCoordinator: shardCoordinator, - enableEpochsHandler: enableEpochsHandler, + shardCoordinator: shardCoordinator, } } @@ -72,30 +69,26 @@ func (tp *tokensProcessor) processEvent( return } - isMultiTransferEventV2 := eventIdentifier == core.BuiltInFunctionMultiESDTNFTTransfer && tp.enableEpochsHandler.IsScToScEventLogEnabled() + isMultiTransferEventV2 := eventIdentifier == core.BuiltInFunctionMultiESDTNFTTransfer if isMultiTransferEventV2 { - tp.processMultiTransferEventV2(event, markedAlteredAccounts) + tp.processMultiTransferEvent(event, markedAlteredAccounts) return } nonce := topics[idxTokenNonceInTopics] nonceBigInt := big.NewInt(0).SetBytes(nonce) - err := tp.extractEsdtData(event, nonceBigInt, markedAlteredAccounts) - if err != nil { - log.Debug("cannot extract esdt data", "error", err) - return - } + tp.extractEsdtData(event, nonceBigInt, markedAlteredAccounts) } func (tp *tokensProcessor) extractEsdtData( event data.EventHandler, nonce *big.Int, markedAlteredAccounts map[string]*markedAlteredAccount, -) error { +) { address := event.GetAddress() topics := event.GetTopics() if len(topics) == 0 { - return nil + return } identifier := string(event.GetIdentifier()) @@ -115,13 +108,11 @@ func (tp *tokensProcessor) extractEsdtData( destinationAddress := topics[idxReceiverAddressInTopics] tp.processEsdtDataForAddress(destinationAddress, nonce, string(tokenID), markedAlteredAccounts, false) } - - return nil } -func (tp *tokensProcessor) processMultiTransferEventV2(event data.EventHandler, markedAlteredAccounts map[string]*markedAlteredAccount) { +func (tp *tokensProcessor) processMultiTransferEvent(event data.EventHandler, markedAlteredAccounts map[string]*markedAlteredAccount) { topics := event.GetTopics() - // MultiESDTNFTTransfer V2 event + // MultiESDTNFTTransfer event // N = len(topics) // i := 0; i < N-1; i+=3 // { @@ -130,12 +121,14 @@ func (tp *tokensProcessor) processMultiTransferEventV2(event data.EventHandler, // topics[i+2] --- transferred value // } // topics[N-1] --- destination address - if len(topics) < minTopicsMultiTransferV2 { + numOfTopics := len(topics) + if numOfTopics < minTopicsMultiTransfer || numOfTopics%3 != 1 { + log.Warn("tokensProcessor.processMultiTransferEvent: wrong number of topics", "got", numOfTopics) return } address := event.GetAddress() - numOfTopics := len(topics) + destinationAddress := topics[numOfTopics-1] for i := 0; i < numOfTopics-1; i += 3 { tokenID := topics[i] diff --git a/outport/process/alteredaccounts/tokensProcessor_test.go b/outport/process/alteredaccounts/tokensProcessor_test.go index 7850cb48072..a7a6a65af96 100644 --- a/outport/process/alteredaccounts/tokensProcessor_test.go +++ b/outport/process/alteredaccounts/tokensProcessor_test.go @@ -7,16 +7,13 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/process/mock" - "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" "github.com/stretchr/testify/require" ) -func TestTokenProcessorProcessEventNotEnoughTopics(t *testing.T) { +func TestTokenProcessorProcessEventWrongNumberOfTopics(t *testing.T) { t.Parallel() - enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{} - enableEpochsHandler.IsScToScEventLogEnabledField = true - tp := newTokensProcessor(&mock.ShardCoordinatorStub{}, enableEpochsHandler) + tp := newTokensProcessor(&mock.ShardCoordinatorStub{}) markedAccounts := make(map[string]*markedAlteredAccount) tp.processEvent(&transaction.Event{ @@ -26,14 +23,20 @@ func TestTokenProcessorProcessEventNotEnoughTopics(t *testing.T) { }, markedAccounts) require.Equal(t, 0, len(markedAccounts)) + + tp.processEvent(&transaction.Event{ + Identifier: []byte(core.BuiltInFunctionMultiESDTNFTTransfer), + Address: []byte("addr"), + Topics: [][]byte{[]byte("0"), []byte("1"), []byte("2"), []byte("0"), []byte("1")}, + }, markedAccounts) + + require.Equal(t, 0, len(markedAccounts)) } func TestTokenProcessorProcessEventMultiTransferV2(t *testing.T) { t.Parallel() - enableEpochsHandler := &enableEpochsHandlerMock.EnableEpochsHandlerStub{} - enableEpochsHandler.IsScToScEventLogEnabledField = true - tp := newTokensProcessor(&mock.ShardCoordinatorStub{}, enableEpochsHandler) + tp := newTokensProcessor(&mock.ShardCoordinatorStub{}) markedAccounts := make(map[string]*markedAlteredAccount) tp.processEvent(&transaction.Event{ diff --git a/outport/process/factory/outportDataProviderFactory.go b/outport/process/factory/outportDataProviderFactory.go index add24bfb6e6..014ce6ddae4 100644 --- a/outport/process/factory/outportDataProviderFactory.go +++ b/outport/process/factory/outportDataProviderFactory.go @@ -54,7 +54,6 @@ func CreateOutportDataProvider(arg ArgOutportDataProviderFactory) (outport.DataP AddressConverter: arg.AddressConverter, AccountsDB: arg.AccountsDB, EsdtDataStorageHandler: arg.EsdtDataStorageHandler, - EnabledEpochsHandler: arg.EnableEpochsHandler, }) if err != nil { return nil, err From 4f647d0286a248d676ffb21caedd6c1e6ce12c1c Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 22 Aug 2023 14:03:23 +0300 Subject: [PATCH 083/120] small fix --- outport/process/alteredaccounts/tokensProcessor.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/outport/process/alteredaccounts/tokensProcessor.go b/outport/process/alteredaccounts/tokensProcessor.go index bc49c61058f..bb0839ef44a 100644 --- a/outport/process/alteredaccounts/tokensProcessor.go +++ b/outport/process/alteredaccounts/tokensProcessor.go @@ -69,8 +69,8 @@ func (tp *tokensProcessor) processEvent( return } - isMultiTransferEventV2 := eventIdentifier == core.BuiltInFunctionMultiESDTNFTTransfer - if isMultiTransferEventV2 { + isMultiTransferEvent := eventIdentifier == core.BuiltInFunctionMultiESDTNFTTransfer + if isMultiTransferEvent { tp.processMultiTransferEvent(event, markedAlteredAccounts) return } From 82eba9c7290834e1b6600f069fcba6bf873994cc Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 22 Aug 2023 14:03:59 +0300 Subject: [PATCH 084/120] remove unused error --- outport/process/alteredaccounts/errors.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/outport/process/alteredaccounts/errors.go b/outport/process/alteredaccounts/errors.go index 4f7a3f27209..eae3a48f175 100644 --- a/outport/process/alteredaccounts/errors.go +++ b/outport/process/alteredaccounts/errors.go @@ -19,6 +19,3 @@ var errCannotCastToUserAccountHandler = errors.New("cannot cast account handler // errCannotCastToVmCommonUserAccountHandler signals an issue while casting to vm common user account handler var errCannotCastToVmCommonUserAccountHandler = errors.New("cannot cast user account handler to vm common user account handler") - -// ErrNilMetadata signals that a nil metadata has been provided -var ErrNilMetadata = errors.New("nil metadata provided") From 6846e4233330771ef0b10d2e5fb2bb2c4ad2ced1 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 22 Aug 2023 16:23:07 +0300 Subject: [PATCH 085/120] fixes after merge --- go.mod | 2 +- go.sum | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index e4311349681..2ade1299a5d 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.13 github.com/multiversx/mx-chain-scenario-go v1.2.1 github.com/multiversx/mx-chain-storage-go v1.0.12 - github.com/multiversx/mx-chain-vm-common-go v1.5.3-0.20230817123414-d332d9044473 + github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd diff --git a/go.sum b/go.sum index 485a5d4d9a5..59dcc6cb18b 100644 --- a/go.sum +++ b/go.sum @@ -382,16 +382,16 @@ github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736 h1: github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= github.com/multiversx/mx-chain-crypto-go v1.2.8 h1:wOgVlUaO5X4L8iEbFjcQcL8SZvv6WZ7LqH73BiRPhxU= github.com/multiversx/mx-chain-crypto-go v1.2.8/go.mod h1:fkaWKp1rbQN9wPKya5jeoRyC+c/SyN/NfggreyeBw+8= -github.com/multiversx/mx-chain-es-indexer-go v1.4.9 h1:rL+8P+X279/9xY8a6t1ynWhhOzJya0LmBAm5ZNCosik= -github.com/multiversx/mx-chain-es-indexer-go v1.4.9/go.mod h1:rgsFY2RwaH5Slud0i6zJbxidvf1y8LE+YOXnnny0O/c= +github.com/multiversx/mx-chain-es-indexer-go v1.4.10 h1:qwYWQ92PuaKhrhZEHm+blEeYSvrxtT1rG8sAL4OEzqc= +github.com/multiversx/mx-chain-es-indexer-go v1.4.10/go.mod h1:rgsFY2RwaH5Slud0i6zJbxidvf1y8LE+YOXnnny0O/c= github.com/multiversx/mx-chain-logger-go v1.0.13 h1:eru/TETo0MkO4ZTnXsQDKf4PBRpAXmqjT02klNT/JnY= github.com/multiversx/mx-chain-logger-go v1.0.13/go.mod h1:MZJhTAtZTJxT+yK2EHc4ZW3YOHUc1UdjCD0iahRNBZk= github.com/multiversx/mx-chain-scenario-go v1.2.1 h1:9eC6VcOEAKRRKZ7EbSWPLzCdNIMWwuNBtAZlgR4cSMA= github.com/multiversx/mx-chain-scenario-go v1.2.1/go.mod h1:EuZY7DpNFHVNSxJR8dKE1z2I8gBYfEFFPSwNUOXptqE= github.com/multiversx/mx-chain-storage-go v1.0.12 h1:FrkgHPV38BO8cwdK0GUYHxVkUyOhyBBIhPz0P1e72NA= github.com/multiversx/mx-chain-storage-go v1.0.12/go.mod h1:/8VrMbO9CbIi0Ym3F1QPY6EENGcUq5DpEBPDt4evn9Q= -github.com/multiversx/mx-chain-vm-common-go v1.5.3-0.20230817123414-d332d9044473 h1:Lw2w84sF8FiFaXmuZ2wNOr8foBMXmyaKHiPgpkL7Hkw= -github.com/multiversx/mx-chain-vm-common-go v1.5.3-0.20230817123414-d332d9044473/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= +github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f h1:41rBUuyYKuvyKlF0kJA+/Mm3a90BqtntiP8vMEyIB9g= +github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676 h1:T++epWNPrIs+1zqLSMQNZDjKgiemRmBbMZ0WdSRntwY= github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676/go.mod h1:taHBYMfZx/R5QxOfObDJ0wPBW44vnefdr9eQk+MmG/0= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 h1:AtJY/By1Zx/bb5C7sKypriggw7QpkbVCJ/fX9nTOPDU= From 6e258417f8e02d058a597b15e7b3643d02a9e5fd Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 22 Aug 2023 16:35:49 +0300 Subject: [PATCH 086/120] fix version of mx-chain-vm-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 2ade1299a5d..421d7058266 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/multiversx/mx-chain-scenario-go v1.2.1 github.com/multiversx/mx-chain-storage-go v1.0.12 github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f - github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676 + github.com/multiversx/mx-chain-vm-go v1.5.7-0.20230822131337-735f5ca5047b github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88-0.20230817130100-3e5270010759 diff --git a/go.sum b/go.sum index 59dcc6cb18b..ab829060e81 100644 --- a/go.sum +++ b/go.sum @@ -392,8 +392,8 @@ github.com/multiversx/mx-chain-storage-go v1.0.12 h1:FrkgHPV38BO8cwdK0GUYHxVkUyO github.com/multiversx/mx-chain-storage-go v1.0.12/go.mod h1:/8VrMbO9CbIi0Ym3F1QPY6EENGcUq5DpEBPDt4evn9Q= github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f h1:41rBUuyYKuvyKlF0kJA+/Mm3a90BqtntiP8vMEyIB9g= github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= -github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676 h1:T++epWNPrIs+1zqLSMQNZDjKgiemRmBbMZ0WdSRntwY= -github.com/multiversx/mx-chain-vm-go v1.5.6-0.20230817131505-42db8db53676/go.mod h1:taHBYMfZx/R5QxOfObDJ0wPBW44vnefdr9eQk+MmG/0= +github.com/multiversx/mx-chain-vm-go v1.5.7-0.20230822131337-735f5ca5047b h1:CKK6QI1hlt0YGIhKAve3jUwkYPJWcrLHv3SQMoWmZN8= +github.com/multiversx/mx-chain-vm-go v1.5.7-0.20230822131337-735f5ca5047b/go.mod h1:u6J4AxJp16iel+hrRye2GjrhvMCHhkikosZd6gdSD9s= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 h1:AtJY/By1Zx/bb5C7sKypriggw7QpkbVCJ/fX9nTOPDU= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61/go.mod h1:JZ52LHZgxMh3uxMVzzmOucAVOqTwanbFKEmB21PyoOE= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd h1:BAiE4ZjfeigqeK+fHotv9NccJCdwx3Dp38FVfOdMXMU= From 3cd54614859643ea4176ca145d98be02f68d52e8 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 24 Aug 2023 13:15:37 +0300 Subject: [PATCH 087/120] - fixes --- .../requestHandlers/requesters/disabled/requester.go | 5 +++++ state/snapshotsManager.go | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dataRetriever/requestHandlers/requesters/disabled/requester.go b/dataRetriever/requestHandlers/requesters/disabled/requester.go index 9de56f5a396..207fd414fdd 100644 --- a/dataRetriever/requestHandlers/requesters/disabled/requester.go +++ b/dataRetriever/requestHandlers/requesters/disabled/requester.go @@ -29,6 +29,11 @@ func (r *requester) SetDebugHandler(_ dataRetriever.DebugHandler) error { return nil } +// RequestDataFromHashArray returns nil as it is disabled +func (r *requester) RequestDataFromHashArray(_ [][]byte, _ uint32) error { + return nil +} + // IsInterfaceNil returns true if there is no value under the interface func (r *requester) IsInterfaceNil() bool { return r == nil diff --git a/state/snapshotsManager.go b/state/snapshotsManager.go index 1f537b6857c..fff80151cdd 100644 --- a/state/snapshotsManager.go +++ b/state/snapshotsManager.go @@ -247,14 +247,14 @@ func (sm *snapshotsManager) snapshotState( }) if err != nil { log.Error("error waiting for storage epoch change", "err", err) - sm.earlySnapshotCompletion(stats) + sm.earlySnapshotCompletion(stats, trieStorageManager) return } if !trieStorageManager.ShouldTakeSnapshot() { log.Debug("skipping snapshot", "rootHash", rootHash, "epoch", epoch) - sm.earlySnapshotCompletion(stats) + sm.earlySnapshotCompletion(stats, trieStorageManager) return } @@ -277,15 +277,21 @@ func (sm *snapshotsManager) snapshotState( go sm.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, epoch) } -func (sm *snapshotsManager) earlySnapshotCompletion(stats *snapshotStatistics) { +func (sm *snapshotsManager) earlySnapshotCompletion(stats *snapshotStatistics, trieStorageManager common.StorageManager) { sm.mutex.Lock() defer sm.mutex.Unlock() stats.SnapshotFinished() sm.isSnapshotInProgress.Reset() + trieStorageManager.ExitPruningBufferingMode() } func (sm *snapshotsManager) waitForStorageEpochChange(args storageEpochChangeWaitArgs) error { + if sm.processingMode == common.ImportDb { + log.Debug("no need to wait for storage epoch change as the node is running in import-db mode") + return nil + } + if args.SnapshotWaitTimeout < args.WaitTimeForSnapshotEpochCheck { return fmt.Errorf("timeout (%s) must be greater than wait time between snapshot epoch check (%s)", args.SnapshotWaitTimeout, args.WaitTimeForSnapshotEpochCheck) } From 11f4683277cc03e2b25fc39d0de493faeb3f37ff Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 24 Aug 2023 15:31:49 +0300 Subject: [PATCH 088/120] fix data race in tests --- dataRetriever/topicSender/topicResolverSender_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dataRetriever/topicSender/topicResolverSender_test.go b/dataRetriever/topicSender/topicResolverSender_test.go index 2e8df0f47c9..9e5bfc1c5ef 100644 --- a/dataRetriever/topicSender/topicResolverSender_test.go +++ b/dataRetriever/topicSender/topicResolverSender_test.go @@ -157,11 +157,11 @@ func TestTopicResolverSender_SendShouldWork(t *testing.T) { t.Parallel() pID1 := core.PeerID("peer1") - sentToPid1 := false buffToSend := []byte("buff") t.Run("on main network", func(t *testing.T) { t.Parallel() + sentToPid1 := false arg := createMockArgTopicResolverSender() arg.MainMessenger = &p2pmocks.MessengerStub{ SendToConnectedPeerCalled: func(topic string, buff []byte, peerID core.PeerID) error { @@ -206,6 +206,7 @@ func TestTopicResolverSender_SendShouldWork(t *testing.T) { t.Run("on full archive network", func(t *testing.T) { t.Parallel() + sentToPid1 := false arg := createMockArgTopicResolverSender() arg.FullArchiveMessenger = &p2pmocks.MessengerStub{ SendToConnectedPeerCalled: func(topic string, buff []byte, peerID core.PeerID) error { From 82b516ca23f4ed47fafa9cb82e219e38c6110a11 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 24 Aug 2023 16:43:42 +0300 Subject: [PATCH 089/120] - added unit tests --- state/export_test.go | 8 +++++- state/snapshotsManager_test.go | 48 ++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/state/export_test.go b/state/export_test.go index 43beff645bd..43810db3749 100644 --- a/state/export_test.go +++ b/state/export_test.go @@ -1,11 +1,12 @@ package state import ( + "time" + "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/testscommon/storageManager" vmcommon "github.com/multiversx/mx-chain-vm-common-go" - "time" ) // LastSnapshotStarted - @@ -105,3 +106,8 @@ func GetStorageEpochChangeWaitArgs() storageEpochChangeWaitArgs { func (sm *snapshotsManager) WaitForStorageEpochChange(args storageEpochChangeWaitArgs) error { return sm.waitForStorageEpochChange(args) } + +// NewNilSnapshotsManager - +func NewNilSnapshotsManager() *snapshotsManager { + return nil +} diff --git a/state/snapshotsManager_test.go b/state/snapshotsManager_test.go index 9ab2b50820b..da9cb0f3356 100644 --- a/state/snapshotsManager_test.go +++ b/state/snapshotsManager_test.go @@ -104,6 +104,16 @@ func TestNewSnapshotsManager(t *testing.T) { }) } +func TestSnapshotsManager_IsInterfaceNil(t *testing.T) { + t.Parallel() + + instance := state.NewNilSnapshotsManager() + assert.True(t, instance.IsInterfaceNil()) + + instance, _ = state.NewSnapshotsManager(getDefaultSnapshotManagerArgs()) + assert.False(t, instance.IsInterfaceNil()) +} + func TestSnapshotsManager_SetSyncer(t *testing.T) { t.Parallel() @@ -321,6 +331,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { getLatestStorageEpochCalled := false sm, _ := state.NewSnapshotsManager(getDefaultSnapshotManagerArgs()) + enterPruningBufferingModeCalled := false + exitPruningBufferingModeCalled := false tsm := &storageManager.StorageManagerStub{ GetLatestStorageEpochCalled: func() (uint32, error) { getLatestStorageEpochCalled = true @@ -331,6 +343,12 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { assert.Fail(t, "the func should have returned before this is called") return false }, + EnterPruningBufferingModeCalled: func() { + enterPruningBufferingModeCalled = true + }, + ExitPruningBufferingModeCalled: func() { + exitPruningBufferingModeCalled = true + }, } sm.SnapshotState(rootHash, epoch, tsm) @@ -339,6 +357,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { } assert.True(t, getLatestStorageEpochCalled) + assert.True(t, enterPruningBufferingModeCalled) + assert.True(t, exitPruningBufferingModeCalled) }) t.Run("tsm signals that a snapshot should not be taken", func(t *testing.T) { t.Parallel() @@ -352,6 +372,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { }, } sm, _ := state.NewSnapshotsManager(args) + enterPruningBufferingModeCalled := false + exitPruningBufferingModeCalled := false tsm := &storageManager.StorageManagerStub{ GetLatestStorageEpochCalled: func() (uint32, error) { return 5, nil @@ -361,6 +383,12 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { assert.True(t, sm.IsSnapshotInProgress()) return false }, + EnterPruningBufferingModeCalled: func() { + enterPruningBufferingModeCalled = true + }, + ExitPruningBufferingModeCalled: func() { + exitPruningBufferingModeCalled = true + }, } sm.SnapshotState(rootHash, epoch, tsm) @@ -369,6 +397,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { } assert.True(t, shouldTakeSnapshotCalled) + assert.True(t, enterPruningBufferingModeCalled) + assert.True(t, exitPruningBufferingModeCalled) }) t.Run("snapshot with errors does not mark active and does not remove lastSnapshot", func(t *testing.T) { t.Parallel() @@ -503,6 +533,24 @@ func TestSnapshotsManager_WaitForStorageEpochChange(t *testing.T) { err := sm.WaitForStorageEpochChange(args) assert.Error(t, err) }) + t.Run("is in import-db mode should not return error on timeout condition", func(t *testing.T) { + t.Parallel() + + args := state.GetStorageEpochChangeWaitArgs() + args.WaitTimeForSnapshotEpochCheck = time.Millisecond + args.SnapshotWaitTimeout = time.Millisecond * 5 + args.TrieStorageManager = &storageManager.StorageManagerStub{ + GetLatestStorageEpochCalled: func() (uint32, error) { + return 0, nil + }, + } + argsSnapshotManager := getDefaultSnapshotManagerArgs() + argsSnapshotManager.ProcessingMode = common.ImportDb + sm, _ := state.NewSnapshotsManager(argsSnapshotManager) + + err := sm.WaitForStorageEpochChange(args) + assert.Nil(t, err) + }) t.Run("returns when latestStorageEpoch == snapshotEpoch", func(t *testing.T) { t.Parallel() From 3e0cad7e8fe8b73a57e282e5470c279dfeba759c Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 24 Aug 2023 17:02:06 +0300 Subject: [PATCH 090/120] - fix race condition --- state/snapshotsManager_test.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/state/snapshotsManager_test.go b/state/snapshotsManager_test.go index da9cb0f3356..70c2423ce51 100644 --- a/state/snapshotsManager_test.go +++ b/state/snapshotsManager_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/core/atomic" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/state" @@ -331,8 +332,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { getLatestStorageEpochCalled := false sm, _ := state.NewSnapshotsManager(getDefaultSnapshotManagerArgs()) - enterPruningBufferingModeCalled := false - exitPruningBufferingModeCalled := false + enterPruningBufferingModeCalled := atomic.Flag{} + exitPruningBufferingModeCalled := atomic.Flag{} tsm := &storageManager.StorageManagerStub{ GetLatestStorageEpochCalled: func() (uint32, error) { getLatestStorageEpochCalled = true @@ -344,10 +345,10 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { return false }, EnterPruningBufferingModeCalled: func() { - enterPruningBufferingModeCalled = true + enterPruningBufferingModeCalled.SetValue(true) }, ExitPruningBufferingModeCalled: func() { - exitPruningBufferingModeCalled = true + exitPruningBufferingModeCalled.SetValue(true) }, } @@ -357,8 +358,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { } assert.True(t, getLatestStorageEpochCalled) - assert.True(t, enterPruningBufferingModeCalled) - assert.True(t, exitPruningBufferingModeCalled) + assert.True(t, enterPruningBufferingModeCalled.IsSet()) + assert.True(t, exitPruningBufferingModeCalled.IsSet()) }) t.Run("tsm signals that a snapshot should not be taken", func(t *testing.T) { t.Parallel() @@ -372,8 +373,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { }, } sm, _ := state.NewSnapshotsManager(args) - enterPruningBufferingModeCalled := false - exitPruningBufferingModeCalled := false + enterPruningBufferingModeCalled := atomic.Flag{} + exitPruningBufferingModeCalled := atomic.Flag{} tsm := &storageManager.StorageManagerStub{ GetLatestStorageEpochCalled: func() (uint32, error) { return 5, nil @@ -384,10 +385,10 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { return false }, EnterPruningBufferingModeCalled: func() { - enterPruningBufferingModeCalled = true + enterPruningBufferingModeCalled.SetValue(true) }, ExitPruningBufferingModeCalled: func() { - exitPruningBufferingModeCalled = true + exitPruningBufferingModeCalled.SetValue(true) }, } @@ -397,8 +398,8 @@ func TestSnapshotsManager_SnapshotState(t *testing.T) { } assert.True(t, shouldTakeSnapshotCalled) - assert.True(t, enterPruningBufferingModeCalled) - assert.True(t, exitPruningBufferingModeCalled) + assert.True(t, enterPruningBufferingModeCalled.IsSet()) + assert.True(t, exitPruningBufferingModeCalled.IsSet()) }) t.Run("snapshot with errors does not mark active and does not remove lastSnapshot", func(t *testing.T) { t.Parallel() From fa5b54ce185cdc8a5bb1f7f5ce46a2481c6c09a8 Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Thu, 24 Aug 2023 18:01:13 +0300 Subject: [PATCH 091/120] add ordering to generated and executed intra shard smart contract results --- .../block/postprocess/intermediateResults.go | 44 +++++++++++-------- process/block/preprocess/transactions.go | 1 + 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/process/block/postprocess/intermediateResults.go b/process/block/postprocess/intermediateResults.go index d051fa41e65..6b9020ca29d 100644 --- a/process/block/postprocess/intermediateResults.go +++ b/process/block/postprocess/intermediateResults.go @@ -22,25 +22,27 @@ import ( var _ process.IntermediateTransactionHandler = (*intermediateResultsProcessor)(nil) type intermediateResultsProcessor struct { - pubkeyConv core.PubkeyConverter - blockType block.Type - currTxs dataRetriever.TransactionCacher - enableEpochsHandler common.EnableEpochsHandler + pubkeyConv core.PubkeyConverter + blockType block.Type + currTxs dataRetriever.TransactionCacher + enableEpochsHandler common.EnableEpochsHandler + executionOrderHandler common.TxExecutionOrderHandler *basePostProcessor } // ArgsNewIntermediateResultsProcessor defines the arguments needed for new smart contract processor type ArgsNewIntermediateResultsProcessor struct { - Hasher hashing.Hasher - Marshalizer marshal.Marshalizer - Coordinator sharding.Coordinator - PubkeyConv core.PubkeyConverter - Store dataRetriever.StorageService - BlockType block.Type - CurrTxs dataRetriever.TransactionCacher - EconomicsFee process.FeeHandler - EnableEpochsHandler common.EnableEpochsHandler + Hasher hashing.Hasher + Marshalizer marshal.Marshalizer + Coordinator sharding.Coordinator + PubkeyConv core.PubkeyConverter + Store dataRetriever.StorageService + BlockType block.Type + CurrTxs dataRetriever.TransactionCacher + EconomicsFee process.FeeHandler + EnableEpochsHandler common.EnableEpochsHandler + TxExecutionOrderHandler common.TxExecutionOrderHandler } // NewIntermediateResultsProcessor creates a new intermediate results processor @@ -71,6 +73,9 @@ func NewIntermediateResultsProcessor( if check.IfNil(args.EnableEpochsHandler) { return nil, process.ErrNilEnableEpochsHandler } + if check.IfNil(args.TxExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } base := &basePostProcessor{ hasher: args.Hasher, @@ -83,11 +88,12 @@ func NewIntermediateResultsProcessor( } irp := &intermediateResultsProcessor{ - basePostProcessor: base, - pubkeyConv: args.PubkeyConv, - blockType: args.BlockType, - currTxs: args.CurrTxs, - enableEpochsHandler: args.EnableEpochsHandler, + basePostProcessor: base, + pubkeyConv: args.PubkeyConv, + blockType: args.BlockType, + currTxs: args.CurrTxs, + enableEpochsHandler: args.EnableEpochsHandler, + executionOrderHandler: args.TxExecutionOrderHandler, } irp.interResultsForBlock = make(map[string]*txInfo) @@ -255,6 +261,8 @@ func (irp *intermediateResultsProcessor) AddIntermediateTransactions(txs []data. } sndShId, dstShId := irp.getShardIdsFromAddresses(addScr.SndAddr, addScr.RcvAddr) + + irp.executionOrderHandler.Add(scrHash) irp.addIntermediateTxToResultsForBlock(addScr, scrHash, sndShId, dstShId) } diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index 113ab9bb3f2..8ff3ccbffaf 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -885,6 +885,7 @@ func (txs *transactions) processAndRemoveBadTransaction( _, err := txs.txProcessor.ProcessTransaction(tx) isTxTargetedForDeletion := errors.Is(err, process.ErrLowerNonceInTransaction) || errors.Is(err, process.ErrInsufficientFee) || errors.Is(err, process.ErrTransactionNotExecutable) if isTxTargetedForDeletion { + txs.txExecutionOrderHandler.Remove(txHash) strCache := process.ShardCacherIdentifier(sndShardId, dstShardId) txs.txPool.RemoveData(txHash, strCache) } From 82915f09318f9b2690c5f71ec61f8178e763cbd0 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 25 Aug 2023 11:26:24 +0300 Subject: [PATCH 092/120] add missing param initialization causing --- integrationTests/vm/testInitializer.go | 1 + 1 file changed, 1 insertion(+) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 69089efb00e..b6a45323625 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -267,6 +267,7 @@ func (vmTestContext *VMTestContext) GetVMOutputWithTransientVM(funcName string, StorageService: &storageStubs.ChainStorerStub{}, Marshaller: integrationTests.TestMarshalizer, Uint64ByteSliceConverter: integrationTests.TestUint64Converter, + Hasher: integrationtests.TestHasher, } scQueryService, _ := smartContract.NewSCQueryService(argsNewSCQueryService) From 4e4db93fae05849cbafab953e6082d598519bb38 Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Fri, 25 Aug 2023 15:58:55 +0300 Subject: [PATCH 093/120] fixes tests and initialization --- common/disabled/orderedCollection.go | 57 +++++++++++++++ common/disabled/orderedCollection_test.go | 28 +++++++ factory/processing/blockProcessorCreator.go | 34 +++++---- .../txSimulatorProcessComponents.go | 35 +++++---- genesis/process/metaGenesisBlockCreator.go | 17 +++-- genesis/process/shardGenesisBlockCreator.go | 17 +++-- integrationTests/testProcessorNode.go | 72 +++++++++--------- integrationTests/vm/testInitializer.go | 18 +++-- .../vm/wasm/wasmvm/mock_contracts.go | 1 + .../postprocess/intermediateResults_test.go | 20 ++--- process/coordinator/process_test.go | 40 +++++----- .../intermediateProcessorsContainerFactory.go | 73 ++++++++++--------- ...rmediateProcessorsContainerFactory_test.go | 18 +++-- .../intermediateProcessorsContainerFactory.go | 73 ++++++++++--------- ...rmediateProcessorsContainerFactory_test.go | 18 +++-- 15 files changed, 322 insertions(+), 199 deletions(-) create mode 100644 common/disabled/orderedCollection.go create mode 100644 common/disabled/orderedCollection_test.go diff --git a/common/disabled/orderedCollection.go b/common/disabled/orderedCollection.go new file mode 100644 index 00000000000..1fbc4b3c4d5 --- /dev/null +++ b/common/disabled/orderedCollection.go @@ -0,0 +1,57 @@ +package disabled + +import ( + "errors" +) + +type orderedCollection struct { +} + +var errDisabledComponent = errors.New("") + +// NewOrderedCollection creates a new ordered collection +func NewOrderedCollection() *orderedCollection { + return &orderedCollection{} +} + +// Add adds a new item to the order collector +func (oc *orderedCollection) Add(_ []byte) {} + +// GetItemAtIndex returns the item at the given index +func (oc *orderedCollection) GetItemAtIndex(_ uint32) ([]byte, error) { + return nil, errDisabledComponent +} + +// GetOrder returns the order of the item in the ordered collection +func (oc *orderedCollection) GetOrder(_ []byte) (int, error) { + return 0, errDisabledComponent +} + +// Remove removes an item from the order collector if it exists, adapting the order of the remaining items +func (oc *orderedCollection) Remove(_ []byte) {} + +// RemoveMultiple removes multiple items from the order collector if they exist, adapting the order of the remaining items +func (oc *orderedCollection) RemoveMultiple(_ [][]byte) {} + +// GetItems returns the items in the order they were added +func (oc *orderedCollection) GetItems() [][]byte { + return make([][]byte, 0) +} + +// Contains returns true if the item is in the ordered collection +func (oc *orderedCollection) Contains(_ []byte) bool { + return false +} + +// Clear clears the ordered collection +func (oc *orderedCollection) Clear() {} + +// Len returns the number of items in the ordered collection +func (oc *orderedCollection) Len() int { + return 0 +} + +// IsInterfaceNil returns true if there is no value under the interface +func (oc *orderedCollection) IsInterfaceNil() bool { + return oc == nil +} diff --git a/common/disabled/orderedCollection_test.go b/common/disabled/orderedCollection_test.go new file mode 100644 index 00000000000..59e166286a8 --- /dev/null +++ b/common/disabled/orderedCollection_test.go @@ -0,0 +1,28 @@ +package disabled + +import ( + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "testing" +) + +func TestOrderedCollection_MethodsShouldNotPanic(t *testing.T) { + t.Parallel() + + oc := NewOrderedCollection() + assert.False(t, check.IfNil(oc)) + + require.NotPanics(t, func() { + oc.Add([]byte("key")) + _, _ = oc.GetItemAtIndex(0) + _, _ = oc.GetOrder([]byte("key")) + oc.Remove([]byte("key")) + oc.RemoveMultiple([][]byte{[]byte("key1"), []byte("key2")}) + _ = oc.GetItems() + _ = oc.Contains([]byte("key")) + oc.Clear() + _ = oc.Len() + _ = oc.IsInterfaceNil() + }) +} diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index 6512d05086a..9cd88b095cd 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -168,14 +168,15 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( } argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - Marshalizer: pcf.coreData.InternalMarshalizer(), - Hasher: pcf.coreData.Hasher(), - PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), - Store: pcf.data.StorageService(), - PoolsHolder: pcf.data.Datapool(), - EconomicsFee: pcf.coreData.EconomicsData(), - EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + Marshalizer: pcf.coreData.InternalMarshalizer(), + Hasher: pcf.coreData.Hasher(), + PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), + Store: pcf.data.StorageService(), + PoolsHolder: pcf.data.Datapool(), + EconomicsFee: pcf.coreData.EconomicsData(), + EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + TxExecutionOrderHandler: pcf.txExecutionOrderHandler, } interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) @@ -491,14 +492,15 @@ func (pcf *processComponentsFactory) newMetaBlockProcessor( } argsFactory := metachain.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - Marshalizer: pcf.coreData.InternalMarshalizer(), - Hasher: pcf.coreData.Hasher(), - PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), - Store: pcf.data.StorageService(), - PoolsHolder: pcf.data.Datapool(), - EconomicsFee: pcf.coreData.EconomicsData(), - EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + Marshalizer: pcf.coreData.InternalMarshalizer(), + Hasher: pcf.coreData.Hasher(), + PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), + Store: pcf.data.StorageService(), + PoolsHolder: pcf.data.Datapool(), + EconomicsFee: pcf.coreData.EconomicsData(), + EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + TxExecutionOrderHandler: pcf.txExecutionOrderHandler, } interimProcFactory, err := metachain.NewIntermediateProcessorsContainerFactory(argsFactory) diff --git a/factory/processing/txSimulatorProcessComponents.go b/factory/processing/txSimulatorProcessComponents.go index 8916f60ab1b..2a5e8c5a7a2 100644 --- a/factory/processing/txSimulatorProcessComponents.go +++ b/factory/processing/txSimulatorProcessComponents.go @@ -3,6 +3,7 @@ package processing import ( "github.com/multiversx/mx-chain-core-go/core" dataBlock "github.com/multiversx/mx-chain-core-go/data/block" + "github.com/multiversx/mx-chain-go/common/disabled" bootstrapDisabled "github.com/multiversx/mx-chain-go/epochStart/bootstrap/disabled" "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/genesis" @@ -104,14 +105,15 @@ func (pcf *processComponentsFactory) createArgsTxSimulatorProcessorForMeta( args := transactionEvaluator.ArgsTxSimulator{} argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - Marshalizer: pcf.coreData.InternalMarshalizer(), - Hasher: pcf.coreData.Hasher(), - PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), - Store: bootstrapDisabled.NewChainStorer(), - PoolsHolder: pcf.data.Datapool(), - EconomicsFee: &processDisabled.FeeHandler{}, - EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + Marshalizer: pcf.coreData.InternalMarshalizer(), + Hasher: pcf.coreData.Hasher(), + PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), + Store: bootstrapDisabled.NewChainStorer(), + PoolsHolder: pcf.data.Datapool(), + EconomicsFee: &processDisabled.FeeHandler{}, + EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + TxExecutionOrderHandler: disabled.NewOrderedCollection(), } intermediateProcessorsFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { @@ -248,14 +250,15 @@ func (pcf *processComponentsFactory) createArgsTxSimulatorProcessorShard( args := transactionEvaluator.ArgsTxSimulator{} argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - Marshalizer: pcf.coreData.InternalMarshalizer(), - Hasher: pcf.coreData.Hasher(), - PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), - Store: bootstrapDisabled.NewChainStorer(), - PoolsHolder: pcf.data.Datapool(), - EconomicsFee: &processDisabled.FeeHandler{}, - EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + Marshalizer: pcf.coreData.InternalMarshalizer(), + Hasher: pcf.coreData.Hasher(), + PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), + Store: bootstrapDisabled.NewChainStorer(), + PoolsHolder: pcf.data.Datapool(), + EconomicsFee: &processDisabled.FeeHandler{}, + EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + TxExecutionOrderHandler: disabled.NewOrderedCollection(), } intermediateProcessorsFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index c5be52cd5e8..0df88542162 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -376,14 +376,15 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc genesisFeeHandler := &disabled.FeeHandler{} argsFactory := metachain.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: arg.ShardCoordinator, - Marshalizer: arg.Core.InternalMarshalizer(), - Hasher: arg.Core.Hasher(), - PubkeyConverter: arg.Core.AddressPubKeyConverter(), - Store: arg.Data.StorageService(), - PoolsHolder: arg.Data.Datapool(), - EconomicsFee: genesisFeeHandler, - EnableEpochsHandler: enableEpochsHandler, + ShardCoordinator: arg.ShardCoordinator, + Marshalizer: arg.Core.InternalMarshalizer(), + Hasher: arg.Core.Hasher(), + PubkeyConverter: arg.Core.AddressPubKeyConverter(), + Store: arg.Data.StorageService(), + PoolsHolder: arg.Data.Datapool(), + EconomicsFee: genesisFeeHandler, + EnableEpochsHandler: enableEpochsHandler, + TxExecutionOrderHandler: arg.TxExecutionOrderHandler, } interimProcFactory, err := metachain.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index d70e3bd3945..a80fd8ae149 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -493,14 +493,15 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo genesisFeeHandler := &disabled.FeeHandler{} argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: arg.ShardCoordinator, - Marshalizer: arg.Core.InternalMarshalizer(), - Hasher: arg.Core.Hasher(), - PubkeyConverter: arg.Core.AddressPubKeyConverter(), - Store: arg.Data.StorageService(), - PoolsHolder: arg.Data.Datapool(), - EconomicsFee: genesisFeeHandler, - EnableEpochsHandler: enableEpochsHandler, + ShardCoordinator: arg.ShardCoordinator, + Marshalizer: arg.Core.InternalMarshalizer(), + Hasher: arg.Core.Hasher(), + PubkeyConverter: arg.Core.AddressPubKeyConverter(), + Store: arg.Data.StorageService(), + PoolsHolder: arg.Data.Datapool(), + EconomicsFee: genesisFeeHandler, + EnableEpochsHandler: enableEpochsHandler, + TxExecutionOrderHandler: arg.TxExecutionOrderHandler, } interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 4c8c660ed0d..8bfb21e3467 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1502,28 +1502,30 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u } argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: tpn.ShardCoordinator, - Marshalizer: TestMarshalizer, - Hasher: TestHasher, - PubkeyConverter: TestAddressPubkeyConverter, - Store: tpn.Storage, - PoolsHolder: tpn.DataPool, - EconomicsFee: tpn.EconomicsData, - EnableEpochsHandler: tpn.EnableEpochsHandler, + ShardCoordinator: tpn.ShardCoordinator, + Marshalizer: TestMarshalizer, + Hasher: TestHasher, + PubkeyConverter: TestAddressPubkeyConverter, + Store: tpn.Storage, + PoolsHolder: tpn.DataPool, + EconomicsFee: tpn.EconomicsData, + EnableEpochsHandler: tpn.EnableEpochsHandler, + TxExecutionOrderHandler: tpn.TxExecutionOrderHandler, } interimProcFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) tpn.InterimProcContainer, _ = interimProcFactory.Create() argsNewIntermediateResultsProc := postprocess.ArgsNewIntermediateResultsProcessor{ - Hasher: TestHasher, - Marshalizer: TestMarshalizer, - Coordinator: tpn.ShardCoordinator, - PubkeyConv: TestAddressPubkeyConverter, - Store: tpn.Storage, - BlockType: dataBlock.SmartContractResultBlock, - CurrTxs: tpn.DataPool.CurrentBlockTxs(), - EconomicsFee: tpn.EconomicsData, - EnableEpochsHandler: tpn.EnableEpochsHandler, + Hasher: TestHasher, + Marshalizer: TestMarshalizer, + Coordinator: tpn.ShardCoordinator, + PubkeyConv: TestAddressPubkeyConverter, + Store: tpn.Storage, + BlockType: dataBlock.SmartContractResultBlock, + CurrTxs: tpn.DataPool.CurrentBlockTxs(), + EconomicsFee: tpn.EconomicsData, + EnableEpochsHandler: tpn.EnableEpochsHandler, + TxExecutionOrderHandler: tpn.TxExecutionOrderHandler, } tpn.ScrForwarder, _ = postprocess.NewTestIntermediateResultsProcessor(argsNewIntermediateResultsProc) @@ -1747,28 +1749,30 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[string]uint64) { argsFactory := metaProcess.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: tpn.ShardCoordinator, - Marshalizer: TestMarshalizer, - Hasher: TestHasher, - PubkeyConverter: TestAddressPubkeyConverter, - Store: tpn.Storage, - PoolsHolder: tpn.DataPool, - EconomicsFee: tpn.EconomicsData, - EnableEpochsHandler: tpn.EnableEpochsHandler, + ShardCoordinator: tpn.ShardCoordinator, + Marshalizer: TestMarshalizer, + Hasher: TestHasher, + PubkeyConverter: TestAddressPubkeyConverter, + Store: tpn.Storage, + PoolsHolder: tpn.DataPool, + EconomicsFee: tpn.EconomicsData, + EnableEpochsHandler: tpn.EnableEpochsHandler, + TxExecutionOrderHandler: tpn.TxExecutionOrderHandler, } interimProcFactory, _ := metaProcess.NewIntermediateProcessorsContainerFactory(argsFactory) tpn.InterimProcContainer, _ = interimProcFactory.Create() argsNewIntermediateResultsProc := postprocess.ArgsNewIntermediateResultsProcessor{ - Hasher: TestHasher, - Marshalizer: TestMarshalizer, - Coordinator: tpn.ShardCoordinator, - PubkeyConv: TestAddressPubkeyConverter, - Store: tpn.Storage, - BlockType: dataBlock.SmartContractResultBlock, - CurrTxs: tpn.DataPool.CurrentBlockTxs(), - EconomicsFee: tpn.EconomicsData, - EnableEpochsHandler: tpn.EnableEpochsHandler, + Hasher: TestHasher, + Marshalizer: TestMarshalizer, + Coordinator: tpn.ShardCoordinator, + PubkeyConv: TestAddressPubkeyConverter, + Store: tpn.Storage, + BlockType: dataBlock.SmartContractResultBlock, + CurrTxs: tpn.DataPool.CurrentBlockTxs(), + EconomicsFee: tpn.EconomicsData, + EnableEpochsHandler: tpn.EnableEpochsHandler, + TxExecutionOrderHandler: tpn.TxExecutionOrderHandler, } tpn.ScrForwarder, _ = postprocess.NewTestIntermediateResultsProcessor(argsNewIntermediateResultsProc) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index f3db60b50bf..d0d850be1ca 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -54,6 +54,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/storageunit" "github.com/multiversx/mx-chain-go/storage/txcache" "github.com/multiversx/mx-chain-go/testscommon" + commonMocks "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" @@ -906,14 +907,15 @@ func CreateTxProcessorWithOneSCExecutorWithVMs( } argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: shardCoordinator, - Marshalizer: integrationtests.TestMarshalizer, - Hasher: integrationtests.TestHasher, - PubkeyConverter: pubkeyConv, - Store: disabled.NewChainStorer(), - PoolsHolder: poolsHolder, - EconomicsFee: &processDisabled.FeeHandler{}, - EnableEpochsHandler: enableEpochsHandler, + ShardCoordinator: shardCoordinator, + Marshalizer: integrationtests.TestMarshalizer, + Hasher: integrationtests.TestHasher, + PubkeyConverter: pubkeyConv, + Store: disabled.NewChainStorer(), + PoolsHolder: poolsHolder, + EconomicsFee: &processDisabled.FeeHandler{}, + EnableEpochsHandler: enableEpochsHandler, + TxExecutionOrderHandler: &commonMocks.TxExecutionOrderHandlerStub{}, } interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { diff --git a/integrationTests/vm/wasm/wasmvm/mock_contracts.go b/integrationTests/vm/wasm/wasmvm/mock_contracts.go index f8294d05787..f22781144f6 100644 --- a/integrationTests/vm/wasm/wasmvm/mock_contracts.go +++ b/integrationTests/vm/wasm/wasmvm/mock_contracts.go @@ -104,6 +104,7 @@ func GetAddressForNewAccountOnWalletAndNodeWithVM( userAccount.SetCodeHash(address) err = node.AccntState.SaveAccount(userAccount) require.Nil(t, err) + _, _ = node.AccntState.Commit() return address, userAccount } diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index 1b70fba4130..ee42abfd3f1 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -2,6 +2,7 @@ package postprocess import ( "bytes" + txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" "math/big" "sort" "strconv" @@ -32,15 +33,16 @@ func createMockPubkeyConverter() *testscommon.PubkeyConverterMock { func createMockArgsNewIntermediateResultsProcessor() ArgsNewIntermediateResultsProcessor { args := ArgsNewIntermediateResultsProcessor{ - Hasher: &hashingMocks.HasherMock{}, - Marshalizer: &mock.MarshalizerMock{}, - Coordinator: mock.NewMultiShardsCoordinatorMock(5), - PubkeyConv: createMockPubkeyConverter(), - Store: &storage.ChainStorerStub{}, - BlockType: block.SmartContractResultBlock, - CurrTxs: &mock.TxForCurrentBlockStub{}, - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + Hasher: &hashingMocks.HasherMock{}, + Marshalizer: &mock.MarshalizerMock{}, + Coordinator: mock.NewMultiShardsCoordinatorMock(5), + PubkeyConv: createMockPubkeyConverter(), + Store: &storage.ChainStorerStub{}, + BlockType: block.SmartContractResultBlock, + CurrTxs: &mock.TxForCurrentBlockStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + TxExecutionOrderHandler: &txExecOrderStub.TxExecutionOrderHandlerStub{}, } return args diff --git a/process/coordinator/process_test.go b/process/coordinator/process_test.go index 6a95350970f..68fa53bca13 100644 --- a/process/coordinator/process_test.go +++ b/process/coordinator/process_test.go @@ -554,14 +554,15 @@ func createPreProcessorContainer() process.PreProcessorsContainer { func createInterimProcessorContainer() process.IntermediateProcessorContainer { argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: mock.NewMultiShardsCoordinatorMock(5), - Marshalizer: &mock.MarshalizerMock{}, - Hasher: &hashingMocks.HasherMock{}, - PubkeyConverter: createMockPubkeyConverter(), - Store: initStore(), - PoolsHolder: initDataPool([]byte("test_hash1")), - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + ShardCoordinator: mock.NewMultiShardsCoordinatorMock(5), + Marshalizer: &mock.MarshalizerMock{}, + Hasher: &hashingMocks.HasherMock{}, + PubkeyConverter: createMockPubkeyConverter(), + Store: initStore(), + PoolsHolder: initDataPool([]byte("test_hash1")), + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } preFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) container, _ := preFactory.Create() @@ -2197,14 +2198,15 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsNilOrMiss(t *testi tdp := initDataPool(txHash) shardCoordinator := mock.NewMultiShardsCoordinatorMock(5) argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ - ShardCoordinator: shardCoordinator, - Marshalizer: &mock.MarshalizerMock{}, - Hasher: &hashingMocks.HasherMock{}, - PubkeyConverter: createMockPubkeyConverter(), - Store: &storageStubs.ChainStorerStub{}, - PoolsHolder: tdp, - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + ShardCoordinator: shardCoordinator, + Marshalizer: &mock.MarshalizerMock{}, + Hasher: &hashingMocks.HasherMock{}, + PubkeyConverter: createMockPubkeyConverter(), + Store: &storageStubs.ChainStorerStub{}, + PoolsHolder: tdp, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } preFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) container, _ := preFactory.Create() @@ -2264,7 +2266,8 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsOk(t *testing.T) { return MaxGasLimitPerBlock }, }, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + TxExecutionOrderHandler: &commonMock.TxExecutionOrderHandlerStub{}, } interFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) container, _ := interFactory.Create() @@ -4057,7 +4060,8 @@ func TestTransactionCoordinator_RevertIfNeededShouldWork(t *testing.T) { return 0 }, } - tc, _ := NewTransactionCoordinator(txCoordinatorArgs) + tc, err := NewTransactionCoordinator(txCoordinatorArgs) + require.Nil(t, err) createMBDestMeExecutionInfo := &createMiniBlockDestMeExecutionInfo{ processedTxHashes: txHashes, diff --git a/process/factory/metachain/intermediateProcessorsContainerFactory.go b/process/factory/metachain/intermediateProcessorsContainerFactory.go index 826e61231c7..c9584623c91 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory.go @@ -15,26 +15,28 @@ import ( ) type intermediateProcessorsContainerFactory struct { - shardCoordinator sharding.Coordinator - marshalizer marshal.Marshalizer - hasher hashing.Hasher - pubkeyConverter core.PubkeyConverter - store dataRetriever.StorageService - poolsHolder dataRetriever.PoolsHolder - economicsFee process.FeeHandler - enableEpochsHandler common.EnableEpochsHandler + shardCoordinator sharding.Coordinator + marshalizer marshal.Marshalizer + hasher hashing.Hasher + pubkeyConverter core.PubkeyConverter + store dataRetriever.StorageService + poolsHolder dataRetriever.PoolsHolder + economicsFee process.FeeHandler + enableEpochsHandler common.EnableEpochsHandler + executionOrderHandler common.TxExecutionOrderHandler } // ArgsNewIntermediateProcessorsContainerFactory defines the argument list to create a new container factory type ArgsNewIntermediateProcessorsContainerFactory struct { - ShardCoordinator sharding.Coordinator - Marshalizer marshal.Marshalizer - Hasher hashing.Hasher - PubkeyConverter core.PubkeyConverter - Store dataRetriever.StorageService - PoolsHolder dataRetriever.PoolsHolder - EconomicsFee process.FeeHandler - EnableEpochsHandler common.EnableEpochsHandler + ShardCoordinator sharding.Coordinator + Marshalizer marshal.Marshalizer + Hasher hashing.Hasher + PubkeyConverter core.PubkeyConverter + Store dataRetriever.StorageService + PoolsHolder dataRetriever.PoolsHolder + EconomicsFee process.FeeHandler + EnableEpochsHandler common.EnableEpochsHandler + TxExecutionOrderHandler common.TxExecutionOrderHandler } // NewIntermediateProcessorsContainerFactory is responsible for creating a new intermediate processors factory object @@ -66,16 +68,20 @@ func NewIntermediateProcessorsContainerFactory( if check.IfNil(args.EnableEpochsHandler) { return nil, process.ErrNilEnableEpochsHandler } + if check.IfNil(args.TxExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } return &intermediateProcessorsContainerFactory{ - shardCoordinator: args.ShardCoordinator, - marshalizer: args.Marshalizer, - hasher: args.Hasher, - pubkeyConverter: args.PubkeyConverter, - store: args.Store, - poolsHolder: args.PoolsHolder, - economicsFee: args.EconomicsFee, - enableEpochsHandler: args.EnableEpochsHandler, + shardCoordinator: args.ShardCoordinator, + marshalizer: args.Marshalizer, + hasher: args.Hasher, + pubkeyConverter: args.PubkeyConverter, + store: args.Store, + poolsHolder: args.PoolsHolder, + economicsFee: args.EconomicsFee, + enableEpochsHandler: args.EnableEpochsHandler, + executionOrderHandler: args.TxExecutionOrderHandler, }, nil } @@ -108,15 +114,16 @@ func (ppcm *intermediateProcessorsContainerFactory) Create() (process.Intermedia func (ppcm *intermediateProcessorsContainerFactory) createSmartContractResultsIntermediateProcessor() (process.IntermediateTransactionHandler, error) { args := postprocess.ArgsNewIntermediateResultsProcessor{ - Hasher: ppcm.hasher, - Marshalizer: ppcm.marshalizer, - Coordinator: ppcm.shardCoordinator, - PubkeyConv: ppcm.pubkeyConverter, - Store: ppcm.store, - BlockType: block.SmartContractResultBlock, - CurrTxs: ppcm.poolsHolder.CurrentBlockTxs(), - EconomicsFee: ppcm.economicsFee, - EnableEpochsHandler: ppcm.enableEpochsHandler, + Hasher: ppcm.hasher, + Marshalizer: ppcm.marshalizer, + Coordinator: ppcm.shardCoordinator, + PubkeyConv: ppcm.pubkeyConverter, + Store: ppcm.store, + BlockType: block.SmartContractResultBlock, + CurrTxs: ppcm.poolsHolder.CurrentBlockTxs(), + EconomicsFee: ppcm.economicsFee, + EnableEpochsHandler: ppcm.enableEpochsHandler, + TxExecutionOrderHandler: ppcm.executionOrderHandler, } irp, err := postprocess.NewIntermediateResultsProcessor(args) return irp, err diff --git a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go index 03c4323c140..f479b6b1861 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go @@ -1,6 +1,7 @@ package metachain_test import ( + txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" "testing" "github.com/multiversx/mx-chain-go/process" @@ -21,14 +22,15 @@ func createMockPubkeyConverter() *testscommon.PubkeyConverterMock { func createMockArgsNewIntermediateProcessorsFactory() metachain.ArgsNewIntermediateProcessorsContainerFactory { args := metachain.ArgsNewIntermediateProcessorsContainerFactory{ - Hasher: &hashingMocks.HasherMock{}, - Marshalizer: &mock.MarshalizerMock{}, - ShardCoordinator: mock.NewMultiShardsCoordinatorMock(5), - PubkeyConverter: createMockPubkeyConverter(), - Store: &storageStubs.ChainStorerStub{}, - PoolsHolder: dataRetrieverMock.NewPoolsHolderMock(), - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + Hasher: &hashingMocks.HasherMock{}, + Marshalizer: &mock.MarshalizerMock{}, + ShardCoordinator: mock.NewMultiShardsCoordinatorMock(5), + PubkeyConverter: createMockPubkeyConverter(), + Store: &storageStubs.ChainStorerStub{}, + PoolsHolder: dataRetrieverMock.NewPoolsHolderMock(), + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + TxExecutionOrderHandler: &txExecOrderStub.TxExecutionOrderHandlerStub{}, } return args } diff --git a/process/factory/shard/intermediateProcessorsContainerFactory.go b/process/factory/shard/intermediateProcessorsContainerFactory.go index c19b971d3b3..007e6e2c991 100644 --- a/process/factory/shard/intermediateProcessorsContainerFactory.go +++ b/process/factory/shard/intermediateProcessorsContainerFactory.go @@ -15,26 +15,28 @@ import ( ) type intermediateProcessorsContainerFactory struct { - shardCoordinator sharding.Coordinator - marshalizer marshal.Marshalizer - hasher hashing.Hasher - pubkeyConverter core.PubkeyConverter - store dataRetriever.StorageService - poolsHolder dataRetriever.PoolsHolder - economicsFee process.FeeHandler - enableEpochsHandler common.EnableEpochsHandler + shardCoordinator sharding.Coordinator + marshalizer marshal.Marshalizer + hasher hashing.Hasher + pubkeyConverter core.PubkeyConverter + store dataRetriever.StorageService + poolsHolder dataRetriever.PoolsHolder + economicsFee process.FeeHandler + enableEpochsHandler common.EnableEpochsHandler + executionOrderHandler common.TxExecutionOrderHandler } // ArgsNewIntermediateProcessorsContainerFactory defines the argument list to create a new container factory type ArgsNewIntermediateProcessorsContainerFactory struct { - ShardCoordinator sharding.Coordinator - Marshalizer marshal.Marshalizer - Hasher hashing.Hasher - PubkeyConverter core.PubkeyConverter - Store dataRetriever.StorageService - PoolsHolder dataRetriever.PoolsHolder - EconomicsFee process.FeeHandler - EnableEpochsHandler common.EnableEpochsHandler + ShardCoordinator sharding.Coordinator + Marshalizer marshal.Marshalizer + Hasher hashing.Hasher + PubkeyConverter core.PubkeyConverter + Store dataRetriever.StorageService + PoolsHolder dataRetriever.PoolsHolder + EconomicsFee process.FeeHandler + EnableEpochsHandler common.EnableEpochsHandler + TxExecutionOrderHandler common.TxExecutionOrderHandler } // NewIntermediateProcessorsContainerFactory is responsible for creating a new intermediate processors factory object @@ -66,16 +68,20 @@ func NewIntermediateProcessorsContainerFactory( if check.IfNil(args.EnableEpochsHandler) { return nil, process.ErrNilEnableEpochsHandler } + if check.IfNil(args.TxExecutionOrderHandler) { + return nil, process.ErrNilTxExecutionOrderHandler + } return &intermediateProcessorsContainerFactory{ - shardCoordinator: args.ShardCoordinator, - marshalizer: args.Marshalizer, - hasher: args.Hasher, - pubkeyConverter: args.PubkeyConverter, - store: args.Store, - poolsHolder: args.PoolsHolder, - economicsFee: args.EconomicsFee, - enableEpochsHandler: args.EnableEpochsHandler, + shardCoordinator: args.ShardCoordinator, + marshalizer: args.Marshalizer, + hasher: args.Hasher, + pubkeyConverter: args.PubkeyConverter, + store: args.Store, + poolsHolder: args.PoolsHolder, + economicsFee: args.EconomicsFee, + enableEpochsHandler: args.EnableEpochsHandler, + executionOrderHandler: args.TxExecutionOrderHandler, }, nil } @@ -118,15 +124,16 @@ func (ppcm *intermediateProcessorsContainerFactory) Create() (process.Intermedia func (ppcm *intermediateProcessorsContainerFactory) createSmartContractResultsIntermediateProcessor() (process.IntermediateTransactionHandler, error) { args := postprocess.ArgsNewIntermediateResultsProcessor{ - Hasher: ppcm.hasher, - Marshalizer: ppcm.marshalizer, - Coordinator: ppcm.shardCoordinator, - PubkeyConv: ppcm.pubkeyConverter, - Store: ppcm.store, - BlockType: block.SmartContractResultBlock, - CurrTxs: ppcm.poolsHolder.CurrentBlockTxs(), - EconomicsFee: ppcm.economicsFee, - EnableEpochsHandler: ppcm.enableEpochsHandler, + Hasher: ppcm.hasher, + Marshalizer: ppcm.marshalizer, + Coordinator: ppcm.shardCoordinator, + PubkeyConv: ppcm.pubkeyConverter, + Store: ppcm.store, + BlockType: block.SmartContractResultBlock, + CurrTxs: ppcm.poolsHolder.CurrentBlockTxs(), + EconomicsFee: ppcm.economicsFee, + EnableEpochsHandler: ppcm.enableEpochsHandler, + TxExecutionOrderHandler: ppcm.executionOrderHandler, } irp, err := postprocess.NewIntermediateResultsProcessor(args) diff --git a/process/factory/shard/intermediateProcessorsContainerFactory_test.go b/process/factory/shard/intermediateProcessorsContainerFactory_test.go index a2e9ecec971..86e103dd669 100644 --- a/process/factory/shard/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/shard/intermediateProcessorsContainerFactory_test.go @@ -9,6 +9,7 @@ import ( "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" + txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" @@ -55,14 +56,15 @@ func createMockPubkeyConverter() *testscommon.PubkeyConverterMock { func createMockArgsNewIntermediateProcessorsFactory() shard.ArgsNewIntermediateProcessorsContainerFactory { args := shard.ArgsNewIntermediateProcessorsContainerFactory{ - Hasher: &hashingMocks.HasherMock{}, - Marshalizer: &mock.MarshalizerMock{}, - ShardCoordinator: mock.NewMultiShardsCoordinatorMock(5), - PubkeyConverter: createMockPubkeyConverter(), - Store: &storageStubs.ChainStorerStub{}, - PoolsHolder: createDataPools(), - EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, - EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + Hasher: &hashingMocks.HasherMock{}, + Marshalizer: &mock.MarshalizerMock{}, + ShardCoordinator: mock.NewMultiShardsCoordinatorMock(5), + PubkeyConverter: createMockPubkeyConverter(), + Store: &storageStubs.ChainStorerStub{}, + PoolsHolder: createDataPools(), + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, + EnableEpochsHandler: &enableEpochsHandlerMock.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + TxExecutionOrderHandler: &txExecOrderStub.TxExecutionOrderHandlerStub{}, } return args } From 15a2a123291bb0456a09493a3e34624aeabd30b1 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 28 Aug 2023 10:35:52 +0300 Subject: [PATCH 094/120] proper tags --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 421d7058266..d37a4da3677 100644 --- a/go.mod +++ b/go.mod @@ -14,17 +14,17 @@ require ( github.com/gorilla/websocket v1.5.0 github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-communication-go v1.0.6 - github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736 + github.com/multiversx/mx-chain-core-go v1.2.14 github.com/multiversx/mx-chain-crypto-go v1.2.8 github.com/multiversx/mx-chain-es-indexer-go v1.4.10 github.com/multiversx/mx-chain-logger-go v1.0.13 github.com/multiversx/mx-chain-scenario-go v1.2.1 github.com/multiversx/mx-chain-storage-go v1.0.12 - github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f - github.com/multiversx/mx-chain-vm-go v1.5.7-0.20230822131337-735f5ca5047b - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88-0.20230817130100-3e5270010759 + github.com/multiversx/mx-chain-vm-common-go v1.5.5 + github.com/multiversx/mx-chain-vm-go v1.5.7 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88 github.com/pelletier/go-toml v1.9.3 github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.11+incompatible diff --git a/go.sum b/go.sum index ab829060e81..e27a7e3e334 100644 --- a/go.sum +++ b/go.sum @@ -378,8 +378,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.0.6 h1:f2bizRoVuJXBWc32px7pCuzMx4Pgi2tKhUt8BkFV1Fg= github.com/multiversx/mx-chain-communication-go v1.0.6/go.mod h1:+oaUowpq+SqrEmAsMPGwhz44g7L81loWb6AiNQU9Ms4= -github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736 h1:8n/X21jjR/XjAliLxSPz3K2ukImXGJV127FfjLTXfTY= -github.com/multiversx/mx-chain-core-go v1.2.14-0.20230817122307-6b5a05d01736/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= +github.com/multiversx/mx-chain-core-go v1.2.14 h1:TAfJ3aUcT54JCWtmfsSvzsVEQKfLZ0Di0bZG6XoXc1w= +github.com/multiversx/mx-chain-core-go v1.2.14/go.mod h1:BILOGHUOIG5dNNX8cgkzCNfDaVtoYrJRYcPnpxRMH84= github.com/multiversx/mx-chain-crypto-go v1.2.8 h1:wOgVlUaO5X4L8iEbFjcQcL8SZvv6WZ7LqH73BiRPhxU= github.com/multiversx/mx-chain-crypto-go v1.2.8/go.mod h1:fkaWKp1rbQN9wPKya5jeoRyC+c/SyN/NfggreyeBw+8= github.com/multiversx/mx-chain-es-indexer-go v1.4.10 h1:qwYWQ92PuaKhrhZEHm+blEeYSvrxtT1rG8sAL4OEzqc= @@ -390,16 +390,16 @@ github.com/multiversx/mx-chain-scenario-go v1.2.1 h1:9eC6VcOEAKRRKZ7EbSWPLzCdNIM github.com/multiversx/mx-chain-scenario-go v1.2.1/go.mod h1:EuZY7DpNFHVNSxJR8dKE1z2I8gBYfEFFPSwNUOXptqE= github.com/multiversx/mx-chain-storage-go v1.0.12 h1:FrkgHPV38BO8cwdK0GUYHxVkUyOhyBBIhPz0P1e72NA= github.com/multiversx/mx-chain-storage-go v1.0.12/go.mod h1:/8VrMbO9CbIi0Ym3F1QPY6EENGcUq5DpEBPDt4evn9Q= -github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f h1:41rBUuyYKuvyKlF0kJA+/Mm3a90BqtntiP8vMEyIB9g= -github.com/multiversx/mx-chain-vm-common-go v1.5.5-0.20230822130603-08901ff7d61f/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= -github.com/multiversx/mx-chain-vm-go v1.5.7-0.20230822131337-735f5ca5047b h1:CKK6QI1hlt0YGIhKAve3jUwkYPJWcrLHv3SQMoWmZN8= -github.com/multiversx/mx-chain-vm-go v1.5.7-0.20230822131337-735f5ca5047b/go.mod h1:u6J4AxJp16iel+hrRye2GjrhvMCHhkikosZd6gdSD9s= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61 h1:AtJY/By1Zx/bb5C7sKypriggw7QpkbVCJ/fX9nTOPDU= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61-0.20230817125320-a060efdffb61/go.mod h1:JZ52LHZgxMh3uxMVzzmOucAVOqTwanbFKEmB21PyoOE= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd h1:BAiE4ZjfeigqeK+fHotv9NccJCdwx3Dp38FVfOdMXMU= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62-0.20230817125554-159f8a707acd/go.mod h1:p5zH9C3Xlqm+KRfM/Yg8epSMbDD3ph074jB0ngPVLMg= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88-0.20230817130100-3e5270010759 h1:dUr5ZERaVisWBA73mpJR/3Ac5WtQmryYZytSdtTvEcw= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88-0.20230817130100-3e5270010759/go.mod h1:n5bzraW8/tzxS6IzRBQAbEpkJ5qLuJnABNI0h46uFL0= +github.com/multiversx/mx-chain-vm-common-go v1.5.5 h1:NoG73lvcHSeUcoFlYybG8ceGuJ6KptD3QJjUNEnGDVk= +github.com/multiversx/mx-chain-vm-common-go v1.5.5/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= +github.com/multiversx/mx-chain-vm-go v1.5.7 h1:Ebv1UEYA0O9x2NauqZWw7o6v/UQ8uZio8iJKE5V3KEg= +github.com/multiversx/mx-chain-vm-go v1.5.7/go.mod h1:F5OoQjCuYNr1hYWvwZKCcWYQir3+r2QVBxQux/eo0Ak= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61 h1:7c3VRhr5JDu7qs3AkmKQu7DzWGGIoiHfSIMrzw3x5Ao= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61/go.mod h1:bQFh+KuUIEBmCfKJ0qVN2+DbRRbAqW0huKfHpiTbyEE= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62 h1:rQaWRbrQwrEhSN0ZEQQ0JAbttgi+OrMf/CLziWpRUCA= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62/go.mod h1:RJaDHRU9Fk4oGWQH1sUp8soCsfW6FmNfWyhImTg0294= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88 h1:siLqUwhoXJVs+DvC/uRc9CwCzYmFXtrIru0aMlizUjI= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88/go.mod h1:ZvI1nJCnfl0xJiTSWK39U2G3oHZIyMPWjlxUw/8NunI= github.com/multiversx/mx-components-big-int v1.0.0 h1:Wkr8lSzK2nDqixOrrBa47VNuqdhV1m/aJhaP1EMaiS8= github.com/multiversx/mx-components-big-int v1.0.0/go.mod h1:maIEMgHlNE2u78JaDD0oLzri+ShgU4okHfzP3LWGdQM= github.com/multiversx/protobuf v1.3.2 h1:RaNkxvGTGbA0lMcnHAN24qE1G1i+Xs5yHA6MDvQ4mSM= From ddd7aabf8b486c7f9121990895b674f4b63f0878 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 28 Aug 2023 15:13:41 +0300 Subject: [PATCH 095/120] fixes after merge --- factory/processing/processComponents.go | 1 + integrationTests/testInitializer.go | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index aaecb5b4ebb..f9e9d39ee4b 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -355,6 +355,7 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { pcf.coreData.InternalMarshalizer(), pcf.coreData.Hasher(), pcf.bootstrapComponents.ShardCoordinator(), + pcf.txExecutionOrderHandler, ) if err != nil { return nil, err diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 1de5e012fbd..8d08a89f6fe 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -2730,8 +2730,10 @@ func GenerateTrieKeysForMaxLevel(numTrieLevels int, numChildrenPerBranch int) [] func generateRandHexString(size int) string { buff := make([]string, size) + lenCharsPoolBig := big.NewInt(int64(len(charsPool))) for i := 0; i < size; i++ { - buff[i] = charsPool[mathRand.Intn(len(charsPool))] + randomIndexBig, _ := rand.Int(rand.Reader, lenCharsPoolBig) + buff[i] = charsPool[randomIndexBig.Int64()] } return strings.Join(buff, "") From 2d559b25aee8a05d31740a11e8a6e750c2ad7c4d Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Mon, 28 Aug 2023 17:53:33 +0300 Subject: [PATCH 096/120] unit tests & cleanup --- integrationTests/vm/wasm/wasmvm/mock_contracts.go | 2 +- .../block/postprocess/intermediateResults_test.go | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/wasm/wasmvm/mock_contracts.go b/integrationTests/vm/wasm/wasmvm/mock_contracts.go index f22781144f6..8925075ae7c 100644 --- a/integrationTests/vm/wasm/wasmvm/mock_contracts.go +++ b/integrationTests/vm/wasm/wasmvm/mock_contracts.go @@ -129,7 +129,7 @@ func GetAddressForNewAccount( return GetAddressForNewAccountWithVM(t, net, node, net.DefaultVM) } -// GetAddressForNewAccountWithVM +// GetAddressForNewAccountWithVM - func GetAddressForNewAccountWithVM( t *testing.T, net *integrationTests.TestNetwork, diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index ee42abfd3f1..31f43ddf1d7 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -2,12 +2,13 @@ package postprocess import ( "bytes" - txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" "math/big" "sort" "strconv" "testing" + txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" @@ -136,6 +137,17 @@ func TestNewIntermediateResultsProcessor_NilEpochHandler(t *testing.T) { assert.Equal(t, process.ErrNilEnableEpochsHandler, err) } +func TestNewIntermediateResultsProcessor_NilTxExecutionOrderHandler(t *testing.T) { + t.Parallel() + + args := createMockArgsNewIntermediateResultsProcessor() + args.TxExecutionOrderHandler = nil + irp, err := NewIntermediateResultsProcessor(args) + + assert.Nil(t, irp) + assert.Equal(t, process.ErrNilTxExecutionOrderHandler, err) +} + func TestNewIntermediateResultsProcessor_Good(t *testing.T) { t.Parallel() From f750086e74fd662f0ec784d43e02d1a037c356a0 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 29 Aug 2023 10:44:19 +0300 Subject: [PATCH 097/120] add todos --- outport/process/outportDataProvider.go | 1 + process/block/preprocess/transactions.go | 2 ++ process/common.go | 1 + 3 files changed, 4 insertions(+) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index d9614ce9d1f..38b47bc9c4d 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -534,6 +534,7 @@ func (odp *outportDataProvider) filterOutDuplicatedMiniBlocks(miniBlocksFromBody return filteredMiniBlocks, nil } +// TODO remove after system test func printPool(pool *outportcore.TransactionPool) { total := len(pool.Transactions) + len(pool.InvalidTxs) + len(pool.SmartContractResults) + len(pool.Rewards) if total > 0 { diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index 8ff3ccbffaf..e6e390a0d6c 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -892,6 +892,8 @@ func (txs *transactions) processAndRemoveBadTransaction( if err != nil && !errors.Is(err, process.ErrFailedTransaction) { txs.txExecutionOrderHandler.Remove(txHash) + + // TODO remove warn after system test log.Warn("already executed", "error", err.Error(), "txhash", txHash) return err } diff --git a/process/common.go b/process/common.go index 2ae1b5b48a6..19e1df1a0ec 100644 --- a/process/common.go +++ b/process/common.go @@ -710,6 +710,7 @@ func DisplayProcessTxDetails( "sender", senderAddress, "receiver", receiverAddress) + // TODO remove after system test log.Warn("executing transaction", "txHash", txHash) } From bfce8fa5b22ad776251d97c4fa1c88cf837a5f89 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 29 Aug 2023 10:44:34 +0300 Subject: [PATCH 098/120] fix logging function --- api/shared/logging/logging.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/api/shared/logging/logging.go b/api/shared/logging/logging.go index 612ac848dd7..3b995f43dfd 100644 --- a/api/shared/logging/logging.go +++ b/api/shared/logging/logging.go @@ -14,7 +14,14 @@ const thresholdMinAPICallDurationToLog = 200 * time.Millisecond // LogAPIActionDurationIfNeeded will log the duration of an action triggered by an API call if it's above a threshold func LogAPIActionDurationIfNeeded(startTime time.Time, action string) { duration := time.Since(startTime) - if duration > thresholdMinAPICallDurationToLog { - log.Debug(fmt.Sprintf("%s took %s", action, duration)) + if duration < thresholdMinAPICallDurationToLog { + return } + + if duration.Nanoseconds() == 1<<63-1 { + // fix for this issue https://github.com/tcnksm/go-httpstat/issues/13 + // in some situations, a duration of 2562047h47m16.854775807s was printed + return + } + log.Debug(fmt.Sprintf("%s took %s", action, duration)) } From eb9e6ac654b32993c4590458ce5162bbd7d0f58a Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 29 Aug 2023 11:02:52 +0300 Subject: [PATCH 099/120] extra todo for testing --- process/block/postprocess/intermediateResults.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/process/block/postprocess/intermediateResults.go b/process/block/postprocess/intermediateResults.go index 6b9020ca29d..61a2e602f2c 100644 --- a/process/block/postprocess/intermediateResults.go +++ b/process/block/postprocess/intermediateResults.go @@ -262,6 +262,8 @@ func (irp *intermediateResultsProcessor) AddIntermediateTransactions(txs []data. sndShId, dstShId := irp.getShardIdsFromAddresses(addScr.SndAddr, addScr.RcvAddr) + // TODO remove this after system test + log.Warn("executing transaction", "txHash", scrHash) irp.executionOrderHandler.Add(scrHash) irp.addIntermediateTxToResultsForBlock(addScr, scrHash, sndShId, dstShId) } From 087bd9b64405ba94652b18d696730e20fb2af7d4 Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Tue, 29 Aug 2023 11:51:42 +0300 Subject: [PATCH 100/120] set max gas per query to 300s equivalent --- process/smartContract/scQueryService.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 3f528571886..eb3d9b95e4e 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -4,7 +4,6 @@ import ( "bytes" "errors" "fmt" - "math" "math/big" "sync" @@ -29,6 +28,9 @@ import ( var _ process.SCQueryService = (*SCQueryService)(nil) +// MaxGasLimitPerQuery - each unit is the equivalent of 1 nanosecond processing time +const MaxGasLimitPerQuery = 300_000_000_000 + // SCQueryService can execute Get functions over SC to fetch stored values type SCQueryService struct { vmContainer process.VirtualMachinesContainer @@ -78,7 +80,7 @@ func NewSCQueryService( return nil, err } - gasForQuery := uint64(math.MaxUint64) + gasForQuery := uint64(MaxGasLimitPerQuery) if args.MaxGasLimitPerQuery > 0 { gasForQuery = args.MaxGasLimitPerQuery } From 6a32f0dc1caacc303484fd4e3b064ce7fbcbf74b Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 29 Aug 2023 11:58:41 +0300 Subject: [PATCH 101/120] small fix and extra warn --- outport/process/outportDataProvider.go | 2 +- process/block/preprocess/rewardTxPreProcessor.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 38b47bc9c4d..fe9405db904 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -549,7 +549,7 @@ func printPool(pool *outportcore.TransactionPool) { } if len(pool.InvalidTxs) > 0 { log.Warn("############### INVALID ####################") - for hash, tx := range pool.Transactions { + for hash, tx := range pool.InvalidTxs { log.Warn(hash, "order", tx.GetExecutionOrder()) } } diff --git a/process/block/preprocess/rewardTxPreProcessor.go b/process/block/preprocess/rewardTxPreProcessor.go index c1e352cace2..c2c236c96bd 100644 --- a/process/block/preprocess/rewardTxPreProcessor.go +++ b/process/block/preprocess/rewardTxPreProcessor.go @@ -276,6 +276,8 @@ func (rtp *rewardTxPreprocessor) ProcessBlockTransactions( return err } + // TODO remove this after system test + log.Warn("executing transaction", "txHash", txHash) rtp.txExecutionOrderHandler.Add(txHash) err = rtp.rewardsProcessor.ProcessRewardTransaction(rTx) if err != nil { From cb8e7ee1893fadd26c3a11ad8c6df305589fbfc1 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 29 Aug 2023 12:31:16 +0300 Subject: [PATCH 102/120] extra todo --- process/block/preprocess/rewardTxPreProcessor.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/process/block/preprocess/rewardTxPreProcessor.go b/process/block/preprocess/rewardTxPreProcessor.go index c2c236c96bd..94ecf476e80 100644 --- a/process/block/preprocess/rewardTxPreProcessor.go +++ b/process/block/preprocess/rewardTxPreProcessor.go @@ -509,6 +509,9 @@ func (rtp *rewardTxPreprocessor) ProcessMiniBlock( } snapshot := rtp.handleProcessTransactionInit(preProcessorExecutionInfoHandler, miniBlockTxHashes[txIndex]) + + // TODO remove this after system test + log.Warn("executing transaction", "txHash", miniBlockTxHashes[txIndex]) rtp.txExecutionOrderHandler.Add(miniBlockTxHashes[txIndex]) err = rtp.rewardsProcessor.ProcessRewardTransaction(miniBlockRewardTxs[txIndex]) if err != nil { From 115b82c8e5ba8cfffa495637d9b6cb0975520738 Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Tue, 29 Aug 2023 13:32:41 +0300 Subject: [PATCH 103/120] fix unit test --- process/smartContract/scQueryService_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index c26827488c6..7d3bc6359b4 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -962,7 +962,7 @@ func TestSCQueryService_ComputeTxCostScCall(t *testing.T) { mockVM := &mock.VMExecutionHandlerStub{ RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { return &vmcommon.VMOutput{ - GasRemaining: uint64(math.MaxUint64) - consumedGas, + GasRemaining: uint64(MaxGasLimitPerQuery) - consumedGas, ReturnCode: vmcommon.Ok, }, nil }, @@ -976,7 +976,7 @@ func TestSCQueryService_ComputeTxCostScCall(t *testing.T) { } argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { - return uint64(math.MaxUint64) + return uint64(MaxGasLimitPerQuery) }, } target, _ := NewSCQueryService(argsNewSCQuery) From 52d6fa8a7cac34d78a3124b847b7620b8e4bf494 Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Tue, 29 Aug 2023 13:40:53 +0300 Subject: [PATCH 104/120] fix unit test --- process/smartContract/scQueryService_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 7d3bc6359b4..ca991459da0 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -599,13 +599,13 @@ func TestExecuteQuery_ReturnsCorrectly(t *testing.T) { func TestExecuteQuery_GasProvidedShouldBeApplied(t *testing.T) { t.Parallel() - t.Run("no gas defined, should use max uint64", func(t *testing.T) { + t.Run("no gas defined, should use max gas limit", func(t *testing.T) { t.Parallel() runSCWasCalled := false mockVM := &mock.VMExecutionHandlerStub{ RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { - require.Equal(t, uint64(math.MaxUint64), input.GasProvided) + require.Equal(t, uint64(MaxGasLimitPerQuery), input.GasProvided) runSCWasCalled = true return &vmcommon.VMOutput{}, nil }, @@ -976,7 +976,7 @@ func TestSCQueryService_ComputeTxCostScCall(t *testing.T) { } argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { - return uint64(MaxGasLimitPerQuery) + return uint64(math.MaxUint64) }, } target, _ := NewSCQueryService(argsNewSCQuery) From b77d1f6c4b2fe51517db44e54c8cca76a461faf9 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 30 Aug 2023 10:41:17 +0300 Subject: [PATCH 105/120] merge go mod --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d37a4da3677..b7760e566f4 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/multiversx/mx-chain-scenario-go v1.2.1 github.com/multiversx/mx-chain-storage-go v1.0.12 github.com/multiversx/mx-chain-vm-common-go v1.5.5 - github.com/multiversx/mx-chain-vm-go v1.5.7 + github.com/multiversx/mx-chain-vm-go v1.5.8-0.20230830073619-69e712b5198b github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88 diff --git a/go.sum b/go.sum index e27a7e3e334..1a0f55b5bea 100644 --- a/go.sum +++ b/go.sum @@ -392,8 +392,8 @@ github.com/multiversx/mx-chain-storage-go v1.0.12 h1:FrkgHPV38BO8cwdK0GUYHxVkUyO github.com/multiversx/mx-chain-storage-go v1.0.12/go.mod h1:/8VrMbO9CbIi0Ym3F1QPY6EENGcUq5DpEBPDt4evn9Q= github.com/multiversx/mx-chain-vm-common-go v1.5.5 h1:NoG73lvcHSeUcoFlYybG8ceGuJ6KptD3QJjUNEnGDVk= github.com/multiversx/mx-chain-vm-common-go v1.5.5/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= -github.com/multiversx/mx-chain-vm-go v1.5.7 h1:Ebv1UEYA0O9x2NauqZWw7o6v/UQ8uZio8iJKE5V3KEg= -github.com/multiversx/mx-chain-vm-go v1.5.7/go.mod h1:F5OoQjCuYNr1hYWvwZKCcWYQir3+r2QVBxQux/eo0Ak= +github.com/multiversx/mx-chain-vm-go v1.5.8-0.20230830073619-69e712b5198b h1:kUhI0p1SyS1QFgXjMeAP8cO9DFWPsu3DURyT2lsMOGs= +github.com/multiversx/mx-chain-vm-go v1.5.8-0.20230830073619-69e712b5198b/go.mod h1:F5OoQjCuYNr1hYWvwZKCcWYQir3+r2QVBxQux/eo0Ak= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61 h1:7c3VRhr5JDu7qs3AkmKQu7DzWGGIoiHfSIMrzw3x5Ao= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61/go.mod h1:bQFh+KuUIEBmCfKJ0qVN2+DbRRbAqW0huKfHpiTbyEE= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62 h1:rQaWRbrQwrEhSN0ZEQQ0JAbttgi+OrMf/CLziWpRUCA= From 0da84a483e64232302d8e292c4b19f6275a43a87 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 30 Aug 2023 10:52:41 +0300 Subject: [PATCH 106/120] fixes after merge --- process/smartContract/scQueryService.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/smartContract/scQueryService.go b/process/smartContract/scQueryService.go index 3f528571886..e0955df7843 100644 --- a/process/smartContract/scQueryService.go +++ b/process/smartContract/scQueryService.go @@ -78,7 +78,7 @@ func NewSCQueryService( return nil, err } - gasForQuery := uint64(math.MaxUint64) + gasForQuery := uint64(math.MaxInt64) if args.MaxGasLimitPerQuery > 0 { gasForQuery = args.MaxGasLimitPerQuery } From b1c93bbcc00c9e63002ba844208a23b81220f255 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 30 Aug 2023 11:13:39 +0300 Subject: [PATCH 107/120] integrate max int64 as max gaslimit --- epochStart/metachain/stakingDataProvider.go | 4 ++-- epochStart/metachain/systemSCs.go | 4 ++-- epochStart/metachain/systemSCs_test.go | 4 ++-- genesis/process/genesisBlockCreator_test.go | 2 +- genesis/process/intermediate/txExecutionProcessor.go | 2 +- genesis/process/metaGenesisBlockCreator.go | 4 ++-- integrationTests/vm/txsFee/moveBalance_test.go | 2 +- process/smartContract/scQueryService_test.go | 6 +++--- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/epochStart/metachain/stakingDataProvider.go b/epochStart/metachain/stakingDataProvider.go index 27f8bf4b697..bf3faf572b3 100644 --- a/epochStart/metachain/stakingDataProvider.go +++ b/epochStart/metachain/stakingDataProvider.go @@ -80,7 +80,7 @@ func (sdp *stakingDataProvider) GetTotalStakeEligibleNodes() *big.Int { } // GetTotalTopUpStakeEligibleNodes returns the stake in excess of the minimum stake required, that is backing the -//current epoch eligible nodes +// current epoch eligible nodes // This value is populated by a previous call to PrepareStakingData (done for epoch start) func (sdp *stakingDataProvider) GetTotalTopUpStakeEligibleNodes() *big.Int { sdp.mutStakingData.RLock() @@ -261,7 +261,7 @@ func (sdp *stakingDataProvider) getValidatorInfoFromSC(validatorAddress string) VMInput: vmcommon.VMInput{ CallerAddr: vm.EndOfEpochAddress, CallValue: big.NewInt(0), - GasProvided: math.MaxUint64, + GasProvided: math.MaxInt64, Arguments: [][]byte{validatorAddressBytes}, }, RecipientAddr: vm.ValidatorSCAddress, diff --git a/epochStart/metachain/systemSCs.go b/epochStart/metachain/systemSCs.go index a1e0536a973..658bec62cb3 100644 --- a/epochStart/metachain/systemSCs.go +++ b/epochStart/metachain/systemSCs.go @@ -1365,7 +1365,7 @@ func (s *systemSCProcessor) extractConfigFromESDTContract() ([][]byte, error) { CallerAddr: s.endOfEpochCallerAddress, Arguments: [][]byte{}, CallValue: big.NewInt(0), - GasProvided: math.MaxUint64, + GasProvided: math.MaxInt64, }, Function: "getContractConfig", RecipientAddr: vm.ESDTSCAddress, @@ -1392,7 +1392,7 @@ func (s *systemSCProcessor) changeESDTOwner(currentConfigValues [][]byte) error CallerAddr: s.endOfEpochCallerAddress, Arguments: [][]byte{s.esdtOwnerAddressBytes, baseIssuingCost, minTokenNameLength, maxTokenNameLength}, CallValue: big.NewInt(0), - GasProvided: math.MaxUint64, + GasProvided: math.MaxInt64, }, Function: "configChange", RecipientAddr: vm.ESDTSCAddress, diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index 0e89b5ca755..e4e168e145e 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -497,7 +497,7 @@ func doStake(t *testing.T, systemVm vmcommon.VMExecutionHandler, accountsDB stat CallerAddr: owner, Arguments: args, CallValue: big.NewInt(0).Mul(big.NewInt(int64(numBlsKeys)), nodePrice), - GasProvided: math.MaxUint64, + GasProvided: math.MaxInt64, }, RecipientAddr: vm.ValidatorSCAddress, Function: "stake", @@ -516,7 +516,7 @@ func doUnStake(t *testing.T, systemVm vmcommon.VMExecutionHandler, accountsDB st CallerAddr: owner, Arguments: blsKeys, CallValue: big.NewInt(0), - GasProvided: math.MaxUint64, + GasProvided: math.MaxInt64, }, RecipientAddr: vm.ValidatorSCAddress, Function: "unStake", diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index ad316b083eb..8cbc3eb460a 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -229,7 +229,7 @@ func createMockArgument( return entireSupply }, MaxGasLimitPerBlockCalled: func(shardID uint32) uint64 { - return math.MaxUint64 + return math.MaxInt64 }, } arg.Economics = ted diff --git a/genesis/process/intermediate/txExecutionProcessor.go b/genesis/process/intermediate/txExecutionProcessor.go index 2ccb7d3f98f..e4ff789d15e 100644 --- a/genesis/process/intermediate/txExecutionProcessor.go +++ b/genesis/process/intermediate/txExecutionProcessor.go @@ -53,7 +53,7 @@ func (tep *txExecutionProcessor) ExecuteTransaction( Value: value, RcvAddr: rcvAddress, GasPrice: 0, - GasLimit: math.MaxUint64, + GasLimit: math.MaxInt64, Data: data, Signature: nil, } diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index f6be1cf5a8d..73d0e2a95a7 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -619,7 +619,7 @@ func deploySystemSmartContracts( RcvAddr: rcvAddress, SndAddr: address, GasPrice: 0, - GasLimit: math.MaxUint64, + GasLimit: math.MaxInt64, Data: []byte(deployTxData), Signature: nil, } @@ -664,7 +664,7 @@ func setStakedData( RcvAddr: vm.ValidatorSCAddress, SndAddr: nodeInfo.AddressBytes(), GasPrice: 0, - GasLimit: math.MaxUint64, + GasLimit: math.MaxInt64, Data: []byte("stake@" + oneEncoded + "@" + hex.EncodeToString(nodeInfo.PubKeyBytes()) + "@" + hex.EncodeToString([]byte("genesis"))), Signature: nil, } diff --git a/integrationTests/vm/txsFee/moveBalance_test.go b/integrationTests/vm/txsFee/moveBalance_test.go index 78646813825..6f59c1934b6 100644 --- a/integrationTests/vm/txsFee/moveBalance_test.go +++ b/integrationTests/vm/txsFee/moveBalance_test.go @@ -180,7 +180,7 @@ func TestMoveBalanceMoreGasThanGasLimitPerMiniBlockForSafeCrossShard(t *testing. senderBalance := big.NewInt(0).SetUint64(math.MaxUint64) gasPriceLocal := uint64(1) - gasLimit := uint64(math.MaxUint64) + gasLimit := uint64(math.MaxInt64) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) tx := vm.CreateTransaction(0, big.NewInt(500), sndAddr, rcvAddr, gasPriceLocal, gasLimit, []byte("aaaa")) diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index c26827488c6..e7598811a9e 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -605,7 +605,7 @@ func TestExecuteQuery_GasProvidedShouldBeApplied(t *testing.T) { runSCWasCalled := false mockVM := &mock.VMExecutionHandlerStub{ RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { - require.Equal(t, uint64(math.MaxUint64), input.GasProvided) + require.Equal(t, uint64(math.MaxInt64), input.GasProvided) runSCWasCalled = true return &vmcommon.VMOutput{}, nil }, @@ -962,7 +962,7 @@ func TestSCQueryService_ComputeTxCostScCall(t *testing.T) { mockVM := &mock.VMExecutionHandlerStub{ RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { return &vmcommon.VMOutput{ - GasRemaining: uint64(math.MaxUint64) - consumedGas, + GasRemaining: uint64(math.MaxInt64) - consumedGas, ReturnCode: vmcommon.Ok, }, nil }, @@ -998,7 +998,7 @@ func TestSCQueryService_ComputeScCallGasLimitRetCodeNotOK(t *testing.T) { mockVM := &mock.VMExecutionHandlerStub{ RunSmartContractCallCalled: func(input *vmcommon.ContractCallInput) (output *vmcommon.VMOutput, e error) { return &vmcommon.VMOutput{ - GasRemaining: uint64(math.MaxUint64) - consumedGas, + GasRemaining: uint64(math.MaxInt64) - consumedGas, ReturnCode: vmcommon.FunctionNotFound, ReturnMessage: message, }, nil From 38f5d6d78deb8b54c02d5f5abb07ac97ad4bbb75 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 30 Aug 2023 11:30:25 +0300 Subject: [PATCH 108/120] enable sharded storag for user accounts and peer accounts storers --- cmd/node/config/config.toml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index 643bcdbd804..310d6be8e8c 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -324,6 +324,8 @@ BatchDelaySeconds = 2 MaxBatchSize = 45000 MaxOpenFiles = 10 + ShardIDProviderType = "BinarySplit" + NumShards = 4 [PeerAccountsTrieStorage] [PeerAccountsTrieStorage.Cache] @@ -337,6 +339,8 @@ BatchDelaySeconds = 2 MaxBatchSize = 1000 MaxOpenFiles = 10 + ShardIDProviderType = "BinarySplit" + NumShards = 4 [AccountsTrieCheckpointsStorage] [AccountsTrieCheckpointsStorage.Cache] From f10d1084dd356161a3d42840182839893432387a Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 30 Aug 2023 11:31:50 +0300 Subject: [PATCH 109/120] integrate max int64 as max gaslimit --- integrationTests/vm/txsFee/moveBalance_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrationTests/vm/txsFee/moveBalance_test.go b/integrationTests/vm/txsFee/moveBalance_test.go index 6f59c1934b6..78646813825 100644 --- a/integrationTests/vm/txsFee/moveBalance_test.go +++ b/integrationTests/vm/txsFee/moveBalance_test.go @@ -180,7 +180,7 @@ func TestMoveBalanceMoreGasThanGasLimitPerMiniBlockForSafeCrossShard(t *testing. senderBalance := big.NewInt(0).SetUint64(math.MaxUint64) gasPriceLocal := uint64(1) - gasLimit := uint64(math.MaxInt64) + gasLimit := uint64(math.MaxUint64) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) tx := vm.CreateTransaction(0, big.NewInt(500), sndAddr, rcvAddr, gasPriceLocal, gasLimit, []byte("aaaa")) From ef84c183ea9d89d54d58e57fb917ddd15a194521 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Wed, 30 Aug 2023 11:34:08 +0300 Subject: [PATCH 110/120] extend some unit tests --- .../postprocess/intermediateResults_test.go | 8 +++++++ .../preprocess/rewardTxPreProcessor_test.go | 24 ++++++++++++++++--- .../preprocess/scheduledTxsExecution_test.go | 8 ++++++- .../preprocess/smartContractResults_test.go | 8 ++++++- process/block/preprocess/transactions_test.go | 7 ++++++ 5 files changed, 50 insertions(+), 5 deletions(-) diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index 31f43ddf1d7..abf1e8ac376 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -362,6 +362,13 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsAddAndRevert(t nrShards := 5 args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + + calledCount := 0 + args.TxExecutionOrderHandler = &txExecOrderStub.TxExecutionOrderHandlerStub{ + AddCalled: func(txHash []byte) { + calledCount++ + }, + } irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) @@ -382,6 +389,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsAddAndRevert(t assert.Nil(t, err) irp.mutInterResultsForBlock.Lock() assert.Equal(t, len(irp.mapProcessedResult[string(key)]), len(txs)) + assert.Equal(t, len(txs), calledCount) irp.mutInterResultsForBlock.Unlock() irp.RemoveProcessedResults(key) diff --git a/process/block/preprocess/rewardTxPreProcessor_test.go b/process/block/preprocess/rewardTxPreProcessor_test.go index 4497c76f63b..ad0d0952569 100644 --- a/process/block/preprocess/rewardTxPreProcessor_test.go +++ b/process/block/preprocess/rewardTxPreProcessor_test.go @@ -470,6 +470,7 @@ func TestRewardTxPreprocessor_ProcessMiniBlockInvalidMiniBlockTypeShouldErr(t *t func TestRewardTxPreprocessor_ProcessMiniBlockShouldWork(t *testing.T) { t.Parallel() + calledCount := 0 txHash := testTxHash tdp := initDataPool() rtp, _ := NewRewardTxPreprocessor( @@ -486,7 +487,11 @@ func TestRewardTxPreprocessor_ProcessMiniBlockShouldWork(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, - &common.TxExecutionOrderHandlerStub{}, + &common.TxExecutionOrderHandlerStub{ + AddCalled: func(txHash []byte) { + calledCount++ + }, + }, ) txHashes := [][]byte{[]byte(txHash)} @@ -506,6 +511,7 @@ func TestRewardTxPreprocessor_ProcessMiniBlockShouldWork(t *testing.T) { _, _, _, err := rtp.ProcessMiniBlock(&mb1, haveTimeTrue, haveAdditionalTimeFalse, false, false, -1, preProcessorExecutionInfoHandlerMock) assert.Nil(t, err) + assert.Equal(t, 1, calledCount) txsMap := rtp.GetAllCurrentUsedTxs() if _, ok := txsMap[txHash]; !ok { @@ -516,6 +522,7 @@ func TestRewardTxPreprocessor_ProcessMiniBlockShouldWork(t *testing.T) { func TestRewardTxPreprocessor_ProcessMiniBlockNotFromMeta(t *testing.T) { t.Parallel() + calledCount := 0 txHash := testTxHash tdp := initDataPool() rtp, _ := NewRewardTxPreprocessor( @@ -532,7 +539,11 @@ func TestRewardTxPreprocessor_ProcessMiniBlockNotFromMeta(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, - &common.TxExecutionOrderHandlerStub{}, + &common.TxExecutionOrderHandlerStub{ + AddCalled: func(txHash []byte) { + calledCount++ + }, + }, ) txHashes := [][]byte{[]byte(txHash)} @@ -551,6 +562,7 @@ func TestRewardTxPreprocessor_ProcessMiniBlockNotFromMeta(t *testing.T) { } _, _, _, err := rtp.ProcessMiniBlock(&mb1, haveTimeTrue, haveAdditionalTimeFalse, false, false, -1, preProcessorExecutionInfoHandlerMock) + assert.Equal(t, 0, calledCount) assert.Equal(t, process.ErrRewardMiniBlockNotFromMeta, err) } @@ -684,6 +696,7 @@ func TestRewardTxPreprocessor_ProcessBlockTransactions(t *testing.T) { txHash := testTxHash tdp := initDataPool() + calledCount := 0 rtp, _ := NewRewardTxPreprocessor( tdp.RewardTransactions(), &storageStubs.ChainStorerStub{}, @@ -698,7 +711,11 @@ func TestRewardTxPreprocessor_ProcessBlockTransactions(t *testing.T) { &testscommon.BlockSizeComputationStub{}, &testscommon.BalanceComputationStub{}, &testscommon.ProcessedMiniBlocksTrackerStub{}, - &common.TxExecutionOrderHandlerStub{}, + &common.TxExecutionOrderHandlerStub{ + AddCalled: func(txHash []byte) { + calledCount++ + }, + }, ) txHashes := [][]byte{[]byte(txHash)} @@ -725,6 +742,7 @@ func TestRewardTxPreprocessor_ProcessBlockTransactions(t *testing.T) { blockBody.MiniBlocks = append(blockBody.MiniBlocks, &mb1, &mb2) err := rtp.ProcessBlockTransactions(&block.Header{MiniBlockHeaders: []block.MiniBlockHeader{{TxCount: 1, Hash: mbHash1}, {TxCount: 1, Hash: mbHash2}}}, &blockBody, haveTimeTrue) + assert.Equal(t, 2, calledCount) assert.Nil(t, err) } diff --git a/process/block/preprocess/scheduledTxsExecution_test.go b/process/block/preprocess/scheduledTxsExecution_test.go index 19717346806..8e2a42385c5 100644 --- a/process/block/preprocess/scheduledTxsExecution_test.go +++ b/process/block/preprocess/scheduledTxsExecution_test.go @@ -296,6 +296,7 @@ func TestScheduledTxsExecution_ExecuteShouldWorkOnErrFailedTransaction(t *testin func TestScheduledTxsExecution_ExecuteShouldWork(t *testing.T) { t.Parallel() + calledCount := 0 scheduledTxsExec, _ := NewScheduledTxsExecution( &testscommon.TxProcessorMock{ ProcessTransactionCalled: func(transaction *transaction.Transaction) (vmcommon.ReturnCode, error) { @@ -307,12 +308,17 @@ func TestScheduledTxsExecution_ExecuteShouldWork(t *testing.T) { &marshal.GogoProtoMarshalizer{}, &hashingMocks.HasherMock{}, &mock.ShardCoordinatorStub{}, - &common.TxExecutionOrderHandlerStub{}, + &common.TxExecutionOrderHandlerStub{ + AddCalled: func(txHash []byte) { + calledCount++ + }, + }, ) scheduledTxsExec.AddScheduledTx([]byte("txHash1"), &transaction.Transaction{Nonce: 0}) err := scheduledTxsExec.Execute([]byte("txHash1")) assert.Nil(t, err) + assert.Equal(t, 1, calledCount) } func TestScheduledTxsExecution_ExecuteAllShouldErrNilHaveTimeHandler(t *testing.T) { diff --git a/process/block/preprocess/smartContractResults_test.go b/process/block/preprocess/smartContractResults_test.go index c7e61d57acd..b1dab4f7860 100644 --- a/process/block/preprocess/smartContractResults_test.go +++ b/process/block/preprocess/smartContractResults_test.go @@ -1322,6 +1322,7 @@ func TestScrsPreprocessor_ProcessBlockTransactionsMissingTrieNode(t *testing.T) func TestScrsPreprocessor_ProcessBlockTransactionsShouldErrMaxGasLimitPerBlockInSelfShardIsReached(t *testing.T) { t.Parallel() + calledCount := 0 enableEpochsHandlerStub := &enableEpochsHandlerMock.EnableEpochsHandlerStub{} enableEpochsHandler := enableEpochsHandlerStub tdp := initDataPool() @@ -1350,7 +1351,11 @@ func TestScrsPreprocessor_ProcessBlockTransactionsShouldErrMaxGasLimitPerBlockIn &testscommon.BalanceComputationStub{}, enableEpochsHandler, &testscommon.ProcessedMiniBlocksTrackerStub{}, - &common.TxExecutionOrderHandlerStub{}, + &common.TxExecutionOrderHandlerStub{ + AddCalled: func(txHash []byte) { + calledCount++ + }, + }, ) body := &block.Body{} @@ -1380,6 +1385,7 @@ func TestScrsPreprocessor_ProcessBlockTransactionsShouldErrMaxGasLimitPerBlockIn err := scrPreproc.ProcessBlockTransactions(&block.Header{MiniBlockHeaders: []block.MiniBlockHeader{{Hash: miniblockHash, TxCount: 1}}}, body, haveTimeTrue) assert.Nil(t, err) + assert.Equal(t, 1, calledCount) enableEpochsHandlerStub.IsOptimizeGasUsedInCrossMiniBlocksFlagEnabledField = true err = scrPreproc.ProcessBlockTransactions(&block.Header{MiniBlockHeaders: []block.MiniBlockHeader{{Hash: miniblockHash, TxCount: 1}}}, body, haveTimeTrue) diff --git a/process/block/preprocess/transactions_test.go b/process/block/preprocess/transactions_test.go index 202e73ed722..3a6e44cc82f 100644 --- a/process/block/preprocess/transactions_test.go +++ b/process/block/preprocess/transactions_test.go @@ -1129,6 +1129,12 @@ func TestTransactionPreprocessor_ProcessTxsToMeShouldUseCorrectSenderAndReceiver return 0, nil }, } + calledCount := 0 + args.TxExecutionOrderHandler = &commonMocks.TxExecutionOrderHandlerStub{ + AddCalled: func(txHash []byte) { + calledCount++ + }, + } preprocessor, _ := NewTransactionPreprocessor(args) tx := transaction.Transaction{SndAddr: []byte("2"), RcvAddr: []byte("0")} @@ -1155,6 +1161,7 @@ func TestTransactionPreprocessor_ProcessTxsToMeShouldUseCorrectSenderAndReceiver _, senderShardID, receiverShardID = preprocessor.GetTxInfoForCurrentBlock(txHash) assert.Equal(t, uint32(2), senderShardID) assert.Equal(t, uint32(0), receiverShardID) + assert.Equal(t, 1, calledCount) } func TestTransactionPreprocessor_ProcessTxsToMeMissingTrieNode(t *testing.T) { From 1e2f857470148208c7091952f86fa1e8dc258a29 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Wed, 30 Aug 2023 11:57:36 +0300 Subject: [PATCH 111/120] fixes after first review --- common/disabled/orderedCollection.go | 20 ++++++++++---------- common/disabled/orderedCollection_test.go | 3 ++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/common/disabled/orderedCollection.go b/common/disabled/orderedCollection.go index 1fbc4b3c4d5..b808e35ff56 100644 --- a/common/disabled/orderedCollection.go +++ b/common/disabled/orderedCollection.go @@ -7,46 +7,46 @@ import ( type orderedCollection struct { } -var errDisabledComponent = errors.New("") +var errDisabledComponent = errors.New("disabled component") // NewOrderedCollection creates a new ordered collection func NewOrderedCollection() *orderedCollection { return &orderedCollection{} } -// Add adds a new item to the order collector +// Add does nothing func (oc *orderedCollection) Add(_ []byte) {} -// GetItemAtIndex returns the item at the given index +// GetItemAtIndex does nothing func (oc *orderedCollection) GetItemAtIndex(_ uint32) ([]byte, error) { return nil, errDisabledComponent } -// GetOrder returns the order of the item in the ordered collection +// GetOrder does nothing func (oc *orderedCollection) GetOrder(_ []byte) (int, error) { return 0, errDisabledComponent } -// Remove removes an item from the order collector if it exists, adapting the order of the remaining items +// Remove does nothing func (oc *orderedCollection) Remove(_ []byte) {} -// RemoveMultiple removes multiple items from the order collector if they exist, adapting the order of the remaining items +// RemoveMultiple does nothing func (oc *orderedCollection) RemoveMultiple(_ [][]byte) {} -// GetItems returns the items in the order they were added +// GetItems does nothing func (oc *orderedCollection) GetItems() [][]byte { return make([][]byte, 0) } -// Contains returns true if the item is in the ordered collection +// Contains does nothing func (oc *orderedCollection) Contains(_ []byte) bool { return false } -// Clear clears the ordered collection +// Clear does nothing func (oc *orderedCollection) Clear() {} -// Len returns the number of items in the ordered collection +// Len does nothing func (oc *orderedCollection) Len() int { return 0 } diff --git a/common/disabled/orderedCollection_test.go b/common/disabled/orderedCollection_test.go index 59e166286a8..a97debf5cc0 100644 --- a/common/disabled/orderedCollection_test.go +++ b/common/disabled/orderedCollection_test.go @@ -1,10 +1,11 @@ package disabled import ( + "testing" + "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "testing" ) func TestOrderedCollection_MethodsShouldNotPanic(t *testing.T) { From b7bf79745307b61559432e43d5c81a7e1da7e511 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 30 Aug 2023 12:28:08 +0300 Subject: [PATCH 112/120] - extended the search for the full history resolver in case the epoch is wrongly provided --- .../resolvers/baseFullHistoryResolver.go | 8 +- .../resolvers/baseFullHistoryResolver_test.go | 101 ++++++++++++++++++ 2 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 dataRetriever/resolvers/baseFullHistoryResolver_test.go diff --git a/dataRetriever/resolvers/baseFullHistoryResolver.go b/dataRetriever/resolvers/baseFullHistoryResolver.go index 93bb1e92ff2..0372777f646 100644 --- a/dataRetriever/resolvers/baseFullHistoryResolver.go +++ b/dataRetriever/resolvers/baseFullHistoryResolver.go @@ -10,7 +10,13 @@ type baseFullHistoryResolver struct { func (bfhr *baseFullHistoryResolver) getFromStorage(key []byte, epoch uint32) ([]byte, error) { //we just call the storer to search in the provided epoch. (it will search automatically also in the next epoch) - return bfhr.storer.GetFromEpoch(key, epoch) + buff, err := bfhr.storer.GetFromEpoch(key, epoch) + if err != nil { + // default to a search first, maximize the chance of getting recent data + return bfhr.storer.SearchFirst(key) + } + + return buff, err } func (bfhr *baseFullHistoryResolver) searchFirst(key []byte) ([]byte, error) { diff --git a/dataRetriever/resolvers/baseFullHistoryResolver_test.go b/dataRetriever/resolvers/baseFullHistoryResolver_test.go new file mode 100644 index 00000000000..567ab20dac9 --- /dev/null +++ b/dataRetriever/resolvers/baseFullHistoryResolver_test.go @@ -0,0 +1,101 @@ +package resolvers + +import ( + "errors" + "testing" + + "github.com/multiversx/mx-chain-go/testscommon/storage" + "github.com/stretchr/testify/assert" +) + +func TestBaseFullHistoryResolver_SearchFirst(t *testing.T) { + t.Parallel() + + testKey := []byte("key") + testValue := []byte("value") + resolver := &baseFullHistoryResolver{ + storer: &storage.StorerStub{ + SearchFirstCalled: func(key []byte) ([]byte, error) { + assert.Equal(t, testKey, key) + + return testValue, nil + }, + }, + } + + val, err := resolver.searchFirst(testKey) + assert.Nil(t, err) + assert.Equal(t, testValue, val) +} + +func TestBaseFullHistoryResolver_GetFromStorage(t *testing.T) { + t.Parallel() + + testKey := []byte("key") + testValue := []byte("value") + testEpoch := uint32(37) + + t.Run("get from epoch returned nil error and not empty buffer", func(t *testing.T) { + resolver := &baseFullHistoryResolver{ + storer: &storage.StorerStub{ + SearchFirstCalled: func(key []byte) ([]byte, error) { + assert.Fail(t, "should have not called SearchFirst") + + return nil, nil + }, + GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { + assert.Equal(t, testKey, key) + assert.Equal(t, testEpoch, epoch) + + return testValue, nil + }, + }, + } + + val, err := resolver.getFromStorage(testKey, testEpoch) + assert.Nil(t, err) + assert.Equal(t, testValue, val) + }) + t.Run("get from epoch returned nil error and nil buffer", func(t *testing.T) { + resolver := &baseFullHistoryResolver{ + storer: &storage.StorerStub{ + SearchFirstCalled: func(key []byte) ([]byte, error) { + assert.Fail(t, "should have not called SearchFirst") + + return nil, nil + }, + GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { + assert.Equal(t, testKey, key) + assert.Equal(t, testEpoch, epoch) + + return nil, nil + }, + }, + } + + val, err := resolver.getFromStorage(testKey, testEpoch) + assert.Nil(t, err) + assert.Equal(t, 0, len(val)) + }) + t.Run("get from epoch returned error and will default to search first", func(t *testing.T) { + resolver := &baseFullHistoryResolver{ + storer: &storage.StorerStub{ + SearchFirstCalled: func(key []byte) ([]byte, error) { + assert.Equal(t, testKey, key) + + return testValue, nil + }, + GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { + assert.Equal(t, testKey, key) + assert.Equal(t, testEpoch, epoch) + + return nil, errors.New("not found") + }, + }, + } + + val, err := resolver.getFromStorage(testKey, testEpoch) + assert.Nil(t, err) + assert.Equal(t, testValue, val) + }) +} From 0739badb6e679e3df86894bff4ac3d47ac498803 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 30 Aug 2023 12:59:14 +0300 Subject: [PATCH 113/120] - changed test description --- dataRetriever/resolvers/baseFullHistoryResolver_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataRetriever/resolvers/baseFullHistoryResolver_test.go b/dataRetriever/resolvers/baseFullHistoryResolver_test.go index 567ab20dac9..881820bdd27 100644 --- a/dataRetriever/resolvers/baseFullHistoryResolver_test.go +++ b/dataRetriever/resolvers/baseFullHistoryResolver_test.go @@ -77,7 +77,7 @@ func TestBaseFullHistoryResolver_GetFromStorage(t *testing.T) { assert.Nil(t, err) assert.Equal(t, 0, len(val)) }) - t.Run("get from epoch returned error and will default to search first", func(t *testing.T) { + t.Run("get from epoch returned error will fallback to search first", func(t *testing.T) { resolver := &baseFullHistoryResolver{ storer: &storage.StorerStub{ SearchFirstCalled: func(key []byte) ([]byte, error) { From a594c40459b655ffcd4b6bc22c87dda49dec7c06 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Wed, 30 Aug 2023 13:10:13 +0300 Subject: [PATCH 114/120] fix imports --- process/block/postprocess/intermediateResults_test.go | 3 +-- .../metachain/intermediateProcessorsContainerFactory_test.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index abf1e8ac376..4213349ee6d 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -7,8 +7,6 @@ import ( "strconv" "testing" - txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" - "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-core-go/data/block" @@ -18,6 +16,7 @@ import ( "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/testscommon" + txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" diff --git a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go index f479b6b1861..465b36a1208 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go @@ -1,13 +1,13 @@ package metachain_test import ( - txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" "testing" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/factory/metachain" "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/testscommon" + txExecOrderStub "github.com/multiversx/mx-chain-go/testscommon/common" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/multiversx/mx-chain-go/testscommon/enableEpochsHandlerMock" From c1c7b27e25877014b1acbade73610b74178475e6 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 30 Aug 2023 15:59:02 +0300 Subject: [PATCH 115/120] - linter fixes --- api/groups/networkGroup_test.go | 69 ++++++++----------- api/groups/nodeGroup_test.go | 63 ++++++++--------- api/middleware/responseLogger.go | 4 +- cmd/assessment/main.go | 3 +- cmd/termui/provider/metricsProvider.go | 4 +- common/statistics/osLevel/memStats.go | 4 +- common/statistics/osLevel/memStats_test.go | 1 - dataRetriever/factory/dataPoolFactory.go | 4 +- debug/process/stateExport_test.go | 6 +- genesis/process/genesisBlockCreator_test.go | 1 - genesis/process/intermediate/baseDeploy.go | 4 +- .../polynetworkbridge/bridge_test.go | 4 +- .../smartContract/scCallingSC_test.go | 4 +- .../multiShard/softfork/scDeploy_test.go | 4 +- .../txScenarios/builtinFunctions_test.go | 4 +- .../multiShard/txScenarios/scCalls_test.go | 4 +- .../executingMiniblocksSc_test.go | 4 +- integrationTests/testNetwork.go | 7 +- .../vm/delegation/changeOwner_test.go | 1 - .../vm/delegation/delegationMulti_test.go | 1 - .../vm/delegation/delegationScenarios_test.go | 1 - .../vm/delegation/delegation_test.go | 1 - .../esdtLocalFunsSC_MockContracts_test.go | 1 - .../esdt/localFuncs/esdtLocalFunsSC_test.go | 1 - .../vm/esdt/multisign/esdtMultisign_test.go | 5 +- .../vm/esdt/nft/esdtNFT/esdtNft_test.go | 1 - .../vm/esdt/nft/esdtNFTSCs/esdtNFTSCs_test.go | 1 - .../vm/esdt/process/esdtProcess_test.go | 1 - .../vm/esdt/roles/esdtRoles_test.go | 1 - .../vm/txsFee/asyncCall_multi_test.go | 24 +++---- integrationTests/vm/txsFee/asyncCall_test.go | 11 ++- integrationTests/vm/txsFee/asyncESDT_test.go | 38 +++++----- .../vm/txsFee/builtInFunctions_test.go | 2 - integrationTests/vm/txsFee/dns_test.go | 1 - .../vm/txsFee/dynamicGasCost_test.go | 7 +- .../vm/txsFee/guardAccount_test.go | 5 +- .../vm/txsFee/migrateDataTrie_test.go | 1 - .../vm/txsFee/multiShard/asyncCall_test.go | 1 - .../vm/txsFee/multiShard/asyncESDT_test.go | 1 - .../txsFee/multiShard/relayedScDeploy_test.go | 1 - .../multiShard/relayedTxScCalls_test.go | 1 - .../scCallWithValueTransfer_test.go | 1 - .../vm/txsFee/multiShard/scCalls_test.go | 1 - .../vm/txsFee/relayedAsyncCall_test.go | 7 +- .../vm/txsFee/relayedAsyncESDT_test.go | 31 ++++----- .../vm/txsFee/relayedBuiltInFunctions_test.go | 8 +-- integrationTests/vm/txsFee/relayedDns_test.go | 1 - .../vm/txsFee/relayedESDT_test.go | 9 ++- .../vm/txsFee/relayedScCalls_test.go | 2 - .../vm/txsFee/relayedScDeploy_test.go | 1 - integrationTests/vm/txsFee/scCalls_test.go | 7 +- integrationTests/vm/txsFee/scDeploy_test.go | 1 - integrationTests/vm/txsFee/utils/utils.go | 14 ++-- .../vm/wasm/badcontracts/badcontracts_test.go | 1 - .../delegation/delegationSimulation_test.go | 1 - .../vm/wasm/delegation/delegation_test.go | 1 - .../vm/wasm/delegation/testRunner.go | 6 +- integrationTests/vm/wasm/erc20/erc20_test.go | 1 - .../vm/wasm/upgrades/upgrades_test.go | 1 - integrationTests/vm/wasm/utils.go | 4 +- .../vm/wasm/wasmer/wasmer_test.go | 1 - .../wasmvm/executeViaBlockchainhook_test.go | 1 - .../vm/wasm/wasmvm/gasSchedule_test.go | 1 - .../vm/wasm/wasmvm/versionswitch/vm_test.go | 3 +- .../wasmvm/versionswitch_revert/vm_test.go | 3 +- .../wasmvm/versionswitch_vmquery/vm_test.go | 3 +- .../vm/wasm/wasmvm/wasmVM_test.go | 1 - node/nodeMemoryConfig_test.go | 4 +- node/nodeRunner_test.go | 18 +++-- outport/notifier/httpClientWrapper.go | 4 +- storage/factory/dbConfigHandler.go | 3 +- testscommon/dataRetriever/poolFactory.go | 4 +- testscommon/goroutines/counter_test.go | 8 +-- testscommon/goroutines/snapshot_test.go | 10 +-- testscommon/realConfigsHandling.go | 6 +- update/genesis/export.go | 4 +- update/genesis/export_test.go | 3 +- update/trigger/importStartHandler.go | 3 +- 78 files changed, 196 insertions(+), 284 deletions(-) diff --git a/api/groups/networkGroup_test.go b/api/groups/networkGroup_test.go index dccf923e1b9..3eb52a4a0c0 100644 --- a/api/groups/networkGroup_test.go +++ b/api/groups/networkGroup_test.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "math/big" "net/http" "net/http/httptest" @@ -96,8 +95,8 @@ func TestNetworkConfigMetrics_ShouldWork(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := common.MetricMinGasLimit - value := uint64(37) - statusMetricsProvider.SetUInt64Value(key, value) + val := uint64(37) + statusMetricsProvider.SetUInt64Value(key, val) facade := mock.FacadeStub{} facade.StatusMetricsHandler = func() external.StatusMetricsHandler { @@ -113,17 +112,15 @@ func TestNetworkConfigMetrics_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", value)) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", val)) assert.True(t, keyAndValueFoundInResponse) } func TestGetNetworkConfig_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -152,8 +149,6 @@ func TestGetNetworkConfig_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { } func TestGetNetworkStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -186,8 +181,8 @@ func TestNetworkConfigMetrics_GasLimitGuardedTxShouldWork(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := common.MetricExtraGasLimitGuardedTx - value := uint64(37) - statusMetricsProvider.SetUInt64Value(key, value) + val := uint64(37) + statusMetricsProvider.SetUInt64Value(key, val) facade := mock.FacadeStub{} facade.StatusMetricsHandler = func() external.StatusMetricsHandler { @@ -203,11 +198,11 @@ func TestNetworkConfigMetrics_GasLimitGuardedTxShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", value)) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", val)) assert.True(t, keyAndValueFoundInResponse) } @@ -216,8 +211,8 @@ func TestNetworkStatusMetrics_ShouldWork(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := common.MetricEpochNumber - value := uint64(37) - statusMetricsProvider.SetUInt64Value(key, value) + val := uint64(37) + statusMetricsProvider.SetUInt64Value(key, val) facade := mock.FacadeStub{} facade.StatusMetricsHandler = func() external.StatusMetricsHandler { @@ -233,19 +228,19 @@ func TestNetworkStatusMetrics_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", value)) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", val)) assert.True(t, keyAndValueFoundInResponse) } func TestEconomicsMetrics_ShouldWork(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := common.MetricTotalSupply - value := "12345" - statusMetricsProvider.SetStringValue(key, value) + val := "12345" + statusMetricsProvider.SetStringValue(key, val) facade := mock.FacadeStub{ GetTotalStakedValueHandler: func() (*api.StakeValues, error) { @@ -268,17 +263,15 @@ func TestEconomicsMetrics_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, value) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, val) assert.True(t, keyAndValueFoundInResponse) } func TestGetEconomicValues_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -312,8 +305,8 @@ func TestGetEconomicValues_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { func TestEconomicsMetrics_CannotGetStakeValues(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := common.MetricTotalSupply - value := "12345" - statusMetricsProvider.SetStringValue(key, value) + val := "12345" + statusMetricsProvider.SetStringValue(key, val) localErr := fmt.Errorf("%s", "local error") facade := mock.FacadeStub{ @@ -410,7 +403,7 @@ func TestDirectStakedInfo_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) @@ -440,7 +433,7 @@ func TestDirectStakedInfo_CannotGetDirectStakedList(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusInternalServerError) @@ -495,7 +488,7 @@ func TestDelegatedInfo_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) @@ -534,7 +527,7 @@ func TestDelegatedInfo_CannotGetDelegatedList(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusInternalServerError) @@ -542,8 +535,6 @@ func TestDelegatedInfo_CannotGetDelegatedList(t *testing.T) { } func TestGetEnableEpochs_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -576,8 +567,8 @@ func TestGetEnableEpochs_ShouldWork(t *testing.T) { statusMetrics := statusHandler.NewStatusMetrics() key := common.MetricScDeployEnableEpoch - value := uint64(4) - statusMetrics.SetUInt64Value(key, value) + val := uint64(4) + statusMetrics.SetUInt64Value(key, val) facade := mock.FacadeStub{} facade.StatusMetricsHandler = func() external.StatusMetricsHandler { @@ -593,18 +584,17 @@ func TestGetEnableEpochs_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, strconv.FormatUint(value, 10)) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, strconv.FormatUint(val, 10)) assert.True(t, keyAndValueFoundInResponse) } func TestGetESDTTotalSupply_InternalError(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected error") facade := mock.FacadeStub{ GetTokenSupplyCalled: func(token string) (*api.ESDTSupply, error) { return nil, expectedErr @@ -620,7 +610,7 @@ func TestGetESDTTotalSupply_InternalError(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusInternalServerError) @@ -629,8 +619,6 @@ func TestGetESDTTotalSupply_InternalError(t *testing.T) { } func TestGetNetworkRatings_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -716,7 +704,7 @@ func TestGetESDTTotalSupply(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) assert.Equal(t, resp.Code, http.StatusOK) respSupply := &supplyResponse{} @@ -964,7 +952,6 @@ func TestNetworkGroup_UpdateFacade(t *testing.T) { loadResponse(resp.Body, &response) assert.Equal(t, builtInCost, response.Data.Configs.BuiltInCost) - expectedErr := errors.New("expected error") newFacade := mock.FacadeStub{ GetGasConfigsCalled: func() (map[string]map[string]uint64, error) { return nil, expectedErr diff --git a/api/groups/nodeGroup_test.go b/api/groups/nodeGroup_test.go index 92fc174ff81..a46d140e598 100644 --- a/api/groups/nodeGroup_test.go +++ b/api/groups/nodeGroup_test.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "net/http/httptest" "strings" @@ -162,8 +161,6 @@ func TestHeartbeatStatus(t *testing.T) { } func TestP2PMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -192,8 +189,6 @@ func TestP2PMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { } func TestNodeStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -222,8 +217,6 @@ func TestNodeStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { } func TestBootstrapStatus_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -270,7 +263,7 @@ func TestBootstrapStatusMetrics_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) @@ -320,8 +313,8 @@ func TestNodeGroup_GetConnectedPeersRatings(t *testing.T) { func TestStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := "test-details-key" - value := "test-details-value" - statusMetricsProvider.SetStringValue(key, value) + val := "test-details-value" + statusMetricsProvider.SetStringValue(key, val) p2pKey := "a_p2p_specific_key" statusMetricsProvider.SetStringValue(p2pKey, "p2p value") @@ -340,11 +333,11 @@ func TestStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, value) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, val) assert.True(t, keyAndValueFoundInResponse) assert.False(t, strings.Contains(respStr, p2pKey)) } @@ -352,8 +345,8 @@ func TestStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { func TestP2PStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := "test-details-key" - value := "test-details-value" - statusMetricsProvider.SetStringValue(key, value) + val := "test-details-value" + statusMetricsProvider.SetStringValue(key, val) p2pKey := "a_p2p_specific_key" p2pValue := "p2p value" @@ -373,7 +366,7 @@ func TestP2PStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) @@ -401,11 +394,11 @@ func TestQueryDebug_ShouldBindJSONErrorsShouldErr(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - queryResponse := &generalResponse{} - loadResponse(resp.Body, queryResponse) + queryResp := &generalResponse{} + loadResponse(resp.Body, queryResp) assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.Contains(t, queryResponse.Error, apiErrors.ErrValidation.Error()) + assert.Contains(t, queryResp.Error, apiErrors.ErrValidation.Error()) } func TestQueryDebug_GetQueryErrorsShouldErr(t *testing.T) { @@ -429,11 +422,11 @@ func TestQueryDebug_GetQueryErrorsShouldErr(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - queryResponse := &generalResponse{} - loadResponse(resp.Body, queryResponse) + queryResp := &generalResponse{} + loadResponse(resp.Body, queryResp) assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.Contains(t, queryResponse.Error, expectedErr.Error()) + assert.Contains(t, queryResp.Error, expectedErr.Error()) } func TestQueryDebug_GetQueryShouldWork(t *testing.T) { @@ -467,14 +460,14 @@ func TestQueryDebug_GetQueryShouldWork(t *testing.T) { response := shared.GenericAPIResponse{} loadResponse(resp.Body, &response) - queryResponse := queryResponse{} + queryResp := queryResponse{} mapResponseData := response.Data.(map[string]interface{}) mapResponseDataBytes, _ := json.Marshal(mapResponseData) - _ = json.Unmarshal(mapResponseDataBytes, &queryResponse) + _ = json.Unmarshal(mapResponseDataBytes, &queryResp) assert.Equal(t, http.StatusOK, resp.Code) - assert.Contains(t, queryResponse.Result, str1) - assert.Contains(t, queryResponse.Result, str2) + assert.Contains(t, queryResp.Result, str1) + assert.Contains(t, queryResp.Result, str2) } func TestPeerInfo_PeerInfoErrorsShouldErr(t *testing.T) { @@ -628,8 +621,6 @@ func TestEpochStartData_ShouldWork(t *testing.T) { } func TestPrometheusMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { - expectedErr := errors.New("i am an error") - facade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ @@ -660,8 +651,8 @@ func TestPrometheusMetrics_ShouldReturnErrorIfFacadeReturnsError(t *testing.T) { func TestPrometheusMetrics_ShouldWork(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := "test-key" - value := uint64(37) - statusMetricsProvider.SetUInt64Value(key, value) + val := uint64(37) + statusMetricsProvider.SetUInt64Value(key, val) facade := mock.FacadeStub{} facade.StatusMetricsHandler = func() external.StatusMetricsHandler { @@ -677,11 +668,11 @@ func TestPrometheusMetrics_ShouldWork(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", value)) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", val)) assert.True(t, keyAndValueFoundInResponse) } @@ -886,8 +877,8 @@ func TestNodeGroup_UpdateFacade(t *testing.T) { statusMetricsProvider := statusHandler.NewStatusMetrics() key := "test-key" - value := uint64(37) - statusMetricsProvider.SetUInt64Value(key, value) + val := uint64(37) + statusMetricsProvider.SetUInt64Value(key, val) facade := mock.FacadeStub{} facade.StatusMetricsHandler = func() external.StatusMetricsHandler { @@ -903,10 +894,10 @@ func TestNodeGroup_UpdateFacade(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - respBytes, _ := ioutil.ReadAll(resp.Body) + respBytes, _ := io.ReadAll(resp.Body) respStr := string(respBytes) assert.Equal(t, resp.Code, http.StatusOK) - keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", value)) + keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", val)) assert.True(t, keyAndValueFoundInResponse) newFacade := mock.FacadeStub{ @@ -944,7 +935,7 @@ func TestNodeGroup_IsInterfaceNil(t *testing.T) { } func loadResponseAsString(rsp io.Reader, response *statusResponse) { - buff, err := ioutil.ReadAll(rsp) + buff, err := io.ReadAll(rsp) if err != nil { logError(err) return diff --git a/api/middleware/responseLogger.go b/api/middleware/responseLogger.go index 233ad88b809..fd3ea8636e3 100644 --- a/api/middleware/responseLogger.go +++ b/api/middleware/responseLogger.go @@ -3,7 +3,7 @@ package middleware import ( "bytes" "fmt" - "io/ioutil" + "io" "net/http" "strings" "time" @@ -64,7 +64,7 @@ func (rlm *responseLoggerMiddleware) logRequestAndResponse(c *gin.Context, durat if c.Request.Body != nil { reqBody := c.Request.Body - reqBodyBytes, err := ioutil.ReadAll(reqBody) + reqBodyBytes, err := io.ReadAll(reqBody) if err != nil { log.Debug(err.Error()) return diff --git a/cmd/assessment/main.go b/cmd/assessment/main.go index 15fce3c4387..8e61205de2b 100644 --- a/cmd/assessment/main.go +++ b/cmd/assessment/main.go @@ -4,7 +4,6 @@ import ( "bytes" "encoding/csv" "fmt" - "io/ioutil" "os" "runtime" "strings" @@ -142,5 +141,5 @@ func saveToFile(hi *hostParameters.HostInfo, results *benchmarks.TestResults, ou return err } - return ioutil.WriteFile(outputFileName, buff.Bytes(), core.FileModeReadWrite) + return os.WriteFile(outputFileName, buff.Bytes(), core.FileModeReadWrite) } diff --git a/cmd/termui/provider/metricsProvider.go b/cmd/termui/provider/metricsProvider.go index 2ffe47e848e..d761caedbec 100644 --- a/cmd/termui/provider/metricsProvider.go +++ b/cmd/termui/provider/metricsProvider.go @@ -2,7 +2,7 @@ package provider import ( "encoding/json" - "io/ioutil" + "io" "net/http" "strings" "time" @@ -88,7 +88,7 @@ func (smp *StatusMetricsProvider) loadMetricsFromApi(metricsPath string) (map[st return nil, err } - responseBytes, err := ioutil.ReadAll(resp.Body) + responseBytes, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/common/statistics/osLevel/memStats.go b/common/statistics/osLevel/memStats.go index c4d6f8f1b6f..269baeb80d4 100644 --- a/common/statistics/osLevel/memStats.go +++ b/common/statistics/osLevel/memStats.go @@ -2,7 +2,7 @@ package osLevel import ( "fmt" - "io/ioutil" + "os" "strconv" "strings" @@ -74,7 +74,7 @@ func (memStats *MemStats) String() string { // ReadCurrentMemStats will read the current mem stats at the OS level func ReadCurrentMemStats() (*MemStats, error) { - buff, err := ioutil.ReadFile(procFile) + buff, err := os.ReadFile(procFile) if err != nil { return nil, err } diff --git a/common/statistics/osLevel/memStats_test.go b/common/statistics/osLevel/memStats_test.go index e4a4eb04a4f..99724172e67 100644 --- a/common/statistics/osLevel/memStats_test.go +++ b/common/statistics/osLevel/memStats_test.go @@ -1,5 +1,4 @@ //go:build darwin || linux -// +build darwin linux package osLevel diff --git a/dataRetriever/factory/dataPoolFactory.go b/dataRetriever/factory/dataPoolFactory.go index 3f4cf038c4a..781488e1f43 100644 --- a/dataRetriever/factory/dataPoolFactory.go +++ b/dataRetriever/factory/dataPoolFactory.go @@ -2,7 +2,7 @@ package factory import ( "fmt" - "io/ioutil" + "os" "time" "github.com/multiversx/mx-chain-core-go/core" @@ -187,7 +187,7 @@ func createTrieSyncDB(args ArgsDataPool) (storage.Persister, error) { } if mainConfig.TrieSyncStorage.DB.UseTmpAsFilePath { - filePath, errTempDir := ioutil.TempDir("", "trieSyncStorage") + filePath, errTempDir := os.MkdirTemp("", "trieSyncStorage") if errTempDir != nil { return nil, errTempDir } diff --git a/debug/process/stateExport_test.go b/debug/process/stateExport_test.go index d0cef9d283a..5bee59d9f14 100644 --- a/debug/process/stateExport_test.go +++ b/debug/process/stateExport_test.go @@ -3,8 +3,8 @@ package process import ( "encoding/hex" "fmt" - "io/ioutil" "math/big" + "os" "testing" "github.com/multiversx/mx-chain-go/state" @@ -63,14 +63,14 @@ func TestExportUserAccountState(t *testing.T) { }) t.Run("test files are produced", func(t *testing.T) { tempDir := t.TempDir() - contents, errReadDir := ioutil.ReadDir(tempDir) + contents, errReadDir := os.ReadDir(tempDir) require.Nil(t, errReadDir) assert.Zero(t, len(contents)) errExport := ExportUserAccountState(accounts, "", address, tempDir) require.Nil(t, errExport) - contents, errReadDir = ioutil.ReadDir(tempDir) + contents, errReadDir = os.ReadDir(tempDir) require.Nil(t, errReadDir) assert.Equal(t, 2, len(contents)) }) diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index ad316b083eb..1e69a96a98b 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO reinstate test after Wasm VM pointer fix diff --git a/genesis/process/intermediate/baseDeploy.go b/genesis/process/intermediate/baseDeploy.go index 79d03c408d8..7f45395fa4c 100644 --- a/genesis/process/intermediate/baseDeploy.go +++ b/genesis/process/intermediate/baseDeploy.go @@ -3,8 +3,8 @@ package intermediate import ( "encoding/hex" "fmt" - "io/ioutil" "math/big" + "os" "path/filepath" "strings" @@ -104,7 +104,7 @@ func (dp *baseDeploy) deployForOneAddress( } func getSCCodeAsHex(filename string) (string, error) { - code, err := ioutil.ReadFile(filepath.Clean(filename)) + code, err := os.ReadFile(filepath.Clean(filename)) if err != nil { return "", err } diff --git a/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go b/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go index 8c36ace890d..d01f900d5e2 100644 --- a/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go +++ b/integrationTests/multiShard/smartContract/polynetworkbridge/bridge_test.go @@ -3,8 +3,8 @@ package polynetworkbridge import ( "encoding/hex" "fmt" - "io/ioutil" "math/big" + "os" "testing" "github.com/multiversx/mx-chain-go/config" @@ -80,7 +80,7 @@ func TestBridgeSetupAndBurn(t *testing.T) { factory.WasmVirtualMachine, ) - scCode, err := ioutil.ReadFile(tokenManagerPath) + scCode, err := os.ReadFile(tokenManagerPath) if err != nil { panic(fmt.Sprintf("putDeploySCToDataPool(): %s", err)) } diff --git a/integrationTests/multiShard/smartContract/scCallingSC_test.go b/integrationTests/multiShard/smartContract/scCallingSC_test.go index b7892cdb989..bec29df5e8e 100644 --- a/integrationTests/multiShard/smartContract/scCallingSC_test.go +++ b/integrationTests/multiShard/smartContract/scCallingSC_test.go @@ -5,8 +5,8 @@ import ( "encoding/hex" "errors" "fmt" - "io/ioutil" "math/big" + "os" "strings" "testing" "time" @@ -984,7 +984,7 @@ func putDeploySCToDataPool( nodes []*integrationTests.TestProcessorNode, gasLimit uint64, ) []byte { - scCode, err := ioutil.ReadFile(fileName) + scCode, err := os.ReadFile(fileName) if err != nil { panic(fmt.Sprintf("putDeploySCToDataPool(): %s", err)) } diff --git a/integrationTests/multiShard/softfork/scDeploy_test.go b/integrationTests/multiShard/softfork/scDeploy_test.go index a026b4f4591..dc735b26abd 100644 --- a/integrationTests/multiShard/softfork/scDeploy_test.go +++ b/integrationTests/multiShard/softfork/scDeploy_test.go @@ -2,8 +2,8 @@ package softfork import ( "encoding/hex" - "io/ioutil" "math/big" + "os" "testing" "time" @@ -121,7 +121,7 @@ func TestScDeploy(t *testing.T) { } func deploySc(t *testing.T, nodes []*integrationTests.TestProcessorNode) []byte { - scCode, err := ioutil.ReadFile("./testdata/answer.wasm") + scCode, err := os.ReadFile("./testdata/answer.wasm") require.Nil(t, err) node := nodes[0] diff --git a/integrationTests/multiShard/txScenarios/builtinFunctions_test.go b/integrationTests/multiShard/txScenarios/builtinFunctions_test.go index c07fe755e53..1064239cbb0 100644 --- a/integrationTests/multiShard/txScenarios/builtinFunctions_test.go +++ b/integrationTests/multiShard/txScenarios/builtinFunctions_test.go @@ -3,8 +3,8 @@ package txScenarios import ( "encoding/hex" "fmt" - "io/ioutil" "math/big" + "os" "testing" "time" @@ -32,7 +32,7 @@ func TestTransaction_TransactionBuiltinFunctionsScenarios(t *testing.T) { nonce++ scPath := "./../../vm/wasm/testdata/counter/counter_old.wasm" - scCode, err := ioutil.ReadFile(scPath) + scCode, err := os.ReadFile(scPath) if err != nil { panic(fmt.Sprintf("cannotReadContractCode: %s", err)) diff --git a/integrationTests/multiShard/txScenarios/scCalls_test.go b/integrationTests/multiShard/txScenarios/scCalls_test.go index d38aea10426..2d56e02bf1a 100644 --- a/integrationTests/multiShard/txScenarios/scCalls_test.go +++ b/integrationTests/multiShard/txScenarios/scCalls_test.go @@ -2,7 +2,7 @@ package txScenarios import ( "fmt" - "io/ioutil" + "os" "testing" "time" @@ -25,7 +25,7 @@ func TestTransaction_TransactionSCScenarios(t *testing.T) { net.Increment() scPath := "./../../vm/wasm/testdata/counter/counter_old.wasm" - scCode, err := ioutil.ReadFile(scPath) + scCode, err := os.ReadFile(scPath) if err != nil { panic(fmt.Sprintf("cannotReadContractCode: %s", err)) diff --git a/integrationTests/singleShard/block/executingMiniblocksSc/executingMiniblocksSc_test.go b/integrationTests/singleShard/block/executingMiniblocksSc/executingMiniblocksSc_test.go index d268e5e8c76..81bf80dca55 100644 --- a/integrationTests/singleShard/block/executingMiniblocksSc/executingMiniblocksSc_test.go +++ b/integrationTests/singleShard/block/executingMiniblocksSc/executingMiniblocksSc_test.go @@ -3,8 +3,8 @@ package executingMiniblocksSc import ( "encoding/hex" "fmt" - "io/ioutil" "math/big" + "os" "testing" "time" @@ -20,7 +20,7 @@ func TestShouldProcessMultipleERC20ContractsInSingleShard(t *testing.T) { t.Skip("this is not a short test") } - scCode, err := ioutil.ReadFile("../../../vm/wasm/testdata/erc20-c-03/wrc20_wasm.wasm") + scCode, err := os.ReadFile("../../../vm/wasm/testdata/erc20-c-03/wrc20_wasm.wasm") assert.Nil(t, err) maxShards := uint32(1) diff --git a/integrationTests/testNetwork.go b/integrationTests/testNetwork.go index 711a0f7e202..e22222d41a7 100644 --- a/integrationTests/testNetwork.go +++ b/integrationTests/testNetwork.go @@ -2,8 +2,8 @@ package integrationTests import ( "fmt" - "io/ioutil" "math/big" + "os" "path/filepath" "testing" @@ -153,14 +153,17 @@ func (net *TestNetwork) CreateWallets(count int) { } } +// SetWallet - func (net *TestNetwork) SetWallet(walletIndex int, wallet *TestWalletAccount) { net.Wallets[walletIndex] = wallet } +// CreateUninitializedWallets - func (net *TestNetwork) CreateUninitializedWallets(count int) { net.Wallets = make([]*TestWalletAccount, count) } +// CreateWalletOnShard - func (net *TestNetwork) CreateWalletOnShard(walletIndex int, shardID uint32) *TestWalletAccount { node := net.firstNodeInShard(shardID) net.Wallets[walletIndex] = CreateTestWalletAccount(node.ShardCoordinator, shardID) @@ -226,7 +229,7 @@ func (net *TestNetwork) DeploySCWithInitArgs( args ...[]byte, ) []byte { scAddress := net.NewAddress(owner) - code, err := ioutil.ReadFile(filepath.Clean(fileName)) + code, err := os.ReadFile(filepath.Clean(fileName)) require.Nil(net.T, err) codeMetadata := &vmcommon.CodeMetadata{ diff --git a/integrationTests/vm/delegation/changeOwner_test.go b/integrationTests/vm/delegation/changeOwner_test.go index 66c215e032a..2b23993882d 100644 --- a/integrationTests/vm/delegation/changeOwner_test.go +++ b/integrationTests/vm/delegation/changeOwner_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package delegation diff --git a/integrationTests/vm/delegation/delegationMulti_test.go b/integrationTests/vm/delegation/delegationMulti_test.go index c6c43e0ee06..90d307c741d 100644 --- a/integrationTests/vm/delegation/delegationMulti_test.go +++ b/integrationTests/vm/delegation/delegationMulti_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package delegation diff --git a/integrationTests/vm/delegation/delegationScenarios_test.go b/integrationTests/vm/delegation/delegationScenarios_test.go index facb4969f04..e1d58b12d6d 100644 --- a/integrationTests/vm/delegation/delegationScenarios_test.go +++ b/integrationTests/vm/delegation/delegationScenarios_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package delegation diff --git a/integrationTests/vm/delegation/delegation_test.go b/integrationTests/vm/delegation/delegation_test.go index aafdfe9d50a..65ff98aab2f 100644 --- a/integrationTests/vm/delegation/delegation_test.go +++ b/integrationTests/vm/delegation/delegation_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package delegation diff --git a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go index 92b4aa22f66..ed85466886c 100644 --- a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go +++ b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package localFuncs diff --git a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go index 8ad806e1418..9f2c96a3199 100644 --- a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go +++ b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package localFuncs diff --git a/integrationTests/vm/esdt/multisign/esdtMultisign_test.go b/integrationTests/vm/esdt/multisign/esdtMultisign_test.go index d0869022aed..42b2bcacbdc 100644 --- a/integrationTests/vm/esdt/multisign/esdtMultisign_test.go +++ b/integrationTests/vm/esdt/multisign/esdtMultisign_test.go @@ -1,12 +1,11 @@ //go:build !race -// +build !race package multisign import ( "encoding/hex" - "io/ioutil" "math/big" + "os" "strings" "testing" "time" @@ -157,7 +156,7 @@ func deployMultisig(t *testing.T, nodes []*integrationTests.TestProcessorNode, o Readable: true, } - contractBytes, err := ioutil.ReadFile("../testdata/multisig-callback.wasm") + contractBytes, err := os.ReadFile("../testdata/multisig-callback.wasm") require.Nil(t, err) proposers := make([]string, 0, len(proposersIndexes)+1) proposers = append(proposers, hex.EncodeToString(nodes[ownerIdx].OwnAccount.Address)) diff --git a/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go b/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go index 0117b84fd3d..7c36970cc91 100644 --- a/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go +++ b/integrationTests/vm/esdt/nft/esdtNFT/esdtNft_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package esdtNFT diff --git a/integrationTests/vm/esdt/nft/esdtNFTSCs/esdtNFTSCs_test.go b/integrationTests/vm/esdt/nft/esdtNFTSCs/esdtNFTSCs_test.go index 1dfa19e4b1e..8f62294a776 100644 --- a/integrationTests/vm/esdt/nft/esdtNFTSCs/esdtNFTSCs_test.go +++ b/integrationTests/vm/esdt/nft/esdtNFTSCs/esdtNFTSCs_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package esdtNFTSCs diff --git a/integrationTests/vm/esdt/process/esdtProcess_test.go b/integrationTests/vm/esdt/process/esdtProcess_test.go index 7d3ac145a73..b409104e0af 100644 --- a/integrationTests/vm/esdt/process/esdtProcess_test.go +++ b/integrationTests/vm/esdt/process/esdtProcess_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package process diff --git a/integrationTests/vm/esdt/roles/esdtRoles_test.go b/integrationTests/vm/esdt/roles/esdtRoles_test.go index 8b310a57969..aa2834062c4 100644 --- a/integrationTests/vm/esdt/roles/esdtRoles_test.go +++ b/integrationTests/vm/esdt/roles/esdtRoles_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package roles diff --git a/integrationTests/vm/txsFee/asyncCall_multi_test.go b/integrationTests/vm/txsFee/asyncCall_multi_test.go index 3a3d85bf9b7..3a4f121d068 100644 --- a/integrationTests/vm/txsFee/asyncCall_multi_test.go +++ b/integrationTests/vm/txsFee/asyncCall_multi_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package txsFee @@ -28,7 +27,6 @@ func TestAsyncCallLegacy(t *testing.T) { require.Nil(t, err) defer testContext.Close() - gasPrice := uint64(10) gasLimit := uint64(5000000) senderAddr := []byte("12345678901234567890123456789011") @@ -72,7 +70,6 @@ func TestAsyncCallMulti(t *testing.T) { require.Nil(t, err) defer testContext.Close() - gasPrice := uint64(10) gasLimit := uint64(5000000) senderAddr := []byte("12345678901234567890123456789011") @@ -120,7 +117,6 @@ func TestAsyncCallTransferAndExecute(t *testing.T) { require.Nil(t, err) defer testContext.Close() - gasPrice := uint64(10) gasLimit := uint64(5000000) senderAddr := []byte("12345678901234567890123456789011") @@ -178,7 +174,6 @@ func transferESDTAndExecute(t *testing.T, numberOfCallsFromParent int, numberOfB require.Nil(t, err) defer testContext.Close() - gasPrice := uint64(10) gasLimit := uint64(5000000) senderAddr := []byte("12345678901234567890123456789011") @@ -232,9 +227,9 @@ func transferESDTAndExecute(t *testing.T, numberOfCallsFromParent int, numberOfB int64(numberOfCallsFromParent)*int64(numberOfBackTransfers)*esdtToTransferBackFromChild /* sent back via callback*/)) utils.CheckESDTNFTBalance(t, testContext, forwarderSCAddress, esdtToken, 0, - big.NewInt((esdtBalance.Int64() - /* initial */ - int64(numberOfCallsFromParent)*esdtToTransferFromParent + /* sent via async */ - int64(numberOfCallsFromParent)*int64(numberOfBackTransfers)*esdtToTransferBackFromChild /* received back via callback */))) + big.NewInt(esdtBalance.Int64()- /* initial */ + int64(numberOfCallsFromParent)*esdtToTransferFromParent+ /* sent via async */ + int64(numberOfCallsFromParent)*int64(numberOfBackTransfers)*esdtToTransferBackFromChild /* received back via callback */)) res := vm.GetIntValueFromSC(nil, testContext.Accounts, childSCAddress, "num_called_retrieve_funds_promises") require.Equal(t, big.NewInt(int64(numberOfCallsFromParent)), res) @@ -310,7 +305,6 @@ func TestAsyncCallMulti_CrossShard(t *testing.T) { _, _ = vm.CreateAccount(testContextFirstContract.Accounts, firstContractOwner, 0, egldBalance) _, _ = vm.CreateAccount(testContextSecondContract.Accounts, secondContractOwner, 0, egldBalance) - gasPrice := uint64(10) gasLimit := uint64(5000000) firstAccount, _ := testContextFirstContract.Accounts.LoadAccount(firstContractOwner) @@ -397,7 +391,6 @@ func TestAsyncCallTransferAndExecute_CrossShard(t *testing.T) { _, _ = vm.CreateAccount(childShard.Accounts, childOwner, 0, egldBalance) _, _ = vm.CreateAccount(forwarderShard.Accounts, forwarderOwner, 0, egldBalance) - gasPrice := uint64(10) gasLimit := uint64(5000000) childOwnerAccount, _ := childShard.Accounts.LoadAccount(childOwner) @@ -456,10 +449,10 @@ func TestAsyncCallTransferAndExecute_CrossShard(t *testing.T) { func TestAsyncCallTransferESDTAndExecute_CrossShard_Success(t *testing.T) { numberOfCallsFromParent := 3 numberOfBackTransfers := 2 - transferESDTAndExecute_CrossShard(t, numberOfCallsFromParent, numberOfBackTransfers) + transferESDTAndExecuteCrossShard(t, numberOfCallsFromParent, numberOfBackTransfers) } -func transferESDTAndExecute_CrossShard(t *testing.T, numberOfCallsFromParent int, numberOfBackTransfers int) { +func transferESDTAndExecuteCrossShard(t *testing.T, numberOfCallsFromParent int, numberOfBackTransfers int) { vaultShard, err := vm.CreatePreparedTxProcessorWithVMsMultiShard(0, config.EnableEpochs{ DynamicGasCostForDataTrieStorageLoadEnableEpoch: integrationTests.UnreachableEpoch, }) @@ -491,7 +484,6 @@ func transferESDTAndExecute_CrossShard(t *testing.T, numberOfCallsFromParent int _, _ = vm.CreateAccount(vaultShard.Accounts, vaultOwner, 0, egldBalance) _, _ = vm.CreateAccount(forwarderShard.Accounts, forwarderOwner, 0, egldBalance) - gasPrice := uint64(10) gasLimit := uint64(5000000) vaultOwnerAccount, _ := vaultShard.Accounts.LoadAccount(vaultOwner) @@ -567,9 +559,9 @@ func transferESDTAndExecute_CrossShard(t *testing.T, numberOfCallsFromParent int int64(numberOfCallsFromParent)*int64(numberOfBackTransfers)*esdtToTransferBackFromChild /* sent back via callback*/)) utils.CheckESDTNFTBalance(t, forwarderShard, forwarderSCAddress, esdtToken, 0, - big.NewInt((esdtBalance.Int64() - /* initial */ - int64(numberOfCallsFromParent)*esdtToTransferFromParent + /* sent via async */ - int64(numberOfCallsFromParent)*int64(numberOfBackTransfers)*esdtToTransferBackFromChild /* received back via callback */))) + big.NewInt(esdtBalance.Int64()- /* initial */ + int64(numberOfCallsFromParent)*esdtToTransferFromParent+ /* sent via async */ + int64(numberOfCallsFromParent)*int64(numberOfBackTransfers)*esdtToTransferBackFromChild /* received back via callback */)) res := vm.GetIntValueFromSC(nil, vaultShard.Accounts, vaultSCAddress, "num_called_retrieve_funds_promises") require.Equal(t, big.NewInt(int64(numberOfCallsFromParent)), res) diff --git a/integrationTests/vm/txsFee/asyncCall_test.go b/integrationTests/vm/txsFee/asyncCall_test.go index c24e9befd0a..c49ff9fff1c 100644 --- a/integrationTests/vm/txsFee/asyncCall_test.go +++ b/integrationTests/vm/txsFee/asyncCall_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -37,11 +36,11 @@ func TestAsyncCallShouldWork(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(100000000) + balance := big.NewInt(100000000) senderAddr := []byte("12345678901234567890123456789011") ownerAddr := []byte("12345678901234567890123456789010") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) - _, _ = vm.CreateAccount(testContext.Accounts, senderAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, balance) + _, _ = vm.CreateAccount(testContext.Accounts, senderAddr, 0, balance) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) @@ -94,9 +93,9 @@ func TestMinterContractWithAsyncCalls(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(1000000000000) + balance := big.NewInt(1000000000000) ownerAddr := []byte("12345678901234567890123456789011") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, balance) token := []byte("miiutoken") roles := [][]byte{[]byte(core.ESDTRoleNFTCreate)} diff --git a/integrationTests/vm/txsFee/asyncESDT_test.go b/integrationTests/vm/txsFee/asyncESDT_test.go index b5f40b32cb7..2c2dfce4c71 100644 --- a/integrationTests/vm/txsFee/asyncESDT_test.go +++ b/integrationTests/vm/txsFee/asyncESDT_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -32,16 +31,16 @@ func TestAsyncESDTCallShouldWork(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("12345678901234567890123456789010") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) // create an address with ESDT token sndAddr := []byte("12345678901234567890123456789012") - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, localEgldBalance, token, 0, localEsdtBalance) // deploy 2 contracts ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) @@ -84,16 +83,16 @@ func TestAsyncESDTCallSecondScRefusesPayment(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("12345678901234567890123456789010") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) // create an address with ESDT token sndAddr := []byte("12345678901234567890123456789012") - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, localEgldBalance, token, 0, localEsdtBalance) // deploy 2 contracts ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) @@ -137,16 +136,16 @@ func TestAsyncESDTCallsOutOfGas(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("12345678901234567890123456789010") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) // create an address with ESDT token sndAddr := []byte("12345678901234567890123456789012") - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, localEgldBalance, token, 0, localEsdtBalance) // deploy 2 contracts ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) @@ -486,20 +485,19 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { function1 := []byte("add_queued_call") function2 := []byte("forward_queued_calls") - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("owner-78901234567890123456789000") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) // create an address with ESDT token sndAddr := []byte("sender-8901234567890123456789000") - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) esdtTransferValue := big.NewInt(5000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, localEgldBalance, token, 0, localEsdtBalance) // deploy contract - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) scAddress := utils.DoDeploySecond(t, testContext, "./testdata/third/third.wasm", ownerAccount, gasPrice, deployGasLimit, nil, big.NewInt(0)) @@ -516,7 +514,7 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) require.Nil(t, err) - utils.CheckESDTBalance(t, testContext, sndAddr, token, esdtBalance) + utils.CheckESDTBalance(t, testContext, sndAddr, token, localEsdtBalance) utils.CheckESDTBalance(t, testContext, scAddress, token, big.NewInt(0)) // execute second call @@ -530,7 +528,7 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { _, err = testContext.Accounts.Commit() require.Nil(t, err) - utils.CheckESDTBalance(t, testContext, sndAddr, token, big.NewInt(0).Sub(esdtBalance, esdtTransferValue)) + utils.CheckESDTBalance(t, testContext, sndAddr, token, big.NewInt(0).Sub(localEsdtBalance, esdtTransferValue)) utils.CheckESDTBalance(t, testContext, scAddress, token, esdtTransferValue) // try to recreate the data trie diff --git a/integrationTests/vm/txsFee/builtInFunctions_test.go b/integrationTests/vm/txsFee/builtInFunctions_test.go index a8c45a8f517..47aaa17d1f6 100644 --- a/integrationTests/vm/txsFee/builtInFunctions_test.go +++ b/integrationTests/vm/txsFee/builtInFunctions_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -37,7 +36,6 @@ func TestBuildInFunctionChangeOwnerCallShouldWorkV1(t *testing.T) { utils.CleanAccumulatedIntermediateTransactions(t, testContext) newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) diff --git a/integrationTests/vm/txsFee/dns_test.go b/integrationTests/vm/txsFee/dns_test.go index d0481efa871..53c6644b679 100644 --- a/integrationTests/vm/txsFee/dns_test.go +++ b/integrationTests/vm/txsFee/dns_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/dynamicGasCost_test.go b/integrationTests/vm/txsFee/dynamicGasCost_test.go index b733dec7534..49c651c76a4 100644 --- a/integrationTests/vm/txsFee/dynamicGasCost_test.go +++ b/integrationTests/vm/txsFee/dynamicGasCost_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -34,8 +33,6 @@ func TestDynamicGasCostForDataTrieStorageLoad(t *testing.T) { require.Nil(t, err) defer testContext.Close() - gasPrice := uint64(10) - scAddress, _ := utils.DoDeployNoChecks(t, testContext, "../wasm/testdata/trieStoreAndLoad/storage.wasm") acc := getAccount(t, testContext, scAddress) require.Nil(t, acc.DataTrie()) @@ -47,8 +44,8 @@ func TestDynamicGasCostForDataTrieStorageLoad(t *testing.T) { keys := insertInDataTrie(t, testContext, scAddress, 15) - dataTrie := getAccountDataTrie(t, testContext, scAddress) - trieKeysDepth := getTrieDepthForKeys(t, dataTrie, keys) + dataTrieInstance := getAccountDataTrie(t, testContext, scAddress) + trieKeysDepth := getTrieDepthForKeys(t, dataTrieInstance, keys) apiCallsCost := 3 loadValCost := 32 diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index dfe57225f19..2baa497f991 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -7,8 +6,8 @@ package txsFee import ( "encoding/hex" - "io/ioutil" "math/big" + "os" "sort" "strings" "sync" @@ -115,7 +114,7 @@ func prepareTestContextForGuardedAccounts(tb testing.TB) *vm.VMTestContext { } func getLatestGasScheduleVersion(tb testing.TB, directoryToSearch string) string { - fileInfoSlice, err := ioutil.ReadDir(directoryToSearch) + fileInfoSlice, err := os.ReadDir(directoryToSearch) require.Nil(tb, err) gasSchedulePrefix := "gasScheduleV" diff --git a/integrationTests/vm/txsFee/migrateDataTrie_test.go b/integrationTests/vm/txsFee/migrateDataTrie_test.go index d8c4458198e..a4bc4ad1e0f 100644 --- a/integrationTests/vm/txsFee/migrateDataTrie_test.go +++ b/integrationTests/vm/txsFee/migrateDataTrie_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/multiShard/asyncCall_test.go b/integrationTests/vm/txsFee/multiShard/asyncCall_test.go index bc81d980a54..b647f105a1a 100644 --- a/integrationTests/vm/txsFee/multiShard/asyncCall_test.go +++ b/integrationTests/vm/txsFee/multiShard/asyncCall_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package multiShard diff --git a/integrationTests/vm/txsFee/multiShard/asyncESDT_test.go b/integrationTests/vm/txsFee/multiShard/asyncESDT_test.go index b9790925c06..114859ac5bf 100644 --- a/integrationTests/vm/txsFee/multiShard/asyncESDT_test.go +++ b/integrationTests/vm/txsFee/multiShard/asyncESDT_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go b/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go index 82bf9fc370f..7e6ac45d2b5 100644 --- a/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go +++ b/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package multiShard diff --git a/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go b/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go index 21903455982..8e0229fef08 100644 --- a/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go +++ b/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/multiShard/scCallWithValueTransfer_test.go b/integrationTests/vm/txsFee/multiShard/scCallWithValueTransfer_test.go index 8c3b252e768..bcb14308bab 100644 --- a/integrationTests/vm/txsFee/multiShard/scCallWithValueTransfer_test.go +++ b/integrationTests/vm/txsFee/multiShard/scCallWithValueTransfer_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package multiShard diff --git a/integrationTests/vm/txsFee/multiShard/scCalls_test.go b/integrationTests/vm/txsFee/multiShard/scCalls_test.go index 27beb349823..42e1dc824c1 100644 --- a/integrationTests/vm/txsFee/multiShard/scCalls_test.go +++ b/integrationTests/vm/txsFee/multiShard/scCalls_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/relayedAsyncCall_test.go b/integrationTests/vm/txsFee/relayedAsyncCall_test.go index 5d9508eb115..5fda61846ba 100644 --- a/integrationTests/vm/txsFee/relayedAsyncCall_test.go +++ b/integrationTests/vm/txsFee/relayedAsyncCall_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -46,12 +45,12 @@ func testRelayedAsyncCallShouldWork(t *testing.T, enableEpochs config.EnableEpoc testContext, err := vm.CreatePreparedTxProcessorWithVMs(enableEpochs) require.Nil(t, err) - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("12345678901234567890123456789010") relayerAddr := []byte("12345678901234567890123456789017") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) - _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, localEgldBalance) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) diff --git a/integrationTests/vm/txsFee/relayedAsyncESDT_test.go b/integrationTests/vm/txsFee/relayedAsyncESDT_test.go index a479d8611d9..061a884b268 100644 --- a/integrationTests/vm/txsFee/relayedAsyncESDT_test.go +++ b/integrationTests/vm/txsFee/relayedAsyncESDT_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -25,18 +24,18 @@ func TestRelayedAsyncESDTCallShouldWork(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("12345678901234567890123456789010") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) // create an address with ESDT token relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789012") - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, esdtBalance) - _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, localEsdtBalance) + _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, localEgldBalance) // deploy 2 contracts ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) @@ -83,18 +82,18 @@ func TestRelayedAsyncESDTCall_InvalidCallFirstContract(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("12345678901234567890123456789010") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) // create an address with ESDT token relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789012") - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, esdtBalance) - _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, localEsdtBalance) + _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, localEgldBalance) // deploy 2 contracts ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) @@ -141,18 +140,18 @@ func TestRelayedAsyncESDTCall_InvalidOutOfGas(t *testing.T) { require.Nil(t, err) defer testContext.Close() - egldBalance := big.NewInt(100000000) + localEgldBalance := big.NewInt(100000000) ownerAddr := []byte("12345678901234567890123456789010") - _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, localEgldBalance) // create an address with ESDT token relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789012") - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, esdtBalance) - _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, localEsdtBalance) + _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, localEgldBalance) // deploy 2 contracts ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) diff --git a/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go b/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go index e0657cada1a..dd82f276e27 100644 --- a/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go +++ b/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -163,22 +162,19 @@ func TestRelayedBuildInFunctionChangeOwnerCallInsufficientGasLimitShouldConsumeG testRelayedBuildInFunctionChangeOwnerCallInsufficientGasLimitShouldConsumeGas(t, config.EnableEpochs{ RelayedNonceFixEnableEpoch: 1000, - }, - 2) + }) }) t.Run("nonce fix is enabled, should still increase the sender's nonce", func(t *testing.T) { testRelayedBuildInFunctionChangeOwnerCallInsufficientGasLimitShouldConsumeGas(t, config.EnableEpochs{ RelayedNonceFixEnableEpoch: 0, - }, - 2) + }) }) } func testRelayedBuildInFunctionChangeOwnerCallInsufficientGasLimitShouldConsumeGas( t *testing.T, enableEpochs config.EnableEpochs, - expectedOwnerNonce uint64, ) { testContext, err := vm.CreatePreparedTxProcessorWithVMs(enableEpochs) require.Nil(t, err) diff --git a/integrationTests/vm/txsFee/relayedDns_test.go b/integrationTests/vm/txsFee/relayedDns_test.go index 761c566f5a0..e71c02622f1 100644 --- a/integrationTests/vm/txsFee/relayedDns_test.go +++ b/integrationTests/vm/txsFee/relayedDns_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/relayedESDT_test.go b/integrationTests/vm/txsFee/relayedESDT_test.go index 96b4ad6ce14..eba6eedb384 100644 --- a/integrationTests/vm/txsFee/relayedESDT_test.go +++ b/integrationTests/vm/txsFee/relayedESDT_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -27,9 +26,9 @@ func TestRelayedESDTTransferShouldWork(t *testing.T) { rcvAddr := []byte("12345678901234567890123456789022") relayerBalance := big.NewInt(10000000) - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, esdtBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, localEsdtBalance) _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, relayerBalance) gasLimit := uint64(40) @@ -72,9 +71,9 @@ func TestTestRelayedESTTransferNotEnoughESTValueShouldConsumeGas(t *testing.T) { rcvAddr := []byte("12345678901234567890123456789022") relayerBalance := big.NewInt(10000000) - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, esdtBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, localEsdtBalance) _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, relayerBalance) gasLimit := uint64(40) diff --git a/integrationTests/vm/txsFee/relayedScCalls_test.go b/integrationTests/vm/txsFee/relayedScCalls_test.go index 414e165c202..d5e0e46179e 100644 --- a/integrationTests/vm/txsFee/relayedScCalls_test.go +++ b/integrationTests/vm/txsFee/relayedScCalls_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -266,7 +265,6 @@ func testRelayedDeployInvalidContractShouldIncrementNonceOnSender( require.Nil(t, err) relayerAddr := []byte("12345678901234567890123456789033") - gasPrice := uint64(10) gasLimit := uint64(20) _, _ = vm.CreateAccount(testContext.Accounts, senderAddr, 0, big.NewInt(0)) diff --git a/integrationTests/vm/txsFee/relayedScDeploy_test.go b/integrationTests/vm/txsFee/relayedScDeploy_test.go index e31ec9c5386..a1c8601ea07 100644 --- a/integrationTests/vm/txsFee/relayedScDeploy_test.go +++ b/integrationTests/vm/txsFee/relayedScDeploy_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/scCalls_test.go b/integrationTests/vm/txsFee/scCalls_test.go index ab8cba5cad5..db01a33cd11 100644 --- a/integrationTests/vm/txsFee/scCalls_test.go +++ b/integrationTests/vm/txsFee/scCalls_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -30,7 +29,7 @@ import ( logger "github.com/multiversx/mx-chain-logger-go" vmcommon "github.com/multiversx/mx-chain-vm-common-go" wasmConfig "github.com/multiversx/mx-chain-vm-go/config" - vmhost "github.com/multiversx/mx-chain-vm-go/vmhost" + "github.com/multiversx/mx-chain-vm-go/vmhost" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -326,9 +325,9 @@ func TestESDTScCallAndGasChangeShouldWork(t *testing.T) { senderBalance = big.NewInt(10000000) gasLimit = uint64(30000) - esdtBalance := big.NewInt(100000000) + localEsdtBalance := big.NewInt(100000000) token := []byte("miiutoken") - utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, senderBalance, token, 0, esdtBalance) + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, senderBalance, token, 0, localEsdtBalance) txData := txDataBuilder.NewBuilder() valueToSendToSc := int64(1000) diff --git a/integrationTests/vm/txsFee/scDeploy_test.go b/integrationTests/vm/txsFee/scDeploy_test.go index 2f608b8cf86..29e6e431a5e 100644 --- a/integrationTests/vm/txsFee/scDeploy_test.go +++ b/integrationTests/vm/txsFee/scDeploy_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/txsFee/utils/utils.go b/integrationTests/vm/txsFee/utils/utils.go index 6e067ab378c..40f91cbe1c9 100644 --- a/integrationTests/vm/txsFee/utils/utils.go +++ b/integrationTests/vm/txsFee/utils/utils.go @@ -5,8 +5,8 @@ import ( "crypto/rand" "encoding/hex" "fmt" - "io/ioutil" "math/big" + "os" "path/filepath" "strings" "testing" @@ -420,15 +420,15 @@ func GenerateUserNameForDNSContract(contractAddress []byte) []byte { // Before applying the data it does a cleanup on the old state // the data from the file must be in the following format: // -//hex(key1),hex(value1) -//hex(key2),hex(value2) -//... +// hex(key1),hex(value1) +// hex(key2),hex(value2) +// ... // // Example: -//61750100,0000 -//61750101,0001 +// 61750100,0000 +// 61750101,0001 func OverwriteAccountStorageWithHexFileContent(tb testing.TB, testContext *vm.VMTestContext, address []byte, pathToData string) { - allData, err := ioutil.ReadFile(filepath.Clean(pathToData)) + allData, err := os.ReadFile(filepath.Clean(pathToData)) require.Nil(tb, err) account, err := testContext.Accounts.GetExistingAccount(address) diff --git a/integrationTests/vm/wasm/badcontracts/badcontracts_test.go b/integrationTests/vm/wasm/badcontracts/badcontracts_test.go index 3c0de5a2662..cc23caf1174 100644 --- a/integrationTests/vm/wasm/badcontracts/badcontracts_test.go +++ b/integrationTests/vm/wasm/badcontracts/badcontracts_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package badcontracts diff --git a/integrationTests/vm/wasm/delegation/delegationSimulation_test.go b/integrationTests/vm/wasm/delegation/delegationSimulation_test.go index 1b7a3b56909..be67b8d32b1 100644 --- a/integrationTests/vm/wasm/delegation/delegationSimulation_test.go +++ b/integrationTests/vm/wasm/delegation/delegationSimulation_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package delegation diff --git a/integrationTests/vm/wasm/delegation/delegation_test.go b/integrationTests/vm/wasm/delegation/delegation_test.go index e58e7332bab..a60d1fe7ecb 100644 --- a/integrationTests/vm/wasm/delegation/delegation_test.go +++ b/integrationTests/vm/wasm/delegation/delegation_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package delegation diff --git a/integrationTests/vm/wasm/delegation/testRunner.go b/integrationTests/vm/wasm/delegation/testRunner.go index 00833c38de8..3e476970ca7 100644 --- a/integrationTests/vm/wasm/delegation/testRunner.go +++ b/integrationTests/vm/wasm/delegation/testRunner.go @@ -4,8 +4,8 @@ import ( "crypto/rand" "encoding/hex" "fmt" - "io/ioutil" "math/big" + "os" "sync" "time" @@ -59,7 +59,7 @@ func RunDelegationStressTest( return nil, err } - tempDir, err := ioutil.TempDir("", "integrationTest") + tempDir, err := os.MkdirTemp("", "integrationTest") if err != nil { return nil, err } @@ -218,7 +218,7 @@ func deployDelegationSC(node *integrationTests.TestProcessorNode, delegationFile blocksBeforeUnBond := 60 value := big.NewInt(10) - contractBytes, err := ioutil.ReadFile(delegationFilename) + contractBytes, err := os.ReadFile(delegationFilename) if err != nil { return err } diff --git a/integrationTests/vm/wasm/erc20/erc20_test.go b/integrationTests/vm/wasm/erc20/erc20_test.go index 321850fd9bc..7eed879eb50 100644 --- a/integrationTests/vm/wasm/erc20/erc20_test.go +++ b/integrationTests/vm/wasm/erc20/erc20_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package erc20 diff --git a/integrationTests/vm/wasm/upgrades/upgrades_test.go b/integrationTests/vm/wasm/upgrades/upgrades_test.go index 26ced0d1963..34389067f00 100644 --- a/integrationTests/vm/wasm/upgrades/upgrades_test.go +++ b/integrationTests/vm/wasm/upgrades/upgrades_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/wasm/utils.go b/integrationTests/vm/wasm/utils.go index 2ece91d203c..e58d3e25c7b 100644 --- a/integrationTests/vm/wasm/utils.go +++ b/integrationTests/vm/wasm/utils.go @@ -5,9 +5,9 @@ import ( "encoding/hex" "errors" "fmt" - "io/ioutil" "math" "math/big" + "os" "path/filepath" "strconv" "strings" @@ -616,7 +616,7 @@ func (context *TestContext) UpgradeSC(wasmPath string, parametersString string) // GetSCCode - func GetSCCode(fileName string) string { - code, err := ioutil.ReadFile(filepath.Clean(fileName)) + code, err := os.ReadFile(filepath.Clean(fileName)) if err != nil { panic("Could not get SC code.") } diff --git a/integrationTests/vm/wasm/wasmer/wasmer_test.go b/integrationTests/vm/wasm/wasmer/wasmer_test.go index e1e58f3a8b8..f73bceae6b5 100644 --- a/integrationTests/vm/wasm/wasmer/wasmer_test.go +++ b/integrationTests/vm/wasm/wasmer/wasmer_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/wasm/wasmvm/executeViaBlockchainhook_test.go b/integrationTests/vm/wasm/wasmvm/executeViaBlockchainhook_test.go index f45d201b604..e36c4bb744d 100644 --- a/integrationTests/vm/wasm/wasmvm/executeViaBlockchainhook_test.go +++ b/integrationTests/vm/wasm/wasmvm/executeViaBlockchainhook_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race package wasmvm diff --git a/integrationTests/vm/wasm/wasmvm/gasSchedule_test.go b/integrationTests/vm/wasm/wasmvm/gasSchedule_test.go index e45f47826cb..496a31c0c06 100644 --- a/integrationTests/vm/wasm/wasmvm/gasSchedule_test.go +++ b/integrationTests/vm/wasm/wasmvm/gasSchedule_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/integrationTests/vm/wasm/wasmvm/versionswitch/vm_test.go b/integrationTests/vm/wasm/wasmvm/versionswitch/vm_test.go index faf0eff7314..45565934c77 100644 --- a/integrationTests/vm/wasm/wasmvm/versionswitch/vm_test.go +++ b/integrationTests/vm/wasm/wasmvm/versionswitch/vm_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -12,7 +11,7 @@ import ( "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" - wasmvm "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm/wasmvm" + "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm/wasmvm" "github.com/stretchr/testify/require" ) diff --git a/integrationTests/vm/wasm/wasmvm/versionswitch_revert/vm_test.go b/integrationTests/vm/wasm/wasmvm/versionswitch_revert/vm_test.go index c025292450c..dac92a24a75 100644 --- a/integrationTests/vm/wasm/wasmvm/versionswitch_revert/vm_test.go +++ b/integrationTests/vm/wasm/wasmvm/versionswitch_revert/vm_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -12,7 +11,7 @@ import ( "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" - wasmvm "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm/wasmvm" + "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm/wasmvm" "github.com/stretchr/testify/require" ) diff --git a/integrationTests/vm/wasm/wasmvm/versionswitch_vmquery/vm_test.go b/integrationTests/vm/wasm/wasmvm/versionswitch_vmquery/vm_test.go index feb39b1c93d..4af3688e4fa 100644 --- a/integrationTests/vm/wasm/wasmvm/versionswitch_vmquery/vm_test.go +++ b/integrationTests/vm/wasm/wasmvm/versionswitch_vmquery/vm_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix @@ -12,7 +11,7 @@ import ( "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" - wasmvm "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm/wasmvm" + "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm/wasmvm" "github.com/stretchr/testify/require" ) diff --git a/integrationTests/vm/wasm/wasmvm/wasmVM_test.go b/integrationTests/vm/wasm/wasmvm/wasmVM_test.go index 9808ded709e..35d26a97f07 100644 --- a/integrationTests/vm/wasm/wasmvm/wasmVM_test.go +++ b/integrationTests/vm/wasm/wasmvm/wasmVM_test.go @@ -1,5 +1,4 @@ //go:build !race -// +build !race // TODO remove build condition above to allow -race -short, after Wasm VM fix diff --git a/node/nodeMemoryConfig_test.go b/node/nodeMemoryConfig_test.go index 56e7c08fc38..cbb5ebd0842 100644 --- a/node/nodeMemoryConfig_test.go +++ b/node/nodeMemoryConfig_test.go @@ -1,7 +1,7 @@ package node import ( - "io/ioutil" + "os" "testing" "github.com/multiversx/mx-chain-core-go/core" @@ -13,7 +13,7 @@ import ( func TestMemoryConfig(t *testing.T) { nodeConfig := config.Config{} - tomlBytes, err := ioutil.ReadFile("../cmd/node/config/config.toml") + tomlBytes, err := os.ReadFile("../cmd/node/config/config.toml") require.Nil(t, err) err = toml.Unmarshal(tomlBytes, &nodeConfig) require.Nil(t, err) diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go index 231dfc96c73..6e3c61a12cd 100644 --- a/node/nodeRunner_test.go +++ b/node/nodeRunner_test.go @@ -1,10 +1,8 @@ //go:build !race -// +build !race package node import ( - "io/ioutil" "os" "path" "syscall" @@ -96,17 +94,17 @@ func TestCopyDirectory(t *testing.T) { // +- dir2 // +- file4 - err := ioutil.WriteFile(path.Join(tempDir, file1Name), file1Contents, os.ModePerm) + err := os.WriteFile(path.Join(tempDir, file1Name), file1Contents, os.ModePerm) require.Nil(t, err) err = os.MkdirAll(path.Join(tempDir, "src", "dir1"), os.ModePerm) require.Nil(t, err) err = os.MkdirAll(path.Join(tempDir, "src", "dir2"), os.ModePerm) require.Nil(t, err) - err = ioutil.WriteFile(path.Join(tempDir, "src", file2Name), file2Contents, os.ModePerm) + err = os.WriteFile(path.Join(tempDir, "src", file2Name), file2Contents, os.ModePerm) require.Nil(t, err) - err = ioutil.WriteFile(path.Join(tempDir, "src", "dir1", file3Name), file3Contents, os.ModePerm) + err = os.WriteFile(path.Join(tempDir, "src", "dir1", file3Name), file3Contents, os.ModePerm) require.Nil(t, err) - err = ioutil.WriteFile(path.Join(tempDir, "src", "dir2", file4Name), file4Contents, os.ModePerm) + err = os.WriteFile(path.Join(tempDir, "src", "dir2", file4Name), file4Contents, os.ModePerm) require.Nil(t, err) err = copyDirectory(path.Join(tempDir, "src"), path.Join(tempDir, "dst")) @@ -114,19 +112,19 @@ func TestCopyDirectory(t *testing.T) { copySingleFile(path.Join(tempDir, "dst"), path.Join(tempDir, file1Name)) // after copy, check that the files are the same - buff, err := ioutil.ReadFile(path.Join(tempDir, "dst", file1Name)) + buff, err := os.ReadFile(path.Join(tempDir, "dst", file1Name)) require.Nil(t, err) assert.Equal(t, file1Contents, buff) - buff, err = ioutil.ReadFile(path.Join(tempDir, "dst", file2Name)) + buff, err = os.ReadFile(path.Join(tempDir, "dst", file2Name)) require.Nil(t, err) assert.Equal(t, file2Contents, buff) - buff, err = ioutil.ReadFile(path.Join(tempDir, "dst", "dir1", file3Name)) + buff, err = os.ReadFile(path.Join(tempDir, "dst", "dir1", file3Name)) require.Nil(t, err) assert.Equal(t, file3Contents, buff) - buff, err = ioutil.ReadFile(path.Join(tempDir, "dst", "dir2", file4Name)) + buff, err = os.ReadFile(path.Join(tempDir, "dst", "dir2", file4Name)) require.Nil(t, err) assert.Equal(t, file4Contents, buff) } diff --git a/outport/notifier/httpClientWrapper.go b/outport/notifier/httpClientWrapper.go index 6fc38bd2841..af0d3609d0d 100644 --- a/outport/notifier/httpClientWrapper.go +++ b/outport/notifier/httpClientWrapper.go @@ -4,7 +4,7 @@ import ( "bytes" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "time" ) @@ -94,7 +94,7 @@ func (h *httpClientWrapper) Post( } }() - resBody, err := ioutil.ReadAll(resp.Body) + resBody, err := io.ReadAll(resp.Body) if err != nil { return err } diff --git a/storage/factory/dbConfigHandler.go b/storage/factory/dbConfigHandler.go index a2e2797f3a6..5dc426ad441 100644 --- a/storage/factory/dbConfigHandler.go +++ b/storage/factory/dbConfigHandler.go @@ -1,7 +1,6 @@ package factory import ( - "io/ioutil" "os" "path/filepath" @@ -122,7 +121,7 @@ func checkIfDirExists(path string) (bool, error) { } func checkIfDirIsEmpty(path string) bool { - files, err := ioutil.ReadDir(path) + files, err := os.ReadDir(path) if err != nil { log.Trace("getDBConfig: failed to check if dir is empty", "path", path, "error", err.Error()) return true diff --git a/testscommon/dataRetriever/poolFactory.go b/testscommon/dataRetriever/poolFactory.go index d4d0ed59fc8..1597ef02074 100644 --- a/testscommon/dataRetriever/poolFactory.go +++ b/testscommon/dataRetriever/poolFactory.go @@ -2,7 +2,7 @@ package dataRetriever import ( "fmt" - "io/ioutil" + "os" "time" "github.com/multiversx/mx-chain-core-go/marshal" @@ -87,7 +87,7 @@ func CreatePoolsHolder(numShards uint32, selfShard uint32) dataRetriever.PoolsHo cacher, err := cache.NewCapacityLRU(10, 10000) panicIfError("Create trieSync cacher", err) - tempDir, _ := ioutil.TempDir("", "integrationTests") + tempDir, _ := os.MkdirTemp("", "integrationTests") cfg := storageunit.ArgDB{ Path: tempDir, DBType: storageunit.LvlDBSerial, diff --git a/testscommon/goroutines/counter_test.go b/testscommon/goroutines/counter_test.go index 3af8d63cf8b..2a5978051c4 100644 --- a/testscommon/goroutines/counter_test.go +++ b/testscommon/goroutines/counter_test.go @@ -1,7 +1,7 @@ package goroutines import ( - "io/ioutil" + "os" "testing" "github.com/stretchr/testify/assert" @@ -12,7 +12,7 @@ func TestGoRoutines_SnapshotAll(t *testing.T) { t.Parallel() handler := func() string { - buffFile1, err := ioutil.ReadFile("testdata/test1.data") + buffFile1, err := os.ReadFile("testdata/test1.data") require.Nil(t, err) return string(buffFile1) @@ -35,7 +35,7 @@ func TestGoRoutines_SnapshotAllDifferentFiles(t *testing.T) { filename := "testdata/test2.data" handler := func() string { - buffFile, err := ioutil.ReadFile(filename) + buffFile, err := os.ReadFile(filename) require.Nil(t, err) return string(buffFile) @@ -68,7 +68,7 @@ func TestGoRoutines_Reset(t *testing.T) { filename := "testdata/test2.data" handler := func() string { - buffFile, err := ioutil.ReadFile(filename) + buffFile, err := os.ReadFile(filename) require.Nil(t, err) return string(buffFile) diff --git a/testscommon/goroutines/snapshot_test.go b/testscommon/goroutines/snapshot_test.go index e938a493d40..eda264c3e58 100644 --- a/testscommon/goroutines/snapshot_test.go +++ b/testscommon/goroutines/snapshot_test.go @@ -1,7 +1,7 @@ package goroutines import ( - "io/ioutil" + "os" "testing" "github.com/stretchr/testify/assert" @@ -11,7 +11,7 @@ import ( func TestNewSnapshot(t *testing.T) { t.Parallel() - buff, err := ioutil.ReadFile("testdata/test1.data") + buff, err := os.ReadFile("testdata/test1.data") require.Nil(t, err) s, err := newSnapshot(string(buff), AllPassFilter) assert.Nil(t, err) @@ -21,7 +21,7 @@ func TestNewSnapshot(t *testing.T) { func TestNewSnapshot_WithFilter(t *testing.T) { t.Parallel() - buff, err := ioutil.ReadFile("testdata/test1.data") + buff, err := os.ReadFile("testdata/test1.data") require.Nil(t, err) s, err := newSnapshot(string(buff), TestsRelevantGoRoutines) assert.Nil(t, err) @@ -31,12 +31,12 @@ func TestNewSnapshot_WithFilter(t *testing.T) { func TestSnapshot_Diff(t *testing.T) { t.Parallel() - buffFile2, err := ioutil.ReadFile("testdata/test2.data") + buffFile2, err := os.ReadFile("testdata/test2.data") require.Nil(t, err) snapshot2, err := newSnapshot(string(buffFile2), AllPassFilter) require.Nil(t, err) - buffFile3, err := ioutil.ReadFile("testdata/test3.data") + buffFile3, err := os.ReadFile("testdata/test3.data") require.Nil(t, err) snapshot3, err := newSnapshot(string(buffFile3), AllPassFilter) require.Nil(t, err) diff --git a/testscommon/realConfigsHandling.go b/testscommon/realConfigsHandling.go index c69f5471b30..2008710c4af 100644 --- a/testscommon/realConfigsHandling.go +++ b/testscommon/realConfigsHandling.go @@ -1,7 +1,7 @@ package testscommon import ( - "io/ioutil" + "os" "os/exec" "path" "strings" @@ -96,7 +96,7 @@ func CreateTestConfigs(tb testing.TB, originalConfigsPath string) *config.Config } func correctTestPathInGenesisSmartContracts(tb testing.TB, tempDir string, newGenesisSmartContractsFilename string) { - input, err := ioutil.ReadFile(newGenesisSmartContractsFilename) + input, err := os.ReadFile(newGenesisSmartContractsFilename) require.Nil(tb, err) lines := strings.Split(string(input), "\n") @@ -106,6 +106,6 @@ func correctTestPathInGenesisSmartContracts(tb testing.TB, tempDir string, newGe } } output := strings.Join(lines, "\n") - err = ioutil.WriteFile(newGenesisSmartContractsFilename, []byte(output), 0644) + err = os.WriteFile(newGenesisSmartContractsFilename, []byte(output), 0644) require.Nil(tb, err) } diff --git a/update/genesis/export.go b/update/genesis/export.go index 06bc16dc8a0..0f5c469afc9 100644 --- a/update/genesis/export.go +++ b/update/genesis/export.go @@ -4,7 +4,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "os" "path/filepath" "sort" "strings" @@ -492,7 +492,7 @@ func (se *stateExport) exportNodesSetupJson(validators map[uint32][]*state.Valid return err } - return ioutil.WriteFile(filepath.Join(se.exportFolder, common.NodesSetupJsonFileName), nodesSetupBytes, 0664) + return os.WriteFile(filepath.Join(se.exportFolder, common.NodesSetupJsonFileName), nodesSetupBytes, 0664) } // IsInterfaceNil returns true if underlying object is nil diff --git a/update/genesis/export_test.go b/update/genesis/export_test.go index 8b2c3a17d40..f1fca206504 100644 --- a/update/genesis/export_test.go +++ b/update/genesis/export_test.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "errors" - "io/ioutil" "math/big" "os" "path/filepath" @@ -405,7 +404,7 @@ func TestStateExport_ExportNodesSetupJsonShouldExportKeysInAlphabeticalOrder(t * var nodesSetup sharding.NodesSetup - nsBytes, err := ioutil.ReadFile(filepath.Join(testFolderName, common.NodesSetupJsonFileName)) + nsBytes, err := os.ReadFile(filepath.Join(testFolderName, common.NodesSetupJsonFileName)) require.NoError(t, err) err = json.Unmarshal(nsBytes, &nodesSetup) diff --git a/update/trigger/importStartHandler.go b/update/trigger/importStartHandler.go index c1b8f6e5b76..b1300c46207 100644 --- a/update/trigger/importStartHandler.go +++ b/update/trigger/importStartHandler.go @@ -1,7 +1,6 @@ package trigger import ( - "io/ioutil" "os" "path/filepath" "strings" @@ -49,7 +48,7 @@ func (ish *importStartHandler) loadFileStatus() (string, bool) { return "", false } - contents, err := ioutil.ReadFile(ish.getFilename()) + contents, err := os.ReadFile(ish.getFilename()) if err != nil { log.Error("error reading must import file", "file", ish.getFilename(), From ebf91b5726a3d0d7dc22fe2b85742e2192be28c9 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 30 Aug 2023 16:16:15 +0300 Subject: [PATCH 116/120] - more fixes --- .../vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go | 2 +- integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go index ed85466886c..e5abb053058 100644 --- a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go +++ b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_MockContracts_test.go @@ -44,5 +44,5 @@ func TestESDTLocalMintAndBurnFromSC_MockContracts(t *testing.T) { LocalBurnMock), ) - ESDTLocalMintAndBurnFromSC_RunTestsAndAsserts(t, net.Nodes, ownerWallet, scAddress, net.Proposers, nonce, round) + esdtLocalMintAndBurnFromSCRunTestsAndAsserts(t, net.Nodes, ownerWallet, scAddress, net.Proposers, nonce, round) } diff --git a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go index 9f2c96a3199..c5e9da76d9b 100644 --- a/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go +++ b/integrationTests/vm/esdt/localFuncs/esdtLocalFunsSC_test.go @@ -37,10 +37,10 @@ func TestESDTLocalMintAndBurnFromSC(t *testing.T) { scAddress := esdtCommon.DeployNonPayableSmartContract(t, nodes, idxProposers, &nonce, &round, "../testdata/local-esdt-and-nft.wasm") - ESDTLocalMintAndBurnFromSC_RunTestsAndAsserts(t, nodes, nodes[0].OwnAccount, scAddress, idxProposers, nonce, round) + esdtLocalMintAndBurnFromSCRunTestsAndAsserts(t, nodes, nodes[0].OwnAccount, scAddress, idxProposers, nonce, round) } -func ESDTLocalMintAndBurnFromSC_RunTestsAndAsserts( +func esdtLocalMintAndBurnFromSCRunTestsAndAsserts( t *testing.T, nodes []*integrationTests.TestProcessorNode, ownerWallet *integrationTests.TestWalletAccount, From e055c6b6d9b074eb2fadecb286eb37fb47db7d1a Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Thu, 31 Aug 2023 15:13:40 +0300 Subject: [PATCH 117/120] add also invalid transactions --- outport/process/outportDataProvider.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index fe9405db904..6f7280a9910 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -231,6 +231,9 @@ func (odp *outportDataProvider) setExecutionOrderInTransactionPool( for scrHash, scrInfo := range pool.SmartContractResults { txGroups[scrHash] = scrInfo } + for invalidTxHash, invalidTxInfo := range pool.InvalidTxs { + txGroups[invalidTxHash] = invalidTxInfo + } if odp.shardID != core.MetachainShardId { for txHash, rewardInfo := range pool.Rewards { From 1fd13a36c78127646f3de4a5f72e8d915bd3d2d5 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 1 Sep 2023 12:28:58 +0300 Subject: [PATCH 118/120] release of mx-chain-vm-go --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index b7760e566f4..4381aeb88e3 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( github.com/multiversx/mx-chain-scenario-go v1.2.1 github.com/multiversx/mx-chain-storage-go v1.0.12 github.com/multiversx/mx-chain-vm-common-go v1.5.5 - github.com/multiversx/mx-chain-vm-go v1.5.8-0.20230830073619-69e712b5198b + github.com/multiversx/mx-chain-vm-go v1.5.8 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.88 diff --git a/go.sum b/go.sum index 1a0f55b5bea..c70f1c9463f 100644 --- a/go.sum +++ b/go.sum @@ -392,8 +392,8 @@ github.com/multiversx/mx-chain-storage-go v1.0.12 h1:FrkgHPV38BO8cwdK0GUYHxVkUyO github.com/multiversx/mx-chain-storage-go v1.0.12/go.mod h1:/8VrMbO9CbIi0Ym3F1QPY6EENGcUq5DpEBPDt4evn9Q= github.com/multiversx/mx-chain-vm-common-go v1.5.5 h1:NoG73lvcHSeUcoFlYybG8ceGuJ6KptD3QJjUNEnGDVk= github.com/multiversx/mx-chain-vm-common-go v1.5.5/go.mod h1:sqkKMCnwkWl8DURdb9q7pctK8IANghdHY1KJLE0ox2c= -github.com/multiversx/mx-chain-vm-go v1.5.8-0.20230830073619-69e712b5198b h1:kUhI0p1SyS1QFgXjMeAP8cO9DFWPsu3DURyT2lsMOGs= -github.com/multiversx/mx-chain-vm-go v1.5.8-0.20230830073619-69e712b5198b/go.mod h1:F5OoQjCuYNr1hYWvwZKCcWYQir3+r2QVBxQux/eo0Ak= +github.com/multiversx/mx-chain-vm-go v1.5.8 h1:PRC+pDPHUN0i6Qu2Un9Sy9MLIUt4ZRdLz6wEHvMGnNA= +github.com/multiversx/mx-chain-vm-go v1.5.8/go.mod h1:F5OoQjCuYNr1hYWvwZKCcWYQir3+r2QVBxQux/eo0Ak= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61 h1:7c3VRhr5JDu7qs3AkmKQu7DzWGGIoiHfSIMrzw3x5Ao= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.61/go.mod h1:bQFh+KuUIEBmCfKJ0qVN2+DbRRbAqW0huKfHpiTbyEE= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.62 h1:rQaWRbrQwrEhSN0ZEQQ0JAbttgi+OrMf/CLziWpRUCA= From edb041953051e9e82027be66f5cea3facf6a048c Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 1 Sep 2023 13:17:38 +0300 Subject: [PATCH 119/120] fix after review --- ...async_mock_contracts_test.go => asyncMockContracts_test.go} | 0 .../vm/wasm/wasmvm/{mock_contracts.go => mockContracts.go} | 3 +++ 2 files changed, 3 insertions(+) rename integrationTests/vm/wasm/wasmvm/{async_mock_contracts_test.go => asyncMockContracts_test.go} (100%) rename integrationTests/vm/wasm/wasmvm/{mock_contracts.go => mockContracts.go} (98%) diff --git a/integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go b/integrationTests/vm/wasm/wasmvm/asyncMockContracts_test.go similarity index 100% rename from integrationTests/vm/wasm/wasmvm/async_mock_contracts_test.go rename to integrationTests/vm/wasm/wasmvm/asyncMockContracts_test.go diff --git a/integrationTests/vm/wasm/wasmvm/mock_contracts.go b/integrationTests/vm/wasm/wasmvm/mockContracts.go similarity index 98% rename from integrationTests/vm/wasm/wasmvm/mock_contracts.go rename to integrationTests/vm/wasm/wasmvm/mockContracts.go index 9de48ec1b23..6e84bea94e0 100644 --- a/integrationTests/vm/wasm/wasmvm/mock_contracts.go +++ b/integrationTests/vm/wasm/wasmvm/mockContracts.go @@ -30,7 +30,10 @@ var MockInitialBalance = big.NewInt(10_000_000) // WalletAddressPrefix is the prefix of any smart contract address used for testing. var WalletAddressPrefix = []byte("..........") +// InitialEsdt is the initial amount minted for esdt var InitialEsdt = uint64(100) + +// EsdtTokenIdentifier is the token identifier in tests var EsdtTokenIdentifier = []byte("TTT-010101") // InitializeMockContracts - From 4f17a5bc2e4f5eda6361c65e51bef5107cd5c794 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 1 Sep 2023 13:56:10 +0300 Subject: [PATCH 120/120] remove logs and prints --- outport/process/outportDataProvider.go | 40 ------------------- .../block/postprocess/intermediateResults.go | 2 - .../block/preprocess/rewardTxPreProcessor.go | 4 -- process/block/preprocess/transactions.go | 2 - process/common.go | 3 -- 5 files changed, 51 deletions(-) diff --git a/outport/process/outportDataProvider.go b/outport/process/outportDataProvider.go index 6f7280a9910..c74e2ed164f 100644 --- a/outport/process/outportDataProvider.go +++ b/outport/process/outportDataProvider.go @@ -117,8 +117,6 @@ func (odp *outportDataProvider) PrepareOutportSaveBlockData(arg ArgPrepareOutpor log.Warn("PrepareOutportSaveBlockData - checkTxOrder", "error", err.Error()) } - printPool(pool) - alteredAccounts, err := odp.alteredAccountsProvider.ExtractAlteredAccountsFromPool(pool, shared.AlteredAccountsOptions{ WithAdditionalOutportData: true, }) @@ -536,41 +534,3 @@ func (odp *outportDataProvider) filterOutDuplicatedMiniBlocks(miniBlocksFromBody return filteredMiniBlocks, nil } - -// TODO remove after system test -func printPool(pool *outportcore.TransactionPool) { - total := len(pool.Transactions) + len(pool.InvalidTxs) + len(pool.SmartContractResults) + len(pool.Rewards) - if total > 0 { - log.Warn("###################################") - } - - if len(pool.Transactions) > 0 { - log.Warn("############### NORMAL TXS ####################") - for hash, tx := range pool.Transactions { - log.Warn(hash, "order", tx.GetExecutionOrder()) - } - } - if len(pool.InvalidTxs) > 0 { - log.Warn("############### INVALID ####################") - for hash, tx := range pool.InvalidTxs { - log.Warn(hash, "order", tx.GetExecutionOrder()) - } - } - - if len(pool.SmartContractResults) > 0 { - log.Warn("############### SCRS ####################") - for hash, tx := range pool.SmartContractResults { - log.Warn(hash, "order", tx.GetExecutionOrder()) - } - } - - if len(pool.Rewards) > 0 { - log.Warn("############### REWARDS ####################") - for hash, tx := range pool.Rewards { - log.Warn(hash, "order", tx.GetExecutionOrder()) - } - } - if total > 0 { - log.Warn("###################################") - } -} diff --git a/process/block/postprocess/intermediateResults.go b/process/block/postprocess/intermediateResults.go index 61a2e602f2c..6b9020ca29d 100644 --- a/process/block/postprocess/intermediateResults.go +++ b/process/block/postprocess/intermediateResults.go @@ -262,8 +262,6 @@ func (irp *intermediateResultsProcessor) AddIntermediateTransactions(txs []data. sndShId, dstShId := irp.getShardIdsFromAddresses(addScr.SndAddr, addScr.RcvAddr) - // TODO remove this after system test - log.Warn("executing transaction", "txHash", scrHash) irp.executionOrderHandler.Add(scrHash) irp.addIntermediateTxToResultsForBlock(addScr, scrHash, sndShId, dstShId) } diff --git a/process/block/preprocess/rewardTxPreProcessor.go b/process/block/preprocess/rewardTxPreProcessor.go index 94ecf476e80..d80d8ffbb4c 100644 --- a/process/block/preprocess/rewardTxPreProcessor.go +++ b/process/block/preprocess/rewardTxPreProcessor.go @@ -276,8 +276,6 @@ func (rtp *rewardTxPreprocessor) ProcessBlockTransactions( return err } - // TODO remove this after system test - log.Warn("executing transaction", "txHash", txHash) rtp.txExecutionOrderHandler.Add(txHash) err = rtp.rewardsProcessor.ProcessRewardTransaction(rTx) if err != nil { @@ -510,8 +508,6 @@ func (rtp *rewardTxPreprocessor) ProcessMiniBlock( snapshot := rtp.handleProcessTransactionInit(preProcessorExecutionInfoHandler, miniBlockTxHashes[txIndex]) - // TODO remove this after system test - log.Warn("executing transaction", "txHash", miniBlockTxHashes[txIndex]) rtp.txExecutionOrderHandler.Add(miniBlockTxHashes[txIndex]) err = rtp.rewardsProcessor.ProcessRewardTransaction(miniBlockRewardTxs[txIndex]) if err != nil { diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index e6e390a0d6c..120de22ff4a 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -893,8 +893,6 @@ func (txs *transactions) processAndRemoveBadTransaction( if err != nil && !errors.Is(err, process.ErrFailedTransaction) { txs.txExecutionOrderHandler.Remove(txHash) - // TODO remove warn after system test - log.Warn("already executed", "error", err.Error(), "txhash", txHash) return err } diff --git a/process/common.go b/process/common.go index 19e1df1a0ec..f06e0d00091 100644 --- a/process/common.go +++ b/process/common.go @@ -709,9 +709,6 @@ func DisplayProcessTxDetails( "data", hex.EncodeToString(txHandler.GetData()), "sender", senderAddress, "receiver", receiverAddress) - - // TODO remove after system test - log.Warn("executing transaction", "txHash", txHash) } // IsAllowedToSaveUnderKey returns if saving key-value in data tries under given key is allowed