From 6287822d760f842738a02a133b5d9a7bbed7aabb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Fri, 8 Jul 2022 15:03:06 +0300 Subject: [PATCH 01/14] Refactoring: decouple NetworkProvider from Proxy components, work in progress. --- cmd/rosetta/main.go | 3 +- server/factory/controllers.go | 3 - .../disabledExternalConnector.go | 2 +- server/factory/interface.go | 34 ++++ server/factory/logging.go | 5 + server/factory/provider.go | 149 ++++++++++++++++++ server/provider/constants.go | 16 +- server/provider/interface.go | 22 +++ server/provider/networkProvider.go | 134 ++++------------ 9 files changed, 244 insertions(+), 124 deletions(-) rename server/{provider => factory}/disabledExternalConnector.go (97%) create mode 100644 server/factory/interface.go create mode 100644 server/factory/logging.go create mode 100644 server/factory/provider.go create mode 100644 server/provider/interface.go diff --git a/cmd/rosetta/main.go b/cmd/rosetta/main.go index 8a1042c7..2f5f8865 100644 --- a/cmd/rosetta/main.go +++ b/cmd/rosetta/main.go @@ -9,7 +9,6 @@ import ( "time" "github.com/ElrondNetwork/rosetta/server/factory" - "github.com/ElrondNetwork/rosetta/server/provider" "github.com/ElrondNetwork/rosetta/version" "github.com/coinbase/rosetta-sdk-go/server" "github.com/urfave/cli" @@ -48,7 +47,7 @@ func startRosetta(ctx *cli.Context) error { log.Info("Starting Rosetta...") - networkProvider, err := provider.NewNetworkProvider(provider.ArgsNewNetworkProvider{ + networkProvider, err := factory.CreateNetworkProvider(factory.ArgsCreateNetworkProvider{ IsOffline: cliFlags.offline, NumShards: cliFlags.numShards, ObservedActualShard: cliFlags.observerActualShard, diff --git a/server/factory/controllers.go b/server/factory/controllers.go index 52a518e9..991330af 100644 --- a/server/factory/controllers.go +++ b/server/factory/controllers.go @@ -1,7 +1,6 @@ package factory import ( - logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/rosetta/server/services" "github.com/ElrondNetwork/rosetta/server/services/offline" "github.com/coinbase/rosetta-sdk-go/asserter" @@ -9,8 +8,6 @@ import ( "github.com/coinbase/rosetta-sdk-go/types" ) -var log = logger.GetOrCreate("server/factory") - func CreateControllers(networkProvider services.NetworkProvider) ([]server.Router, error) { if networkProvider.IsOffline() { return createOfflineControllers(networkProvider) diff --git a/server/provider/disabledExternalConnector.go b/server/factory/disabledExternalConnector.go similarity index 97% rename from server/provider/disabledExternalConnector.go rename to server/factory/disabledExternalConnector.go index cdec5e18..6ee01fed 100644 --- a/server/provider/disabledExternalConnector.go +++ b/server/factory/disabledExternalConnector.go @@ -1,4 +1,4 @@ -package provider +package factory import ( "github.com/ElrondNetwork/elrond-proxy-go/data" diff --git a/server/factory/interface.go b/server/factory/interface.go new file mode 100644 index 00000000..8c35b5ee --- /dev/null +++ b/server/factory/interface.go @@ -0,0 +1,34 @@ +package factory + +import ( + "math/big" + + "github.com/ElrondNetwork/elrond-go-core/data/transaction" + "github.com/ElrondNetwork/elrond-proxy-go/data" + "github.com/ElrondNetwork/rosetta/server/resources" +) + +type networkProvider interface { + IsOffline() bool + GetBlockchainName() string + GetChainID() string + GetNativeCurrency() resources.NativeCurrency + GetObserverPubkey() string + GetNetworkConfig() *resources.NetworkConfig + GetGenesisBlockSummary() *resources.BlockSummary + GetGenesisTimestamp() int64 + GetGenesisBalances() ([]*resources.GenesisBalance, error) + GetLatestBlockSummary() (*resources.BlockSummary, error) + GetBlockByNonce(nonce uint64) (*data.Block, error) + GetBlockByHash(hash string) (*data.Block, error) + GetAccount(address string) (*data.AccountModel, error) + IsAddressObserved(address string) (bool, error) + ConvertPubKeyToAddress(pubkey []byte) string + ConvertAddressToPubKey(address string) ([]byte, error) + SendTransaction(tx *data.Transaction) (string, error) + ComputeTransactionHash(tx *data.Transaction) (string, error) + ComputeReceiptHash(apiReceipt *transaction.ApiReceipt) (string, error) + ComputeTransactionFeeForMoveBalance(tx *data.FullTransaction) *big.Int + GetMempoolTransactionByHash(hash string) (*data.FullTransaction, error) + LogDescription() +} diff --git a/server/factory/logging.go b/server/factory/logging.go new file mode 100644 index 00000000..50c8b4b4 --- /dev/null +++ b/server/factory/logging.go @@ -0,0 +1,5 @@ +package factory + +import logger "github.com/ElrondNetwork/elrond-go-logger" + +var log = logger.GetOrCreate("server/factory") diff --git a/server/factory/provider.go b/server/factory/provider.go new file mode 100644 index 00000000..02af25c0 --- /dev/null +++ b/server/factory/provider.go @@ -0,0 +1,149 @@ +package factory + +import ( + "time" + + "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" + hasherFactory "github.com/ElrondNetwork/elrond-go-core/hashing/factory" + marshalFactory "github.com/ElrondNetwork/elrond-go-core/marshal/factory" + "github.com/ElrondNetwork/elrond-go/sharding" + "github.com/ElrondNetwork/elrond-proxy-go/data" + "github.com/ElrondNetwork/elrond-proxy-go/observer" + "github.com/ElrondNetwork/elrond-proxy-go/process" + processFactory "github.com/ElrondNetwork/elrond-proxy-go/process/factory" + "github.com/ElrondNetwork/rosetta/server/provider" +) + +const ( + hasherType = "blake2b" + marshalizerForHashingType = "gogo protobuf" + pubKeyLength = 32 + + notApplicableConfigurationFilePath = "not applicable" + notApplicableFullHistoryNodesMessage = "not applicable" + + requestTimeoutInSeconds = 60 +) + +var ( + nodeStatusCacheDuration = time.Duration(1 * time.Second) +) + +type ArgsCreateNetworkProvider struct { + IsOffline bool + NumShards uint32 + ObservedActualShard uint32 + ObservedProjectedShard uint32 + ObservedProjectedShardIsSet bool + ObserverUrl string + ObserverPubkey string + ChainID string + GasPerDataByte uint64 + MinGasPrice uint64 + MinGasLimit uint64 + NativeCurrencySymbol string + GenesisBlockHash string + GenesisTimestamp int64 + ObserveNotFinalBlocks bool +} + +func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, error) { + shardCoordinator, err := sharding.NewMultiShardCoordinator(args.NumShards, args.ObservedActualShard) + if err != nil { + return nil, err + } + + pubKeyConverter, err := pubkeyConverter.NewBech32PubkeyConverter(pubKeyLength, log) + if err != nil { + return nil, err + } + + observers := []*data.NodeData{ + { + ShardId: args.ObservedActualShard, + Address: args.ObserverUrl, + IsSynced: true, + }, + } + + observersProvider, err := observer.NewSimpleNodesProvider(observers, notApplicableConfigurationFilePath) + if err != nil { + return nil, err + } + + disabledObserversProvider := observer.NewDisabledNodesProvider(notApplicableFullHistoryNodesMessage) + if err != nil { + return nil, err + } + + baseProcessor, err := process.NewBaseProcessor( + requestTimeoutInSeconds, + shardCoordinator, + observersProvider, + disabledObserversProvider, + pubKeyConverter, + ) + if err != nil { + return nil, err + } + + accountProcessor, err := process.NewAccountProcessor( + baseProcessor, + pubKeyConverter, + &disabledExternalStorageConnector{}, + ) + if err != nil { + return nil, err + } + + hasher, err := hasherFactory.NewHasher(hasherType) + if err != nil { + return nil, err + } + + marshalizerForHashing, err := marshalFactory.NewMarshalizer(marshalizerForHashingType) + if err != nil { + return nil, err + } + + transactionProcessor, err := processFactory.CreateTransactionProcessor( + baseProcessor, + pubKeyConverter, + hasher, + marshalizerForHashing, + ) + if err != nil { + return nil, err + } + + blockProcessor, err := process.NewBlockProcessor(&disabledExternalStorageConnector{}, baseProcessor) + if err != nil { + return nil, err + } + + return provider.NewNetworkProvider(provider.ArgsNewNetworkProvider{ + IsOffline: args.IsOffline, + ObservedActualShard: args.ObservedActualShard, + ObservedProjectedShard: args.ObservedProjectedShard, + ObservedProjectedShardIsSet: args.ObservedProjectedShardIsSet, + ObserverUrl: args.ObserverUrl, + ObserverPubkey: args.ObserverPubkey, + ChainID: args.ChainID, + GasPerDataByte: args.GasPerDataByte, + MinGasPrice: args.MinGasPrice, + MinGasLimit: args.MinGasLimit, + NativeCurrencySymbol: args.NativeCurrencySymbol, + GenesisBlockHash: args.GenesisBlockHash, + GenesisTimestamp: args.GenesisTimestamp, + ObserveNotFinalBlocks: args.ObserveNotFinalBlocks, + + BaseProcessor: baseProcessor, + AccountProcessor: accountProcessor, + TransactionProcessor: transactionProcessor, + BlockProcessor: blockProcessor, + + Hasher: hasher, + MarshalizerForHashing: marshalizerForHashing, + PubKeyConverter: pubKeyConverter, + }) +} diff --git a/server/provider/constants.go b/server/provider/constants.go index 5fb309af..2a4705a7 100644 --- a/server/provider/constants.go +++ b/server/provider/constants.go @@ -1,17 +1,9 @@ package provider -import "time" - -// Defined by the Network: -var hasherType = "blake2b" -var marshalizerForHashingType = "gogo protobuf" -var pubKeyLength = 32 -var nativeCurrencyNumDecimals = 18 -var genesisBlockNonce = 0 - -// Defined in the scope of the Rosetta node: -var requestTimeoutInSeconds = 60 -var nodeStatusCacheDuration = time.Duration(1 * time.Second) +var ( + nativeCurrencyNumDecimals = 18 + genesisBlockNonce = 0 +) type MiniblockProcessingType string diff --git a/server/provider/interface.go b/server/provider/interface.go new file mode 100644 index 00000000..3561e708 --- /dev/null +++ b/server/provider/interface.go @@ -0,0 +1,22 @@ +package provider + +import ( + "github.com/ElrondNetwork/elrond-proxy-go/facade" + "github.com/ElrondNetwork/elrond-proxy-go/process" +) + +type baseProcessor interface { + process.Processor +} + +type accountProcessor interface { + facade.AccountProcessor +} + +type transactionProcessor interface { + facade.TransactionProcessor +} + +type blockProcessor interface { + facade.BlockProcessor +} diff --git a/server/provider/networkProvider.go b/server/provider/networkProvider.go index a9206985..4c4bd749 100644 --- a/server/provider/networkProvider.go +++ b/server/provider/networkProvider.go @@ -7,28 +7,17 @@ import ( "math/big" "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" "github.com/ElrondNetwork/elrond-go-core/data/receipt" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing" - hasherFactory "github.com/ElrondNetwork/elrond-go-core/hashing/factory" "github.com/ElrondNetwork/elrond-go-core/marshal" - marshalFactory "github.com/ElrondNetwork/elrond-go-core/marshal/factory" logger "github.com/ElrondNetwork/elrond-go-logger" - "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-proxy-go/common" "github.com/ElrondNetwork/elrond-proxy-go/data" - "github.com/ElrondNetwork/elrond-proxy-go/facade" - "github.com/ElrondNetwork/elrond-proxy-go/observer" - "github.com/ElrondNetwork/elrond-proxy-go/process" - processFactory "github.com/ElrondNetwork/elrond-proxy-go/process/factory" "github.com/ElrondNetwork/rosetta/server/resources" ) var ( - notApplicableConfigurationFilePath = "not applicable" - notApplicableFullHistoryNodesMessage = "not applicable" - urlPathGetNetworkConfig = "/network/config" urlPathGetNodeStatus = "/node/status" urlPathGetGenesisBalances = "/network/genesis-balances" @@ -38,7 +27,6 @@ var log = logger.GetOrCreate("server/provider") type ArgsNewNetworkProvider struct { IsOffline bool - NumShards uint32 ObservedActualShard uint32 ObservedProjectedShard uint32 ObservedProjectedShardIsSet bool @@ -52,20 +40,19 @@ type ArgsNewNetworkProvider struct { GenesisBlockHash string GenesisTimestamp int64 ObserveNotFinalBlocks bool -} - -type networkProvider struct { - isOffline bool - pubKeyConverter core.PubkeyConverter - baseProcessor process.Processor - accountProcessor facade.AccountProcessor - transactionProcessor facade.TransactionProcessor - blockProcessor facade.BlockProcessor + BaseProcessor baseProcessor + AccountProcessor accountProcessor + TransactionProcessor transactionProcessor + BlockProcessor blockProcessor - hasher hashing.Hasher - marshalizerForHashing marshal.Marshalizer + Hasher hashing.Hasher + MarshalizerForHashing marshal.Marshalizer + PubKeyConverter core.PubkeyConverter +} +type networkProvider struct { + isOffline bool observedActualShard uint32 observedProjectedShard uint32 observedProjectedShardIsSet bool @@ -76,96 +63,22 @@ type networkProvider struct { genesisTimestamp int64 observeNotFinalBlocks bool + baseProcessor baseProcessor + accountProcessor accountProcessor + transactionProcessor transactionProcessor + blockProcessor blockProcessor + + hasher hashing.Hasher + marshalizerForHashing marshal.Marshalizer + pubKeyConverter core.PubkeyConverter + networkConfig *resources.NetworkConfig } -// TODO: Move constructor calls to /factory. Receive dependencies in constructor. func NewNetworkProvider(args ArgsNewNetworkProvider) (*networkProvider, error) { - shardCoordinator, err := sharding.NewMultiShardCoordinator(args.NumShards, args.ObservedActualShard) - if err != nil { - return nil, err - } - - pubKeyConverter, err := pubkeyConverter.NewBech32PubkeyConverter(pubKeyLength, log) - if err != nil { - return nil, err - } - - observers := []*data.NodeData{ - { - ShardId: args.ObservedActualShard, - Address: args.ObserverUrl, - IsSynced: true, - }, - } - - observersProvider, err := observer.NewSimpleNodesProvider(observers, notApplicableConfigurationFilePath) - if err != nil { - return nil, err - } - - disabledObserversProvider := observer.NewDisabledNodesProvider(notApplicableFullHistoryNodesMessage) - if err != nil { - return nil, err - } - - baseProcessor, err := process.NewBaseProcessor( - requestTimeoutInSeconds, - shardCoordinator, - observersProvider, - disabledObserversProvider, - pubKeyConverter, - ) - if err != nil { - return nil, err - } - - accountProcessor, err := process.NewAccountProcessor( - baseProcessor, - pubKeyConverter, - &disabledExternalStorageConnector{}, - ) - if err != nil { - return nil, err - } - - hasher, err := hasherFactory.NewHasher(hasherType) - if err != nil { - return nil, err - } - - marshalizerForHashing, err := marshalFactory.NewMarshalizer(marshalizerForHashingType) - if err != nil { - return nil, err - } - - transactionProcessor, err := processFactory.CreateTransactionProcessor( - baseProcessor, - pubKeyConverter, - hasher, - marshalizerForHashing, - ) - if err != nil { - return nil, err - } - - blockProcessor, err := process.NewBlockProcessor(&disabledExternalStorageConnector{}, baseProcessor) - if err != nil { - return nil, err - } - return &networkProvider{ isOffline: args.IsOffline, - pubKeyConverter: pubKeyConverter, - baseProcessor: baseProcessor, - accountProcessor: accountProcessor, - transactionProcessor: transactionProcessor, - blockProcessor: blockProcessor, - - hasher: hasher, - marshalizerForHashing: marshalizerForHashing, - observedActualShard: args.ObservedActualShard, observedProjectedShard: args.ObservedProjectedShard, observedProjectedShardIsSet: args.ObservedProjectedShardIsSet, @@ -176,6 +89,15 @@ func NewNetworkProvider(args ArgsNewNetworkProvider) (*networkProvider, error) { genesisTimestamp: args.GenesisTimestamp, observeNotFinalBlocks: args.ObserveNotFinalBlocks, + baseProcessor: args.BaseProcessor, + accountProcessor: args.AccountProcessor, + transactionProcessor: args.TransactionProcessor, + blockProcessor: args.BlockProcessor, + + hasher: args.Hasher, + marshalizerForHashing: args.MarshalizerForHashing, + pubKeyConverter: args.PubKeyConverter, + networkConfig: &resources.NetworkConfig{ ChainID: args.ChainID, GasPerDataByte: args.GasPerDataByte, From 128925556374feaed01a595b3554ecfacef23211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Fri, 8 Jul 2022 17:43:21 +0300 Subject: [PATCH 02/14] Use "smaller" interfaces. --- server/provider/interface.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/server/provider/interface.go b/server/provider/interface.go index 3561e708..8c637577 100644 --- a/server/provider/interface.go +++ b/server/provider/interface.go @@ -1,22 +1,26 @@ package provider import ( - "github.com/ElrondNetwork/elrond-proxy-go/facade" - "github.com/ElrondNetwork/elrond-proxy-go/process" + "github.com/ElrondNetwork/elrond-proxy-go/common" + "github.com/ElrondNetwork/elrond-proxy-go/data" ) type baseProcessor interface { - process.Processor + CallGetRestEndPoint(address string, path string, value interface{}) (int, error) + ComputeShardId(addressBuff []byte) (uint32, error) } type accountProcessor interface { - facade.AccountProcessor + GetAccount(address string, options common.AccountQueryOptions) (*data.AccountModel, error) } type transactionProcessor interface { - facade.TransactionProcessor + SendTransaction(tx *data.Transaction) (int, string, error) + ComputeTransactionHash(tx *data.Transaction) (string, error) + GetTransactionByHashAndSenderAddress(txHash string, sndAddr string, withEvents bool) (*data.FullTransaction, int, error) } type blockProcessor interface { - facade.BlockProcessor + GetBlockByHash(shardID uint32, hash string, options common.BlockQueryOptions) (*data.BlockApiResponse, error) + GetBlockByNonce(shardID uint32, nonce uint64, options common.BlockQueryOptions) (*data.BlockApiResponse, error) } From 20309ae5fe19842aa4b39c37c774c7bef62d0430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Fri, 8 Jul 2022 18:03:46 +0300 Subject: [PATCH 03/14] Refactoring: define "observerFacade". --- .../components/disabledExternalConnector.go | 24 +++++++++++++ server/factory/components/observerFacade.go | 14 ++++++++ server/factory/disabledExternalConnector.go | 21 ----------- server/factory/provider.go | 15 ++++---- server/provider/interface.go | 11 +----- server/provider/networkProvider.go | 35 +++++++------------ 6 files changed, 61 insertions(+), 59 deletions(-) create mode 100644 server/factory/components/disabledExternalConnector.go create mode 100644 server/factory/components/observerFacade.go delete mode 100644 server/factory/disabledExternalConnector.go diff --git a/server/factory/components/disabledExternalConnector.go b/server/factory/components/disabledExternalConnector.go new file mode 100644 index 00000000..1b70ba23 --- /dev/null +++ b/server/factory/components/disabledExternalConnector.go @@ -0,0 +1,24 @@ +package components + +import ( + "github.com/ElrondNetwork/elrond-proxy-go/data" +) + +// DisabledExternalStorageConnector is a no-operation external storage connector +type DisabledExternalStorageConnector struct { +} + +// GetTransactionsByAddress returns nothing +func (connector *DisabledExternalStorageConnector) GetTransactionsByAddress(address string) ([]data.DatabaseTransaction, error) { + return make([]data.DatabaseTransaction, 0), nil +} + +// GetAtlasBlockByShardIDAndNonce returns nothing +func (connector *DisabledExternalStorageConnector) GetAtlasBlockByShardIDAndNonce(shardID uint32, nonce uint64) (data.AtlasBlock, error) { + return data.AtlasBlock{}, nil +} + +// IsInterfaceNil returns true if there is no value under the interface +func (connector *DisabledExternalStorageConnector) IsInterfaceNil() bool { + return connector == nil +} diff --git a/server/factory/components/observerFacade.go b/server/factory/components/observerFacade.go new file mode 100644 index 00000000..c28fbdbd --- /dev/null +++ b/server/factory/components/observerFacade.go @@ -0,0 +1,14 @@ +package components + +import ( + "github.com/ElrondNetwork/elrond-proxy-go/facade" + "github.com/ElrondNetwork/elrond-proxy-go/process" +) + +// ObserverFacade holds (embeds) several components implemented in elrond-proxy-go +type ObserverFacade struct { + process.Processor + facade.AccountProcessor + facade.TransactionProcessor + facade.BlockProcessor +} diff --git a/server/factory/disabledExternalConnector.go b/server/factory/disabledExternalConnector.go deleted file mode 100644 index 6ee01fed..00000000 --- a/server/factory/disabledExternalConnector.go +++ /dev/null @@ -1,21 +0,0 @@ -package factory - -import ( - "github.com/ElrondNetwork/elrond-proxy-go/data" -) - -type disabledExternalStorageConnector struct { -} - -func (connector *disabledExternalStorageConnector) GetTransactionsByAddress(address string) ([]data.DatabaseTransaction, error) { - return make([]data.DatabaseTransaction, 0), nil -} - -func (connector *disabledExternalStorageConnector) GetAtlasBlockByShardIDAndNonce(shardID uint32, nonce uint64) (data.AtlasBlock, error) { - return data.AtlasBlock{}, nil -} - -// IsInterfaceNil returns true if there is no value under the interface -func (connector *disabledExternalStorageConnector) IsInterfaceNil() bool { - return connector == nil -} diff --git a/server/factory/provider.go b/server/factory/provider.go index 02af25c0..03f5efac 100644 --- a/server/factory/provider.go +++ b/server/factory/provider.go @@ -11,6 +11,7 @@ import ( "github.com/ElrondNetwork/elrond-proxy-go/observer" "github.com/ElrondNetwork/elrond-proxy-go/process" processFactory "github.com/ElrondNetwork/elrond-proxy-go/process/factory" + "github.com/ElrondNetwork/rosetta/server/factory/components" "github.com/ElrondNetwork/rosetta/server/provider" ) @@ -90,7 +91,7 @@ func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, err accountProcessor, err := process.NewAccountProcessor( baseProcessor, pubKeyConverter, - &disabledExternalStorageConnector{}, + &components.DisabledExternalStorageConnector{}, ) if err != nil { return nil, err @@ -116,7 +117,7 @@ func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, err return nil, err } - blockProcessor, err := process.NewBlockProcessor(&disabledExternalStorageConnector{}, baseProcessor) + blockProcessor, err := process.NewBlockProcessor(&components.DisabledExternalStorageConnector{}, baseProcessor) if err != nil { return nil, err } @@ -137,10 +138,12 @@ func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, err GenesisTimestamp: args.GenesisTimestamp, ObserveNotFinalBlocks: args.ObserveNotFinalBlocks, - BaseProcessor: baseProcessor, - AccountProcessor: accountProcessor, - TransactionProcessor: transactionProcessor, - BlockProcessor: blockProcessor, + ObserverFacade: &components.ObserverFacade{ + Processor: baseProcessor, + AccountProcessor: accountProcessor, + TransactionProcessor: transactionProcessor, + BlockProcessor: blockProcessor, + }, Hasher: hasher, MarshalizerForHashing: marshalizerForHashing, diff --git a/server/provider/interface.go b/server/provider/interface.go index 8c637577..36a5cafe 100644 --- a/server/provider/interface.go +++ b/server/provider/interface.go @@ -5,22 +5,13 @@ import ( "github.com/ElrondNetwork/elrond-proxy-go/data" ) -type baseProcessor interface { +type observerFacade interface { CallGetRestEndPoint(address string, path string, value interface{}) (int, error) ComputeShardId(addressBuff []byte) (uint32, error) -} - -type accountProcessor interface { GetAccount(address string, options common.AccountQueryOptions) (*data.AccountModel, error) -} - -type transactionProcessor interface { SendTransaction(tx *data.Transaction) (int, string, error) ComputeTransactionHash(tx *data.Transaction) (string, error) GetTransactionByHashAndSenderAddress(txHash string, sndAddr string, withEvents bool) (*data.FullTransaction, int, error) -} - -type blockProcessor interface { GetBlockByHash(shardID uint32, hash string, options common.BlockQueryOptions) (*data.BlockApiResponse, error) GetBlockByNonce(shardID uint32, nonce uint64, options common.BlockQueryOptions) (*data.BlockApiResponse, error) } diff --git a/server/provider/networkProvider.go b/server/provider/networkProvider.go index 4c4bd749..9365d95d 100644 --- a/server/provider/networkProvider.go +++ b/server/provider/networkProvider.go @@ -41,10 +41,7 @@ type ArgsNewNetworkProvider struct { GenesisTimestamp int64 ObserveNotFinalBlocks bool - BaseProcessor baseProcessor - AccountProcessor accountProcessor - TransactionProcessor transactionProcessor - BlockProcessor blockProcessor + ObserverFacade observerFacade Hasher hashing.Hasher MarshalizerForHashing marshal.Marshalizer @@ -63,10 +60,7 @@ type networkProvider struct { genesisTimestamp int64 observeNotFinalBlocks bool - baseProcessor baseProcessor - accountProcessor accountProcessor - transactionProcessor transactionProcessor - blockProcessor blockProcessor + observerFacade observerFacade hasher hashing.Hasher marshalizerForHashing marshal.Marshalizer @@ -89,10 +83,7 @@ func NewNetworkProvider(args ArgsNewNetworkProvider) (*networkProvider, error) { genesisTimestamp: args.GenesisTimestamp, observeNotFinalBlocks: args.ObserveNotFinalBlocks, - baseProcessor: args.BaseProcessor, - accountProcessor: args.AccountProcessor, - transactionProcessor: args.TransactionProcessor, - blockProcessor: args.BlockProcessor, + observerFacade: args.ObserverFacade, hasher: args.Hasher, marshalizerForHashing: args.MarshalizerForHashing, @@ -161,7 +152,7 @@ func (provider *networkProvider) GetGenesisBalances() ([]*resources.GenesisBalan response := &resources.GenesisBalancesApiResponse{} - _, err := provider.baseProcessor.CallGetRestEndPoint(provider.observerUrl, urlPathGetGenesisBalances, &response) + _, err := provider.observerFacade.CallGetRestEndPoint(provider.observerUrl, urlPathGetGenesisBalances, &response) if err != nil { return nil, err } @@ -190,7 +181,7 @@ func (provider *networkProvider) GetLatestBlockSummary() (*resources.BlockSummar WithLogs: false, } - blockResponse, err := provider.blockProcessor.GetBlockByNonce( + blockResponse, err := provider.observerFacade.GetBlockByNonce( provider.observedActualShard, latestBlockNonce, queryOptions, @@ -227,7 +218,7 @@ func (provider *networkProvider) getNodeStatus() (*resources.NodeStatus, error) response := &resources.NodeStatusApiResponse{} - _, err := provider.baseProcessor.CallGetRestEndPoint(provider.observerUrl, urlPathGetNodeStatus, &response) + _, err := provider.observerFacade.CallGetRestEndPoint(provider.observerUrl, urlPathGetNodeStatus, &response) if err != nil { return nil, err } @@ -268,7 +259,7 @@ func (provider *networkProvider) doGetBlockByNonce(nonce uint64) (*data.Block, e WithLogs: true, } - response, err := provider.blockProcessor.GetBlockByNonce(provider.observedActualShard, nonce, queryOptions) + response, err := provider.observerFacade.GetBlockByNonce(provider.observedActualShard, nonce, queryOptions) if err != nil { return nil, newErrCannotGetBlockByNonce(nonce, err) } @@ -300,7 +291,7 @@ func (provider *networkProvider) doGetBlockByHash(hash string) (*data.Block, err WithLogs: true, } - response, err := provider.blockProcessor.GetBlockByHash(provider.observedActualShard, hash, queryOptions) + response, err := provider.observerFacade.GetBlockByHash(provider.observedActualShard, hash, queryOptions) if err != nil { return nil, newErrCannotGetBlockByHash(hash, err) } @@ -319,7 +310,7 @@ func (provider *networkProvider) GetAccount(address string) (*data.AccountModel, onFinalBlock := !provider.observeNotFinalBlocks options := common.AccountQueryOptions{OnFinalBlock: onFinalBlock} - account, err := provider.accountProcessor.GetAccount(address, options) + account, err := provider.observerFacade.GetAccount(address, options) if err != nil { return nil, newErrCannotGetAccount(address, err) } @@ -342,7 +333,7 @@ func (provider *networkProvider) IsAddressObserved(address string) (bool, error) return false, err } - shard, err := provider.baseProcessor.ComputeShardId(pubKey) + shard, err := provider.observerFacade.ComputeShardId(pubKey) if err != nil { return false, err } @@ -369,7 +360,7 @@ func (provider *networkProvider) ConvertAddressToPubKey(address string) ([]byte, // ComputeTransactionHash computes the hash of a provided transaction func (provider *networkProvider) ComputeTransactionHash(tx *data.Transaction) (string, error) { - return provider.transactionProcessor.ComputeTransactionHash(tx) + return provider.observerFacade.ComputeTransactionHash(tx) } func (provider *networkProvider) ComputeReceiptHash(apiReceipt *transaction.ApiReceipt) (string, error) { @@ -405,7 +396,7 @@ func (provider *networkProvider) SendTransaction(tx *data.Transaction) (string, return "", errIsOffline } - _, hash, err := provider.transactionProcessor.SendTransaction(tx) + _, hash, err := provider.observerFacade.SendTransaction(tx) if err != nil { return "", err } @@ -419,7 +410,7 @@ func (provider *networkProvider) GetMempoolTransactionByHash(hash string) (*data return nil, errIsOffline } - tx, _, err := provider.transactionProcessor.GetTransactionByHashAndSenderAddress(hash, "", false) + tx, _, err := provider.observerFacade.GetTransactionByHashAndSenderAddress(hash, "", false) if err != nil { return nil, newErrCannotGetTransaction(hash, err) } From 08fc462b91b433ebf1f9b3212bda30f1be578f6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Fri, 8 Jul 2022 23:31:36 +0300 Subject: [PATCH 04/14] Define observerFacadeMock. --- server/provider/interface.go | 6 +- testscommon/observerFacadeMock.go | 193 ++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 testscommon/observerFacadeMock.go diff --git a/server/provider/interface.go b/server/provider/interface.go index 36a5cafe..77dfe230 100644 --- a/server/provider/interface.go +++ b/server/provider/interface.go @@ -6,12 +6,12 @@ import ( ) type observerFacade interface { - CallGetRestEndPoint(address string, path string, value interface{}) (int, error) - ComputeShardId(addressBuff []byte) (uint32, error) + CallGetRestEndPoint(baseUrl string, path string, value interface{}) (int, error) + ComputeShardId(pubKey []byte) (uint32, error) GetAccount(address string, options common.AccountQueryOptions) (*data.AccountModel, error) SendTransaction(tx *data.Transaction) (int, string, error) ComputeTransactionHash(tx *data.Transaction) (string, error) - GetTransactionByHashAndSenderAddress(txHash string, sndAddr string, withEvents bool) (*data.FullTransaction, int, error) + GetTransactionByHashAndSenderAddress(hash string, sender string, withEvents bool) (*data.FullTransaction, int, error) GetBlockByHash(shardID uint32, hash string, options common.BlockQueryOptions) (*data.BlockApiResponse, error) GetBlockByNonce(shardID uint32, nonce uint64, options common.BlockQueryOptions) (*data.BlockApiResponse, error) } diff --git a/testscommon/observerFacadeMock.go b/testscommon/observerFacadeMock.go new file mode 100644 index 00000000..873d3915 --- /dev/null +++ b/testscommon/observerFacadeMock.go @@ -0,0 +1,193 @@ +package testscommon + +import ( + "encoding/json" + "fmt" + + "github.com/ElrondNetwork/elrond-go/sharding" + "github.com/ElrondNetwork/elrond-proxy-go/common" + "github.com/ElrondNetwork/elrond-proxy-go/data" +) + +type observerFacadeMock struct { + MockNumShards uint32 + MockSelfShard uint32 + MockGetResponse interface{} + MockAccount *data.AccountModel + MockComputedTransactionHash string + MockNextError error + MockNextApiResponseError string + + MockAccountsByAddress map[string]*data.Account + MockTransactionsByHash map[string]*data.FullTransaction + MockBlocks []*data.Block + + SendTransactionCalled func(tx *data.Transaction) (string, error) +} + +// NewObserverFacadeMock - +func NewObserverFacadeMock() *observerFacadeMock { + return &observerFacadeMock{ + MockNumShards: 3, + MockSelfShard: 0, + + MockComputedTransactionHash: emptyHash, + MockNextError: nil, + + MockAccountsByAddress: make(map[string]*data.Account), + MockTransactionsByHash: make(map[string]*data.FullTransaction), + MockBlocks: []*data.Block{{ + Nonce: 0, + Hash: "0000", + }}, + } +} + +// CallGetRestEndPoint - +func (mock *observerFacadeMock) CallGetRestEndPoint(baseUrl string, path string, value interface{}) (int, error) { + if mock.MockNextError != nil { + return 0, mock.MockNextError + } + + data, err := json.Marshal(mock.MockGetResponse) + if err != nil { + return 500, err + } + + err = json.Unmarshal(data, value) + if err != nil { + return 500, err + } + + return 200, nil +} + +// ComputeShardId - +func (mock *observerFacadeMock) ComputeShardId(pubKey []byte) (uint32, error) { + if mock.MockNextError != nil { + return 0, mock.MockNextError + } + + shardCoordinator, err := sharding.NewMultiShardCoordinator(mock.MockNumShards, mock.MockSelfShard) + if err != nil { + return 0, err + } + + shard := shardCoordinator.ComputeId(pubKey) + return shard, nil +} + +// GetAccount - +func (mock *observerFacadeMock) GetAccount(address string, options common.AccountQueryOptions) (*data.AccountModel, error) { + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + + latestBlock := mock.MockBlocks[len(mock.MockBlocks)-1] + + account, ok := mock.MockAccountsByAddress[address] + if ok { + return &data.AccountModel{ + Account: *account, + BlockInfo: data.BlockInfo{ + Nonce: latestBlock.Nonce, + Hash: latestBlock.Hash, + RootHash: emptyHash, + }, + }, nil + } + + return nil, fmt.Errorf("account %s not found", address) +} + +// SendTransaction - +func (mock *observerFacadeMock) SendTransaction(tx *data.Transaction) (string, error) { + if mock.MockNextError != nil { + return "", mock.MockNextError + } + + if mock.SendTransactionCalled != nil { + return mock.SendTransactionCalled(tx) + } + + return mock.MockComputedTransactionHash, nil +} + +// ComputeTransactionHash - +func (mock *observerFacadeMock) ComputeTransactionHash(tx *data.Transaction) (string, error) { + if mock.MockNextError != nil { + return "", mock.MockNextError + } + + return mock.MockComputedTransactionHash, nil +} + +// GetTransactionByHashAndSenderAddress - +func (mock *observerFacadeMock) GetTransactionByHashAndSenderAddress(hash string, sender string, withEvents bool) (*data.FullTransaction, int, error) { + if mock.MockNextError != nil { + return nil, 0, mock.MockNextError + } + + transaction, ok := mock.MockTransactionsByHash[hash] + if ok { + return transaction, 0, mock.MockNextError + } + + return nil, 0, fmt.Errorf("transaction %s not found", hash) +} + +// GetBlockByHash - +func (mock *observerFacadeMock) GetBlockByHash(shardID uint32, hash string, options common.BlockQueryOptions) (*data.BlockApiResponse, error) { + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + + if mock.MockNextApiResponseError != "" { + return &data.BlockApiResponse{ + Code: data.ReturnCodeInternalError, + Error: mock.MockNextApiResponseError, + }, nil + } + + for _, block := range mock.MockBlocks { + if block.Hash == hash { + return &data.BlockApiResponse{ + Code: data.ReturnCodeSuccess, + Data: data.BlockApiResponsePayload{Block: *block}, + }, nil + } + } + + return &data.BlockApiResponse{ + Code: data.ReturnCodeInternalError, + Error: "block not found", + }, nil +} + +// GetBlockByNonce - +func (mock *observerFacadeMock) GetBlockByNonce(shardID uint32, nonce uint64, options common.BlockQueryOptions) (*data.BlockApiResponse, error) { + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + + if mock.MockNextApiResponseError != "" { + return &data.BlockApiResponse{ + Code: data.ReturnCodeInternalError, + Error: mock.MockNextApiResponseError, + }, nil + } + + for _, block := range mock.MockBlocks { + if block.Nonce == nonce { + return &data.BlockApiResponse{ + Code: data.ReturnCodeSuccess, + Data: data.BlockApiResponsePayload{Block: *block}, + }, nil + } + } + + return &data.BlockApiResponse{ + Code: data.ReturnCodeInternalError, + Error: "block not found", + }, nil +} From c3892b6e4f3251447219ca44a77b545b02063e9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Fri, 8 Jul 2022 23:38:31 +0300 Subject: [PATCH 05/14] Improve networkProviderMock. --- testscommon/networkProviderMock.go | 60 +++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/testscommon/networkProviderMock.go b/testscommon/networkProviderMock.go index bdb890ec..43eeba62 100644 --- a/testscommon/networkProviderMock.go +++ b/testscommon/networkProviderMock.go @@ -127,19 +127,31 @@ func (mock *networkProviderMock) GetGenesisTimestamp() int64 { // GetGenesisBalances - func (mock *networkProviderMock) GetGenesisBalances() ([]*resources.GenesisBalance, error) { - return mock.MockGenesisBalances, mock.MockNextError + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + + return mock.MockGenesisBalances, nil } // GetLatestBlockSummary - func (mock *networkProviderMock) GetLatestBlockSummary() (*resources.BlockSummary, error) { - return mock.MockLatestBlockSummary, mock.MockNextError + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + + return mock.MockLatestBlockSummary, nil } // GetBlockByNonce - func (mock *networkProviderMock) GetBlockByNonce(nonce uint64) (*data.Block, error) { + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + block, ok := mock.MockBlocksByNonce[nonce] if ok { - return block, mock.MockNextError + return block, nil } return nil, fmt.Errorf("block %d not found", nonce) @@ -147,9 +159,13 @@ func (mock *networkProviderMock) GetBlockByNonce(nonce uint64) (*data.Block, err // GetBlockByHash - func (mock *networkProviderMock) GetBlockByHash(hash string) (*data.Block, error) { + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + block, ok := mock.MockBlocksByHash[hash] if ok { - return block, mock.MockNextError + return block, nil } return nil, fmt.Errorf("block %s not found", hash) @@ -157,6 +173,10 @@ func (mock *networkProviderMock) GetBlockByHash(hash string) (*data.Block, error // GetAccount - func (mock *networkProviderMock) GetAccount(address string) (*data.AccountModel, error) { + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + account, ok := mock.MockAccountsByAddress[address] if ok { return &data.AccountModel{ @@ -166,7 +186,7 @@ func (mock *networkProviderMock) GetAccount(address string) (*data.AccountModel, Hash: mock.MockLatestBlockSummary.Hash, RootHash: emptyHash, }, - }, mock.MockNextError + }, nil } return nil, fmt.Errorf("account %s not found", address) @@ -174,6 +194,10 @@ func (mock *networkProviderMock) GetAccount(address string) (*data.AccountModel, // IsAddressObserved - func (mock *networkProviderMock) IsAddressObserved(address string) (bool, error) { + if mock.MockNextError != nil { + return false, mock.MockNextError + } + shardCoordinator, err := sharding.NewMultiShardCoordinator(mock.MockNumShards, mock.MockObservedActualShard) if err != nil { return false, err @@ -208,12 +232,20 @@ func (mock *networkProviderMock) ConvertAddressToPubKey(address string) ([]byte, // ComputeTransactionHash - func (mock *networkProviderMock) ComputeTransactionHash(tx *data.Transaction) (string, error) { - return mock.MockComputedTransactionHash, mock.MockNextError + if mock.MockNextError != nil { + return "", mock.MockNextError + } + + return mock.MockComputedTransactionHash, nil } // ComputeReceiptHash - func (mock *networkProviderMock) ComputeReceiptHash(apiReceipt *transaction.ApiReceipt) (string, error) { - return mock.MockComputedReceiptHash, mock.MockNextError + if mock.MockNextError != nil { + return "", mock.MockNextError + } + + return mock.MockComputedReceiptHash, nil } // ComputeTransactionFeeForMoveBalance - @@ -228,19 +260,27 @@ func (mock *networkProviderMock) ComputeTransactionFeeForMoveBalance(tx *data.Fu // SendTransaction - func (mock *networkProviderMock) SendTransaction(tx *data.Transaction) (string, error) { + if mock.MockNextError != nil { + return "", mock.MockNextError + } + if mock.SendTransactionCalled != nil { return mock.SendTransactionCalled(tx) } - return mock.MockComputedTransactionHash, mock.MockNextError + return mock.MockComputedTransactionHash, nil } // GetMempoolTransactionByHash - func (mock *networkProviderMock) GetMempoolTransactionByHash(hash string) (*data.FullTransaction, error) { + if mock.MockNextError != nil { + return nil, mock.MockNextError + } + transaction, ok := mock.MockMempoolTransactionsByHash[hash] if ok { - return transaction, mock.MockNextError + return transaction, nil } - return nil, mock.MockNextError + return nil, nil } From 7ffd4e3e9985890e55a5cf54526c3847cee2956f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Sat, 9 Jul 2022 00:18:11 +0300 Subject: [PATCH 06/14] Improve mocks / testscommon. --- testscommon/addresses.go | 6 ------ testscommon/logging.go | 2 +- testscommon/observerFacadeMock.go | 8 ++++---- testscommon/realworld.go | 17 +++++++++++++++++ 4 files changed, 22 insertions(+), 11 deletions(-) create mode 100644 testscommon/realworld.go diff --git a/testscommon/addresses.go b/testscommon/addresses.go index 0f10908a..d926b473 100644 --- a/testscommon/addresses.go +++ b/testscommon/addresses.go @@ -2,14 +2,8 @@ package testscommon import ( "encoding/hex" - - "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" - logger "github.com/ElrondNetwork/elrond-go-logger" ) -// RealWorldBech32PubkeyConverter is a bech32 converter, to be used in tests -var RealWorldBech32PubkeyConverter, _ = pubkeyConverter.NewBech32PubkeyConverter(32, logger.GetOrCreate("testscommon")) - var ( // TestAddressAlice is a test address TestAddressAlice = "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th" diff --git a/testscommon/logging.go b/testscommon/logging.go index 02126392..03d238cb 100644 --- a/testscommon/logging.go +++ b/testscommon/logging.go @@ -2,4 +2,4 @@ package testscommon import logger "github.com/ElrondNetwork/elrond-go-logger" -var log = logger.GetOrCreate("main") +var log = logger.GetOrCreate("testscommon") diff --git a/testscommon/observerFacadeMock.go b/testscommon/observerFacadeMock.go index 873d3915..46cee402 100644 --- a/testscommon/observerFacadeMock.go +++ b/testscommon/observerFacadeMock.go @@ -22,7 +22,7 @@ type observerFacadeMock struct { MockTransactionsByHash map[string]*data.FullTransaction MockBlocks []*data.Block - SendTransactionCalled func(tx *data.Transaction) (string, error) + SendTransactionCalled func(tx *data.Transaction) (int, string, error) } // NewObserverFacadeMock - @@ -101,16 +101,16 @@ func (mock *observerFacadeMock) GetAccount(address string, options common.Accoun } // SendTransaction - -func (mock *observerFacadeMock) SendTransaction(tx *data.Transaction) (string, error) { +func (mock *observerFacadeMock) SendTransaction(tx *data.Transaction) (int, string, error) { if mock.MockNextError != nil { - return "", mock.MockNextError + return 500, "", mock.MockNextError } if mock.SendTransactionCalled != nil { return mock.SendTransactionCalled(tx) } - return mock.MockComputedTransactionHash, nil + return 200, mock.MockComputedTransactionHash, nil } // ComputeTransactionHash - diff --git a/testscommon/realworld.go b/testscommon/realworld.go new file mode 100644 index 00000000..9f8f7701 --- /dev/null +++ b/testscommon/realworld.go @@ -0,0 +1,17 @@ +package testscommon + +import ( + "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" + hasherFactory "github.com/ElrondNetwork/elrond-go-core/hashing/factory" + marshalFactory "github.com/ElrondNetwork/elrond-go-core/marshal/factory" + logger "github.com/ElrondNetwork/elrond-go-logger" +) + +// RealWorldBech32PubkeyConverter is a bech32 converter, to be used in tests +var RealWorldBech32PubkeyConverter, _ = pubkeyConverter.NewBech32PubkeyConverter(32, logger.GetOrCreate("testscommon")) + +// RealWorldBlake2bHasher is a blake2b hasher, to be used in tests +var RealWorldBlake2bHasher, _ = hasherFactory.NewHasher("blake2b") + +// MarshalizerForHashing is a gogo protobuf marshalizer, to be used in tests +var MarshalizerForHashing, _ = marshalFactory.NewMarshalizer("gogo protobuf") From f1f6a1be1503651f97689fd5a327eccc7bc54fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Sun, 10 Jul 2022 00:42:33 +0300 Subject: [PATCH 07/14] Fix localnet checks config. Cleanup some test snippets. --- checks/localnet/localnet-data-001.json | 2 +- checks/localnet/localnet-data-continue.json | 2 +- checks/localnet/snippets/adder.spec.ts | 8 -------- checks/localnet/snippets/refunds.spec.ts | 8 -------- checks/localnet/snippets/scheduled.spec.ts | 6 ++---- 5 files changed, 4 insertions(+), 22 deletions(-) diff --git a/checks/localnet/localnet-data-001.json b/checks/localnet/localnet-data-001.json index 50bf2915..fc374c77 100644 --- a/checks/localnet/localnet-data-001.json +++ b/checks/localnet/localnet-data-001.json @@ -37,7 +37,7 @@ "coin_tracking_disabled": false, "status_port": 9090, "results_output_file": "", - "pruning_disabled": false, + "pruning_disabled": true, "initial_balance_fetch_disabled": false, "historical_balance_disabled": true } diff --git a/checks/localnet/localnet-data-continue.json b/checks/localnet/localnet-data-continue.json index 8be51a84..79247866 100644 --- a/checks/localnet/localnet-data-continue.json +++ b/checks/localnet/localnet-data-continue.json @@ -36,7 +36,7 @@ "coin_tracking_disabled": false, "status_port": 9090, "results_output_file": "", - "pruning_disabled": false, + "pruning_disabled": true, "initial_balance_fetch_disabled": false, "historical_balance_disabled": true } diff --git a/checks/localnet/snippets/adder.spec.ts b/checks/localnet/snippets/adder.spec.ts index 8431aa06..5e0d7261 100644 --- a/checks/localnet/snippets/adder.spec.ts +++ b/checks/localnet/snippets/adder.spec.ts @@ -221,12 +221,4 @@ describe("adder snippet", async function () { const transactionHash = await provider.sendTransaction(transaction); return { transaction, transactionHash }; } - - it("generate report", async function () { - await session.generateReport(); - }); - - it("destroy session", async function () { - await session.destroy(); - }); }); diff --git a/checks/localnet/snippets/refunds.spec.ts b/checks/localnet/snippets/refunds.spec.ts index 5c2af3b9..fcbca15d 100644 --- a/checks/localnet/snippets/refunds.spec.ts +++ b/checks/localnet/snippets/refunds.spec.ts @@ -188,12 +188,4 @@ describe("refunds", async function () { console.log("Bob to DNS:", transactionHash) await transactionWatcher.awaitCompleted(transactionBobToDNS); }); - - it("generate report", async function () { - await session.generateReport(); - }); - - it("destroy session", async function () { - await session.destroy(); - }); }); diff --git a/checks/localnet/snippets/scheduled.spec.ts b/checks/localnet/snippets/scheduled.spec.ts index 57ff19ed..d4da5c22 100644 --- a/checks/localnet/snippets/scheduled.spec.ts +++ b/checks/localnet/snippets/scheduled.spec.ts @@ -71,6 +71,8 @@ describe("scheduled", async function () { } await sendTransactions(transactions); + + // TODO: Add some waits. E.g. for the last transaction. }); it("setup", async function () { @@ -151,10 +153,6 @@ describe("scheduled", async function () { await sendTransactions(transactions); }); - it("destroy session", async function () { - await session.destroy(); - }); - async function sendTransactions(transactions: ITransaction[]): Promise { const sendableTransactions = transactions.map(item => item.toSendable()); const response = await networkProvider.doPostGeneric("transaction/send-multiple", sendableTransactions); From 5805925928ebc47d70dc688ce867bbe1529f9d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Sun, 10 Jul 2022 00:44:42 +0300 Subject: [PATCH 08/14] Add scenario for partial miniblocks. --- checks/localnet/snippets/partial.spec.ts | 83 ++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 checks/localnet/snippets/partial.spec.ts diff --git a/checks/localnet/snippets/partial.spec.ts b/checks/localnet/snippets/partial.spec.ts new file mode 100644 index 00000000..ab260896 --- /dev/null +++ b/checks/localnet/snippets/partial.spec.ts @@ -0,0 +1,83 @@ +import { DefaultGasConfiguration, GasEstimator, TransactionFactory, TransactionWatcher } from "@elrondnetwork/erdjs"; +import { ProxyNetworkProvider } from "@elrondnetwork/erdjs-network-providers/out"; +import { FiveMinutesInMilliseconds, IAddress, INetworkConfig, ITestSession, ITestUser, ITransaction, TestSession } from "@elrondnetwork/erdjs-snippets"; +import { assert } from "chai"; +import { createAdderInteractor } from "./adderInteractor"; + +// For testing this scenario, a localnet should be used, with altered code (waits / time.Sleep() in processing). +describe("partial", async function () { + this.bail(true); + + let session: ITestSession; + let networkProvider: ProxyNetworkProvider; + let networkConfig: INetworkConfig; + let transactionFactory: TransactionFactory; + let transactionWatcher: TransactionWatcher; + + // shard(alice) = 1 + // shard(bob) = 0 + let whale: ITestUser; + let alice: ITestUser; + let bob: ITestUser; + + this.beforeAll(async function () { + session = await TestSession.load("localnet", __dirname); + await session.syncNetworkConfig(); + + networkProvider = session.networkProvider; + networkConfig = session.getNetworkConfig(); + transactionFactory = new TransactionFactory(new GasEstimator(DefaultGasConfiguration)); + transactionWatcher = new TransactionWatcher(networkProvider); + + whale = session.users.getUser("whale"); + alice = session.users.getUser("alice"); + bob = session.users.getUser("bob"); + }); + + this.beforeEach(async function () { + session.correlation.step = this.currentTest?.fullTitle() || ""; + }); + + it("setup", async function () { + this.timeout(FiveMinutesInMilliseconds); + + await session.syncUsers([alice, bob]); + + let addressInShard0 = await deploy(bob); + await session.saveAddress({ name: "adderInShard0", address: addressInShard0 }); + + let addressInShard1 = await deploy(alice); + await session.saveAddress({ name: "adderInShard1", address: addressInShard1 }); + }); + + async function deploy(deployer: ITestUser): Promise { + let interactor = await createAdderInteractor(session); + let { address, returnCode } = await interactor.deploy(deployer, 42); + assert.isTrue(returnCode.isSuccess()); + return address; + } + + it("execute many", async function () { + this.timeout(FiveMinutesInMilliseconds); + + await session.syncUsers([alice, bob]); + + const adderInShard0 = await session.loadAddress("adderInShard0"); + const interactor0 = await createAdderInteractor(session, adderInShard0); + + const transactions: ITransaction[] = []; + + for (let i = 0; i < 10; i++) { + transactions.push(await interactor0.buildTransactionAdd(alice, 1, 30000000)); + } + + await sendTransactions(transactions); + }); + + async function sendTransactions(transactions: ITransaction[]): Promise { + const sendableTransactions = transactions.map(item => item.toSendable()); + const response = await networkProvider.doPostGeneric("transaction/send-multiple", sendableTransactions); + console.log("Sent transactions:", response.numOfSentTxs); + console.log(response); + } +}); From e0d38f59130c0493364063c86f208fd6d3a00d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Sun, 10 Jul 2022 01:08:46 +0300 Subject: [PATCH 09/14] Fix test snippet. --- checks/localnet/snippets/adder.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/checks/localnet/snippets/adder.spec.ts b/checks/localnet/snippets/adder.spec.ts index 5e0d7261..41f54881 100644 --- a/checks/localnet/snippets/adder.spec.ts +++ b/checks/localnet/snippets/adder.spec.ts @@ -66,8 +66,6 @@ describe("adder snippet", async function () { it("add", async function () { this.timeout(FiveMinutesInMilliseconds); - // If the step fails, retry it (using a Mocha utility function). - this.retries(5); await session.syncUsers([bob]); From d32b5c91093c3b0c971bcb0bcbae90200a8b2245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Sun, 10 Jul 2022 02:12:25 +0300 Subject: [PATCH 10/14] Sketch test. --- server/provider/networkProvider_test.go | 50 +++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 server/provider/networkProvider_test.go diff --git a/server/provider/networkProvider_test.go b/server/provider/networkProvider_test.go new file mode 100644 index 00000000..fe868fa6 --- /dev/null +++ b/server/provider/networkProvider_test.go @@ -0,0 +1,50 @@ +package provider + +import ( + "testing" + + "github.com/ElrondNetwork/rosetta/testscommon" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestNewNetworkProvider(t *testing.T) { + args := ArgsNewNetworkProvider{ + IsOffline: true, + ObservedActualShard: 42, + ObservedProjectedShard: 42, + ObservedProjectedShardIsSet: true, + ObserverUrl: "http://my-observer:8080", + ObserverPubkey: "abba", + ChainID: "T", + GasPerDataByte: 1501, + MinGasPrice: 1000000001, + MinGasLimit: 50001, + NativeCurrencySymbol: "XeGLD", + GenesisBlockHash: "aaaa", + GenesisTimestamp: 123456789, + ObserverFacade: testscommon.NewObserverFacadeMock(), + Hasher: testscommon.RealWorldBlake2bHasher, + MarshalizerForHashing: testscommon.MarshalizerForHashing, + PubKeyConverter: testscommon.RealWorldBech32PubkeyConverter, + } + + provider, err := NewNetworkProvider(args) + require.Nil(t, err) + require.NotNil(t, provider) + + assert.Equal(t, true, provider.IsOffline()) + assert.Equal(t, uint32(42), provider.observedActualShard) + assert.Equal(t, uint32(42), provider.observedProjectedShard) + assert.Equal(t, true, provider.observedProjectedShardIsSet) + assert.Equal(t, "http://my-observer:8080", provider.observerUrl) + assert.Equal(t, "abba", provider.GetObserverPubkey()) + assert.Equal(t, "T", provider.GetChainID()) + assert.Equal(t, "T", provider.GetNetworkConfig().ChainID) + assert.Equal(t, uint64(1501), provider.GetNetworkConfig().GasPerDataByte) + assert.Equal(t, uint64(1000000001), provider.GetNetworkConfig().MinGasPrice) + assert.Equal(t, uint64(50001), provider.GetNetworkConfig().MinGasLimit) + assert.Equal(t, "XeGLD", provider.GetNativeCurrency().Symbol) + assert.Equal(t, "aaaa", provider.GetGenesisBlockSummary().Hash) + assert.Equal(t, int64(123456789), provider.GetGenesisTimestamp()) +} From fef0b1b659e9f652f94cd091d576a5834d9c2080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Sun, 10 Jul 2022 19:56:49 +0300 Subject: [PATCH 11/14] Rename files. --- checks/localnet/README.md | 4 ++-- ...alnet-construction-001.json => localnet-construction.json} | 2 +- ...ocalnet-construction-001.ros => localnet-construction.ros} | 0 .../localnet/{localnet-data-001.json => localnet-data.json} | 0 checks/localnet/localnet-spec.json | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) rename checks/localnet/{localnet-construction-001.json => localnet-construction.json} (94%) rename checks/localnet/{localnet-construction-001.ros => localnet-construction.ros} (100%) rename checks/localnet/{localnet-data-001.json => localnet-data.json} (100%) diff --git a/checks/localnet/README.md b/checks/localnet/README.md index 718eba8c..70ea3a18 100644 --- a/checks/localnet/README.md +++ b/checks/localnet/README.md @@ -36,6 +36,6 @@ rosetta --observer-actual-shard=0 --chain-id=localnet --native-currency=XeGLD -- ``` rosetta-cli check:spec --configuration-file localnet-spec.json -rosetta-cli check:data --configuration-file localnet-data-001.json -rosetta-cli check:construction --configuration-file localnet-construction-001.json +rosetta-cli check:data --configuration-file localnet-data.json +rosetta-cli check:construction --configuration-file localnet-construction.json ``` diff --git a/checks/localnet/localnet-construction-001.json b/checks/localnet/localnet-construction.json similarity index 94% rename from checks/localnet/localnet-construction-001.json rename to checks/localnet/localnet-construction.json index c3fbf00b..823156d4 100644 --- a/checks/localnet/localnet-construction-001.json +++ b/checks/localnet/localnet-construction.json @@ -16,7 +16,7 @@ }, "stale_depth": 10, "broadcast_limit": 1, - "constructor_dsl_file": "localnet-construction-001.ros", + "constructor_dsl_file": "localnet-construction.ros", "prefunded_accounts": [ { "account_identifier": { diff --git a/checks/localnet/localnet-construction-001.ros b/checks/localnet/localnet-construction.ros similarity index 100% rename from checks/localnet/localnet-construction-001.ros rename to checks/localnet/localnet-construction.ros diff --git a/checks/localnet/localnet-data-001.json b/checks/localnet/localnet-data.json similarity index 100% rename from checks/localnet/localnet-data-001.json rename to checks/localnet/localnet-data.json diff --git a/checks/localnet/localnet-spec.json b/checks/localnet/localnet-spec.json index e25d799c..85948e51 100644 --- a/checks/localnet/localnet-spec.json +++ b/checks/localnet/localnet-spec.json @@ -21,7 +21,7 @@ "offline_url": "http://localhost:8092", "stale_depth": 10, "broadcast_limit": 5, - "constructor_dsl_file": "localnet-construction-001.ros", + "constructor_dsl_file": "localnet-construction.ros", "prefunded_accounts": [ { "account_identifier": { From ec8a6a6ac23ce08a0312cce176c23e24e1a44643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Fri, 29 Jul 2022 11:01:36 +0300 Subject: [PATCH 12/14] Fix build. --- server/factory/provider.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/factory/provider.go b/server/factory/provider.go index 03f5efac..dc3329a1 100644 --- a/server/factory/provider.go +++ b/server/factory/provider.go @@ -45,7 +45,6 @@ type ArgsCreateNetworkProvider struct { NativeCurrencySymbol string GenesisBlockHash string GenesisTimestamp int64 - ObserveNotFinalBlocks bool } func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, error) { @@ -136,7 +135,6 @@ func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, err NativeCurrencySymbol: args.NativeCurrencySymbol, GenesisBlockHash: args.GenesisBlockHash, GenesisTimestamp: args.GenesisTimestamp, - ObserveNotFinalBlocks: args.ObserveNotFinalBlocks, ObserverFacade: &components.ObserverFacade{ Processor: baseProcessor, From 8430acfc10e9dbc759093459504014371f783f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Mon, 1 Aug 2022 16:15:24 +0300 Subject: [PATCH 13/14] Bit of cleanup. --- server/factory/components/observerFacade.go | 1 - server/factory/provider.go | 10 --------- server/provider/interface.go | 1 - testscommon/observerFacadeMock.go | 23 --------------------- 4 files changed, 35 deletions(-) diff --git a/server/factory/components/observerFacade.go b/server/factory/components/observerFacade.go index c28fbdbd..d2d9c340 100644 --- a/server/factory/components/observerFacade.go +++ b/server/factory/components/observerFacade.go @@ -8,7 +8,6 @@ import ( // ObserverFacade holds (embeds) several components implemented in elrond-proxy-go type ObserverFacade struct { process.Processor - facade.AccountProcessor facade.TransactionProcessor facade.BlockProcessor } diff --git a/server/factory/provider.go b/server/factory/provider.go index dc3329a1..1904c9b0 100644 --- a/server/factory/provider.go +++ b/server/factory/provider.go @@ -87,15 +87,6 @@ func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, err return nil, err } - accountProcessor, err := process.NewAccountProcessor( - baseProcessor, - pubKeyConverter, - &components.DisabledExternalStorageConnector{}, - ) - if err != nil { - return nil, err - } - hasher, err := hasherFactory.NewHasher(hasherType) if err != nil { return nil, err @@ -138,7 +129,6 @@ func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, err ObserverFacade: &components.ObserverFacade{ Processor: baseProcessor, - AccountProcessor: accountProcessor, TransactionProcessor: transactionProcessor, BlockProcessor: blockProcessor, }, diff --git a/server/provider/interface.go b/server/provider/interface.go index 77dfe230..f2586a7d 100644 --- a/server/provider/interface.go +++ b/server/provider/interface.go @@ -8,7 +8,6 @@ import ( type observerFacade interface { CallGetRestEndPoint(baseUrl string, path string, value interface{}) (int, error) ComputeShardId(pubKey []byte) (uint32, error) - GetAccount(address string, options common.AccountQueryOptions) (*data.AccountModel, error) SendTransaction(tx *data.Transaction) (int, string, error) ComputeTransactionHash(tx *data.Transaction) (string, error) GetTransactionByHashAndSenderAddress(hash string, sender string, withEvents bool) (*data.FullTransaction, int, error) diff --git a/testscommon/observerFacadeMock.go b/testscommon/observerFacadeMock.go index 46cee402..f84f17a1 100644 --- a/testscommon/observerFacadeMock.go +++ b/testscommon/observerFacadeMock.go @@ -77,29 +77,6 @@ func (mock *observerFacadeMock) ComputeShardId(pubKey []byte) (uint32, error) { return shard, nil } -// GetAccount - -func (mock *observerFacadeMock) GetAccount(address string, options common.AccountQueryOptions) (*data.AccountModel, error) { - if mock.MockNextError != nil { - return nil, mock.MockNextError - } - - latestBlock := mock.MockBlocks[len(mock.MockBlocks)-1] - - account, ok := mock.MockAccountsByAddress[address] - if ok { - return &data.AccountModel{ - Account: *account, - BlockInfo: data.BlockInfo{ - Nonce: latestBlock.Nonce, - Hash: latestBlock.Hash, - RootHash: emptyHash, - }, - }, nil - } - - return nil, fmt.Errorf("account %s not found", address) -} - // SendTransaction - func (mock *observerFacadeMock) SendTransaction(tx *data.Transaction) (int, string, error) { if mock.MockNextError != nil { From 9b7aaed1ae2c522bb417132a9549fc34cad4ccaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Mon, 1 Aug 2022 18:21:58 +0300 Subject: [PATCH 14/14] Fix after review, bump version. --- server/factory/provider.go | 1 + version/constants.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/server/factory/provider.go b/server/factory/provider.go index 1904c9b0..a0f6e0ef 100644 --- a/server/factory/provider.go +++ b/server/factory/provider.go @@ -47,6 +47,7 @@ type ArgsCreateNetworkProvider struct { GenesisTimestamp int64 } +// CreateNetworkProvider creates a network provider func CreateNetworkProvider(args ArgsCreateNetworkProvider) (networkProvider, error) { shardCoordinator, err := sharding.NewMultiShardCoordinator(args.NumShards, args.ObservedActualShard) if err != nil { diff --git a/version/constants.go b/version/constants.go index ad7f6a5a..9e8bd449 100644 --- a/version/constants.go +++ b/version/constants.go @@ -5,7 +5,7 @@ const ( RosettaVersion = "v1.4.12" // RosettaMiddlewareVersion is the version of this package (application) - RosettaMiddlewareVersion = "v0.1.6" + RosettaMiddlewareVersion = "v0.1.7" // NodeVersion is the canonical version of the node runtime NodeVersion = "rc/2022-july"