From 1f7e6be83d0e8598518deea38198b715cc0514fa Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Wed, 29 Mar 2023 16:22:44 +0300 Subject: [PATCH 1/3] fixes txs execution order --- .../transactionsExecutionOrder.go | 20 ++++--- .../transactionsExecutionOrder_test.go | 53 ++++++++++--------- 2 files changed, 39 insertions(+), 34 deletions(-) diff --git a/outport/process/executionOrder/transactionsExecutionOrder.go b/outport/process/executionOrder/transactionsExecutionOrder.go index c60b2af2548..15603a7e2fa 100644 --- a/outport/process/executionOrder/transactionsExecutionOrder.go +++ b/outport/process/executionOrder/transactionsExecutionOrder.go @@ -173,7 +173,7 @@ func (s *sorter) getInvalidTxsExecutedInCurrentBlock(scheduledMbsFromPreviousBlo for _, hash := range mb.TxHashes { _, found := allScheduledTxs[string(hash)] if found { - scheduledExecutedInvalidTxsHashesPrevBlock = append(scheduledExecutedInvalidTxsHashesPrevBlock, string(hash)) + scheduledExecutedInvalidTxsHashesPrevBlock = append(scheduledExecutedInvalidTxsHashesPrevBlock, hex.EncodeToString(hash)) continue } invalidTxHashes = append(invalidTxHashes, hash) @@ -249,9 +249,10 @@ func getRewardsTxsFromMe(pool *outport.TransactionPool, blockBody *block.Body, h func extractTxsFromMap(txsHashes [][]byte, txs map[string]*outport.TxInfo) ([]data.TxWithExecutionOrderHandler, error) { result := make([]data.TxWithExecutionOrderHandler, 0, len(txsHashes)) for _, txHash := range txsHashes { - tx, found := txs[string(txHash)] + txHashHex := hex.EncodeToString(txHash) + tx, found := txs[txHashHex] if !found { - return nil, fmt.Errorf("cannot find transaction in pool, txHash: %s", hex.EncodeToString(txHash)) + return nil, fmt.Errorf("cannot find transaction in pool, txHash: %s", txHashHex) } result = append(result, tx) } @@ -262,9 +263,10 @@ func extractTxsFromMap(txsHashes [][]byte, txs map[string]*outport.TxInfo) ([]da func extractSCRsFromMap(txsHashes [][]byte, scrs map[string]*outport.SCRInfo) ([]data.TxWithExecutionOrderHandler, error) { result := make([]data.TxWithExecutionOrderHandler, 0, len(txsHashes)) for _, txHash := range txsHashes { - scr, found := scrs[string(txHash)] + txHashHex := hex.EncodeToString(txHash) + scr, found := scrs[txHashHex] if !found { - return nil, fmt.Errorf("cannot find scr in pool, txHash: %s", hex.EncodeToString(txHash)) + return nil, fmt.Errorf("cannot find scr in pool, txHash: %s", txHashHex) } result = append(result, scr) } @@ -275,9 +277,10 @@ func extractSCRsFromMap(txsHashes [][]byte, scrs map[string]*outport.SCRInfo) ([ func extractRewardsFromMap(txsHashes [][]byte, rewards map[string]*outport.RewardInfo) ([]data.TxWithExecutionOrderHandler, error) { result := make([]data.TxWithExecutionOrderHandler, 0, len(txsHashes)) for _, txHash := range txsHashes { - reward, found := rewards[string(txHash)] + txHashHex := hex.EncodeToString(txHash) + reward, found := rewards[txHashHex] if !found { - return nil, fmt.Errorf("cannot find reward in pool, txHash: %s", hex.EncodeToString(txHash)) + return nil, fmt.Errorf("cannot find reward in pool, txHash: %s", txHashHex) } result = append(result, reward) } @@ -299,7 +302,8 @@ func extractExecutedTxHashes(mbIndex int, mbTxHashes [][]byte, header data.Heade func extractAndPutScrsToDestinationMap(scrsHashes [][]byte, scrsMap map[string]*outport.SCRInfo, destinationMap map[string]data.TxWithExecutionOrderHandler) { for _, scrHash := range scrsHashes { - scr, found := scrsMap[string(scrHash)] + scrHashHex := hex.EncodeToString(scrHash) + scr, found := scrsMap[scrHashHex] if !found { continue } diff --git a/outport/process/executionOrder/transactionsExecutionOrder_test.go b/outport/process/executionOrder/transactionsExecutionOrder_test.go index 41df8a351b3..b2e09e47da2 100644 --- a/outport/process/executionOrder/transactionsExecutionOrder_test.go +++ b/outport/process/executionOrder/transactionsExecutionOrder_test.go @@ -1,6 +1,7 @@ package executionOrder import ( + "encoding/hex" "testing" "github.com/multiversx/mx-chain-core-go/core" @@ -130,25 +131,25 @@ func TestAddExecutionOrderInTransactionPool(t *testing.T) { pool := &outport.TransactionPool{ Transactions: map[string]*outport.TxInfo{ - string(txHashToMe): {Transaction: &transaction.Transaction{Nonce: 1}}, - string(txHashFromMe): {Transaction: &transaction.Transaction{Nonce: 2}}, + hex.EncodeToString(txHashToMe): {Transaction: &transaction.Transaction{Nonce: 1}}, + hex.EncodeToString(txHashFromMe): {Transaction: &transaction.Transaction{Nonce: 2}}, }, SmartContractResults: map[string]*outport.SCRInfo{ - string(scrHashToMe): {SmartContractResult: &smartContractResult.SmartContractResult{Nonce: 3}}, - string(scrHashFromMe): {SmartContractResult: &smartContractResult.SmartContractResult{ + hex.EncodeToString(scrHashToMe): {SmartContractResult: &smartContractResult.SmartContractResult{Nonce: 3}}, + hex.EncodeToString(scrHashFromMe): {SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 4, OriginalTxHash: txHashToMe, }}, - string(scrHashIntra): {SmartContractResult: &smartContractResult.SmartContractResult{ + hex.EncodeToString(scrHashIntra): {SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 0, OriginalTxHash: txHashToMe, }}, }, Rewards: map[string]*outport.RewardInfo{ - string(rewardTxHash): {Reward: &rewardTx.RewardTx{}}, + hex.EncodeToString(rewardTxHash): {Reward: &rewardTx.RewardTx{}}, }, InvalidTxs: map[string]*outport.TxInfo{ - string(invalidTxHash): {Transaction: &transaction.Transaction{Nonce: 5}}, + hex.EncodeToString(invalidTxHash): {Transaction: &transaction.Transaction{Nonce: 5}}, }, Receipts: map[string]*receipt.Receipt{}, Logs: nil, @@ -159,28 +160,28 @@ func TestAddExecutionOrderInTransactionPool(t *testing.T) { require.Equal(t, &outport.TransactionPool{ Transactions: map[string]*outport.TxInfo{ - string(txHashToMe): { + hex.EncodeToString(txHashToMe): { Transaction: &transaction.Transaction{Nonce: 1}, ExecutionOrder: 0, }, - string(txHashFromMe): { + hex.EncodeToString(txHashFromMe): { Transaction: &transaction.Transaction{Nonce: 2}, ExecutionOrder: 3, }, }, SmartContractResults: map[string]*outport.SCRInfo{ - string(scrHashToMe): { + hex.EncodeToString(scrHashToMe): { SmartContractResult: &smartContractResult.SmartContractResult{Nonce: 3}, ExecutionOrder: 1, }, - string(scrHashFromMe): { + hex.EncodeToString(scrHashFromMe): { SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 4, OriginalTxHash: txHashToMe, }, ExecutionOrder: 0, }, - string(scrHashIntra): { + hex.EncodeToString(scrHashIntra): { SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 0, OriginalTxHash: txHashToMe, @@ -189,13 +190,13 @@ func TestAddExecutionOrderInTransactionPool(t *testing.T) { }, }, Rewards: map[string]*outport.RewardInfo{ - string(rewardTxHash): { + hex.EncodeToString(rewardTxHash): { Reward: &rewardTx.RewardTx{}, ExecutionOrder: 2, }, }, InvalidTxs: map[string]*outport.TxInfo{ - string(invalidTxHash): { + hex.EncodeToString(invalidTxHash): { Transaction: &transaction.Transaction{Nonce: 5}, ExecutionOrder: 4, }, @@ -256,8 +257,8 @@ func TestAddExecutionOrderInTransactionPoolFromMeTransactionAndScheduled(t *test pool := &outport.TransactionPool{ Transactions: map[string]*outport.TxInfo{ - string(firstTxHash): {Transaction: &transaction.Transaction{Nonce: 1}}, - string(secondTxHash): {Transaction: &transaction.Transaction{Nonce: 2}}, + hex.EncodeToString(firstTxHash): {Transaction: &transaction.Transaction{Nonce: 1}}, + hex.EncodeToString(secondTxHash): {Transaction: &transaction.Transaction{Nonce: 2}}, }, } @@ -266,11 +267,11 @@ func TestAddExecutionOrderInTransactionPoolFromMeTransactionAndScheduled(t *test require.Equal(t, &outport.TransactionPool{ Transactions: map[string]*outport.TxInfo{ - string(firstTxHash): { + hex.EncodeToString(firstTxHash): { Transaction: &transaction.Transaction{Nonce: 1}, ExecutionOrder: 0, }, - string(secondTxHash): { + hex.EncodeToString(secondTxHash): { Transaction: &transaction.Transaction{Nonce: 2}, ExecutionOrder: 1, }, @@ -369,13 +370,13 @@ func TestAddExecutionOrderInTransactionPoolFromMeTransactionAndScheduledInvalid( pool := &outport.TransactionPool{ Transactions: map[string]*outport.TxInfo{ - string(secondTxHash): {Transaction: &transaction.Transaction{Nonce: 2}}, + hex.EncodeToString(secondTxHash): {Transaction: &transaction.Transaction{Nonce: 2}}, }, InvalidTxs: map[string]*outport.TxInfo{ - string(firstTxHash): {Transaction: &transaction.Transaction{Nonce: 1}}, + hex.EncodeToString(firstTxHash): {Transaction: &transaction.Transaction{Nonce: 1}}, }, SmartContractResults: map[string]*outport.SCRInfo{ - string(scrHash): {SmartContractResult: &smartContractResult.SmartContractResult{ + hex.EncodeToString(scrHash): {SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 3, OriginalTxHash: scheduledTx, }}, @@ -386,19 +387,19 @@ func TestAddExecutionOrderInTransactionPoolFromMeTransactionAndScheduledInvalid( require.Nil(t, err) require.Equal(t, &outport.TransactionPool{ Transactions: map[string]*outport.TxInfo{ - string(secondTxHash): { + hex.EncodeToString(secondTxHash): { Transaction: &transaction.Transaction{Nonce: 2}, ExecutionOrder: 1, }, }, InvalidTxs: map[string]*outport.TxInfo{ - string(firstTxHash): { + hex.EncodeToString(firstTxHash): { Transaction: &transaction.Transaction{Nonce: 1}, ExecutionOrder: 0, }, }, SmartContractResults: map[string]*outport.SCRInfo{ - string(scrHash): { + hex.EncodeToString(scrHash): { SmartContractResult: &smartContractResult.SmartContractResult{ Nonce: 3, OriginalTxHash: scheduledTx, @@ -408,6 +409,6 @@ func TestAddExecutionOrderInTransactionPoolFromMeTransactionAndScheduledInvalid( }, }, pool) - require.Equal(t, []string{string(scrHash)}, scrsHashes) - require.Equal(t, []string{string(scheduledInvalidTxHash)}, invalidTxsHashes) + require.Equal(t, []string{hex.EncodeToString(scrHash)}, scrsHashes) + require.Equal(t, []string{hex.EncodeToString(scheduledInvalidTxHash)}, invalidTxsHashes) } From fdc540f2adb9129730c581746a3c18e911690c01 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 31 Mar 2023 12:28:48 +0300 Subject: [PATCH 2/3] latest version of indexer and mx-chain-core --- go.mod | 4 +-- go.sum | 8 +++--- outport/notifier/eventNotifier.go | 46 +++++++++++++++++++++++++++---- outport/notifier/interface.go | 10 +++++++ 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 112652627d3..15c251425ee 100644 --- a/go.mod +++ b/go.mod @@ -13,9 +13,9 @@ 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-0.20230322093158-35195fa155c0 + github.com/multiversx/mx-chain-core-go v1.2.1-0.20230329082847-b78e96c3ad5a github.com/multiversx/mx-chain-crypto-go v1.2.5 - github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230322095713-a82089993c0d + github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230331083741-0fd8a2156e96 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.13 github.com/multiversx/mx-chain-storage-go v1.0.7 diff --git a/go.sum b/go.sum index 1f771cf385b..95fc609ad2e 100644 --- a/go.sum +++ b/go.sum @@ -612,12 +612,12 @@ github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7 github.com/multiversx/mx-chain-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.1.31/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.2.0/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.1-0.20230322093158-35195fa155c0 h1:Hr0bAMUJigh5xGFm2qoKKglEtpIXckxCLjCDBUYv1DM= -github.com/multiversx/mx-chain-core-go v1.2.1-0.20230322093158-35195fa155c0/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.2.1-0.20230329082847-b78e96c3ad5a h1:cjPv/NIb4c3oBuBxxc2ggyaMvpmGlo1RO8mmzrkWARM= +github.com/multiversx/mx-chain-core-go v1.2.1-0.20230329082847-b78e96c3ad5a/go.mod h1:/lovncjwo+pXQ7IAERwNzwCifeH7SAWk0DGqjorX2bc= github.com/multiversx/mx-chain-crypto-go v1.2.5 h1:tuq3BUNMhKud5DQbZi9DiVAAHUXypizy8zPH0NpTGZk= github.com/multiversx/mx-chain-crypto-go v1.2.5/go.mod h1:teqhNyWEqfMPgNn8sgWXlgtJ1a36jGCnhs/tRpXW6r4= -github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230322095713-a82089993c0d h1:PDkG7SrzIsyRo5PLI68vlBM85PiQhWHhpafW7VCzhgM= -github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230322095713-a82089993c0d/go.mod h1:iDLxzwUi9CGzzEbFRi4TgYvmhsp21qNj5eqMgT32d2M= +github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230331083741-0fd8a2156e96 h1:okIfLr+NqX04eHNp9k97KuLhpYfLJOjmGZaOia9xcGg= +github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230331083741-0fd8a2156e96/go.mod h1:Y6jgeoMBpDCtm7lurtChhgPyhpQ0GF5OruW/tl/++JI= 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.13 h1:woIlYkDFCKYyJQ5urDcOzz8HUFGsSEhTfUXDDxNI2zM= diff --git a/outport/notifier/eventNotifier.go b/outport/notifier/eventNotifier.go index db5ae102fc4..349164fde3b 100644 --- a/outport/notifier/eventNotifier.go +++ b/outport/notifier/eventNotifier.go @@ -6,7 +6,8 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/core/unmarshal" + "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/marshal" logger "github.com/multiversx/mx-chain-logger-go" @@ -34,8 +35,9 @@ type FinalizedBlock struct { } type eventNotifier struct { - httpClient httpClientHandler - marshalizer marshal.Marshalizer + httpClient httpClientHandler + marshalizer marshal.Marshalizer + blockContainer blockContainerHandler } // ArgsEventNotifier defines the arguments needed for event notifier creation @@ -51,10 +53,15 @@ func NewEventNotifier(args ArgsEventNotifier) (*eventNotifier, error) { if err != nil { return nil, err } + blockContainer, err := createBlockCreatorsContainer() + if err != nil { + return nil, err + } return &eventNotifier{ - httpClient: args.HttpClient, - marshalizer: args.Marshaller, + httpClient: args.HttpClient, + marshalizer: args.Marshaller, + blockContainer: blockContainer, }, nil } @@ -86,7 +93,7 @@ func (en *eventNotifier) SaveBlock(args *outport.OutportBlock) error { // RevertIndexedBlock converts revert data in order to be pushed to subscribers func (en *eventNotifier) RevertIndexedBlock(blockData *outport.BlockData) error { - headerHandler, err := unmarshal.GetHeaderFromBytes(en.marshalizer, core.HeaderType(blockData.HeaderType), blockData.HeaderBytes) + headerHandler, err := en.getHeaderFromBytes(core.HeaderType(blockData.HeaderType), blockData.HeaderBytes) if err != nil { return err } @@ -150,3 +157,30 @@ func (en *eventNotifier) IsInterfaceNil() bool { func (en *eventNotifier) Close() error { return nil } + +func (en *eventNotifier) getHeaderFromBytes(headerType core.HeaderType, headerBytes []byte) (header data.HeaderHandler, err error) { + creator, err := en.blockContainer.Get(headerType) + if err != nil { + return nil, err + } + + return block.GetHeaderFromBytes(en.marshalizer, creator, headerBytes) +} + +func createBlockCreatorsContainer() (blockContainerHandler, error) { + container := block.NewEmptyBlockCreatorsContainer() + err := container.Add(core.ShardHeaderV1, block.NewEmptyHeaderCreator()) + if err != nil { + return nil, err + } + err = container.Add(core.ShardHeaderV2, block.NewEmptyHeaderV2Creator()) + if err != nil { + return nil, err + } + err = container.Add(core.MetaHeader, block.NewEmptyMetaBlockCreator()) + if err != nil { + return nil, err + } + + return container, nil +} diff --git a/outport/notifier/interface.go b/outport/notifier/interface.go index 52bdf53eb52..612ab5988cf 100644 --- a/outport/notifier/interface.go +++ b/outport/notifier/interface.go @@ -1,6 +1,16 @@ package notifier +import ( + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/block" +) + type httpClientHandler interface { Post(route string, payload interface{}) error IsInterfaceNil() bool } + +// BlockContainerHandler defines what a block container should be able to do +type blockContainerHandler interface { + Get(headerType core.HeaderType) (block.EmptyBlockCreator, error) +} From 74dc1e4fc13011157328de0f014f3fd75809ddca Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Fri, 31 Mar 2023 16:40:19 +0300 Subject: [PATCH 3/3] fixes after review --- go.mod | 2 +- go.sum | 3 +- outport/factory/notifierFactory.go | 29 +++++++++++++++++-- outport/notifier/errors.go | 10 ++----- outport/notifier/eventNotifier.go | 34 ++++++----------------- outport/notifier/eventNotifier_test.go | 22 +++++++++++++-- outport/notifier/interface.go | 2 +- testscommon/outport/blockContainerStub.go | 20 +++++++++++++ 8 files changed, 81 insertions(+), 41 deletions(-) create mode 100644 testscommon/outport/blockContainerStub.go diff --git a/go.mod b/go.mod index 15c251425ee..8c2797ac2af 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-0.20230329082847-b78e96c3ad5a + github.com/multiversx/mx-chain-core-go v1.2.1-0.20230330105824-932a718276f6 github.com/multiversx/mx-chain-crypto-go v1.2.5 github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230331083741-0fd8a2156e96 github.com/multiversx/mx-chain-logger-go v1.0.11 diff --git a/go.sum b/go.sum index 95fc609ad2e..667d3d6905b 100644 --- a/go.sum +++ b/go.sum @@ -612,8 +612,9 @@ github.com/multiversx/concurrent-map v0.1.4/go.mod h1:8cWFRJDOrWHOTNSqgYCUvwT7c7 github.com/multiversx/mx-chain-core-go v1.1.30/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.1.31/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= github.com/multiversx/mx-chain-core-go v1.2.0/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.1-0.20230329082847-b78e96c3ad5a h1:cjPv/NIb4c3oBuBxxc2ggyaMvpmGlo1RO8mmzrkWARM= github.com/multiversx/mx-chain-core-go v1.2.1-0.20230329082847-b78e96c3ad5a/go.mod h1:/lovncjwo+pXQ7IAERwNzwCifeH7SAWk0DGqjorX2bc= +github.com/multiversx/mx-chain-core-go v1.2.1-0.20230330105824-932a718276f6 h1:4Nv0uxJbfSZ1fqWcQEYyQ1SdAAluDEbHjTi0X8ZFXFs= +github.com/multiversx/mx-chain-core-go v1.2.1-0.20230330105824-932a718276f6/go.mod h1:/lovncjwo+pXQ7IAERwNzwCifeH7SAWk0DGqjorX2bc= github.com/multiversx/mx-chain-crypto-go v1.2.5 h1:tuq3BUNMhKud5DQbZi9DiVAAHUXypizy8zPH0NpTGZk= github.com/multiversx/mx-chain-crypto-go v1.2.5/go.mod h1:teqhNyWEqfMPgNn8sgWXlgtJ1a36jGCnhs/tRpXW6r4= github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230331083741-0fd8a2156e96 h1:okIfLr+NqX04eHNp9k97KuLhpYfLJOjmGZaOia9xcGg= diff --git a/outport/factory/notifierFactory.go b/outport/factory/notifierFactory.go index 0e57628a3c5..a4cc572f491 100644 --- a/outport/factory/notifierFactory.go +++ b/outport/factory/notifierFactory.go @@ -3,6 +3,7 @@ package factory import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/outport" "github.com/multiversx/mx-chain-go/outport/notifier" @@ -37,9 +38,15 @@ func CreateEventNotifier(args *EventNotifierFactoryArgs) (outport.Driver, error) return nil, err } + blockContainer, err := createBlockCreatorsContainer() + if err != nil { + return nil, err + } + notifierArgs := notifier.ArgsEventNotifier{ - HttpClient: httpClient, - Marshaller: args.Marshaller, + HttpClient: httpClient, + Marshaller: args.Marshaller, + BlockContainer: blockContainer, } return notifier.NewEventNotifier(notifierArgs) @@ -52,3 +59,21 @@ func checkInputArgs(args *EventNotifierFactoryArgs) error { return nil } + +func createBlockCreatorsContainer() (notifier.BlockContainerHandler, error) { + container := block.NewEmptyBlockCreatorsContainer() + err := container.Add(core.ShardHeaderV1, block.NewEmptyHeaderCreator()) + if err != nil { + return nil, err + } + err = container.Add(core.ShardHeaderV2, block.NewEmptyHeaderV2Creator()) + if err != nil { + return nil, err + } + err = container.Add(core.MetaHeader, block.NewEmptyMetaBlockCreator()) + if err != nil { + return nil, err + } + + return container, nil +} diff --git a/outport/notifier/errors.go b/outport/notifier/errors.go index 7c6fff363ac..154faf4c1dd 100644 --- a/outport/notifier/errors.go +++ b/outport/notifier/errors.go @@ -4,9 +4,6 @@ import ( "errors" ) -// ErrNilTransactionsPool signals that a nil transactions pool was provided -var ErrNilTransactionsPool = errors.New("nil transactions pool") - // ErrInvalidValue signals that an invalid value has been provided var ErrInvalidValue = errors.New("invalid value") @@ -16,8 +13,5 @@ var ErrNilHTTPClientWrapper = errors.New("nil http client wrapper") // ErrNilMarshaller signals that a nil marshaller has been provided var ErrNilMarshaller = errors.New("nil marshaller") -// ErrNilPubKeyConverter signals that a nil pubkey converter has been provided -var ErrNilPubKeyConverter = errors.New("nil pub key converter") - -// ErrNilHasher is raised when a valid hasher is expected but nil used -var ErrNilHasher = errors.New("hasher is nil") +// ErrNilBlockContainerHandler signals that a nil block container handler has been provided +var ErrNilBlockContainerHandler = errors.New("nil bock container handler") diff --git a/outport/notifier/eventNotifier.go b/outport/notifier/eventNotifier.go index 4518d16de8d..b8e8b007258 100644 --- a/outport/notifier/eventNotifier.go +++ b/outport/notifier/eventNotifier.go @@ -32,13 +32,14 @@ type RevertBlock struct { type eventNotifier struct { httpClient httpClientHandler marshalizer marshal.Marshalizer - blockContainer blockContainerHandler + blockContainer BlockContainerHandler } // ArgsEventNotifier defines the arguments needed for event notifier creation type ArgsEventNotifier struct { - HttpClient httpClientHandler - Marshaller marshal.Marshalizer + HttpClient httpClientHandler + Marshaller marshal.Marshalizer + BlockContainer BlockContainerHandler } // NewEventNotifier creates a new instance of the eventNotifier @@ -48,15 +49,11 @@ func NewEventNotifier(args ArgsEventNotifier) (*eventNotifier, error) { if err != nil { return nil, err } - blockContainer, err := createBlockCreatorsContainer() - if err != nil { - return nil, err - } return &eventNotifier{ httpClient: args.HttpClient, marshalizer: args.Marshaller, - blockContainer: blockContainer, + blockContainer: args.BlockContainer, }, nil } @@ -67,6 +64,9 @@ func checkEventNotifierArgs(args ArgsEventNotifier) error { if check.IfNil(args.Marshaller) { return ErrNilMarshaller } + if check.IfNilReflect(args.BlockContainer) { + return ErrNilBlockContainerHandler + } return nil } @@ -158,21 +158,3 @@ func (en *eventNotifier) getHeaderFromBytes(headerType core.HeaderType, headerBy return block.GetHeaderFromBytes(en.marshalizer, creator, headerBytes) } - -func createBlockCreatorsContainer() (blockContainerHandler, error) { - container := block.NewEmptyBlockCreatorsContainer() - err := container.Add(core.ShardHeaderV1, block.NewEmptyHeaderCreator()) - if err != nil { - return nil, err - } - err = container.Add(core.ShardHeaderV2, block.NewEmptyHeaderV2Creator()) - if err != nil { - return nil, err - } - err = container.Add(core.MetaHeader, block.NewEmptyMetaBlockCreator()) - if err != nil { - return nil, err - } - - return container, nil -} diff --git a/outport/notifier/eventNotifier_test.go b/outport/notifier/eventNotifier_test.go index 28f8950bcec..60a3d354206 100644 --- a/outport/notifier/eventNotifier_test.go +++ b/outport/notifier/eventNotifier_test.go @@ -11,14 +11,16 @@ import ( "github.com/multiversx/mx-chain-go/outport/mock" "github.com/multiversx/mx-chain-go/outport/notifier" "github.com/multiversx/mx-chain-go/testscommon" + outportStub "github.com/multiversx/mx-chain-go/testscommon/outport" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func createMockEventNotifierArgs() notifier.ArgsEventNotifier { return notifier.ArgsEventNotifier{ - HttpClient: &mock.HTTPClientStub{}, - Marshaller: &testscommon.MarshalizerMock{}, + HttpClient: &mock.HTTPClientStub{}, + Marshaller: &testscommon.MarshalizerMock{}, + BlockContainer: &outportStub.BlockContainerStub{}, } } @@ -47,6 +49,17 @@ func TestNewEventNotifier(t *testing.T) { require.Equal(t, notifier.ErrNilMarshaller, err) }) + t.Run("nil block container", func(t *testing.T) { + t.Parallel() + + args := createMockEventNotifierArgs() + args.BlockContainer = nil + + en, err := notifier.NewEventNotifier(args) + require.Nil(t, en) + require.Equal(t, notifier.ErrNilBlockContainerHandler, err) + }) + t.Run("should work", func(t *testing.T) { t.Parallel() @@ -123,6 +136,11 @@ func TestRevertIndexedBlock(t *testing.T) { return nil }, } + args.BlockContainer = &outportStub.BlockContainerStub{ + GetCalled: func(headerType core.HeaderType) (block.EmptyBlockCreator, error) { + return block.NewEmptyHeaderCreator(), nil + }, + } en, _ := notifier.NewEventNotifier(args) diff --git a/outport/notifier/interface.go b/outport/notifier/interface.go index 612ab5988cf..2fd931d0295 100644 --- a/outport/notifier/interface.go +++ b/outport/notifier/interface.go @@ -11,6 +11,6 @@ type httpClientHandler interface { } // BlockContainerHandler defines what a block container should be able to do -type blockContainerHandler interface { +type BlockContainerHandler interface { Get(headerType core.HeaderType) (block.EmptyBlockCreator, error) } diff --git a/testscommon/outport/blockContainerStub.go b/testscommon/outport/blockContainerStub.go new file mode 100644 index 00000000000..cec28498b2f --- /dev/null +++ b/testscommon/outport/blockContainerStub.go @@ -0,0 +1,20 @@ +package outport + +import ( + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/block" +) + +// BlockContainerStub - +type BlockContainerStub struct { + GetCalled func(headerType core.HeaderType) (block.EmptyBlockCreator, error) +} + +// Get - +func (bcs *BlockContainerStub) Get(headerType core.HeaderType) (block.EmptyBlockCreator, error) { + if bcs.GetCalled != nil { + return bcs.GetCalled(headerType) + } + + return nil, nil +}