From a56ec9570a65c274b8ab2527117148f4f0e9ee95 Mon Sep 17 00:00:00 2001 From: Marius Date: Wed, 19 Jan 2022 12:36:39 +0200 Subject: [PATCH 001/335] CLN: Add todo placeholder --- process/dataValidators/txValidator.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 47dbf99185a..622094df624 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -101,6 +101,15 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.TxValidatorHandler txv.pubkeyConverter.Encode(senderAddress), ) } + /* + - check code metadata if frozen + - if frozen: - check data field and if setguardian: + if yes - continue + no- return error - action not permitted on frozen account + - if not frozen: + continue + todo: (IMPORTANT) on execution if relayed - check if inner tx is frozen - if yes check correct relayer (= active guardian) + */ accountBalance := account.GetBalance() txFee := interceptedTx.Fee() From 26c8d3f0cbba01c340f8df5871b17cb5a2c2156c Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 20 Jan 2022 14:24:53 +0200 Subject: [PATCH 002/335] FEAT: Add tmp code version --- go.mod | 2 +- go.sum | 3 +- process/dataValidators/txValidator.go | 45 +++++++++++++++++++++------ 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 49672e86ed7..87242cb602c 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/ElrondNetwork/elrond-go-core v1.1.7 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.5 - github.com/ElrondNetwork/elrond-vm-common v1.2.9 + github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5 github.com/ElrondNetwork/notifier-go v1.0.3 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta diff --git a/go.sum b/go.sum index 402c4a2e145..88588a4bb98 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,9 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.4/go.mod h1:e5D+c97lKUfFdAzFX7rrI github.com/ElrondNetwork/elrond-go-logger v1.0.5 h1:tB/HBvV9IVeCaSrGakX+GLGu7K5UPLv8gA0TNKPOTOU= github.com/ElrondNetwork/elrond-go-logger v1.0.5/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= -github.com/ElrondNetwork/elrond-vm-common v1.2.9 h1:TiW7HFBdtraJnSOXC+OjTIRbOqwG9t3PkL8aTqkAUZM= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= +github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5 h1:ocesm1StWoglxsJ70oNXD6E4QRbgPUUZng3q+otn8xY= +github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= github.com/ElrondNetwork/notifier-go v1.0.3/go.mod h1:GOv7j2o90e/GVmmBddWwyfJZ/JW4V4pvyXIpukd6FfY= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 622094df624..e79b78eb88f 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -1,6 +1,8 @@ package dataValidators import ( + "bytes" + "errors" "fmt" "github.com/ElrondNetwork/elrond-go-core/core" @@ -9,6 +11,8 @@ import ( "github.com/ElrondNetwork/elrond-go/process/interceptors/processor" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" ) var _ process.TxValidator = (*txValidator)(nil) @@ -101,15 +105,14 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.TxValidatorHandler txv.pubkeyConverter.Encode(senderAddress), ) } - /* - - check code metadata if frozen - - if frozen: - check data field and if setguardian: - if yes - continue - no- return error - action not permitted on frozen account - - if not frozen: - continue - todo: (IMPORTANT) on execution if relayed - check if inner tx is frozen - if yes check correct relayer (= active guardian) - */ + + txData, err := getTxData(interceptedTx) + if err != nil { + return err + } + if isAccountFrozen(account) && !isBuiltinFuncCall(txData, builtInFunctions.BuiltInFunctionSetGuardian) { + return errors.New("operation not permitted") + } accountBalance := account.GetBalance() txFee := interceptedTx.Fee() @@ -125,6 +128,30 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.TxValidatorHandler return nil } +func getTxData(interceptedTx process.TxValidatorHandler) ([]byte, error) { + txHandler, ok := interceptedTx.(processor.InterceptedTransactionHandler) + if !ok { + return nil, process.ErrWrongTypeAssertion + } + tx := txHandler.Transaction() + if tx == nil { + return nil, process.ErrNilTransaction + } + + return tx.GetData(), nil +} + +func isAccountFrozen(account state.UserAccountHandler) bool { + codeMetaDataBytes := account.GetCodeMetadata() + codeMetaData := vmcommon.CodeMetadataFromBytes(codeMetaDataBytes) + return codeMetaData.Frozen +} + +func isBuiltinFuncCall(txData []byte, function string) bool { + expectedTxData := []byte(function + "@") + return bytes.HasPrefix(txData, expectedTxData) +} + // CheckTxWhiteList will check if the cross shard transactions are whitelisted and could be added in pools func (txv *txValidator) CheckTxWhiteList(data process.InterceptedData) error { interceptedTx, ok := data.(processor.InterceptedTransactionHandler) From e7b2a33f015323e8620bfe1cfb5ecc81c1bb7d6e Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 25 Jan 2022 09:11:31 +0200 Subject: [PATCH 003/335] FEAT: Change interfaces + add InterceptedTxHandler --- node/node.go | 2 +- process/dataValidators/disabledTxValidator.go | 2 +- process/dataValidators/txValidator.go | 10 ++----- process/dataValidators/txValidator_test.go | 15 ++++++---- .../processor/txInterceptorProcessor_test.go | 4 +-- process/interface.go | 13 +++++++- process/mock/interceptedTxHandlerStub.go | 30 +++++++++++++++---- process/mock/txValidatorStub.go | 6 ++-- 8 files changed, 56 insertions(+), 26 deletions(-) diff --git a/node/node.go b/node/node.go index 427b89baa28..cc7dfb89d5d 100644 --- a/node/node.go +++ b/node/node.go @@ -791,7 +791,7 @@ func (n *Node) commonTransactionValidation( whiteListerVerifiedTxs process.WhiteListHandler, whiteListRequest process.WhiteListHandler, checkSignature bool, -) (process.TxValidator, process.TxValidatorHandler, error) { +) (process.TxValidator, process.InterceptedTxHandler, error) { txValidator, err := dataValidators.NewTxValidator( n.stateComponents.AccountsAdapter(), n.processComponents.ShardCoordinator(), diff --git a/process/dataValidators/disabledTxValidator.go b/process/dataValidators/disabledTxValidator.go index 0201b893805..c13bedf2bdd 100644 --- a/process/dataValidators/disabledTxValidator.go +++ b/process/dataValidators/disabledTxValidator.go @@ -14,7 +14,7 @@ func NewDisabledTxValidator() *disabledTxValidator { } // CheckTxValidity is a disabled implementation that will return nil -func (dtv *disabledTxValidator) CheckTxValidity(_ process.TxValidatorHandler) error { +func (dtv *disabledTxValidator) CheckTxValidity(_ process.InterceptedTxHandler) error { return nil } diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index e79b78eb88f..623b14ecf6b 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -57,7 +57,7 @@ func NewTxValidator( } // CheckTxValidity will filter transactions that needs to be added in pools -func (txv *txValidator) CheckTxValidity(interceptedTx process.TxValidatorHandler) error { +func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandler) error { // TODO: Refactor, extract methods. interceptedData, ok := interceptedTx.(process.InterceptedData) @@ -128,12 +128,8 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.TxValidatorHandler return nil } -func getTxData(interceptedTx process.TxValidatorHandler) ([]byte, error) { - txHandler, ok := interceptedTx.(processor.InterceptedTransactionHandler) - if !ok { - return nil, process.ErrWrongTypeAssertion - } - tx := txHandler.Transaction() +func getTxData(interceptedTx process.InterceptedTxHandler) ([]byte, error) { + tx := interceptedTx.Transaction() if tx == nil { return nil, process.ErrNilTransaction } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 3769c6121d1..3647ffd852c 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -7,6 +7,8 @@ import ( "testing" "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/dataValidators" "github.com/ElrondNetwork/elrond-go/process/mock" @@ -47,8 +49,8 @@ func getTxValidatorHandler( nonce uint64, sndAddr []byte, fee *big.Int, -) process.TxValidatorHandler { - return &mock.TxValidatorHandlerStub{ +) process.InterceptedTxHandler { + return &mock.InterceptedTxHandlerStub{ SenderShardIdCalled: func() uint32 { return sndShardId }, @@ -64,6 +66,9 @@ func getTxValidatorHandler( FeeCalled: func() *big.Int { return fee }, + TransactionCalled: func() data.TransactionHandler { + return &transaction.Transaction{} + }, } } @@ -314,10 +319,10 @@ func TestTxValidator_CheckTxValidityAccountNotExitsButWhiteListedShouldReturnTru interceptedTx := struct { process.InterceptedData - process.TxValidatorHandler + process.InterceptedTxHandler }{ - InterceptedData: nil, - TxValidatorHandler: txValidatorHandler, + InterceptedData: nil, + InterceptedTxHandler: txValidatorHandler, } // interceptedTx needs to be of type InterceptedData & TxValidatorHandler diff --git a/process/interceptors/processor/txInterceptorProcessor_test.go b/process/interceptors/processor/txInterceptorProcessor_test.go index d497a9d3693..3a9f42f5915 100644 --- a/process/interceptors/processor/txInterceptorProcessor_test.go +++ b/process/interceptors/processor/txInterceptorProcessor_test.go @@ -80,7 +80,7 @@ func TestTxInterceptorProcessor_ValidateReturnsFalseShouldErr(t *testing.T) { expectedErr := errors.New("tx validation error") arg := createMockTxArgument() arg.TxValidator = &mock.TxValidatorStub{ - CheckTxValidityCalled: func(txValidatorHandler process.TxValidatorHandler) error { + CheckTxValidityCalled: func(interceptedTx process.InterceptedTxHandler) error { return expectedErr }, } @@ -101,7 +101,7 @@ func TestTxInterceptorProcessor_ValidateReturnsTrueShouldWork(t *testing.T) { arg := createMockTxArgument() arg.TxValidator = &mock.TxValidatorStub{ - CheckTxValidityCalled: func(txValidatorHandler process.TxValidatorHandler) error { + CheckTxValidityCalled: func(interceptedTx process.InterceptedTxHandler) error { return nil }, } diff --git a/process/interface.go b/process/interface.go index af13d27d843..4bd24d25a38 100644 --- a/process/interface.go +++ b/process/interface.go @@ -60,7 +60,7 @@ type TxTypeHandler interface { // TxValidator can determine if a provided transaction handler is valid or not from the process point of view type TxValidator interface { - CheckTxValidity(txHandler TxValidatorHandler) error + CheckTxValidity(interceptedTx InterceptedTxHandler) error CheckTxWhiteList(data InterceptedData) error IsInterfaceNil() bool } @@ -74,6 +74,17 @@ type TxValidatorHandler interface { Fee() *big.Int } +// InterceptedTxHandler defines an intercepted data wrapper over transaction handler that has +// receiver and sender shard getters +type InterceptedTxHandler interface { + SenderShardId() uint32 + ReceiverShardId() uint32 + Nonce() uint64 + SenderAddress() []byte + Fee() *big.Int + Transaction() data.TransactionHandler +} + // TxVersionCheckerHandler defines the functionality that is needed for a TxVersionChecker to validate transaction version type TxVersionCheckerHandler interface { IsSignedWithHash(tx *transaction.Transaction) bool diff --git a/process/mock/interceptedTxHandlerStub.go b/process/mock/interceptedTxHandlerStub.go index f7805182e1e..2e21790fea7 100644 --- a/process/mock/interceptedTxHandlerStub.go +++ b/process/mock/interceptedTxHandlerStub.go @@ -18,30 +18,48 @@ type InterceptedTxHandlerStub struct { // SenderShardId - func (iths *InterceptedTxHandlerStub) SenderShardId() uint32 { - return iths.SenderShardIdCalled() + if iths.SenderShardIdCalled != nil { + return iths.SenderShardIdCalled() + } + return 0 } // ReceiverShardId - func (iths *InterceptedTxHandlerStub) ReceiverShardId() uint32 { - return iths.ReceiverShardIdCalled() + if iths.ReceiverShardIdCalled != nil { + return iths.ReceiverShardIdCalled() + } + return 0 } // Nonce - func (iths *InterceptedTxHandlerStub) Nonce() uint64 { - return iths.NonceCalled() + if iths.NonceCalled != nil { + return iths.NonceCalled() + } + return 0 } // SenderAddress - func (iths *InterceptedTxHandlerStub) SenderAddress() []byte { - return iths.SenderAddressCalled() + if iths.SenderAddressCalled != nil { + return iths.SenderAddressCalled() + } + return nil } // Fee - func (iths *InterceptedTxHandlerStub) Fee() *big.Int { - return iths.FeeCalled() + if iths.FeeCalled != nil { + return iths.FeeCalled() + } + return nil } // Transaction - func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { - return iths.TransactionCalled() + if iths.TransactionCalled != nil { + return iths.TransactionCalled() + } + return nil } diff --git a/process/mock/txValidatorStub.go b/process/mock/txValidatorStub.go index 35740ee0851..790ea87ff22 100644 --- a/process/mock/txValidatorStub.go +++ b/process/mock/txValidatorStub.go @@ -6,14 +6,14 @@ import ( // TxValidatorStub - type TxValidatorStub struct { - CheckTxValidityCalled func(txValidatorHandler process.TxValidatorHandler) error + CheckTxValidityCalled func(interceptedTx process.InterceptedTxHandler) error CheckTxWhiteListCalled func(data process.InterceptedData) error RejectedTxsCalled func() uint64 } // CheckTxValidity - -func (t *TxValidatorStub) CheckTxValidity(txValidatorHandler process.TxValidatorHandler) error { - return t.CheckTxValidityCalled(txValidatorHandler) +func (t *TxValidatorStub) CheckTxValidity(interceptedTx process.InterceptedTxHandler) error { + return t.CheckTxValidityCalled(interceptedTx) } // CheckTxWhiteList - From db9bcd48d5d793c747688fc4038408b5cafdbd80 Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 25 Jan 2022 11:34:10 +0200 Subject: [PATCH 004/335] FEAT: Change arwen-vm version --- go.mod | 4 ++-- go.sum | 8 +++++--- process/dataValidators/txValidator.go | 11 +++++------ 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 87242cb602c..092564416ad 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.1.32 - github.com/ElrondNetwork/elrond-go-core v1.1.7 + github.com/ElrondNetwork/elrond-go-core v1.1.8-0.20220112112600-5ad56d3f2305 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.5 github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5 @@ -55,4 +55,4 @@ replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/Elrond replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.35 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.34 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.34 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.34 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.38-0.20220125093008-b3be84f25578 diff --git a/go.sum b/go.sum index 88588a4bb98..bd08b2b0021 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/ElrondNetwork/arwen-wasm-vm v1.2.35 h1:dM8JnTFw9MuHKIuURLyflJzXX63JB9 github.com/ElrondNetwork/arwen-wasm-vm v1.2.35/go.mod h1:XLdb0Ng7k/BplIfq85MBvcVKpXMOOfn+IIJd6guigpw= github.com/ElrondNetwork/arwen-wasm-vm v1.3.35 h1:Wz+N0bVidKIi/inO1s55HwqrSqkfcPYpcyAIiBbnL+k= github.com/ElrondNetwork/arwen-wasm-vm v1.3.35/go.mod h1:hg3s6l5FbRfjWjzrXrt2kqyNNvDoerxWskLa5o3TYzs= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.34 h1:vyTe/uNOFZxaLTF47ZclmxBwhEo3fEpU2xDyW9euXvg= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.34/go.mod h1:XdxG04hwtyD8jBFeblMR6r8bi7PxuOnuefzs7ptAYIM= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.38-0.20220125093008-b3be84f25578 h1:7k7e8rc+PkYyViRYKA2KnmHR9dtMTchWf7+a/Z+E2rY= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.38-0.20220125093008-b3be84f25578/go.mod h1:fgbwHuOmbdGm8s75pGY2/611Z7TbDsx2CHHiq4wLTc8= github.com/ElrondNetwork/big-int-util v0.1.0 h1:vTMoJ5azhVmr7jhpSD3JUjQdkdyXoEPVkOvhdw1RjV4= github.com/ElrondNetwork/big-int-util v0.1.0/go.mod h1:96viBvoTXLjZOhEvE0D+QnAwg1IJLPAK6GVHMbC7Aw4= github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04gd61sNYo04Zf0= @@ -28,8 +28,9 @@ github.com/ElrondNetwork/elastic-indexer-go v1.1.32 h1:R4mTyNKzw5VXtGnH/gVCqP5P6 github.com/ElrondNetwork/elastic-indexer-go v1.1.32/go.mod h1:k12hnUEjW8ZhYy4hC8RpsrAIiOxioVZOrLSUpgsEgFA= github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= github.com/ElrondNetwork/elrond-go-core v1.1.6/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= -github.com/ElrondNetwork/elrond-go-core v1.1.7 h1:pusBmtsS7lUzrDovW7XKWwhXIt3xRQg5hsB5bV8GkZQ= github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= +github.com/ElrondNetwork/elrond-go-core v1.1.8-0.20220112112600-5ad56d3f2305 h1:0QOs9OQ5PbcNb/lDZOrYYI0ovmsf7aFhwXgsnF2y/7M= +github.com/ElrondNetwork/elrond-go-core v1.1.8-0.20220112112600-5ad56d3f2305/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= @@ -38,6 +39,7 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.5 h1:tB/HBvV9IVeCaSrGakX+GLGu7K5U github.com/ElrondNetwork/elrond-go-logger v1.0.5/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= +github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220117090702-5fe837c6c8b4/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5 h1:ocesm1StWoglxsJ70oNXD6E4QRbgPUUZng3q+otn8xY= github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 623b14ecf6b..ad71d37ad93 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -2,7 +2,6 @@ package dataValidators import ( "bytes" - "errors" "fmt" "github.com/ElrondNetwork/elrond-go-core/core" @@ -110,8 +109,8 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandl if err != nil { return err } - if isAccountFrozen(account) && !isBuiltinFuncCall(txData, builtInFunctions.BuiltInFunctionSetGuardian) { - return errors.New("operation not permitted") + if isAccountFrozen(account) && !isBuiltinFuncCallWithParam(txData, builtInFunctions.BuiltInFunctionSetGuardian) { + return state.ErrOperationNotPermitted } accountBalance := account.GetBalance() @@ -143,9 +142,9 @@ func isAccountFrozen(account state.UserAccountHandler) bool { return codeMetaData.Frozen } -func isBuiltinFuncCall(txData []byte, function string) bool { - expectedTxData := []byte(function + "@") - return bytes.HasPrefix(txData, expectedTxData) +func isBuiltinFuncCallWithParam(txData []byte, function string) bool { + expectedTxDataPrefix := []byte(function + "@") + return bytes.HasPrefix(txData, expectedTxDataPrefix) } // CheckTxWhiteList will check if the cross shard transactions are whitelisted and could be added in pools From 9f739ed757701ab6bb2f4a47cd3009066db18246 Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 25 Jan 2022 12:36:37 +0200 Subject: [PATCH 005/335] FEAT: Change arwen-vm version --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 092564416ad..d2b7358f17d 100644 --- a/go.mod +++ b/go.mod @@ -55,4 +55,4 @@ replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/Elrond replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.35 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.34 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.38-0.20220125093008-b3be84f25578 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.34 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.34 diff --git a/go.sum b/go.sum index bd08b2b0021..3166a5c5dde 100644 --- a/go.sum +++ b/go.sum @@ -16,8 +16,8 @@ github.com/ElrondNetwork/arwen-wasm-vm v1.2.35 h1:dM8JnTFw9MuHKIuURLyflJzXX63JB9 github.com/ElrondNetwork/arwen-wasm-vm v1.2.35/go.mod h1:XLdb0Ng7k/BplIfq85MBvcVKpXMOOfn+IIJd6guigpw= github.com/ElrondNetwork/arwen-wasm-vm v1.3.35 h1:Wz+N0bVidKIi/inO1s55HwqrSqkfcPYpcyAIiBbnL+k= github.com/ElrondNetwork/arwen-wasm-vm v1.3.35/go.mod h1:hg3s6l5FbRfjWjzrXrt2kqyNNvDoerxWskLa5o3TYzs= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.38-0.20220125093008-b3be84f25578 h1:7k7e8rc+PkYyViRYKA2KnmHR9dtMTchWf7+a/Z+E2rY= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.38-0.20220125093008-b3be84f25578/go.mod h1:fgbwHuOmbdGm8s75pGY2/611Z7TbDsx2CHHiq4wLTc8= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.34 h1:vyTe/uNOFZxaLTF47ZclmxBwhEo3fEpU2xDyW9euXvg= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.34/go.mod h1:XdxG04hwtyD8jBFeblMR6r8bi7PxuOnuefzs7ptAYIM= github.com/ElrondNetwork/big-int-util v0.1.0 h1:vTMoJ5azhVmr7jhpSD3JUjQdkdyXoEPVkOvhdw1RjV4= github.com/ElrondNetwork/big-int-util v0.1.0/go.mod h1:96viBvoTXLjZOhEvE0D+QnAwg1IJLPAK6GVHMbC7Aw4= github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04gd61sNYo04Zf0= @@ -39,7 +39,6 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.5 h1:tB/HBvV9IVeCaSrGakX+GLGu7K5U github.com/ElrondNetwork/elrond-go-logger v1.0.5/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= -github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220117090702-5fe837c6c8b4/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5 h1:ocesm1StWoglxsJ70oNXD6E4QRbgPUUZng3q+otn8xY= github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= From 42625dc724253ffab44b2965b9cd49bfe563a250 Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 25 Jan 2022 14:05:19 +0200 Subject: [PATCH 006/335] FEAT: Change arwen-vm version --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index d2b7358f17d..164fd3b05cb 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/ElrondNetwork/elrond-go-core v1.1.8-0.20220112112600-5ad56d3f2305 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.5 - github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5 + github.com/ElrondNetwork/elrond-vm-common v1.3.0 github.com/ElrondNetwork/notifier-go v1.0.3 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta @@ -51,7 +51,7 @@ require ( replace github.com/gogo/protobuf => github.com/ElrondNetwork/protobuf v1.3.2 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.2.35 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.2.38-0.20220125120138-9561d1a2368f replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.35 diff --git a/go.sum b/go.sum index 3166a5c5dde..b518bdb8bca 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOv github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/ElrondNetwork/arwen-wasm-vm v1.2.35 h1:dM8JnTFw9MuHKIuURLyflJzXX63JB928lh9ohNCm0ZA= -github.com/ElrondNetwork/arwen-wasm-vm v1.2.35/go.mod h1:XLdb0Ng7k/BplIfq85MBvcVKpXMOOfn+IIJd6guigpw= +github.com/ElrondNetwork/arwen-wasm-vm v1.2.38-0.20220125120138-9561d1a2368f h1:BL3uS1ykLnCuQPbOT+he9nNnZdo6TnikJ1L9LJ76PIM= +github.com/ElrondNetwork/arwen-wasm-vm v1.2.38-0.20220125120138-9561d1a2368f/go.mod h1:JhzIiFmoefbtbPvbd5I1gVyYA8QHgrujU+QgNTKobn4= github.com/ElrondNetwork/arwen-wasm-vm v1.3.35 h1:Wz+N0bVidKIi/inO1s55HwqrSqkfcPYpcyAIiBbnL+k= github.com/ElrondNetwork/arwen-wasm-vm v1.3.35/go.mod h1:hg3s6l5FbRfjWjzrXrt2kqyNNvDoerxWskLa5o3TYzs= github.com/ElrondNetwork/arwen-wasm-vm v1.4.34 h1:vyTe/uNOFZxaLTF47ZclmxBwhEo3fEpU2xDyW9euXvg= @@ -39,8 +39,8 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.5 h1:tB/HBvV9IVeCaSrGakX+GLGu7K5U github.com/ElrondNetwork/elrond-go-logger v1.0.5/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= -github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5 h1:ocesm1StWoglxsJ70oNXD6E4QRbgPUUZng3q+otn8xY= -github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220118124239-5f6f811ff7c5/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= +github.com/ElrondNetwork/elrond-vm-common v1.3.0 h1:Hx8bJwAsCiLUDh3YERwmHx1rc4n7ZjKRFvcpnmL83hs= +github.com/ElrondNetwork/elrond-vm-common v1.3.0/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= github.com/ElrondNetwork/notifier-go v1.0.3/go.mod h1:GOv7j2o90e/GVmmBddWwyfJZ/JW4V4pvyXIpukd6FfY= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= From 4260a7d06320d0592897eb273d7cc23ef0527a05 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 16 Feb 2022 18:52:35 +0200 Subject: [PATCH 007/335] update dependencies and fixes after update --- go.mod | 10 ++++---- go.sum | 24 +++++++++---------- process/dataValidators/txValidator.go | 3 +-- .../builtInFunctions/factory_test.go | 6 +++-- vm/systemSmartContracts/defaults/gasMap.go | 2 ++ 5 files changed, 23 insertions(+), 22 deletions(-) diff --git a/go.mod b/go.mod index 182aa0a3cc8..f58fe4adcd2 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,10 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.1.34 - github.com/ElrondNetwork/elrond-go-core v1.1.11 + github.com/ElrondNetwork/elrond-go-core v1.1.13 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.6 - github.com/ElrondNetwork/elrond-vm-common v1.3.2 + github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c github.com/ElrondNetwork/notifier-go v1.0.3 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta @@ -53,8 +53,8 @@ require ( replace github.com/gogo/protobuf => github.com/ElrondNetwork/protobuf v1.3.2 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.2.37 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.2.38-0.20220216154141-7e2a7e994850 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.37 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.38-0.20220216155246-c3c866055053 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.38 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.39 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.38 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.41-0.20220216163013-931f72f14be7 diff --git a/go.sum b/go.sum index 92e456e19f1..6e158e9127b 100644 --- a/go.sum +++ b/go.sum @@ -12,12 +12,12 @@ github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOv github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/ElrondNetwork/arwen-wasm-vm v1.2.37 h1:2YkpnGVvvRiioBsRylbk/75BZwCj0ZuLWMKHRM4qIFI= -github.com/ElrondNetwork/arwen-wasm-vm v1.2.37/go.mod h1:JhzIiFmoefbtbPvbd5I1gVyYA8QHgrujU+QgNTKobn4= -github.com/ElrondNetwork/arwen-wasm-vm v1.3.37 h1:BHqxK2tKjQCrTS8LS28wDvxCwepIkAwR9jq9Jcbcy+c= -github.com/ElrondNetwork/arwen-wasm-vm v1.3.37/go.mod h1:6kogylULF71umFbE2RJNWYhYNXowjygSD9C/esVqhmk= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.39 h1:MuaFCHFRgsiiocWm6PIxeY9NVZ2OV+T0voahlVM1dJs= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.39/go.mod h1:fgbwHuOmbdGm8s75pGY2/611Z7TbDsx2CHHiq4wLTc8= +github.com/ElrondNetwork/arwen-wasm-vm v1.2.38-0.20220216154141-7e2a7e994850 h1:2HSRFfAS5moE0Zpr+2EybuFaVWEjHLvA4rJatDTgvYs= +github.com/ElrondNetwork/arwen-wasm-vm v1.2.38-0.20220216154141-7e2a7e994850/go.mod h1:ZPz11hzQ9MgTutpQWQKa2a+ybNU2uD3JKar33QBfWHA= +github.com/ElrondNetwork/arwen-wasm-vm v1.3.38-0.20220216155246-c3c866055053 h1:TxD+8RxcqqGgww/JjCDT2TUvhIfE9+vDTHPEOm6ZuHU= +github.com/ElrondNetwork/arwen-wasm-vm v1.3.38-0.20220216155246-c3c866055053/go.mod h1:Wh0tI8L+BZX83Um0XfCTitMSnzjYoAP9JETDN2103F0= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.41-0.20220216163013-931f72f14be7 h1:mg11IZjQkUUN9YzUZ+iKQgcIZpXhYYpywo7xNQPn7z0= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.41-0.20220216163013-931f72f14be7/go.mod h1:lUcREnYr928jhMt9hACgb6sOL/j3QqYBD0Jzk+/pV/o= github.com/ElrondNetwork/big-int-util v0.1.0 h1:vTMoJ5azhVmr7jhpSD3JUjQdkdyXoEPVkOvhdw1RjV4= github.com/ElrondNetwork/big-int-util v0.1.0/go.mod h1:96viBvoTXLjZOhEvE0D+QnAwg1IJLPAK6GVHMbC7Aw4= github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04gd61sNYo04Zf0= @@ -29,10 +29,10 @@ github.com/ElrondNetwork/elastic-indexer-go v1.1.34/go.mod h1:2XJCGXNCOv9MIhbZeG github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= github.com/ElrondNetwork/elrond-go-core v1.1.6/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= -github.com/ElrondNetwork/elrond-go-core v1.1.8-0.20220112112600-5ad56d3f2305/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.9/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.11 h1:WmEiybQIeI+SFEJ8QeKiot+PCEqcqdjRUDoOTX/KW3Y= -github.com/ElrondNetwork/elrond-go-core v1.1.11/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.10/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.13 h1:67o8RRagno509HWJwnyXTShOnLY6PAP3n5ok/B8sgQY= +github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= @@ -42,10 +42,8 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.6 h1:FGbO2C/s9cfNHag9jaKSB+sjuWUo github.com/ElrondNetwork/elrond-go-logger v1.0.6/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= -github.com/ElrondNetwork/elrond-vm-common v1.2.10-0.20220117090702-5fe837c6c8b4/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= -github.com/ElrondNetwork/elrond-vm-common v1.3.0/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= -github.com/ElrondNetwork/elrond-vm-common v1.3.2 h1:O/Wr5k7HXX7p0+U3ZsGdY5ydqfSABZvBSzwyV/xbu08= -github.com/ElrondNetwork/elrond-vm-common v1.3.2/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c h1:BpzHwmC0haU60hP/qkWyWlGm7Ts1rI+If/1mF0kFToo= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c/go.mod h1:XQoxE2MmrhVpyBMghK3fWvnRAw/iirc0KPtbKAOEPBM= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= github.com/ElrondNetwork/notifier-go v1.0.3/go.mod h1:GOv7j2o90e/GVmmBddWwyfJZ/JW4V4pvyXIpukd6FfY= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index ad71d37ad93..11aa2b6466b 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -11,7 +11,6 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" - "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" ) var _ process.TxValidator = (*txValidator)(nil) @@ -109,7 +108,7 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandl if err != nil { return err } - if isAccountFrozen(account) && !isBuiltinFuncCallWithParam(txData, builtInFunctions.BuiltInFunctionSetGuardian) { + if isAccountFrozen(account) && !isBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { return state.ErrOperationNotPermitted } diff --git a/process/smartContract/builtInFunctions/factory_test.go b/process/smartContract/builtInFunctions/factory_test.go index f8f08f20246..af1997a84f4 100644 --- a/process/smartContract/builtInFunctions/factory_test.go +++ b/process/smartContract/builtInFunctions/factory_test.go @@ -6,8 +6,8 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/mock" - stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/stretchr/testify/assert" ) @@ -73,6 +73,8 @@ func fillGasMapBuiltInCosts(value uint64) map[string]uint64 { gasMap["ESDTNFTAddUri"] = value gasMap["ESDTNFTUpdateAttributes"] = value gasMap["ESDTNFTMultiTransfer"] = value + gasMap["SetGuardian"] = value + gasMap["FreezeAccount"] = value return gasMap } @@ -95,7 +97,7 @@ func TestCreateBuiltInFunctionContainer_Errors(t *testing.T) { args = createMockArguments() container, nftStorageHandler, err := CreateBuiltInFuncContainerAndNFTStorageHandler(args) assert.Nil(t, err) - assert.Equal(t, len(container.Keys()), 25) + assert.Equal(t, len(container.Keys()), 28) err = vmcommonBuiltInFunctions.SetPayableHandler(container, &mock.BlockChainHookHandlerMock{}) assert.Nil(t, err) diff --git a/vm/systemSmartContracts/defaults/gasMap.go b/vm/systemSmartContracts/defaults/gasMap.go index 2e1df6f11e2..97729546039 100644 --- a/vm/systemSmartContracts/defaults/gasMap.go +++ b/vm/systemSmartContracts/defaults/gasMap.go @@ -45,6 +45,8 @@ func FillGasMapBuiltInCosts(value uint64) map[string]uint64 { gasMap["ESDTNFTAddUri"] = value gasMap["ESDTNFTUpdateAttributes"] = value gasMap["ESDTNFTMultiTransfer"] = value + gasMap["SetGuardian"] = value + gasMap["FreezeAccount"] = value return gasMap } From b3cf6ae862191a3524a61523eb2e5fb9bf593b27 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 25 Feb 2022 12:08:31 +0200 Subject: [PATCH 008/335] cmd, process, epochStart, genesis: refactor txValidator and add activation flag for new tx --- cmd/node/config/enableEpochs.toml | 3 + common/constants.go | 3 + config/epochConfig.go | 1 + config/tomlConfig_test.go | 4 + .../epochStartInterceptorsContainerFactory.go | 78 +++++------ epochStart/bootstrap/process.go | 34 ++--- factory/processComponents.go | 98 +++++++------- genesis/process/shardGenesisBlockCreator.go | 1 + process/dataValidators/txValidator.go | 123 +++++++++++++----- process/factory/interceptorscontainer/args.go | 47 +++---- .../metaInterceptorsContainerFactory.go | 24 ++-- .../factory/argInterceptedDataFactory.go | 25 ++-- 12 files changed, 254 insertions(+), 187 deletions(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 4b33c4bda73..f9920a0d79c 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -184,6 +184,9 @@ # disabled in the blockchain hook component DoNotReturnOldBlockInBlockchainHookEnableEpoch = 2 + # FreezeAccountFeatureEnableEpoch represents the epoch when the freeze account feature is enabled in the protocol + FreezeAccountFeatureEnableEpoch = 10 + # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ { EpochEnable = 0, MaxNumNodes = 36, NodesToShufflePerShard = 4 }, diff --git a/common/constants.go b/common/constants.go index 5c47aa54fea..7763d16b479 100644 --- a/common/constants.go +++ b/common/constants.go @@ -472,6 +472,9 @@ const ( // MetricBuiltInFunctionOnMetaEnableEpoch represents the epoch when the builtin functions on metachain are enabled MetricBuiltInFunctionOnMetaEnableEpoch = "erd_builtin_function_on_meta_enable_epoch" + + // MetricFreezeAccountFeatureEnableEpoch represents the epoch when the freeze account feature is enabled + MetricFreezeAccountFeatureEnableEpoch = "erd_freeze_account_feature_enable_epoch" ) const ( diff --git a/config/epochConfig.go b/config/epochConfig.go index b9678a3b060..2270b4748b1 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -74,6 +74,7 @@ type EnableEpochs struct { TransformToMultiShardCreateEnableEpoch uint32 ESDTRegisterAndSetAllRolesEnableEpoch uint32 DoNotReturnOldBlockInBlockchainHookEnableEpoch uint32 + FreezeAccountFeatureEnableEpoch uint32 } // GasScheduleByEpochs represents a gas schedule toml entry that will be applied from the provided epoch diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index c99e4b8fc5e..5f57093fc9b 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -641,6 +641,9 @@ func TestEnableEpochConfig(t *testing.T) { # ESDTRegisterAndSetAllRolesEnableEpoch represents the epoch when new function to register tickerID and set all roles is enabled ESDTRegisterAndSetAllRolesEnableEpoch = 52 + # FreezeAccountFeatureEnableEpoch represents the epoch when freeze account feature is enabled + FreezeAccountFeatureEnableEpoch = 10 + # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ { EpochEnable = 44, MaxNumNodes = 2169, NodesToShufflePerShard = 80 }, @@ -720,6 +723,7 @@ func TestEnableEpochConfig(t *testing.T) { StorageAPICostOptimizationEnableEpoch: 50, TransformToMultiShardCreateEnableEpoch: 51, ESDTRegisterAndSetAllRolesEnableEpoch: 52, + FreezeAccountFeatureEnableEpoch: 10, }, GasSchedule: GasScheduleConfig{ GasScheduleByEpochs: []GasScheduleByEpochs{ diff --git a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go index 3f17ba1205d..260424b177a 100644 --- a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go +++ b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go @@ -24,22 +24,22 @@ const timeSpanForBadHeaders = time.Minute // ArgsEpochStartInterceptorContainer holds the arguments needed for creating a new epoch start interceptors // container factory type ArgsEpochStartInterceptorContainer struct { - CoreComponents process.CoreComponentsHolder - CryptoComponents process.CryptoComponentsHolder - Config config.Config - ShardCoordinator sharding.Coordinator - Messenger process.TopicHandler - DataPool dataRetriever.PoolsHolder - WhiteListHandler update.WhiteListHandler - WhiteListerVerifiedTxs update.WhiteListHandler - AddressPubkeyConv core.PubkeyConverter - NonceConverter typeConverters.Uint64ByteSliceConverter - ChainID []byte - ArgumentsParser process.ArgumentsParser - HeaderIntegrityVerifier process.HeaderIntegrityVerifier - EnableSignTxWithHashEpoch uint32 - EpochNotifier process.EpochNotifier - RequestHandler process.RequestHandler + CoreComponents process.CoreComponentsHolder + CryptoComponents process.CryptoComponentsHolder + Config config.Config + ShardCoordinator sharding.Coordinator + Messenger process.TopicHandler + DataPool dataRetriever.PoolsHolder + WhiteListHandler update.WhiteListHandler + WhiteListerVerifiedTxs update.WhiteListHandler + AddressPubkeyConv core.PubkeyConverter + NonceConverter typeConverters.Uint64ByteSliceConverter + ChainID []byte + ArgumentsParser process.ArgumentsParser + HeaderIntegrityVerifier process.HeaderIntegrityVerifier + EnableEpochs config.EnableEpochs + EpochNotifier process.EpochNotifier + RequestHandler process.RequestHandler } // NewEpochStartInterceptorsContainer will return a real interceptors container factory, but with many disabled components @@ -73,29 +73,29 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) epochStartTrigger := disabled.NewEpochStartTrigger() containerFactoryArgs := interceptorscontainer.CommonInterceptorsContainerFactoryArgs{ - CoreComponents: args.CoreComponents, - CryptoComponents: cryptoComponents, - ShardCoordinator: args.ShardCoordinator, - NodesCoordinator: nodesCoordinator, - Messenger: args.Messenger, - Store: storer, - DataPool: args.DataPool, - Accounts: accountsAdapter, - MaxTxNonceDeltaAllowed: common.MaxTxNonceDeltaAllowed, - TxFeeHandler: feeHandler, - BlockBlackList: blackListHandler, - HeaderSigVerifier: headerSigVerifier, - HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, - SizeCheckDelta: uint32(sizeCheckDelta), - ValidityAttester: validityAttester, - EpochStartTrigger: epochStartTrigger, - WhiteListHandler: args.WhiteListHandler, - WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, - AntifloodHandler: antiFloodHandler, - ArgumentsParser: args.ArgumentsParser, - EnableSignTxWithHashEpoch: args.EnableSignTxWithHashEpoch, - PreferredPeersHolder: disabled.NewPreferredPeersHolder(), - RequestHandler: args.RequestHandler, + CoreComponents: args.CoreComponents, + CryptoComponents: cryptoComponents, + ShardCoordinator: args.ShardCoordinator, + NodesCoordinator: nodesCoordinator, + Messenger: args.Messenger, + Store: storer, + DataPool: args.DataPool, + Accounts: accountsAdapter, + MaxTxNonceDeltaAllowed: common.MaxTxNonceDeltaAllowed, + TxFeeHandler: feeHandler, + BlockBlackList: blackListHandler, + HeaderSigVerifier: headerSigVerifier, + HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, + SizeCheckDelta: uint32(sizeCheckDelta), + ValidityAttester: validityAttester, + EpochStartTrigger: epochStartTrigger, + WhiteListHandler: args.WhiteListHandler, + WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, + AntifloodHandler: antiFloodHandler, + ArgumentsParser: args.ArgumentsParser, + EnableEpochs: args.EnableEpochs, + PreferredPeersHolder: disabled.NewPreferredPeersHolder(), + RequestHandler: args.RequestHandler, } interceptorsContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(containerFactoryArgs) diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 177dc62074d..aca3485d11e 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -167,10 +167,10 @@ type ArgsEpochStartBootstrap struct { } type dataToSync struct { - ownShardHdr data.ShardHeaderHandler - rootHashToSync []byte - withScheduled bool - additionalHeaders map[string]data.HeaderHandler + ownShardHdr data.ShardHeaderHandler + rootHashToSync []byte + withScheduled bool + additionalHeaders map[string]data.HeaderHandler } // NewEpochStartBootstrap will return a new instance of epochStartBootstrap @@ -519,19 +519,19 @@ func (e *epochStartBootstrap) createSyncers() error { var err error args := factoryInterceptors.ArgsEpochStartInterceptorContainer{ - CoreComponents: e.coreComponentsHolder, - CryptoComponents: e.cryptoComponentsHolder, - Config: e.generalConfig, - ShardCoordinator: e.shardCoordinator, - Messenger: e.messenger, - DataPool: e.dataPool, - WhiteListHandler: e.whiteListHandler, - WhiteListerVerifiedTxs: e.whiteListerVerifiedTxs, - ArgumentsParser: e.argumentsParser, - HeaderIntegrityVerifier: e.headerIntegrityVerifier, - EnableSignTxWithHashEpoch: e.enableEpochs.TransactionSignedWithTxHashEnableEpoch, - EpochNotifier: e.epochNotifier, - RequestHandler: e.requestHandler, + CoreComponents: e.coreComponentsHolder, + CryptoComponents: e.cryptoComponentsHolder, + Config: e.generalConfig, + ShardCoordinator: e.shardCoordinator, + Messenger: e.messenger, + DataPool: e.dataPool, + WhiteListHandler: e.whiteListHandler, + WhiteListerVerifiedTxs: e.whiteListerVerifiedTxs, + ArgumentsParser: e.argumentsParser, + HeaderIntegrityVerifier: e.headerIntegrityVerifier, + EnableEpochs: e.enableEpochs, + EpochNotifier: e.epochNotifier, + RequestHandler: e.requestHandler, } e.interceptorContainer, err = factoryInterceptors.NewEpochStartInterceptorsContainer(args) diff --git a/factory/processComponents.go b/factory/processComponents.go index 7582228fd72..033c17635f0 100644 --- a/factory/processComponents.go +++ b/factory/processComponents.go @@ -1242,31 +1242,30 @@ func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { headerBlackList := timecache.NewTimeCache(timeSpanForBadHeaders) shardInterceptorsContainerFactoryArgs := interceptorscontainer.CommonInterceptorsContainerFactoryArgs{ - CoreComponents: pcf.coreData, - CryptoComponents: pcf.crypto, - Accounts: pcf.state.AccountsAdapter(), - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - NodesCoordinator: pcf.nodesCoordinator, - Messenger: pcf.network.NetworkMessenger(), - Store: pcf.data.StorageService(), - DataPool: pcf.data.Datapool(), - MaxTxNonceDeltaAllowed: common.MaxTxNonceDeltaAllowed, - TxFeeHandler: pcf.coreData.EconomicsData(), - BlockBlackList: headerBlackList, - HeaderSigVerifier: headerSigVerifier, - HeaderIntegrityVerifier: headerIntegrityVerifier, - ValidityAttester: validityAttester, - EpochStartTrigger: epochStartTrigger, - WhiteListHandler: pcf.whiteListHandler, - WhiteListerVerifiedTxs: pcf.whiteListerVerifiedTxs, - AntifloodHandler: pcf.network.InputAntiFloodHandler(), - ArgumentsParser: smartContract.NewArgumentParser(), - SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, - EnableSignTxWithHashEpoch: pcf.epochConfig.EnableEpochs.TransactionSignedWithTxHashEnableEpoch, - PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), - RequestHandler: requestHandler, - } - log.Debug("shardInterceptor: enable epoch for transaction signed with tx hash", "epoch", shardInterceptorsContainerFactoryArgs.EnableSignTxWithHashEpoch) + CoreComponents: pcf.coreData, + CryptoComponents: pcf.crypto, + Accounts: pcf.state.AccountsAdapter(), + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + NodesCoordinator: pcf.nodesCoordinator, + Messenger: pcf.network.NetworkMessenger(), + Store: pcf.data.StorageService(), + DataPool: pcf.data.Datapool(), + MaxTxNonceDeltaAllowed: common.MaxTxNonceDeltaAllowed, + TxFeeHandler: pcf.coreData.EconomicsData(), + BlockBlackList: headerBlackList, + HeaderSigVerifier: headerSigVerifier, + HeaderIntegrityVerifier: headerIntegrityVerifier, + ValidityAttester: validityAttester, + EpochStartTrigger: epochStartTrigger, + WhiteListHandler: pcf.whiteListHandler, + WhiteListerVerifiedTxs: pcf.whiteListerVerifiedTxs, + AntifloodHandler: pcf.network.InputAntiFloodHandler(), + ArgumentsParser: smartContract.NewArgumentParser(), + SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, + EnableEpochs: pcf.epochConfig.EnableEpochs, + PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), + RequestHandler: requestHandler, + } interceptorContainerFactory, err := interceptorscontainer.NewShardInterceptorsContainerFactory(shardInterceptorsContainerFactoryArgs) if err != nil { @@ -1285,31 +1284,30 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { headerBlackList := timecache.NewTimeCache(timeSpanForBadHeaders) metaInterceptorsContainerFactoryArgs := interceptorscontainer.CommonInterceptorsContainerFactoryArgs{ - CoreComponents: pcf.coreData, - CryptoComponents: pcf.crypto, - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), - NodesCoordinator: pcf.nodesCoordinator, - Messenger: pcf.network.NetworkMessenger(), - Store: pcf.data.StorageService(), - DataPool: pcf.data.Datapool(), - Accounts: pcf.state.AccountsAdapter(), - MaxTxNonceDeltaAllowed: common.MaxTxNonceDeltaAllowed, - TxFeeHandler: pcf.coreData.EconomicsData(), - BlockBlackList: headerBlackList, - HeaderSigVerifier: headerSigVerifier, - HeaderIntegrityVerifier: headerIntegrityVerifier, - ValidityAttester: validityAttester, - EpochStartTrigger: epochStartTrigger, - WhiteListHandler: pcf.whiteListHandler, - WhiteListerVerifiedTxs: pcf.whiteListerVerifiedTxs, - AntifloodHandler: pcf.network.InputAntiFloodHandler(), - ArgumentsParser: smartContract.NewArgumentParser(), - SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, - EnableSignTxWithHashEpoch: pcf.epochConfig.EnableEpochs.TransactionSignedWithTxHashEnableEpoch, - PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), - RequestHandler: requestHandler, - } - log.Debug("metaInterceptor: enable epoch for transaction signed with tx hash", "epoch", metaInterceptorsContainerFactoryArgs.EnableSignTxWithHashEpoch) + CoreComponents: pcf.coreData, + CryptoComponents: pcf.crypto, + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + NodesCoordinator: pcf.nodesCoordinator, + Messenger: pcf.network.NetworkMessenger(), + Store: pcf.data.StorageService(), + DataPool: pcf.data.Datapool(), + Accounts: pcf.state.AccountsAdapter(), + MaxTxNonceDeltaAllowed: common.MaxTxNonceDeltaAllowed, + TxFeeHandler: pcf.coreData.EconomicsData(), + BlockBlackList: headerBlackList, + HeaderSigVerifier: headerSigVerifier, + HeaderIntegrityVerifier: headerIntegrityVerifier, + ValidityAttester: validityAttester, + EpochStartTrigger: epochStartTrigger, + WhiteListHandler: pcf.whiteListHandler, + WhiteListerVerifiedTxs: pcf.whiteListerVerifiedTxs, + AntifloodHandler: pcf.network.InputAntiFloodHandler(), + ArgumentsParser: smartContract.NewArgumentParser(), + SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, + EnableEpochs: pcf.epochConfig.EnableEpochs, + PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), + RequestHandler: requestHandler, + } interceptorContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorsContainerFactoryArgs) if err != nil { diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index b8b400038cc..39fe358605e 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -112,6 +112,7 @@ func createGenesisConfig() config.EnableEpochs { TransformToMultiShardCreateEnableEpoch: unreachableEpoch, ESDTRegisterAndSetAllRolesEnableEpoch: unreachableEpoch, ScheduledMiniBlocksEnableEpoch: unreachableEpoch, + FreezeAccountFeatureEnableEpoch: unreachableEpoch, } } diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 11aa2b6466b..d751d8acf1d 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -56,8 +56,6 @@ func NewTxValidator( // CheckTxValidity will filter transactions that needs to be added in pools func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandler) error { - // TODO: Refactor, extract methods. - interceptedData, ok := interceptedTx.(process.InterceptedData) if ok { if txv.whiteListHandler.IsWhiteListed(interceptedData) { @@ -65,56 +63,60 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandl } } - shardID := txv.shardCoordinator.SelfId() - txShardID := interceptedTx.SenderShardId() - senderIsInAnotherShard := shardID != txShardID - if senderIsInAnotherShard { + if txv.isSenderInDifferentShard(interceptedTx) { return nil } - senderAddress := interceptedTx.SenderAddress() - accountHandler, err := txv.accounts.GetExistingAccount(senderAddress) + accountHandler, err := txv.getSenderAccount(interceptedTx) if err != nil { - return fmt.Errorf("%w for address %s and shard %d, err: %s", - process.ErrAccountNotFound, - txv.pubkeyConverter.Encode(senderAddress), - shardID, - err.Error(), - ) + return err } - accountNonce := accountHandler.GetNonce() - txNonce := interceptedTx.Nonce() - lowerNonceInTx := txNonce < accountNonce - veryHighNonceInTx := txNonce > accountNonce+uint64(txv.maxNonceDeltaAllowed) - isTxRejected := lowerNonceInTx || veryHighNonceInTx - if isTxRejected { - return fmt.Errorf("%w lowerNonceInTx: %v, veryHighNonceInTx: %v", - process.ErrWrongTransaction, - lowerNonceInTx, - veryHighNonceInTx, - ) + return txv.checkAccount(interceptedTx, accountHandler) +} + +func (txv *txValidator) checkAccount( + interceptedTx process.InterceptedTxHandler, + accountHandler vmcommon.AccountHandler, +) error { + err := txv.checkNonce(interceptedTx, accountHandler) + if err != nil { + return err } - account, ok := accountHandler.(state.UserAccountHandler) - if !ok { - return fmt.Errorf("%w, account is not of type *state.Account, address: %s", - process.ErrWrongTypeAssertion, - txv.pubkeyConverter.Encode(senderAddress), - ) + account, err := txv.getSenderUserAccount(interceptedTx, accountHandler) + if err != nil { + return err } - txData, err := getTxData(interceptedTx) + err = checkPermission(interceptedTx, account) if err != nil { return err } - if isAccountFrozen(account) && !isBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { - return state.ErrOperationNotPermitted + + return txv.checkBalance(interceptedTx, account) +} + +func (txv *txValidator) getSenderUserAccount( + interceptedTx process.InterceptedTxHandler, + accountHandler vmcommon.AccountHandler, +) (state.UserAccountHandler, error) { + senderAddress := interceptedTx.SenderAddress() + account, ok := accountHandler.(state.UserAccountHandler) + if !ok { + return nil, fmt.Errorf("%w, account is not of type *state.Account, address: %s", + process.ErrWrongTypeAssertion, + txv.pubkeyConverter.Encode(senderAddress), + ) } + return account, nil +} +func (txv *txValidator) checkBalance(interceptedTx process.InterceptedTxHandler, account state.UserAccountHandler) error { accountBalance := account.GetBalance() txFee := interceptedTx.Fee() if accountBalance.Cmp(txFee) < 0 { + senderAddress := interceptedTx.SenderAddress() return fmt.Errorf("%w, for address: %s, wanted %v, have %v", process.ErrInsufficientFunds, txv.pubkeyConverter.Encode(senderAddress), @@ -126,6 +128,59 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandl return nil } +func checkPermission(interceptedTx process.InterceptedTxHandler, account state.UserAccountHandler) error { + txData, err := getTxData(interceptedTx) + if err != nil { + return err + } + if isAccountFrozen(account) { + if isBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { + return state.ErrOperationNotPermitted + } + + // TODO: verify guardian signature on Tx + interceptedTx.Transaction() + } + + return nil +} + +func (txv *txValidator) checkNonce(interceptedTx process.InterceptedTxHandler, accountHandler vmcommon.AccountHandler) error { + accountNonce := accountHandler.GetNonce() + txNonce := interceptedTx.Nonce() + lowerNonceInTx := txNonce < accountNonce + veryHighNonceInTx := txNonce > accountNonce+uint64(txv.maxNonceDeltaAllowed) + if lowerNonceInTx || veryHighNonceInTx { + return fmt.Errorf("%w lowerNonceInTx: %v, veryHighNonceInTx: %v", + process.ErrWrongTransaction, + lowerNonceInTx, + veryHighNonceInTx, + ) + } + return nil +} + +func (txv *txValidator) isSenderInDifferentShard(interceptedTx process.InterceptedTxHandler) bool { + shardID := txv.shardCoordinator.SelfId() + txShardID := interceptedTx.SenderShardId() + return shardID != txShardID +} + +func (txv *txValidator) getSenderAccount(interceptedTx process.InterceptedTxHandler) (vmcommon.AccountHandler, error) { + senderAddress := interceptedTx.SenderAddress() + accountHandler, err := txv.accounts.GetExistingAccount(senderAddress) + if err != nil { + return nil, fmt.Errorf("%w for address %s and shard %d, err: %s", + process.ErrAccountNotFound, + txv.pubkeyConverter.Encode(senderAddress), + txv.shardCoordinator.SelfId(), + err.Error(), + ) + } + + return accountHandler, nil +} + func getTxData(interceptedTx process.InterceptedTxHandler) ([]byte, error) { tx := interceptedTx.Transaction() if tx == nil { diff --git a/process/factory/interceptorscontainer/args.go b/process/factory/interceptorscontainer/args.go index 66d6580745e..06250c34cb8 100644 --- a/process/factory/interceptorscontainer/args.go +++ b/process/factory/interceptorscontainer/args.go @@ -1,6 +1,7 @@ package interceptorscontainer import ( + "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" @@ -9,27 +10,27 @@ import ( // CommonInterceptorsContainerFactoryArgs holds the arguments needed for the metachain/shard interceptors factories type CommonInterceptorsContainerFactoryArgs struct { - CoreComponents process.CoreComponentsHolder - CryptoComponents process.CryptoComponentsHolder - Accounts state.AccountsAdapter - ShardCoordinator sharding.Coordinator - NodesCoordinator sharding.NodesCoordinator - Messenger process.TopicHandler - Store dataRetriever.StorageService - DataPool dataRetriever.PoolsHolder - MaxTxNonceDeltaAllowed int - TxFeeHandler process.FeeHandler - BlockBlackList process.TimeCacher - HeaderSigVerifier process.InterceptedHeaderSigVerifier - HeaderIntegrityVerifier process.HeaderIntegrityVerifier - ValidityAttester process.ValidityAttester - EpochStartTrigger process.EpochStartTriggerHandler - WhiteListHandler process.WhiteListHandler - WhiteListerVerifiedTxs process.WhiteListHandler - AntifloodHandler process.P2PAntifloodHandler - ArgumentsParser process.ArgumentsParser - PreferredPeersHolder process.PreferredPeersHolderHandler - SizeCheckDelta uint32 - EnableSignTxWithHashEpoch uint32 - RequestHandler process.RequestHandler + CoreComponents process.CoreComponentsHolder + CryptoComponents process.CryptoComponentsHolder + Accounts state.AccountsAdapter + ShardCoordinator sharding.Coordinator + NodesCoordinator sharding.NodesCoordinator + Messenger process.TopicHandler + Store dataRetriever.StorageService + DataPool dataRetriever.PoolsHolder + MaxTxNonceDeltaAllowed int + TxFeeHandler process.FeeHandler + BlockBlackList process.TimeCacher + HeaderSigVerifier process.InterceptedHeaderSigVerifier + HeaderIntegrityVerifier process.HeaderIntegrityVerifier + ValidityAttester process.ValidityAttester + EpochStartTrigger process.EpochStartTriggerHandler + WhiteListHandler process.WhiteListHandler + WhiteListerVerifiedTxs process.WhiteListHandler + AntifloodHandler process.P2PAntifloodHandler + ArgumentsParser process.ArgumentsParser + PreferredPeersHolder process.PreferredPeersHolderHandler + SizeCheckDelta uint32 + EnableEpochs config.EnableEpochs + RequestHandler process.RequestHandler } diff --git a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go index fe6a17c03bb..c6ade2c6b26 100644 --- a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go @@ -71,18 +71,18 @@ func NewMetaInterceptorsContainerFactory( } argInterceptorFactory := &interceptorFactory.ArgInterceptedDataFactory{ - CoreComponents: args.CoreComponents, - CryptoComponents: args.CryptoComponents, - ShardCoordinator: args.ShardCoordinator, - NodesCoordinator: args.NodesCoordinator, - FeeHandler: args.TxFeeHandler, - HeaderSigVerifier: args.HeaderSigVerifier, - HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, - ValidityAttester: args.ValidityAttester, - EpochStartTrigger: args.EpochStartTrigger, - WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, - ArgsParser: args.ArgumentsParser, - EnableSignTxWithHashEpoch: args.EnableSignTxWithHashEpoch, + CoreComponents: args.CoreComponents, + CryptoComponents: args.CryptoComponents, + ShardCoordinator: args.ShardCoordinator, + NodesCoordinator: args.NodesCoordinator, + FeeHandler: args.TxFeeHandler, + HeaderSigVerifier: args.HeaderSigVerifier, + HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, + ValidityAttester: args.ValidityAttester, + EpochStartTrigger: args.EpochStartTrigger, + WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, + ArgsParser: args.ArgumentsParser, + EnableEpochs: args.EnableEpochs, } container := containers.NewInterceptorsContainer() diff --git a/process/interceptors/factory/argInterceptedDataFactory.go b/process/interceptors/factory/argInterceptedDataFactory.go index 0dfa47118fa..71de6261aad 100644 --- a/process/interceptors/factory/argInterceptedDataFactory.go +++ b/process/interceptors/factory/argInterceptedDataFactory.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" ) @@ -39,16 +40,16 @@ type interceptedDataCryptoComponentsHolder interface { // ArgInterceptedDataFactory holds all dependencies required by the shard and meta intercepted data factory in order to create // new instances type ArgInterceptedDataFactory struct { - CoreComponents interceptedDataCoreComponentsHolder - CryptoComponents interceptedDataCryptoComponentsHolder - ShardCoordinator sharding.Coordinator - NodesCoordinator sharding.NodesCoordinator - FeeHandler process.FeeHandler - WhiteListerVerifiedTxs process.WhiteListHandler - HeaderSigVerifier process.InterceptedHeaderSigVerifier - ValidityAttester process.ValidityAttester - HeaderIntegrityVerifier process.HeaderIntegrityVerifier - EpochStartTrigger process.EpochStartTriggerHandler - ArgsParser process.ArgumentsParser - EnableSignTxWithHashEpoch uint32 + CoreComponents interceptedDataCoreComponentsHolder + CryptoComponents interceptedDataCryptoComponentsHolder + ShardCoordinator sharding.Coordinator + NodesCoordinator sharding.NodesCoordinator + FeeHandler process.FeeHandler + WhiteListerVerifiedTxs process.WhiteListHandler + HeaderSigVerifier process.InterceptedHeaderSigVerifier + ValidityAttester process.ValidityAttester + HeaderIntegrityVerifier process.HeaderIntegrityVerifier + EpochStartTrigger process.EpochStartTriggerHandler + ArgsParser process.ArgumentsParser + EnableEpochs config.EnableEpochs } From 81feb24b195db9eb48a7dd611ee7ae98f76fbf71 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 25 Feb 2022 12:44:18 +0200 Subject: [PATCH 009/335] process, update, node: fixes enableEpochs arguments --- node/nodeHelper.go | 2 +- .../shardInterceptorsContainerFactory.go | 24 +++---- .../factory/interceptedTxDataFactory.go | 2 +- update/factory/exportHandlerFactory.go | 49 +++++++------- update/factory/fullSyncInterceptors.go | 67 ++++++++++--------- 5 files changed, 72 insertions(+), 72 deletions(-) diff --git a/node/nodeHelper.go b/node/nodeHelper.go index 66322869013..4fe597b274a 100644 --- a/node/nodeHelper.go +++ b/node/nodeHelper.go @@ -80,7 +80,7 @@ func CreateHardForkTrigger( OutputAntifloodHandler: network.OutputAntiFloodHandler(), RoundHandler: process.RoundHandler(), InterceptorDebugConfig: config.Debug.InterceptorResolver, - EnableSignTxWithHashEpoch: epochConfig.EnableEpochs.TransactionSignedWithTxHashEnableEpoch, + EnableEpochs: epochConfig.EnableEpochs, MaxHardCapForMissingNodes: config.TrieSync.MaxHardCapForMissingNodes, NumConcurrentTrieSyncers: config.TrieSync.NumConcurrentTrieSyncers, TrieSyncerVersion: config.TrieSync.TrieSyncerVersion, diff --git a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go index ac4da6834d7..b6c088cc30d 100644 --- a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go @@ -70,18 +70,18 @@ func NewShardInterceptorsContainerFactory( } argInterceptorFactory := &interceptorFactory.ArgInterceptedDataFactory{ - CoreComponents: args.CoreComponents, - CryptoComponents: args.CryptoComponents, - ShardCoordinator: args.ShardCoordinator, - NodesCoordinator: args.NodesCoordinator, - FeeHandler: args.TxFeeHandler, - HeaderSigVerifier: args.HeaderSigVerifier, - HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, - ValidityAttester: args.ValidityAttester, - EpochStartTrigger: args.EpochStartTrigger, - WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, - ArgsParser: args.ArgumentsParser, - EnableSignTxWithHashEpoch: args.EnableSignTxWithHashEpoch, + CoreComponents: args.CoreComponents, + CryptoComponents: args.CryptoComponents, + ShardCoordinator: args.ShardCoordinator, + NodesCoordinator: args.NodesCoordinator, + FeeHandler: args.TxFeeHandler, + HeaderSigVerifier: args.HeaderSigVerifier, + HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, + ValidityAttester: args.ValidityAttester, + EpochStartTrigger: args.EpochStartTrigger, + WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, + ArgsParser: args.ArgumentsParser, + EnableEpochs: args.EnableEpochs, } container := containers.NewInterceptorsContainer() diff --git a/process/interceptors/factory/interceptedTxDataFactory.go b/process/interceptors/factory/interceptedTxDataFactory.go index 813213e6acb..6b69ef2e03b 100644 --- a/process/interceptors/factory/interceptedTxDataFactory.go +++ b/process/interceptors/factory/interceptedTxDataFactory.go @@ -108,7 +108,7 @@ func NewInterceptedTxDataFactory(argument *ArgInterceptedDataFactory) (*intercep chainID: []byte(argument.CoreComponents.ChainID()), minTransactionVersion: argument.CoreComponents.MinTransactionVersion(), epochStartTrigger: argument.EpochStartTrigger, - enableSignedTxWithHashEpoch: argument.EnableSignTxWithHashEpoch, + enableSignedTxWithHashEpoch: argument.EnableEpochs.TransactionSignedWithTxHashEnableEpoch, txSignHasher: argument.CoreComponents.TxSignHasher(), txVersionChecker: argument.CoreComponents.TxVersionChecker(), } diff --git a/update/factory/exportHandlerFactory.go b/update/factory/exportHandlerFactory.go index 6630265d236..2bcc6e31e12 100644 --- a/update/factory/exportHandlerFactory.go +++ b/update/factory/exportHandlerFactory.go @@ -62,7 +62,7 @@ type ArgsExporter struct { OutputAntifloodHandler process.P2PAntifloodHandler RoundHandler process.RoundHandler InterceptorDebugConfig config.InterceptorResolverDebugConfig - EnableSignTxWithHashEpoch uint32 + EnableEpochs config.EnableEpochs MaxHardCapForMissingNodes int NumConcurrentTrieSyncers int TrieSyncerVersion int @@ -98,7 +98,7 @@ type exportHandlerFactory struct { outputAntifloodHandler process.P2PAntifloodHandler roundHandler process.RoundHandler interceptorDebugConfig config.InterceptorResolverDebugConfig - enableSignTxWithHashEpoch uint32 + enableEpochs config.EnableEpochs maxHardCapForMissingNodes int numConcurrentTrieSyncers int trieSyncerVersion int @@ -244,12 +244,11 @@ func NewExportHandlerFactory(args ArgsExporter) (*exportHandlerFactory, error) { maxTrieLevelInMemory: args.MaxTrieLevelInMemory, roundHandler: args.RoundHandler, interceptorDebugConfig: args.InterceptorDebugConfig, - enableSignTxWithHashEpoch: args.EnableSignTxWithHashEpoch, + enableEpochs: args.EnableEpochs, maxHardCapForMissingNodes: args.MaxHardCapForMissingNodes, numConcurrentTrieSyncers: args.NumConcurrentTrieSyncers, trieSyncerVersion: args.TrieSyncerVersion, } - log.Debug("exportHandlerFactory: enable epoch for transaction signed with tx hash", "epoch", e.enableSignTxWithHashEpoch) return e, nil } @@ -509,27 +508,27 @@ func (e *exportHandlerFactory) prepareFolders(folder string) error { func (e *exportHandlerFactory) createInterceptors() error { argsInterceptors := ArgsNewFullSyncInterceptorsContainerFactory{ - CoreComponents: e.CoreComponents, - CryptoComponents: e.CryptoComponents, - Accounts: e.accounts, - ShardCoordinator: e.shardCoordinator, - NodesCoordinator: e.nodesCoordinator, - Messenger: e.messenger, - Store: e.storageService, - DataPool: e.dataPool, - MaxTxNonceDeltaAllowed: math.MaxInt32, - TxFeeHandler: &disabled.FeeHandler{}, - BlockBlackList: timecache.NewTimeCache(time.Second), - HeaderSigVerifier: e.headerSigVerifier, - HeaderIntegrityVerifier: e.headerIntegrityVerifier, - SizeCheckDelta: math.MaxUint32, - ValidityAttester: e.validityAttester, - EpochStartTrigger: e.epochStartTrigger, - WhiteListHandler: e.whiteListHandler, - WhiteListerVerifiedTxs: e.whiteListerVerifiedTxs, - InterceptorsContainer: e.interceptorsContainer, - AntifloodHandler: e.inputAntifloodHandler, - EnableSignTxWithHashEpoch: e.enableSignTxWithHashEpoch, + CoreComponents: e.CoreComponents, + CryptoComponents: e.CryptoComponents, + Accounts: e.accounts, + ShardCoordinator: e.shardCoordinator, + NodesCoordinator: e.nodesCoordinator, + Messenger: e.messenger, + Store: e.storageService, + DataPool: e.dataPool, + MaxTxNonceDeltaAllowed: math.MaxInt32, + TxFeeHandler: &disabled.FeeHandler{}, + BlockBlackList: timecache.NewTimeCache(time.Second), + HeaderSigVerifier: e.headerSigVerifier, + HeaderIntegrityVerifier: e.headerIntegrityVerifier, + SizeCheckDelta: math.MaxUint32, + ValidityAttester: e.validityAttester, + EpochStartTrigger: e.epochStartTrigger, + WhiteListHandler: e.whiteListHandler, + WhiteListerVerifiedTxs: e.whiteListerVerifiedTxs, + InterceptorsContainer: e.interceptorsContainer, + AntifloodHandler: e.inputAntifloodHandler, + EnableEpochs: e.enableEpochs, } fullSyncInterceptors, err := NewFullSyncInterceptorsContainerFactory(argsInterceptors) if err != nil { diff --git a/update/factory/fullSyncInterceptors.go b/update/factory/fullSyncInterceptors.go index 09ddbe25259..f8d9d79b0f0 100644 --- a/update/factory/fullSyncInterceptors.go +++ b/update/factory/fullSyncInterceptors.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/throttler" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go/common" + "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/dataValidators" @@ -46,27 +47,27 @@ type fullSyncInterceptorsContainerFactory struct { // ArgsNewFullSyncInterceptorsContainerFactory holds the arguments needed for fullSyncInterceptorsContainerFactory type ArgsNewFullSyncInterceptorsContainerFactory struct { - CoreComponents process.CoreComponentsHolder - CryptoComponents process.CryptoComponentsHolder - Accounts state.AccountsAdapter - ShardCoordinator sharding.Coordinator - NodesCoordinator sharding.NodesCoordinator - Messenger process.TopicHandler - Store dataRetriever.StorageService - DataPool dataRetriever.PoolsHolder - MaxTxNonceDeltaAllowed int - TxFeeHandler process.FeeHandler - BlockBlackList process.TimeCacher - HeaderSigVerifier process.InterceptedHeaderSigVerifier - HeaderIntegrityVerifier process.HeaderIntegrityVerifier - SizeCheckDelta uint32 - ValidityAttester process.ValidityAttester - EpochStartTrigger process.EpochStartTriggerHandler - WhiteListHandler update.WhiteListHandler - WhiteListerVerifiedTxs update.WhiteListHandler - InterceptorsContainer process.InterceptorsContainer - AntifloodHandler process.P2PAntifloodHandler - EnableSignTxWithHashEpoch uint32 + CoreComponents process.CoreComponentsHolder + CryptoComponents process.CryptoComponentsHolder + Accounts state.AccountsAdapter + ShardCoordinator sharding.Coordinator + NodesCoordinator sharding.NodesCoordinator + Messenger process.TopicHandler + Store dataRetriever.StorageService + DataPool dataRetriever.PoolsHolder + MaxTxNonceDeltaAllowed int + TxFeeHandler process.FeeHandler + BlockBlackList process.TimeCacher + HeaderSigVerifier process.InterceptedHeaderSigVerifier + HeaderIntegrityVerifier process.HeaderIntegrityVerifier + SizeCheckDelta uint32 + ValidityAttester process.ValidityAttester + EpochStartTrigger process.EpochStartTriggerHandler + WhiteListHandler update.WhiteListHandler + WhiteListerVerifiedTxs update.WhiteListHandler + InterceptorsContainer process.InterceptorsContainer + AntifloodHandler process.P2PAntifloodHandler + EnableEpochs config.EnableEpochs } // NewFullSyncInterceptorsContainerFactory is responsible for creating a new interceptors factory object @@ -122,18 +123,18 @@ func NewFullSyncInterceptorsContainerFactory( } argInterceptorFactory := &interceptorFactory.ArgInterceptedDataFactory{ - CoreComponents: args.CoreComponents, - CryptoComponents: args.CryptoComponents, - ShardCoordinator: args.ShardCoordinator, - NodesCoordinator: args.NodesCoordinator, - FeeHandler: args.TxFeeHandler, - HeaderSigVerifier: args.HeaderSigVerifier, - HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, - ValidityAttester: args.ValidityAttester, - EpochStartTrigger: args.EpochStartTrigger, - WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, - ArgsParser: smartContract.NewArgumentParser(), - EnableSignTxWithHashEpoch: args.EnableSignTxWithHashEpoch, + CoreComponents: args.CoreComponents, + CryptoComponents: args.CryptoComponents, + ShardCoordinator: args.ShardCoordinator, + NodesCoordinator: args.NodesCoordinator, + FeeHandler: args.TxFeeHandler, + HeaderSigVerifier: args.HeaderSigVerifier, + HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, + ValidityAttester: args.ValidityAttester, + EpochStartTrigger: args.EpochStartTrigger, + WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, + ArgsParser: smartContract.NewArgumentParser(), + EnableEpochs: args.EnableEpochs, } icf := &fullSyncInterceptorsContainerFactory{ From 2620cf28b0323c28c3641b2da2dc2127ff83e70a Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 2 Mar 2022 15:24:33 +0200 Subject: [PATCH 010/335] cmd: update gas schedules for new builtin functions FreezeAccount and SetGuardian --- cmd/node/config/gasSchedules/gasScheduleV1.toml | 2 ++ cmd/node/config/gasSchedules/gasScheduleV2.toml | 2 ++ cmd/node/config/gasSchedules/gasScheduleV3.toml | 2 ++ cmd/node/config/gasSchedules/gasScheduleV4.toml | 2 ++ cmd/node/config/gasSchedules/gasScheduleV5.toml | 2 ++ 5 files changed, 10 insertions(+) diff --git a/cmd/node/config/gasSchedules/gasScheduleV1.toml b/cmd/node/config/gasSchedules/gasScheduleV1.toml index a9b2122e7c6..f0b5f8ebf1c 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV1.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV1.toml @@ -15,6 +15,8 @@ ESDTNFTAddUri = 500000 ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 + SetGuardian = 250000 + FreezeAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV2.toml b/cmd/node/config/gasSchedules/gasScheduleV2.toml index 02eb3aedde1..d4dc4358ea3 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV2.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV2.toml @@ -15,6 +15,8 @@ ESDTNFTAddUri = 500000 ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 + SetGuardian = 250000 + FreezeAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV3.toml b/cmd/node/config/gasSchedules/gasScheduleV3.toml index 02bbe68b5c2..0a2ea787128 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV3.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV3.toml @@ -15,6 +15,8 @@ ESDTNFTAddUri = 500000 ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 + SetGuardian = 250000 + FreezeAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV4.toml b/cmd/node/config/gasSchedules/gasScheduleV4.toml index 650e830b07b..7f77d413c2d 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV4.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV4.toml @@ -15,6 +15,8 @@ ESDTNFTAddUri = 50000 ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 + SetGuardian = 250000 + FreezeAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV5.toml b/cmd/node/config/gasSchedules/gasScheduleV5.toml index 8ae6a7d6736..f8e9f5292b9 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV5.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV5.toml @@ -15,6 +15,8 @@ ESDTNFTAddUri = 50000 ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 + SetGuardian = 250000 + FreezeAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 From c305636e1084ec4500d27226401c00651e59e337 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 7 Mar 2022 16:11:50 +0200 Subject: [PATCH 011/335] process, node: fixes and integration with vmcommon new version --- node/node_test.go | 4 +- .../preprocess/scheduledTxsExecution_test.go | 37 ++++++++----------- process/dataValidators/txValidator.go | 2 +- process/interface.go | 1 + .../interceptedTransaction_test.go | 4 +- 5 files changed, 21 insertions(+), 27 deletions(-) diff --git a/node/node_test.go b/node/node_test.go index 449d2cfd1b3..3ae2bd8b9dd 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -2111,7 +2111,7 @@ func TestCreateTransaction_TxSignedWithHashShouldErrVersionShoudBe2(t *testing.T txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - options := versioning.MaskSignedWithHash + options := transaction.MaskSignedWithHash tx, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version, options) require.Nil(t, err) err = n.ValidateTransaction(tx) @@ -2212,7 +2212,7 @@ func TestCreateTransaction_TxSignedWithHashNoEnabledShouldErr(t *testing.T) { txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - options := versioning.MaskSignedWithHash + options := transaction.MaskSignedWithHash tx, _, _ := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version+1, options) err := n.ValidateTransaction(tx) diff --git a/process/block/preprocess/scheduledTxsExecution_test.go b/process/block/preprocess/scheduledTxsExecution_test.go index a961cabac89..b1bffd6c241 100644 --- a/process/block/preprocess/scheduledTxsExecution_test.go +++ b/process/block/preprocess/scheduledTxsExecution_test.go @@ -791,10 +791,10 @@ func TestScheduledTxsExecution_getScheduledRootHashSCRsGasAndFeesForHeaderShould } scheduledSCRs := &scheduled.ScheduledSCRs{ - RootHash: headerHash, - Scrs: map[int32]scheduled.SmartContractResults{ - 0: { - TxHandlers: []*smartContractResult.SmartContractResult{}, + RootHash: headerHash, + Scrs: []*smartContractResult.SmartContractResult{ + { + Nonce: 1, }, }, GasAndFees: expectedGasAndFees, @@ -869,17 +869,14 @@ func TestScheduledTxsExecution_getMarshalledScheduledRootHashSCRsGasAndFeesShoul scheduledSCRs := &scheduled.ScheduledSCRs{ RootHash: scheduledRootHash, - Scrs: map[int32]scheduled.SmartContractResults{ - 0: { - TxHandlers: []*smartContractResult.SmartContractResult{ - { - Nonce: 1, - }, - }, + Scrs: []*smartContractResult.SmartContractResult{ + { + Nonce: 1, }, }, GasAndFees: &gasAndFees, } + expectedScheduledSCRs, _ := json.Marshal(scheduledSCRs) scheduledTxsExec, _ := NewScheduledTxsExecution( @@ -932,10 +929,10 @@ func TestScheduledTxsExecution_RollBackToBlockShouldWork(t *testing.T) { } scheduledSCRs := &scheduled.ScheduledSCRs{ - RootHash: headerHash, - Scrs: map[int32]scheduled.SmartContractResults{ - 0: { - TxHandlers: []*smartContractResult.SmartContractResult{}, + RootHash: headerHash, + Scrs: []*smartContractResult.SmartContractResult{ + { + Nonce: 1, }, }, GasAndFees: expectedGasAndFees, @@ -982,13 +979,9 @@ func TestScheduledTxsExecution_SaveState(t *testing.T) { scheduledSCRs := &scheduled.ScheduledSCRs{ RootHash: scheduledRootHash, - Scrs: map[int32]scheduled.SmartContractResults{ - 0: { - TxHandlers: []*smartContractResult.SmartContractResult{ - { - Nonce: 1, - }, - }, + Scrs: []*smartContractResult.SmartContractResult{ + { + Nonce: 1, }, }, GasAndFees: &gasAndFees, diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index d751d8acf1d..7818ba45768 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -139,7 +139,7 @@ func checkPermission(interceptedTx process.InterceptedTxHandler, account state.U } // TODO: verify guardian signature on Tx - interceptedTx.Transaction() + //interceptedTx.Transaction() } return nil diff --git a/process/interface.go b/process/interface.go index c15b6e5d0bc..380b7add53d 100644 --- a/process/interface.go +++ b/process/interface.go @@ -89,6 +89,7 @@ type InterceptedTxHandler interface { // TxVersionCheckerHandler defines the functionality that is needed for a TxVersionChecker to validate transaction version type TxVersionCheckerHandler interface { + IsGuardedTransaction(tx *transaction.Transaction) bool IsSignedWithHash(tx *transaction.Transaction) bool CheckTxVersion(tx *transaction.Transaction) error IsInterfaceNil() bool diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index 80de462a1e7..f1387c5256a 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -966,7 +966,7 @@ func TestInterceptedTransaction_CheckValiditySignedWithHashButNotEnabled(t *test Signature: sigOk, ChainID: chainID, Version: minTxVersion + 1, - Options: versioning.MaskSignedWithHash, + Options: dataTransaction.MaskSignedWithHash, } marshalizer := &mock.MarshalizerMock{} @@ -1026,7 +1026,7 @@ func TestInterceptedTransaction_CheckValiditySignedWithHashShoudWork(t *testing. Signature: sigOk, ChainID: chainID, Version: minTxVersion + 1, - Options: versioning.MaskSignedWithHash, + Options: dataTransaction.MaskSignedWithHash, } marshalizer := &mock.MarshalizerMock{} From c4dfb92c5736c4e99ac0c31f81faf1b91b65c5a0 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 9 Mar 2022 11:56:20 +0200 Subject: [PATCH 012/335] fix gosum after merge --- go.sum | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/go.sum b/go.sum index 6e158e9127b..2507cd100d1 100644 --- a/go.sum +++ b/go.sum @@ -31,8 +31,9 @@ github.com/ElrondNetwork/elrond-go-core v1.1.6/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= github.com/ElrondNetwork/elrond-go-core v1.1.9/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.10/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.13 h1:67o8RRagno509HWJwnyXTShOnLY6PAP3n5ok/B8sgQY= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.14 h1:JKpeI+1US4FuE8NwN3dqe0HUTYKLQuYKvwbTqhGt334= +github.com/ElrondNetwork/elrond-go-core v1.1.14/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= From 6d8bb5a72f6757847dd6eb33131ba11a713c5f6a Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 10 Mar 2022 11:13:00 +0200 Subject: [PATCH 013/335] update gomod gosum --- go.mod | 4 +++- go.sum | 11 ----------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 0cc44df23eb..f9bd5919cb7 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.1.34 - github.com/ElrondNetwork/elrond-go-core v1.1.14 + github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220302140818-bf0e84d19ff7 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.6 github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c @@ -58,3 +58,5 @@ replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/Elrond replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.38-0.20220216155246-c3c866055053 replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.40 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.41-0.20220216163013-931f72f14be7 + +replace github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220302140818-bf0e84d19ff7 => /home/adrian/go2/src/github.com/ElrondNetwork/elrond-go-core diff --git a/go.sum b/go.sum index 2507cd100d1..7a1c5ccf78c 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,6 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.9/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.10/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.14 h1:JKpeI+1US4FuE8NwN3dqe0HUTYKLQuYKvwbTqhGt334= -github.com/ElrondNetwork/elrond-go-core v1.1.14/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= @@ -232,7 +230,6 @@ github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -850,8 +847,6 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108 github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= @@ -1051,7 +1046,6 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= @@ -1134,7 +1128,6 @@ golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPI golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1232,7 +1225,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1282,7 +1274,6 @@ golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200114235610-7ae403b6b589/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1366,8 +1357,6 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= From 08d6b29c40304bffe1697d6e5f9f2dff556eb2fb Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 4 Apr 2022 14:38:50 +0300 Subject: [PATCH 014/335] process: create guarded tx signature verifier --- process/dataValidators/txValidator.go | 44 ++++++++--- process/errors.go | 9 +++ process/guardedtx/guardedTxSignature.go | 79 ++++++++++++++++++++ process/guardedtx/guardedTxSignature_test.go | 15 ++++ 4 files changed, 136 insertions(+), 11 deletions(-) create mode 100644 process/guardedtx/guardedTxSignature.go create mode 100644 process/guardedtx/guardedTxSignature_test.go diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 7818ba45768..6ca6c289433 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/interceptors/processor" "github.com/ElrondNetwork/elrond-go/sharding" @@ -15,12 +16,21 @@ import ( var _ process.TxValidator = (*txValidator)(nil) +// GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions +// TODO: add an implementation and integrate it +type GuardianSigVerifier interface { + VerifyGuardianSignature(guardianPubKey []byte, tx data.TransactionHandler) error // todo: through crypto.SingleSigner + GetActiveGuardian(handler data.UserAccountHandler) ([]byte, error) // todo: through core.GuardianChecker + IsInterfaceNil() bool +} + // txValidator represents a tx handler validator that doesn't check the validity of provided txHandler type txValidator struct { accounts state.AccountsAdapter shardCoordinator sharding.Coordinator whiteListHandler process.WhiteListHandler - pubkeyConverter core.PubkeyConverter + pubKeyConverter core.PubkeyConverter + guardianSigVerifier GuardianSigVerifier maxNonceDeltaAllowed int } @@ -29,7 +39,8 @@ func NewTxValidator( accounts state.AccountsAdapter, shardCoordinator sharding.Coordinator, whiteListHandler process.WhiteListHandler, - pubkeyConverter core.PubkeyConverter, + pubKeyConverter core.PubkeyConverter, + guardianSigVerifier GuardianSigVerifier, maxNonceDeltaAllowed int, ) (*txValidator, error) { if check.IfNil(accounts) { @@ -41,16 +52,20 @@ func NewTxValidator( if check.IfNil(whiteListHandler) { return nil, process.ErrNilWhiteListHandler } - if check.IfNil(pubkeyConverter) { + if check.IfNil(pubKeyConverter) { return nil, fmt.Errorf("%w in NewTxValidator", process.ErrNilPubkeyConverter) } + if check.IfNil(guardianSigVerifier) { + return nil, process.ErrNilGuardianSigVerifier + } return &txValidator{ accounts: accounts, shardCoordinator: shardCoordinator, whiteListHandler: whiteListHandler, maxNonceDeltaAllowed: maxNonceDeltaAllowed, - pubkeyConverter: pubkeyConverter, + pubKeyConverter: pubKeyConverter, + guardianSigVerifier: guardianSigVerifier, }, nil } @@ -89,7 +104,7 @@ func (txv *txValidator) checkAccount( return err } - err = checkPermission(interceptedTx, account) + err = txv.checkPermission(interceptedTx, account) if err != nil { return err } @@ -106,7 +121,7 @@ func (txv *txValidator) getSenderUserAccount( if !ok { return nil, fmt.Errorf("%w, account is not of type *state.Account, address: %s", process.ErrWrongTypeAssertion, - txv.pubkeyConverter.Encode(senderAddress), + txv.pubKeyConverter.Encode(senderAddress), ) } return account, nil @@ -119,7 +134,7 @@ func (txv *txValidator) checkBalance(interceptedTx process.InterceptedTxHandler, senderAddress := interceptedTx.SenderAddress() return fmt.Errorf("%w, for address: %s, wanted %v, have %v", process.ErrInsufficientFunds, - txv.pubkeyConverter.Encode(senderAddress), + txv.pubKeyConverter.Encode(senderAddress), txFee, accountBalance, ) @@ -128,7 +143,7 @@ func (txv *txValidator) checkBalance(interceptedTx process.InterceptedTxHandler, return nil } -func checkPermission(interceptedTx process.InterceptedTxHandler, account state.UserAccountHandler) error { +func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTxHandler, account state.UserAccountHandler) error { txData, err := getTxData(interceptedTx) if err != nil { return err @@ -138,8 +153,15 @@ func checkPermission(interceptedTx process.InterceptedTxHandler, account state.U return state.ErrOperationNotPermitted } - // TODO: verify guardian signature on Tx - //interceptedTx.Transaction() + guardianPubKey, errGuardian := txv.guardianSigVerifier.GetActiveGuardian(account) + if errGuardian != nil { + return fmt.Errorf("%w due to error in getting the active guardian %s", state.ErrOperationNotPermitted, errGuardian.Error()) + } + + errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(guardianPubKey, interceptedTx.Transaction()) + if errGuardianSignature != nil { + return fmt.Errorf("%w due to error in signature verification %s", state.ErrOperationNotPermitted, errGuardianSignature.Error()) + } } return nil @@ -172,7 +194,7 @@ func (txv *txValidator) getSenderAccount(interceptedTx process.InterceptedTxHand if err != nil { return nil, fmt.Errorf("%w for address %s and shard %d, err: %s", process.ErrAccountNotFound, - txv.pubkeyConverter.Encode(senderAddress), + txv.pubKeyConverter.Encode(senderAddress), txv.shardCoordinator.SelfId(), err.Error(), ) diff --git a/process/errors.go b/process/errors.go index ee4fd24d960..167538f4fbd 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1076,3 +1076,12 @@ var ErrNilDoubleTransactionsDetector = errors.New("nil double transactions detec // ErrNoTxToProcess signals that no transaction were sent for processing var ErrNoTxToProcess = errors.New("no transaction to process") + +// ErrNilGuardianSigVerifier signals that a nil guardian signature verifier was provided +var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") + +// ErrNilGuardianChecker signals that a nil guardian checker was provided +var ErrNilGuardianChecker = errors.New("nil guardian checker") + +// ErrNilGuardianPublicKey signals that a nil guardian public key was provided +var ErrNilGuardianPublicKey = errors.New("nil guardian public key") diff --git a/process/guardedtx/guardedTxSignature.go b/process/guardedtx/guardedTxSignature.go new file mode 100644 index 00000000000..c094d6a7b15 --- /dev/null +++ b/process/guardedtx/guardedTxSignature.go @@ -0,0 +1,79 @@ +package guardedtx + +import ( + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/data" + crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/process/interceptors/processor" +) + +// GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions +// TODO: add an implementation and integrate it +type GuardianSigVerifier interface { + VerifyGuardianSignature(account data.UserAccountHandler, inTx processor.InterceptedTransactionHandler) error + IsInterfaceNil() bool +} + +type guardedTxSigVerifier struct { + sigVerifier crypto.SingleSigner + guardianChecker core.GuardianChecker + encoder data.Encoder + marshaller data.Marshaller + keyGen crypto.KeyGenerator +} + +// NewGuardedTxSigVerifier creates a new instance of a guarded transaction signature verifier +func NewGuardedTxSigVerifier(sigVerifier crypto.SingleSigner, guardianChecker core.GuardianChecker) (*guardedTxSigVerifier, error) { + if check.IfNil(sigVerifier) { + return nil, process.ErrNilGuardianSigVerifier + } + if check.IfNil(guardianChecker) { + return nil, process.ErrNilGuardianChecker + } + + return &guardedTxSigVerifier{ + sigVerifier: sigVerifier, + guardianChecker: guardianChecker, + }, nil +} + +// VerifyGuardianSignature verifies the guardian signature over the guarded transaction +func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccountHandler, inTx processor.InterceptedTransactionHandler) error { + guardianPubKeyBytes, err := gtx.guardianChecker.GetActiveGuardian(account) + if err != nil { + return err + } + + if len(guardianPubKeyBytes) == 0 { + return process.ErrNilGuardianPublicKey + } + + txHandler := inTx.Transaction() + if check.IfNil(txHandler) { + return process.ErrNilTransaction + } + + guardedTxHandler, castOK := txHandler.(data.GuardedTransactionHandler) + if !castOK { + return process.ErrWrongTypeAssertion + } + + msgForSigVerification, err := guardedTxHandler.GetDataForSigning(gtx.encoder, gtx.marshaller) + if err != nil { + return err + } + + guardianPubKey, err := gtx.keyGen.PublicKeyFromByteArray(guardianPubKeyBytes) + if err != nil { + return err + } + + return gtx.sigVerifier.Verify(guardianPubKey, msgForSigVerification, guardedTxHandler.GetGuardianSignature()) +} + +// IsInterfaceNil returns nil if the receiver is nil +func (gtx *guardedTxSigVerifier) IsInterfaceNil() bool { + return gtx == nil +} diff --git a/process/guardedtx/guardedTxSignature_test.go b/process/guardedtx/guardedTxSignature_test.go new file mode 100644 index 00000000000..9afc22cdd1e --- /dev/null +++ b/process/guardedtx/guardedTxSignature_test.go @@ -0,0 +1,15 @@ +package guardedtx + +import "testing" + +func TestNewGuardedTxSigVerifier(t *testing.T) { + +} + +func TestGuardedTxSigVerifier_IsInterfaceNil(t *testing.T) { + +} + +func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { + +} From 972ac883ec987f1cca2f103bc4d0bf97eaaed66c Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 5 Apr 2022 17:38:02 +0300 Subject: [PATCH 015/335] process: add guardian signature verifier and unit tests --- process/dataValidators/txValidator.go | 12 +- process/errors.go | 3 - process/guardedtx/guardedTxSignature_test.go | 15 -- ...dedTxSignature.go => guardedTxVerifier.go} | 25 ++- process/guardedtx/guardedTxVerifier_test.go | 195 ++++++++++++++++++ .../guardianMocks/guardianCheckerStub.go | 22 ++ .../interceptedTxMocks/interceptedTxStub.go | 65 ++++++ 7 files changed, 306 insertions(+), 31 deletions(-) delete mode 100644 process/guardedtx/guardedTxSignature_test.go rename process/guardedtx/{guardedTxSignature.go => guardedTxVerifier.go} (78%) create mode 100644 process/guardedtx/guardedTxVerifier_test.go create mode 100644 testscommon/guardianMocks/guardianCheckerStub.go create mode 100644 testscommon/interceptedTxMocks/interceptedTxStub.go diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 6ca6c289433..cd6ec891801 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -19,8 +19,7 @@ var _ process.TxValidator = (*txValidator)(nil) // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions // TODO: add an implementation and integrate it type GuardianSigVerifier interface { - VerifyGuardianSignature(guardianPubKey []byte, tx data.TransactionHandler) error // todo: through crypto.SingleSigner - GetActiveGuardian(handler data.UserAccountHandler) ([]byte, error) // todo: through core.GuardianChecker + VerifyGuardianSignature(account data.UserAccountHandler, inTx processor.InterceptedTransactionHandler) error // todo: through crypto.SingleSigner IsInterfaceNil() bool } @@ -56,7 +55,7 @@ func NewTxValidator( return nil, fmt.Errorf("%w in NewTxValidator", process.ErrNilPubkeyConverter) } if check.IfNil(guardianSigVerifier) { - return nil, process.ErrNilGuardianSigVerifier + return nil, process.ErrNilSingleSigner } return &txValidator{ @@ -153,12 +152,7 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTxHandl return state.ErrOperationNotPermitted } - guardianPubKey, errGuardian := txv.guardianSigVerifier.GetActiveGuardian(account) - if errGuardian != nil { - return fmt.Errorf("%w due to error in getting the active guardian %s", state.ErrOperationNotPermitted, errGuardian.Error()) - } - - errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(guardianPubKey, interceptedTx.Transaction()) + errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(account, interceptedTx) if errGuardianSignature != nil { return fmt.Errorf("%w due to error in signature verification %s", state.ErrOperationNotPermitted, errGuardianSignature.Error()) } diff --git a/process/errors.go b/process/errors.go index 167538f4fbd..3a51d6011c9 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1077,9 +1077,6 @@ var ErrNilDoubleTransactionsDetector = errors.New("nil double transactions detec // ErrNoTxToProcess signals that no transaction were sent for processing var ErrNoTxToProcess = errors.New("no transaction to process") -// ErrNilGuardianSigVerifier signals that a nil guardian signature verifier was provided -var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") - // ErrNilGuardianChecker signals that a nil guardian checker was provided var ErrNilGuardianChecker = errors.New("nil guardian checker") diff --git a/process/guardedtx/guardedTxSignature_test.go b/process/guardedtx/guardedTxSignature_test.go deleted file mode 100644 index 9afc22cdd1e..00000000000 --- a/process/guardedtx/guardedTxSignature_test.go +++ /dev/null @@ -1,15 +0,0 @@ -package guardedtx - -import "testing" - -func TestNewGuardedTxSigVerifier(t *testing.T) { - -} - -func TestGuardedTxSigVerifier_IsInterfaceNil(t *testing.T) { - -} - -func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { - -} diff --git a/process/guardedtx/guardedTxSignature.go b/process/guardedtx/guardedTxVerifier.go similarity index 78% rename from process/guardedtx/guardedTxSignature.go rename to process/guardedtx/guardedTxVerifier.go index c094d6a7b15..ac247e44400 100644 --- a/process/guardedtx/guardedTxSignature.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -10,7 +10,6 @@ import ( ) // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions -// TODO: add an implementation and integrate it type GuardianSigVerifier interface { VerifyGuardianSignature(account data.UserAccountHandler, inTx processor.InterceptedTransactionHandler) error IsInterfaceNil() bool @@ -19,23 +18,41 @@ type GuardianSigVerifier interface { type guardedTxSigVerifier struct { sigVerifier crypto.SingleSigner guardianChecker core.GuardianChecker - encoder data.Encoder + encoder core.PubkeyConverter marshaller data.Marshaller keyGen crypto.KeyGenerator } // NewGuardedTxSigVerifier creates a new instance of a guarded transaction signature verifier -func NewGuardedTxSigVerifier(sigVerifier crypto.SingleSigner, guardianChecker core.GuardianChecker) (*guardedTxSigVerifier, error) { +func NewGuardedTxSigVerifier( + sigVerifier crypto.SingleSigner, + guardianChecker core.GuardianChecker, + pubKeyConverter core.PubkeyConverter, + marshaller data.Marshaller, + keyGen crypto.KeyGenerator, +) (*guardedTxSigVerifier, error) { if check.IfNil(sigVerifier) { - return nil, process.ErrNilGuardianSigVerifier + return nil, process.ErrNilSingleSigner } if check.IfNil(guardianChecker) { return nil, process.ErrNilGuardianChecker } + if check.IfNil(pubKeyConverter) { + return nil, process.ErrNilPubkeyConverter + } + if check.IfNil(marshaller) { + return nil, process.ErrNilMarshalizer + } + if check.IfNil(keyGen) { + return nil, process.ErrNilKeyGen + } return &guardedTxSigVerifier{ sigVerifier: sigVerifier, guardianChecker: guardianChecker, + encoder: pubKeyConverter, + marshaller: marshaller, + keyGen: keyGen, }, nil } diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go new file mode 100644 index 00000000000..4ce4549b6a6 --- /dev/null +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -0,0 +1,195 @@ +package guardedtx + +import ( + "math/big" + "testing" + + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/core/mock" + "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" + "github.com/ElrondNetwork/elrond-go-core/data" + txStruct "github.com/ElrondNetwork/elrond-go-core/data/transaction" + "github.com/ElrondNetwork/elrond-go-core/marshal" + crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" + "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" + "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/interceptedTxMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/stretchr/testify/require" +) + +func TestNewGuardedTxSigVerifier(t *testing.T) { + signer := &cryptoMocks.SingleSignerStub{} + guardianChecker := &guardianMocks.GuardianCheckerStub{} + keyGen := &cryptoMocks.KeyGenStub{} + marshaller := &testscommon.MarshalizerMock{} + converter := &testscommon.PubkeyConverterMock{} + + t.Run("nil guardian sig verifier ", func(t *testing.T) { + gtxSigVerifier, err := NewGuardedTxSigVerifier(nil, guardianChecker, converter, marshaller, keyGen) + require.Equal(t, process.ErrNilSingleSigner, err) + require.Nil(t, gtxSigVerifier) + }) + + t.Run("nil guardian checker", func(t *testing.T) { + gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, nil, converter, marshaller, keyGen) + require.Equal(t, process.ErrNilGuardianChecker, err) + require.Nil(t, gtxSigVerifier) + }) + + t.Run("nil public key converter", func(t *testing.T) { + gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, nil, marshaller, keyGen) + require.Equal(t, process.ErrNilGuardianChecker, err) + require.Nil(t, gtxSigVerifier) + }) + + t.Run("ok params", func(t *testing.T) { + gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGen) + require.Nil(t, err) + require.NotNil(t, gtxSigVerifier) + }) +} + +func TestGuardedTxSigVerifier_IsInterfaceNil(t *testing.T) { + var gsv GuardianSigVerifier + require.True(t, check.IfNil(gsv)) + + var gsvNilPtr *guardedTxSigVerifier + require.True(t, check.IfNil(gsvNilPtr)) + + gsv = &guardedTxSigVerifier{} + require.False(t, check.IfNil(gsv)) +} + +func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { + suite := ed25519.NewEd25519() + keyGenerator := signing.NewKeyGenerator(suite) + privateKeyGuardian, publicKeyGuardian := keyGenerator.GeneratePair() + privateKeyOwner, publicKeyOwner := keyGenerator.GeneratePair() + pubKeyGuardianBytes, _ := publicKeyGuardian.ToByteArray() + publicKeyOwnerBytes, _ := publicKeyOwner.ToByteArray() + + signer := &singlesig.Ed25519Signer{} + + acc := &state.UserAccountStub{} + guardianChecker := &guardianMocks.GuardianCheckerStub{ + GetActiveGuardianCalled: func(handler data.UserAccountHandler) ([]byte, error) { + return pubKeyGuardianBytes, nil + }, + } + + value, _ := big.NewInt(0).SetString("100000000000000000000", 10) + + tx := &txStruct.Transaction{ + Nonce: 11, + Value: value, + RcvAddr: publicKeyOwnerBytes, + RcvUserName: nil, + SndAddr: publicKeyOwnerBytes, + SndUserName: nil, + GasPrice: 1000000000, + GasLimit: 50000, + Data: nil, + ChainID: []byte{31}, + Version: 2, + Signature: nil, + Options: 0, + GuardianSignature: nil, + } + + marshaller := &marshal.JsonMarshalizer{} + converter, _ := pubkeyConverter.NewBech32PubkeyConverter(32, &mock.LoggerMock{}) + inTx := createSignedInterceptedTx(tx, signer, privateKeyOwner, privateKeyGuardian, converter, marshaller) + + t.Run("verify OK", func(t *testing.T) { + gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGenerator) + require.Nil(t, err) + + err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx) + require.Nil(t, err) + }) + t.Run("invalid guardian signature", func(t *testing.T) { + gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGenerator) + require.Nil(t, err) + + // owner signs for guardian + inTx2 := createSignedInterceptedTx(tx, signer, privateKeyOwner, privateKeyOwner, converter, marshaller) + err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx2) + require.NotNil(t, err) + }) + t.Run("nil guardian signature", func(t *testing.T) { + gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGenerator) + require.Nil(t, err) + + // owner signs for guardian + inTx2 := createSignedInterceptedTx(tx, signer, privateKeyOwner, privateKeyOwner, converter, marshaller) + txHandler := inTx2.Transaction() + inTx2.TransactionCalled = func() data.TransactionHandler { + tx2, ok := txHandler.(*txStruct.Transaction) + require.True(t, ok) + + tx2.GuardianSignature = nil + return tx2 + } + err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx2) + require.NotNil(t, err) + }) +} + +func createSignedInterceptedTx( + tx *txStruct.Transaction, + signer crypto.SingleSigner, + senderSk crypto.PrivateKey, + guardianSk crypto.PrivateKey, + converter core.PubkeyConverter, + marshaller data.Marshaller, +) *interceptedTxMocks.InterceptedTxHandlerStub { + ownerSig, guardianSig := signAndGuardTx(tx, signer, senderSk, guardianSk, converter, marshaller) + + txCopy := *tx + txCopy.Signature = ownerSig + txCopy.GuardianSignature = guardianSig + + return &interceptedTxMocks.InterceptedTxHandlerStub{ + TransactionCalled: func() data.TransactionHandler { + return &txCopy + }, + } +} + +func signAndGuardTx( + tx *txStruct.Transaction, + signer crypto.SingleSigner, + sk crypto.PrivateKey, + skGuardian crypto.PrivateKey, + converter core.PubkeyConverter, + marshaller data.Marshaller, +) ([]byte, []byte) { + ftx := &txStruct.FrontendTransaction{ + Nonce: tx.Nonce, + Value: tx.Value.String(), + Receiver: converter.Encode(tx.RcvAddr), + Sender: converter.Encode(tx.RcvAddr), + SenderUsername: nil, + ReceiverUsername: nil, + GasPrice: tx.GasPrice, + GasLimit: tx.GasLimit, + Data: tx.Data, + Signature: "", + ChainID: string(tx.ChainID), + Version: tx.Version, + GuardianSignature: "", + } + + buff, _ := marshaller.Marshal(ftx) + signature, _ := signer.Sign(sk, buff) + guardianSignature, _ := signer.Sign(skGuardian, buff) + + return signature, guardianSignature +} diff --git a/testscommon/guardianMocks/guardianCheckerStub.go b/testscommon/guardianMocks/guardianCheckerStub.go new file mode 100644 index 00000000000..ec47c9a757d --- /dev/null +++ b/testscommon/guardianMocks/guardianCheckerStub.go @@ -0,0 +1,22 @@ +package guardianMocks + +import "github.com/ElrondNetwork/elrond-go-core/data" + +// GuardianCheckerStub - +type GuardianCheckerStub struct { + GetActiveGuardianCalled func(handler data.UserAccountHandler) ([]byte, error) +} + +// GetActiveGuardian - +func (gcs *GuardianCheckerStub) GetActiveGuardian(handler data.UserAccountHandler) ([]byte, error) { + if gcs.GetActiveGuardianCalled != nil { + return gcs.GetActiveGuardianCalled(handler) + } + + return nil, nil +} + +// IsInterfaceNil - +func (gcs *GuardianCheckerStub) IsInterfaceNil() bool { + return gcs == nil +} diff --git a/testscommon/interceptedTxMocks/interceptedTxStub.go b/testscommon/interceptedTxMocks/interceptedTxStub.go new file mode 100644 index 00000000000..73bc325e678 --- /dev/null +++ b/testscommon/interceptedTxMocks/interceptedTxStub.go @@ -0,0 +1,65 @@ +package interceptedTxMocks + +import ( + "math/big" + + "github.com/ElrondNetwork/elrond-go-core/data" +) + +// InterceptedTxHandlerStub - +type InterceptedTxHandlerStub struct { + SenderShardIdCalled func() uint32 + ReceiverShardIdCalled func() uint32 + NonceCalled func() uint64 + SenderAddressCalled func() []byte + FeeCalled func() *big.Int + TransactionCalled func() data.TransactionHandler +} + +// SenderShardId - +func (iths *InterceptedTxHandlerStub) SenderShardId() uint32 { + if iths.SenderShardIdCalled != nil { + return iths.SenderShardIdCalled() + } + return 0 +} + +// ReceiverShardId - +func (iths *InterceptedTxHandlerStub) ReceiverShardId() uint32 { + if iths.ReceiverShardIdCalled != nil { + return iths.ReceiverShardIdCalled() + } + return 0 +} + +// Nonce - +func (iths *InterceptedTxHandlerStub) Nonce() uint64 { + if iths.NonceCalled != nil { + return iths.NonceCalled() + } + return 0 +} + +// SenderAddress - +func (iths *InterceptedTxHandlerStub) SenderAddress() []byte { + if iths.SenderAddressCalled != nil { + return iths.SenderAddressCalled() + } + return nil +} + +// Fee - +func (iths *InterceptedTxHandlerStub) Fee() *big.Int { + if iths.FeeCalled != nil { + return iths.FeeCalled() + } + return nil +} + +// Transaction - +func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { + if iths.TransactionCalled != nil { + return iths.TransactionCalled() + } + return nil +} From 04cb8465b12596b7acac160360aed27c9d108431 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 8 Apr 2022 12:55:48 +0300 Subject: [PATCH 016/335] factory, process: add guardian checker, sig verifier and their integration --- factory/interface.go | 1 + factory/mock/processComponentsStub.go | 6 + factory/processComponents.go | 26 ++++ factory/processComponentsHandler.go | 12 ++ .../mock/processComponentsStub.go | 6 + process/dataValidators/txValidator.go | 18 +-- process/dataValidators/txValidator_test.go | 33 ++++++ process/errors.go | 9 ++ .../baseInterceptorsContainerFactory.go | 1 + process/guardedtx/guardedTxVerifier.go | 63 +++++----- process/guardedtx/guardedTxVerifier_test.go | 44 ++++--- process/guardianChecker/guardianChecker.go | 112 ++++++++++++++++++ .../guardianChecker/guardianChecker_test.go | 19 +++ process/interceptors/processor/interface.go | 23 ---- .../processor/txInterceptorProcessor.go | 7 +- process/interface.go | 22 ++++ .../guardianMocks/guardianSigVerifierStub.go | 24 ++++ 17 files changed, 343 insertions(+), 83 deletions(-) create mode 100644 process/guardianChecker/guardianChecker.go create mode 100644 process/guardianChecker/guardianChecker_test.go delete mode 100644 process/interceptors/processor/interface.go create mode 100644 testscommon/guardianMocks/guardianSigVerifierStub.go diff --git a/factory/interface.go b/factory/interface.go index 80acf820f60..9d54e00e023 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -262,6 +262,7 @@ type ProcessComponentsHolder interface { CurrentEpochProvider() process.CurrentNetworkEpochProviderHandler ScheduledTxsExecutionHandler() process.ScheduledTxsExecutionHandler TxsSenderHandler() process.TxsSenderHandler + GuardianSigVerifier() process.GuardianSigVerifier IsInterfaceNil() bool } diff --git a/factory/mock/processComponentsStub.go b/factory/mock/processComponentsStub.go index 1f66011a2ff..f58f8c199a5 100644 --- a/factory/mock/processComponentsStub.go +++ b/factory/mock/processComponentsStub.go @@ -45,6 +45,7 @@ type ProcessComponentsMock struct { CurrentEpochProviderInternal process.CurrentNetworkEpochProviderHandler ScheduledTxsExecutionHandlerInternal process.ScheduledTxsExecutionHandler TxsSenderHandlerField process.TxsSenderHandler + GuardianSigVerifierField process.GuardianSigVerifier } // Create - @@ -227,6 +228,11 @@ func (pcm *ProcessComponentsMock) TxsSenderHandler() process.TxsSenderHandler { return pcm.TxsSenderHandlerField } +// GuardianSigVerifier - +func (pcm *ProcessComponentsMock) GuardianSigVerifier() process.GuardianSigVerifier { + return pcm.GuardianSigVerifierField +} + // IsInterfaceNil - func (pcm *ProcessComponentsMock) IsInterfaceNil() bool { return pcm == nil diff --git a/factory/processComponents.go b/factory/processComponents.go index b478dbb87ae..34b3f42f82c 100644 --- a/factory/processComponents.go +++ b/factory/processComponents.go @@ -41,6 +41,8 @@ import ( "github.com/ElrondNetwork/elrond-go/process/block/poolsCleaner" "github.com/ElrondNetwork/elrond-go/process/block/preprocess" "github.com/ElrondNetwork/elrond-go/process/factory/interceptorscontainer" + "github.com/ElrondNetwork/elrond-go/process/guardedtx" + "github.com/ElrondNetwork/elrond-go/process/guardianChecker" "github.com/ElrondNetwork/elrond-go/process/headerCheck" "github.com/ElrondNetwork/elrond-go/process/peer" "github.com/ElrondNetwork/elrond-go/process/smartContract" @@ -104,6 +106,7 @@ type processComponents struct { vmFactoryForProcessing process.VirtualMachinesContainerFactory scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler txsSender process.TxsSenderHandler + guardianSigVerifier process.GuardianSigVerifier } // ProcessComponentsFactoryArgs holds the arguments needed to create a process components factory @@ -241,6 +244,11 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { return nil, err } + guardianSigVerifier, err := pcf.newGuardianSigVerifier() + if err != nil { + return nil, err + } + resolversContainerFactory, err := pcf.newResolverContainerFactory(currentEpochProvider) if err != nil { return nil, err @@ -606,9 +614,27 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { vmFactoryForProcessing: blockProcessorComponents.vmFactoryForProcessing, scheduledTxsExecutionHandler: scheduledTxsExecutionHandler, txsSender: txsSenderWithAccumulator, + guardianSigVerifier: guardianSigVerifier, }, nil } +func (pcf *processComponentsFactory) newGuardianSigVerifier() (process.GuardianSigVerifier, error) { + gTxChecker, err := guardianChecker.NewAccountGuardianChecker(pcf.coreData.InternalMarshalizer(), pcf.coreData.EpochNotifier()) + if err != nil { + return nil, err + } + + argGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ + SigVerifier: pcf.crypto.TxSingleSigner(), + GuardianChecker: gTxChecker, + PubKeyConverter: pcf.coreData.AddressPubKeyConverter(), + Marshaller: pcf.coreData.InternalMarshalizer(), + KeyGen: pcf.crypto.TxSignKeyGen(), + } + + return guardedtx.NewGuardedTxSigVerifier(argGuardianSigVerifier) +} + func (pcf *processComponentsFactory) newValidatorStatisticsProcessor() (process.ValidatorStatisticsProcessor, error) { storageService := pcf.data.StorageService() diff --git a/factory/processComponentsHandler.go b/factory/processComponentsHandler.go index 1788c0e8eca..4a152be9a17 100644 --- a/factory/processComponentsHandler.go +++ b/factory/processComponentsHandler.go @@ -541,6 +541,18 @@ func (m *managedProcessComponents) TxsSenderHandler() process.TxsSenderHandler { return m.processComponents.txsSender } +// GuardianSigVerifier returns the guardian signature verifier +func (m *managedProcessComponents) GuardianSigVerifier() process.GuardianSigVerifier { + m.mutProcessComponents.RLock() + defer m.mutProcessComponents.RUnlock() + + if m.processComponents == nil { + return nil + } + + return m.processComponents.guardianSigVerifier +} + // IsInterfaceNil returns true if the interface is nil func (m *managedProcessComponents) IsInterfaceNil() bool { return m == nil diff --git a/integrationTests/mock/processComponentsStub.go b/integrationTests/mock/processComponentsStub.go index 7312e6efb56..41e853cf4b5 100644 --- a/integrationTests/mock/processComponentsStub.go +++ b/integrationTests/mock/processComponentsStub.go @@ -45,6 +45,7 @@ type ProcessComponentsStub struct { CurrentEpochProviderInternal process.CurrentNetworkEpochProviderHandler ScheduledTxsExecutionHandlerInternal process.ScheduledTxsExecutionHandler TxsSenderHandlerField process.TxsSenderHandler + GuardianSigVerifierField process.GuardianSigVerifier } // Create - @@ -227,6 +228,11 @@ func (pcs *ProcessComponentsStub) TxsSenderHandler() process.TxsSenderHandler { return pcs.TxsSenderHandlerField } +// GuardianSigVerifier - +func (pcs *ProcessComponentsStub) GuardianSigVerifier() process.GuardianSigVerifier { + return pcs.GuardianSigVerifierField +} + // IsInterfaceNil - func (pcs *ProcessComponentsStub) IsInterfaceNil() bool { return pcs == nil diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index cd6ec891801..03f21016b82 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -6,9 +6,8 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/process/interceptors/processor" + "github.com/ElrondNetwork/elrond-go/process/guardedtx" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" @@ -16,20 +15,13 @@ import ( var _ process.TxValidator = (*txValidator)(nil) -// GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions -// TODO: add an implementation and integrate it -type GuardianSigVerifier interface { - VerifyGuardianSignature(account data.UserAccountHandler, inTx processor.InterceptedTransactionHandler) error // todo: through crypto.SingleSigner - IsInterfaceNil() bool -} - // txValidator represents a tx handler validator that doesn't check the validity of provided txHandler type txValidator struct { accounts state.AccountsAdapter shardCoordinator sharding.Coordinator whiteListHandler process.WhiteListHandler pubKeyConverter core.PubkeyConverter - guardianSigVerifier GuardianSigVerifier + guardianSigVerifier guardedtx.GuardianSigVerifier maxNonceDeltaAllowed int } @@ -39,7 +31,7 @@ func NewTxValidator( shardCoordinator sharding.Coordinator, whiteListHandler process.WhiteListHandler, pubKeyConverter core.PubkeyConverter, - guardianSigVerifier GuardianSigVerifier, + guardianSigVerifier guardedtx.GuardianSigVerifier, maxNonceDeltaAllowed int, ) (*txValidator, error) { if check.IfNil(accounts) { @@ -55,7 +47,7 @@ func NewTxValidator( return nil, fmt.Errorf("%w in NewTxValidator", process.ErrNilPubkeyConverter) } if check.IfNil(guardianSigVerifier) { - return nil, process.ErrNilSingleSigner + return nil, process.ErrNilGuardianSigVerifier } return &txValidator{ @@ -219,7 +211,7 @@ func isBuiltinFuncCallWithParam(txData []byte, function string) bool { // CheckTxWhiteList will check if the cross shard transactions are whitelisted and could be added in pools func (txv *txValidator) CheckTxWhiteList(data process.InterceptedData) error { - interceptedTx, ok := data.(processor.InterceptedTransactionHandler) + interceptedTx, ok := data.(process.InterceptedTransactionHandler) if !ok { return process.ErrWrongTypeAssertion } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 3647ffd852c..4714fe8a82b 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/assert" @@ -82,6 +83,7 @@ func TestNewTxValidator_NilAccountsShouldErr(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -99,6 +101,7 @@ func TestNewTxValidator_NilShardCoordinatorShouldErr(t *testing.T) { nil, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -117,6 +120,7 @@ func TestTxValidator_NewValidatorNilWhiteListHandlerShouldErr(t *testing.T) { shardCoordinator, nil, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -135,6 +139,7 @@ func TestNewTxValidator_NilPubkeyConverterShouldErr(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, nil, + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -142,6 +147,24 @@ func TestNewTxValidator_NilPubkeyConverterShouldErr(t *testing.T) { assert.True(t, errors.Is(err, process.ErrNilPubkeyConverter)) } +func TestNewTxValidator_NilGuardianSigVerifierShouldErr(t *testing.T) { + t.Parallel() + + adb := getAccAdapter(0, big.NewInt(0)) + shardCoordinator := createMockCoordinator("_", 0) + maxNonceDeltaAllowed := 100 + txValidator, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + nil, + maxNonceDeltaAllowed, + ) + assert.Nil(t, txValidator) + assert.True(t, errors.Is(err, process.ErrNilGuardianSigVerifier)) +} + func TestNewTxValidator_ShouldWork(t *testing.T) { t.Parallel() @@ -153,6 +176,7 @@ func TestNewTxValidator_ShouldWork(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -175,6 +199,7 @@ func TestTxValidator_CheckTxValidityTxCrossShardShouldWork(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -200,6 +225,7 @@ func TestTxValidator_CheckTxValidityAccountNonceIsGreaterThanTxNonceShouldReturn shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -226,6 +252,7 @@ func TestTxValidator_CheckTxValidityTxNonceIsTooHigh(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -254,6 +281,7 @@ func TestTxValidator_CheckTxValidityAccountBalanceIsLessThanTxTotalValueShouldRe shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -281,6 +309,7 @@ func TestTxValidator_CheckTxValidityAccountNotExitsShouldReturnFalse(t *testing. shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -310,6 +339,7 @@ func TestTxValidator_CheckTxValidityAccountNotExitsButWhiteListedShouldReturnTru }, }, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -344,6 +374,7 @@ func TestTxValidator_CheckTxValidityWrongAccountTypeShouldReturnFalse(t *testing shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -368,6 +399,7 @@ func TestTxValidator_CheckTxValidityTxIsOkShouldReturnTrue(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, maxNonceDeltaAllowed, ) @@ -391,6 +423,7 @@ func TestTxValidator_IsInterfaceNil(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, 100, ) _ = txValidator diff --git a/process/errors.go b/process/errors.go index 3a51d6011c9..61175128262 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1082,3 +1082,12 @@ var ErrNilGuardianChecker = errors.New("nil guardian checker") // ErrNilGuardianPublicKey signals that a nil guardian public key was provided var ErrNilGuardianPublicKey = errors.New("nil guardian public key") + +// ErrNilGuardianSigVerifier signals that a nil signature verifier was provided +var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") + +// ErrAccountHasNoGuardianSet signals that the account has no guardians set +var ErrAccountHasNoGuardianSet = errors.New("account has no guardian set") + +// ErrActiveHasNoActiveGuardian signals that the account has no active guardian +var ErrActiveHasNoActiveGuardian = errors.New("account has no active guardian") diff --git a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go index 3a11def3133..ed945887a8b 100644 --- a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go @@ -207,6 +207,7 @@ func (bicf *baseInterceptorsContainerFactory) createOneTxInterceptor(topic strin bicf.shardCoordinator, bicf.whiteListHandler, addrPubKeyConverter, + bicf. bicf.maxTxNonceDeltaAllowed, ) if err != nil { diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index ac247e44400..06873ac5dd5 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -6,15 +6,23 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/process/interceptors/processor" ) // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account data.UserAccountHandler, inTx processor.InterceptedTransactionHandler) error + VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error IsInterfaceNil() bool } +// GuardedTxSigVerifierArgs holds the argument to instantiate a guarded tx signature verifier +type GuardedTxSigVerifierArgs struct { + SigVerifier crypto.SingleSigner + GuardianChecker core.GuardianChecker + PubKeyConverter core.PubkeyConverter + Marshaller data.Marshaller + KeyGen crypto.KeyGenerator +} + type guardedTxSigVerifier struct { sigVerifier crypto.SingleSigner guardianChecker core.GuardianChecker @@ -24,49 +32,39 @@ type guardedTxSigVerifier struct { } // NewGuardedTxSigVerifier creates a new instance of a guarded transaction signature verifier -func NewGuardedTxSigVerifier( - sigVerifier crypto.SingleSigner, - guardianChecker core.GuardianChecker, - pubKeyConverter core.PubkeyConverter, - marshaller data.Marshaller, - keyGen crypto.KeyGenerator, -) (*guardedTxSigVerifier, error) { - if check.IfNil(sigVerifier) { +func NewGuardedTxSigVerifier(args GuardedTxSigVerifierArgs) (*guardedTxSigVerifier, error) { + if check.IfNil(args.SigVerifier) { return nil, process.ErrNilSingleSigner } - if check.IfNil(guardianChecker) { + if check.IfNil(args.GuardianChecker) { return nil, process.ErrNilGuardianChecker } - if check.IfNil(pubKeyConverter) { + if check.IfNil(args.PubKeyConverter) { return nil, process.ErrNilPubkeyConverter } - if check.IfNil(marshaller) { + if check.IfNil(args.Marshaller) { return nil, process.ErrNilMarshalizer } - if check.IfNil(keyGen) { + if check.IfNil(args.KeyGen) { return nil, process.ErrNilKeyGen } return &guardedTxSigVerifier{ - sigVerifier: sigVerifier, - guardianChecker: guardianChecker, - encoder: pubKeyConverter, - marshaller: marshaller, - keyGen: keyGen, + sigVerifier: args.SigVerifier, + guardianChecker: args.GuardianChecker, + encoder: args.PubKeyConverter, + marshaller: args.Marshaller, + keyGen: args.KeyGen, }, nil } // VerifyGuardianSignature verifies the guardian signature over the guarded transaction -func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccountHandler, inTx processor.InterceptedTransactionHandler) error { - guardianPubKeyBytes, err := gtx.guardianChecker.GetActiveGuardian(account) +func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + guardianPubKey, err := gtx.GetGuardianPublicKey(account) if err != nil { return err } - if len(guardianPubKeyBytes) == 0 { - return process.ErrNilGuardianPublicKey - } - txHandler := inTx.Transaction() if check.IfNil(txHandler) { return process.ErrNilTransaction @@ -82,12 +80,21 @@ func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccoun return err } - guardianPubKey, err := gtx.keyGen.PublicKeyFromByteArray(guardianPubKeyBytes) + return gtx.sigVerifier.Verify(guardianPubKey, msgForSigVerification, guardedTxHandler.GetGuardianSignature()) +} + +// GetGuardianPublicKey returns the guardian public key for the given account +func (gtx *guardedTxSigVerifier) GetGuardianPublicKey(account data.UserAccountHandler) (crypto.PublicKey, error) { + guardianPubKeyBytes, err := gtx.guardianChecker.GetActiveGuardian(account) if err != nil { - return err + return nil, err } - return gtx.sigVerifier.Verify(guardianPubKey, msgForSigVerification, guardedTxHandler.GetGuardianSignature()) + if len(guardianPubKeyBytes) == 0 { + return nil, process.ErrNilGuardianPublicKey + } + + return gtx.keyGen.PublicKeyFromByteArray(guardianPubKeyBytes) } // IsInterfaceNil returns nil if the receiver is nil diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 4ce4549b6a6..332ecc67543 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -25,32 +25,37 @@ import ( ) func TestNewGuardedTxSigVerifier(t *testing.T) { - signer := &cryptoMocks.SingleSignerStub{} - guardianChecker := &guardianMocks.GuardianCheckerStub{} - keyGen := &cryptoMocks.KeyGenStub{} - marshaller := &testscommon.MarshalizerMock{} - converter := &testscommon.PubkeyConverterMock{} + args := GuardedTxSigVerifierArgs{ + SigVerifier: &cryptoMocks.SingleSignerStub{}, + GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + PubKeyConverter: &testscommon.PubkeyConverterMock{}, + Marshaller: &testscommon.MarshalizerMock{}, + KeyGen: &cryptoMocks.KeyGenStub{}, + } t.Run("nil guardian sig verifier ", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(nil, guardianChecker, converter, marshaller, keyGen) + changedArgs := *&args + changedArgs.SigVerifier = nil + gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilSingleSigner, err) require.Nil(t, gtxSigVerifier) }) - t.Run("nil guardian checker", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, nil, converter, marshaller, keyGen) + changedArgs := *&args + changedArgs.GuardianChecker = nil + gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilGuardianChecker, err) require.Nil(t, gtxSigVerifier) }) - t.Run("nil public key converter", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, nil, marshaller, keyGen) - require.Equal(t, process.ErrNilGuardianChecker, err) + changedArgs := *&args + changedArgs.PubKeyConverter = nil + gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) + require.Equal(t, process.ErrNilPubkeyConverter, err) require.Nil(t, gtxSigVerifier) }) - t.Run("ok params", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGen) + gtxSigVerifier, err := NewGuardedTxSigVerifier(args) require.Nil(t, err) require.NotNil(t, gtxSigVerifier) }) @@ -106,16 +111,23 @@ func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { marshaller := &marshal.JsonMarshalizer{} converter, _ := pubkeyConverter.NewBech32PubkeyConverter(32, &mock.LoggerMock{}) inTx := createSignedInterceptedTx(tx, signer, privateKeyOwner, privateKeyGuardian, converter, marshaller) + args := GuardedTxSigVerifierArgs{ + SigVerifier: signer, + GuardianChecker: guardianChecker, + PubKeyConverter: converter, + Marshaller: marshaller, + KeyGen: keyGenerator, + } t.Run("verify OK", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGenerator) + gtxSigVerifier, err := NewGuardedTxSigVerifier(args) require.Nil(t, err) err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx) require.Nil(t, err) }) t.Run("invalid guardian signature", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGenerator) + gtxSigVerifier, err := NewGuardedTxSigVerifier(args) require.Nil(t, err) // owner signs for guardian @@ -124,7 +136,7 @@ func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { require.NotNil(t, err) }) t.Run("nil guardian signature", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(signer, guardianChecker, converter, marshaller, keyGenerator) + gtxSigVerifier, err := NewGuardedTxSigVerifier(args) require.Nil(t, err) // owner signs for guardian diff --git a/process/guardianChecker/guardianChecker.go b/process/guardianChecker/guardianChecker.go new file mode 100644 index 00000000000..53efb9fa9d3 --- /dev/null +++ b/process/guardianChecker/guardianChecker.go @@ -0,0 +1,112 @@ +package guardianChecker + +import ( + "sync" + + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/ElrondNetwork/elrond-go-core/data/guardians" + "github.com/ElrondNetwork/elrond-go-core/marshal" + "github.com/ElrondNetwork/elrond-go/process" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" +) + +var guardianKey = []byte(core.ElrondProtectedKeyPrefix + core.GuardiansKeyIdentifier) + +type guardianChecker struct { + marshaller marshal.Marshalizer + epochNotifier vmcommon.EpochNotifier + mutEpoch sync.RWMutex + currentEpoch uint32 +} + +// NewAccountGuardianChecker creates a new account guardian checker +func NewAccountGuardianChecker(marshaller marshal.Marshalizer, epochNotifier vmcommon.EpochNotifier) (*guardianChecker, error) { + if check.IfNil(marshaller) { + return nil, process.ErrNilMarshalizer + } + if check.IfNil(epochNotifier) { + return nil, process.ErrNilEpochNotifier + } + + agc := &guardianChecker{ + marshaller: marshaller, + epochNotifier: epochNotifier, + } + + epochNotifier.RegisterNotifyHandler(agc) + + return agc, nil +} + +// GetActiveGuardian returns the active guardian +func (agc *guardianChecker) GetActiveGuardian(uah data.UserAccountHandler) ([]byte, error) { + guardiansMarshalled, err := uah.RetrieveValueFromDataTrieTracker(guardianKey) + if err != nil { + return nil, err + } + + if len(guardiansMarshalled) == 0 { + return nil, process.ErrAccountHasNoGuardianSet + } + + configuredGuardians := &guardians.Guardians{} + err = agc.marshaller.Unmarshal(configuredGuardians, guardiansMarshalled) + if err != nil { + return nil, err + } + + guardian, err := agc.getActiveGuardian(configuredGuardians) + if err != nil { + return nil, err + } + + return guardian.Address, nil +} + +func (agc *guardianChecker) getActiveGuardian(gs *guardians.Guardians) (*guardians.Guardian, error) { + if gs == nil { + return nil, process.ErrAccountHasNoGuardianSet + } + + agc.mutEpoch.RLock() + defer agc.mutEpoch.RUnlock() + + var selectedGuardian *guardians.Guardian + for i, guardian := range gs.Data { + if guardian == nil { + continue + } + if guardian.ActivationEpoch > agc.currentEpoch { + continue + } + if selectedGuardian == nil { + selectedGuardian = gs.Data[i] + continue + } + + // get the most recent active guardian + if selectedGuardian.ActivationEpoch < guardian.ActivationEpoch { + selectedGuardian = gs.Data[i] + } + } + + if selectedGuardian == nil { + return nil, process.ErrActiveHasNoActiveGuardian + } + + return selectedGuardian, nil +} + +// EpochConfirmed is the registered callback function for the epoch change notifier +func (agc *guardianChecker) EpochConfirmed(epoch uint32, _ uint64) { + agc.mutEpoch.Lock() + agc.currentEpoch = epoch + agc.mutEpoch.Unlock() +} + +// IsInterfaceNil returns true if the receiver is nil +func (agc *guardianChecker) IsInterfaceNil() bool { + return agc == nil +} diff --git a/process/guardianChecker/guardianChecker_test.go b/process/guardianChecker/guardianChecker_test.go new file mode 100644 index 00000000000..c42e4ca8b11 --- /dev/null +++ b/process/guardianChecker/guardianChecker_test.go @@ -0,0 +1,19 @@ +package guardianChecker + +import "testing" + +func TestNewAccountGuardianChecker(t *testing.T) { + +} + +func TestAccountGuardianChecker_GetActiveGuardian(t *testing.T) { + +} + +func TestAccountGuardianChecker_EpochConfirmed(t *testing.T) { + +} + +func TestAccountGuardianChecker_IsInterfaceNil(t *testing.T) { + +} diff --git a/process/interceptors/processor/interface.go b/process/interceptors/processor/interface.go deleted file mode 100644 index 435c97df887..00000000000 --- a/process/interceptors/processor/interface.go +++ /dev/null @@ -1,23 +0,0 @@ -package processor - -import ( - "math/big" - - "github.com/ElrondNetwork/elrond-go-core/data" -) - -// InterceptedTransactionHandler defines an intercepted data wrapper over transaction handler that has -// receiver and sender shard getters -type InterceptedTransactionHandler interface { - SenderShardId() uint32 - ReceiverShardId() uint32 - Nonce() uint64 - SenderAddress() []byte - Fee() *big.Int - Transaction() data.TransactionHandler -} - -// ShardedPool is a perspective of the sharded data pool -type ShardedPool interface { - AddData(key []byte, data interface{}, sizeInBytes int, cacheID string) -} diff --git a/process/interceptors/processor/txInterceptorProcessor.go b/process/interceptors/processor/txInterceptorProcessor.go index a63d0981ea5..8fba07d32af 100644 --- a/process/interceptors/processor/txInterceptorProcessor.go +++ b/process/interceptors/processor/txInterceptorProcessor.go @@ -10,10 +10,11 @@ import ( var _ process.InterceptorProcessor = (*TxInterceptorProcessor)(nil) var txLog = logger.GetOrCreate("process/interceptors/processor/txlog") + // TxInterceptorProcessor is the processor used when intercepting transactions // (smart contract results, receipts, transaction) structs which satisfy TransactionHandler interface. type TxInterceptorProcessor struct { - shardedPool ShardedPool + shardedPool process.ShardedPool txValidator process.TxValidator } @@ -37,7 +38,7 @@ func NewTxInterceptorProcessor(argument *ArgTxInterceptorProcessor) (*TxIntercep // Validate checks if the intercepted data can be processed func (txip *TxInterceptorProcessor) Validate(data process.InterceptedData, _ core.PeerID) error { - interceptedTx, ok := data.(InterceptedTransactionHandler) + interceptedTx, ok := data.(process.InterceptedTxHandler) if !ok { return process.ErrWrongTypeAssertion } @@ -47,7 +48,7 @@ func (txip *TxInterceptorProcessor) Validate(data process.InterceptedData, _ cor // Save will save the received data into the cacher func (txip *TxInterceptorProcessor) Save(data process.InterceptedData, peerOriginator core.PeerID, _ string) error { - interceptedTx, ok := data.(InterceptedTransactionHandler) + interceptedTx, ok := data.(process.InterceptedTxHandler) if !ok { return process.ErrWrongTypeAssertion } diff --git a/process/interface.go b/process/interface.go index 55b0f7cc5ca..4c01e62bd91 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1199,6 +1199,28 @@ type ScheduledTxsExecutionHandler interface { IsInterfaceNil() bool } +// InterceptedTransactionHandler defines an intercepted data wrapper over transaction handler that has +// receiver and sender shard getters +type InterceptedTransactionHandler interface { + SenderShardId() uint32 + ReceiverShardId() uint32 + Nonce() uint64 + SenderAddress() []byte + Fee() *big.Int + Transaction() data.TransactionHandler +} + +// ShardedPool is a perspective of the sharded data pool +type ShardedPool interface { + AddData(key []byte, data interface{}, sizeInBytes int, cacheID string) +} + +// GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions +type GuardianSigVerifier interface { + VerifyGuardianSignature(account data.UserAccountHandler, inTx InterceptedTransactionHandler) error + IsInterfaceNil() bool +} + // DoubleTransactionDetector is able to detect if a transaction hash is present more than once in a block body type DoubleTransactionDetector interface { ProcessBlockBody(body *block.Body) diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go new file mode 100644 index 00000000000..cadd50a1c9d --- /dev/null +++ b/testscommon/guardianMocks/guardianSigVerifierStub.go @@ -0,0 +1,24 @@ +package guardianMocks + +import ( + "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/ElrondNetwork/elrond-go/process" +) + +// GuardianSigVerifierStub - +type GuardianSigVerifierStub struct { + VerifyGuardianSignatureCalled func(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error +} + +// VerifyGuardianSignature - +func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + if gsvs.VerifyGuardianSignatureCalled != nil { + return gsvs.VerifyGuardianSignatureCalled(account, inTx) + } + return nil +} + +// IsInterfaceNil - +func (gsvs *GuardianSigVerifierStub) IsInterfaceNil() bool { + return gsvs == nil +} From b5524091c09b233d611a499a56f095b67fc1b927 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 8 Apr 2022 15:24:35 +0300 Subject: [PATCH 017/335] process, factory, epochStart, node: integrate guardian signature verifier --- .../epochStartInterceptorsContainerFactory.go | 20 +++++++++++++++++++ epochStart/bootstrap/process.go | 1 + factory/processComponents.go | 8 ++++++++ node/node.go | 1 + process/factory/interceptorscontainer/args.go | 1 + .../baseInterceptorsContainerFactory.go | 6 +++++- .../metaInterceptorsContainerFactory.go | 2 ++ .../metaInterceptorsContainerFactory_test.go | 2 ++ .../shardInterceptorsContainerFactory.go | 2 ++ .../shardInterceptorsContainerFactory_test.go | 2 ++ .../factory/argInterceptedDataFactory.go | 1 + update/factory/fullSyncInterceptors.go | 1 + 12 files changed, 46 insertions(+), 1 deletion(-) diff --git a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go index 260424b177a..fcb7b711cc3 100644 --- a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go +++ b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go @@ -14,6 +14,8 @@ import ( disabledGenesis "github.com/ElrondNetwork/elrond-go/genesis/process/disabled" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/factory/interceptorscontainer" + "github.com/ElrondNetwork/elrond-go/process/guardedtx" + guardianChecker2 "github.com/ElrondNetwork/elrond-go/process/guardianChecker" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/storage/timecache" "github.com/ElrondNetwork/elrond-go/update" @@ -61,6 +63,23 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) return nil, err } + guardianChecker, err := guardianChecker2.NewAccountGuardianChecker(args.CoreComponents.InternalMarshalizer(), args.CoreComponents.EpochNotifier()) + if err != nil { + return nil, err + } + + argsGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ + SigVerifier: cryptoComponents.TxSingleSigner(), + GuardianChecker: guardianChecker, + PubKeyConverter: args.CoreComponents.AddressPubKeyConverter(), + Marshaller: args.CoreComponents.InternalMarshalizer(), + KeyGen: args.CryptoComponents.TxSignKeyGen(), + } + guardianSigVerifier, err := guardedtx.NewGuardedTxSigVerifier(argsGuardianSigVerifier) + if err != nil { + return nil, err + } + nodesCoordinator := disabled.NewNodesCoordinator() storer := disabled.NewChainStorer() antiFloodHandler := disabled.NewAntiFloodHandler() @@ -96,6 +115,7 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) EnableEpochs: args.EnableEpochs, PreferredPeersHolder: disabled.NewPreferredPeersHolder(), RequestHandler: args.RequestHandler, + GuardianSigVerifier: guardianSigVerifier, } interceptorsContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(containerFactoryArgs) diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 1285542db41..54b342b5d04 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -532,6 +532,7 @@ func (e *epochStartBootstrap) createSyncers() error { EnableEpochs: e.enableEpochs, EpochNotifier: e.epochNotifier, RequestHandler: e.requestHandler, + } e.interceptorContainer, err = factoryInterceptors.NewEpochStartInterceptorsContainer(args) diff --git a/factory/processComponents.go b/factory/processComponents.go index 34b3f42f82c..ff85c353de2 100644 --- a/factory/processComponents.go +++ b/factory/processComponents.go @@ -438,6 +438,7 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { blockTracker, epochStartTrigger, requestHandler, + guardianSigVerifier, ) if err != nil { return nil, err @@ -1113,6 +1114,7 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( validityAttester process.ValidityAttester, epochStartTrigger process.EpochStartTriggerHandler, requestHandler process.RequestHandler, + guardianSigVerifier process.GuardianSigVerifier, ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { return pcf.newShardInterceptorContainerFactory( @@ -1121,6 +1123,7 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( validityAttester, epochStartTrigger, requestHandler, + guardianSigVerifier, ) } if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { @@ -1130,6 +1133,7 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( validityAttester, epochStartTrigger, requestHandler, + guardianSigVerifier, ) } @@ -1266,6 +1270,7 @@ func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( validityAttester process.ValidityAttester, epochStartTrigger process.EpochStartTriggerHandler, requestHandler process.RequestHandler, + guardianSigVerifier process.GuardianSigVerifier, ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { headerBlackList := timecache.NewTimeCache(timeSpanForBadHeaders) shardInterceptorsContainerFactoryArgs := interceptorscontainer.CommonInterceptorsContainerFactoryArgs{ @@ -1292,6 +1297,7 @@ func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( EnableEpochs: pcf.epochConfig.EnableEpochs, PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), RequestHandler: requestHandler, + GuardianSigVerifier: guardianSigVerifier, } interceptorContainerFactory, err := interceptorscontainer.NewShardInterceptorsContainerFactory(shardInterceptorsContainerFactoryArgs) @@ -1308,6 +1314,7 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( validityAttester process.ValidityAttester, epochStartTrigger process.EpochStartTriggerHandler, requestHandler process.RequestHandler, + guardianSigVerifier process.GuardianSigVerifier, ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { headerBlackList := timecache.NewTimeCache(timeSpanForBadHeaders) metaInterceptorsContainerFactoryArgs := interceptorscontainer.CommonInterceptorsContainerFactoryArgs{ @@ -1334,6 +1341,7 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( EnableEpochs: pcf.epochConfig.EnableEpochs, PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), RequestHandler: requestHandler, + GuardianSigVerifier: guardianSigVerifier, } interceptorContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorsContainerFactoryArgs) diff --git a/node/node.go b/node/node.go index 16449f33e03..94eb52ca0c8 100644 --- a/node/node.go +++ b/node/node.go @@ -610,6 +610,7 @@ func (n *Node) commonTransactionValidation( n.processComponents.ShardCoordinator(), whiteListRequest, n.coreComponents.AddressPubKeyConverter(), + n.processComponents.GuardianSigVerifier(), common.MaxTxNonceDeltaAllowed, ) if err != nil { diff --git a/process/factory/interceptorscontainer/args.go b/process/factory/interceptorscontainer/args.go index 06250c34cb8..5a354789b3d 100644 --- a/process/factory/interceptorscontainer/args.go +++ b/process/factory/interceptorscontainer/args.go @@ -33,4 +33,5 @@ type CommonInterceptorsContainerFactoryArgs struct { SizeCheckDelta uint32 EnableEpochs config.EnableEpochs RequestHandler process.RequestHandler + GuardianSigVerifier process.GuardianSigVerifier } diff --git a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go index ed945887a8b..c1d93dccc44 100644 --- a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go @@ -56,6 +56,7 @@ func checkBaseParams( whiteListerVerifiedTxs process.WhiteListHandler, preferredPeersHolder process.PreferredPeersHolderHandler, requestHandler process.RequestHandler, + guardianSigVerifier process.GuardianSigVerifier, ) error { if check.IfNil(coreComponents) { return process.ErrNilCoreComponentsHolder @@ -138,6 +139,9 @@ func checkBaseParams( if check.IfNil(requestHandler) { return process.ErrNilRequestHandler } + if check.IfNil(guardianSigVerifier) { + return process.ErrNilGuardianSigVerifier + } return nil } @@ -207,7 +211,7 @@ func (bicf *baseInterceptorsContainerFactory) createOneTxInterceptor(topic strin bicf.shardCoordinator, bicf.whiteListHandler, addrPubKeyConverter, - bicf. + bicf.argInterceptorFactory.GuardianSigVerifier, bicf.maxTxNonceDeltaAllowed, ) if err != nil { diff --git a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go index c6ade2c6b26..2d18f597ed1 100644 --- a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go @@ -39,6 +39,7 @@ func NewMetaInterceptorsContainerFactory( args.WhiteListerVerifiedTxs, args.PreferredPeersHolder, args.RequestHandler, + args.GuardianSigVerifier, ) if err != nil { return nil, err @@ -83,6 +84,7 @@ func NewMetaInterceptorsContainerFactory( WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, ArgsParser: args.ArgumentsParser, EnableEpochs: args.EnableEpochs, + GuardianSigVerifier: args.GuardianSigVerifier, } container := containers.NewInterceptorsContainer() diff --git a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go index 20d2709dbde..b15c28332bf 100644 --- a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go +++ b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" storageStubs "github.com/ElrondNetwork/elrond-go/testscommon/storage" @@ -577,5 +578,6 @@ func getArgumentsMeta( ArgumentsParser: &mock.ArgumentParserMock{}, PreferredPeersHolder: &p2pmocks.PeersHolderStub{}, RequestHandler: &testscommon.RequestHandlerStub{}, + GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go index b6c088cc30d..ffab48367d7 100644 --- a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go @@ -37,6 +37,7 @@ func NewShardInterceptorsContainerFactory( args.WhiteListerVerifiedTxs, args.PreferredPeersHolder, args.RequestHandler, + args.GuardianSigVerifier, ) if err != nil { return nil, err @@ -82,6 +83,7 @@ func NewShardInterceptorsContainerFactory( WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, ArgsParser: args.ArgumentsParser, EnableEpochs: args.EnableEpochs, + GuardianSigVerifier: args.GuardianSigVerifier, } container := containers.NewInterceptorsContainer() diff --git a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go index 260b626bc42..a6188dd0ec3 100644 --- a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go +++ b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go @@ -16,6 +16,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -655,5 +656,6 @@ func getArgumentsShard( ArgumentsParser: &mock.ArgumentParserMock{}, PreferredPeersHolder: &p2pmocks.PeersHolderStub{}, RequestHandler: &testscommon.RequestHandlerStub{}, + GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/process/interceptors/factory/argInterceptedDataFactory.go b/process/interceptors/factory/argInterceptedDataFactory.go index 71de6261aad..cbbb2b30704 100644 --- a/process/interceptors/factory/argInterceptedDataFactory.go +++ b/process/interceptors/factory/argInterceptedDataFactory.go @@ -52,4 +52,5 @@ type ArgInterceptedDataFactory struct { EpochStartTrigger process.EpochStartTriggerHandler ArgsParser process.ArgumentsParser EnableEpochs config.EnableEpochs + GuardianSigVerifier process.GuardianSigVerifier } diff --git a/update/factory/fullSyncInterceptors.go b/update/factory/fullSyncInterceptors.go index f8d9d79b0f0..a1ba2a0b7a7 100644 --- a/update/factory/fullSyncInterceptors.go +++ b/update/factory/fullSyncInterceptors.go @@ -487,6 +487,7 @@ func (ficf *fullSyncInterceptorsContainerFactory) createOneTxInterceptor(topic s ficf.shardCoordinator, ficf.whiteListHandler, ficf.addressPubkeyConv, + ficf.argInterceptorFactory.GuardianSigVerifier, ficf.maxTxNonceDeltaAllowed, ) if err != nil { From 73b084b4802dc698396795ebe57c0f8e059657dd Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 8 Apr 2022 16:21:12 +0300 Subject: [PATCH 018/335] dataRetriever, integrationTests, node: fix tests --- .../txpool/memorytests/memory_test.go | 22 +++++++++---------- integrationTests/testProcessorNode.go | 6 +++++ node/node_test.go | 2 ++ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/dataRetriever/txpool/memorytests/memory_test.go b/dataRetriever/txpool/memorytests/memory_test.go index c6a569d0192..9ffdde03423 100644 --- a/dataRetriever/txpool/memorytests/memory_test.go +++ b/dataRetriever/txpool/memorytests/memory_test.go @@ -36,25 +36,25 @@ func TestShardedTxPool_MemoryFootprint(t *testing.T) { journals = append(journals, runScenario(t, newScenario(200, 1, core.MegabyteSize, "0"), memoryAssertion{200, 200}, memoryAssertion{0, 1})) journals = append(journals, runScenario(t, newScenario(10, 1000, 20480, "0"), memoryAssertion{190, 205}, memoryAssertion{1, 4})) journals = append(journals, runScenario(t, newScenario(10000, 1, 1024, "0"), memoryAssertion{10, 16}, memoryAssertion{4, 10})) - journals = append(journals, runScenario(t, newScenario(1, 60000, 256, "0"), memoryAssertion{30, 32}, memoryAssertion{10, 16})) - journals = append(journals, runScenario(t, newScenario(10, 10000, 100, "0"), memoryAssertion{36, 40}, memoryAssertion{16, 24})) - journals = append(journals, runScenario(t, newScenario(100000, 1, 1024, "0"), memoryAssertion{120, 128}, memoryAssertion{56, 60})) + journals = append(journals, runScenario(t, newScenario(1, 60000, 256, "0"), memoryAssertion{30, 36}, memoryAssertion{10, 16})) + journals = append(journals, runScenario(t, newScenario(10, 10000, 100, "0"), memoryAssertion{36, 46}, memoryAssertion{16, 24})) + journals = append(journals, runScenario(t, newScenario(100000, 1, 1024, "0"), memoryAssertion{120, 136}, memoryAssertion{56, 60})) // With larger memory footprint - journals = append(journals, runScenario(t, newScenario(100000, 3, 650, "0"), memoryAssertion{290, 310}, memoryAssertion{95, 110})) - journals = append(journals, runScenario(t, newScenario(150000, 2, 650, "0"), memoryAssertion{290, 310}, memoryAssertion{120, 130})) - journals = append(journals, runScenario(t, newScenario(300000, 1, 650, "0"), memoryAssertion{290, 310}, memoryAssertion{170, 190})) - journals = append(journals, runScenario(t, newScenario(30, 10000, 650, "0"), memoryAssertion{290, 310}, memoryAssertion{60, 70})) - journals = append(journals, runScenario(t, newScenario(300, 1000, 650, "0"), memoryAssertion{290, 310}, memoryAssertion{60, 70})) + journals = append(journals, runScenario(t, newScenario(100000, 3, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{95, 110})) + journals = append(journals, runScenario(t, newScenario(150000, 2, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{120, 130})) + journals = append(journals, runScenario(t, newScenario(300000, 1, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{170, 190})) + journals = append(journals, runScenario(t, newScenario(30, 10000, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{60, 70})) + journals = append(journals, runScenario(t, newScenario(300, 1000, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{60, 70})) // Scenarios where destination == me journals = append(journals, runScenario(t, newScenario(100, 1, core.MegabyteSize, "1_0"), memoryAssertion{90, 100}, memoryAssertion{0, 1})) journals = append(journals, runScenario(t, newScenario(10000, 1, 10240, "1_0"), memoryAssertion{96, 128}, memoryAssertion{0, 4})) - journals = append(journals, runScenario(t, newScenario(10, 10000, 1000, "1_0"), memoryAssertion{96, 128}, memoryAssertion{16, 24})) - journals = append(journals, runScenario(t, newScenario(150000, 1, 128, "1_0"), memoryAssertion{50, 65}, memoryAssertion{30, 36})) - journals = append(journals, runScenario(t, newScenario(1, 150000, 128, "1_0"), memoryAssertion{50, 65}, memoryAssertion{30, 36})) + journals = append(journals, runScenario(t, newScenario(10, 10000, 1000, "1_0"), memoryAssertion{96, 136}, memoryAssertion{16, 24})) + journals = append(journals, runScenario(t, newScenario(150000, 1, 128, "1_0"), memoryAssertion{50, 75}, memoryAssertion{30, 36})) + journals = append(journals, runScenario(t, newScenario(1, 150000, 128, "1_0"), memoryAssertion{50, 75}, memoryAssertion{30, 36})) for _, journal := range journals { journal.displayFootprintsSummary() diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 39fe78f7621..9d2fd93317f 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -92,6 +92,7 @@ import ( dblookupextMock "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/mainFactoryMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -1195,6 +1196,8 @@ func (tpn *TestProcessorNode) initInterceptors() { cryptoComponents.BlKeyGen = tpn.OwnAccount.KeygenBlockSign cryptoComponents.TxKeyGen = tpn.OwnAccount.KeygenTxSign + processComponents := GetDefaultProcessComponents() + if tpn.ShardCoordinator.SelfId() == core.MetachainShardId { argsEpochStart := &metachain.ArgsNewMetaEpochStartTrigger{ GenesisTime: tpn.RoundHandler.TimeStamp(), @@ -1236,6 +1239,7 @@ func (tpn *TestProcessorNode) initInterceptors() { ArgumentsParser: smartContract.NewArgumentParser(), PreferredPeersHolder: &p2pmocks.PeersHolderStub{}, RequestHandler: tpn.RequestHandler, + GuardianSigVerifier: processComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorContainerFactoryArgs) @@ -1292,6 +1296,7 @@ func (tpn *TestProcessorNode) initInterceptors() { ArgumentsParser: smartContract.NewArgumentParser(), PreferredPeersHolder: &p2pmocks.PeersHolderStub{}, RequestHandler: tpn.RequestHandler, + GuardianSigVerifier: processComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewShardInterceptorsContainerFactory(shardIntereptorContainerFactoryArgs) @@ -2969,6 +2974,7 @@ func GetDefaultProcessComponents() *mock.ProcessComponentsStub { }, CurrentEpochProviderInternal: &testscommon.CurrentEpochProviderStub{}, HistoryRepositoryInternal: &dblookupextMock.HistoryRepositoryStub{}, + GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/node/node_test.go b/node/node_test.go index 94fc2bf3cb6..266e5daf8f4 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -43,6 +43,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/mainFactoryMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -3547,6 +3548,7 @@ func getDefaultProcessComponents() *factoryMock.ProcessComponentsMock { WhiteListHandlerInternal: &testscommon.WhiteListHandlerStub{}, WhiteListerVerifiedTxsInternal: &testscommon.WhiteListHandlerStub{}, TxsSenderHandlerField: &txsSenderMock.TxsSenderHandlerMock{}, + GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, } } From c3cf42c93960ac37f2a5da5f0309ca741eac17d9 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 8 Apr 2022 16:25:08 +0300 Subject: [PATCH 019/335] gomod: update gomod gosum, remove local reference --- go.mod | 4 +--- go.sum | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f9bd5919cb7..aabf5f90018 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.1.34 - github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220302140818-bf0e84d19ff7 + github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220408095449-e179fadf3449 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.6 github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c @@ -58,5 +58,3 @@ replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.35 => github.com/Elrond replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.35 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.38-0.20220216155246-c3c866055053 replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.40 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.41-0.20220216163013-931f72f14be7 - -replace github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220302140818-bf0e84d19ff7 => /home/adrian/go2/src/github.com/ElrondNetwork/elrond-go-core diff --git a/go.sum b/go.sum index 7a1c5ccf78c..06390664cf1 100644 --- a/go.sum +++ b/go.sum @@ -32,6 +32,8 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.9/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.10/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220408095449-e179fadf3449 h1:szcj1iYXH/r9CFWQvOM+fPFoE0vlld5ckxx57j06qYA= +github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220408095449-e179fadf3449/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= From 7c527b967064cde500f5a24bc6382bc0e4a83dd4 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 11 Apr 2022 16:17:21 +0300 Subject: [PATCH 020/335] process: filter out frozen metadata on smart contracts and fix tests --- integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go | 5 ++++- process/interface.go | 2 +- process/smartContract/hooks/blockChainHook.go | 5 +++-- process/smartContract/hooks/blockChainHook_test.go | 6 +++--- process/smartContract/vmInput.go | 2 +- testscommon/blockChainHookStub.go | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go b/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go index d5e9199e7b2..365340577a9 100644 --- a/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go +++ b/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go @@ -30,7 +30,8 @@ func TestScDeployShouldManageCorrectlyTheCodeMetadata(t *testing.T) { senderAddressBytes, senderBalance, config.EnableEpochs{ - IsPayableBySCEnableEpoch: 1, + IsPayableBySCEnableEpoch: 1, + FreezeAccountFeatureEnableEpoch: 1, }, ) require.Nil(t, err) @@ -46,6 +47,7 @@ func TestScDeployShouldManageCorrectlyTheCodeMetadata(t *testing.T) { PayableBySC: false, Upgradeable: true, Readable: true, + Frozen: false, } assert.Equal(t, expectedCodeMetadata.ToBytes(), getCodeMetadata(t, testContext.Accounts, contractAddress)) @@ -60,6 +62,7 @@ func TestScDeployShouldManageCorrectlyTheCodeMetadata(t *testing.T) { PayableBySC: true, Upgradeable: true, Readable: true, + Frozen: false, } assert.Equal(t, expectedCodeMetadata.ToBytes(), getCodeMetadata(t, testContext.Accounts, contractAddress)) diff --git a/process/interface.go b/process/interface.go index 4c01e62bd91..c8c9e294a31 100644 --- a/process/interface.go +++ b/process/interface.go @@ -509,7 +509,7 @@ type BlockChainHookHandler interface { RevertToSnapshot(snapshot int) error Close() error FilterCodeMetadataForUpgrade(input []byte) ([]byte, error) - ApplyFiltersOnCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata + ApplyFiltersOnSCCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata IsInterfaceNil() bool } diff --git a/process/smartContract/hooks/blockChainHook.go b/process/smartContract/hooks/blockChainHook.go index 026dbf0fdd7..2d7422ee9d6 100644 --- a/process/smartContract/hooks/blockChainHook.go +++ b/process/smartContract/hooks/blockChainHook.go @@ -481,7 +481,7 @@ func (bh *BlockChainHookImpl) FilterCodeMetadataForUpgrade(input []byte) ([]byte } raw := vmcommon.CodeMetadataFromBytes(input) - filtered := bh.ApplyFiltersOnCodeMetadata(raw) + filtered := bh.ApplyFiltersOnSCCodeMetadata(raw) if bytes.Equal(input, filtered.ToBytes()) { return filtered.ToBytes(), nil } @@ -490,8 +490,9 @@ func (bh *BlockChainHookImpl) FilterCodeMetadataForUpgrade(input []byte) ([]byte } // ApplyFiltersOnCodeMetadata will apply all known filters on the provided code metadata value -func (bh *BlockChainHookImpl) ApplyFiltersOnCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata { +func (bh *BlockChainHookImpl) ApplyFiltersOnSCCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata { codeMetadata.PayableBySC = codeMetadata.PayableBySC && bh.flagIsPayableBySC.IsSet() + codeMetadata.Frozen = false return codeMetadata } diff --git a/process/smartContract/hooks/blockChainHook_test.go b/process/smartContract/hooks/blockChainHook_test.go index d6944f47186..be5eac15389 100644 --- a/process/smartContract/hooks/blockChainHook_test.go +++ b/process/smartContract/hooks/blockChainHook_test.go @@ -1756,7 +1756,7 @@ func TestBlockChainHookImpl_ApplyFiltersOnCodeMetadata(t *testing.T) { Readable: true, } - resulted := bh.ApplyFiltersOnCodeMetadata(provided) + resulted := bh.ApplyFiltersOnSCCodeMetadata(provided) expected := vmcommon.CodeMetadata{ Payable: true, @@ -1780,7 +1780,7 @@ func TestBlockChainHookImpl_ApplyFiltersOnCodeMetadata(t *testing.T) { Readable: true, } - resulted := bh.ApplyFiltersOnCodeMetadata(provided) + resulted := bh.ApplyFiltersOnSCCodeMetadata(provided) expected := vmcommon.CodeMetadata{ Payable: true, PayableBySC: true, @@ -1795,7 +1795,7 @@ func TestBlockChainHookImpl_ApplyFiltersOnCodeMetadata(t *testing.T) { Upgradeable: true, Readable: true, } - resulted = bh.ApplyFiltersOnCodeMetadata(provided) + resulted = bh.ApplyFiltersOnSCCodeMetadata(provided) expected = vmcommon.CodeMetadata{ Payable: true, PayableBySC: false, diff --git a/process/smartContract/vmInput.go b/process/smartContract/vmInput.go index 6b3f15bdbc7..6920eabda37 100644 --- a/process/smartContract/vmInput.go +++ b/process/smartContract/vmInput.go @@ -20,7 +20,7 @@ func (sc *scProcessor) createVMDeployInput(tx data.TransactionHandler) (*vmcommo vmCreateInput := &vmcommon.ContractCreateInput{} vmCreateInput.ContractCode = deployData.Code // when executing SC deploys we should always apply the flags - codeMetadata := sc.blockChainHook.ApplyFiltersOnCodeMetadata(deployData.CodeMetadata) + codeMetadata := sc.blockChainHook.ApplyFiltersOnSCCodeMetadata(deployData.CodeMetadata) vmCreateInput.ContractCodeMetadata = codeMetadata.ToBytes() vmCreateInput.VMInput = vmcommon.VMInput{} err = sc.initializeVMInputFromTx(&vmCreateInput.VMInput, tx) diff --git a/testscommon/blockChainHookStub.go b/testscommon/blockChainHookStub.go index d46a323c1d5..ce31e5aad4d 100644 --- a/testscommon/blockChainHookStub.go +++ b/testscommon/blockChainHookStub.go @@ -345,7 +345,7 @@ func (stub *BlockChainHookStub) FilterCodeMetadataForUpgrade(input []byte) ([]by } // ApplyFiltersOnCodeMetadata - -func (stub *BlockChainHookStub) ApplyFiltersOnCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata { +func (stub *BlockChainHookStub) ApplyFiltersOnSCCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata { if stub.ApplyFiltersOnCodeMetadataCalled != nil { stub.ApplyFiltersOnCodeMetadataCalled(codeMetadata) } From de6e12eaa654e9ca7d294cdac1f5461451d78c84 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 11 Apr 2022 18:09:44 +0300 Subject: [PATCH 021/335] epochStart, factory, node, integrationTests: move guardian sig verifier to bootstrap components --- epochStart/bootstrap/common.go | 3 ++ .../epochStartInterceptorsContainerFactory.go | 26 ++++------------- epochStart/bootstrap/process.go | 5 +++- epochStart/bootstrap/process_test.go | 2 ++ epochStart/errors.go | 3 ++ factory/bootstrapComponents.go | 27 ++++++++++++++++++ factory/bootstrapComponentsHandler.go | 12 ++++++++ factory/bootstrapComponents_test.go | 2 ++ factory/interface.go | 3 +- factory/mock/processComponentsStub.go | 6 ---- factory/processComponents.go | 28 +------------------ factory/processComponentsHandler.go | 12 -------- .../mock/processComponentsStub.go | 6 ---- .../startInEpoch/startInEpoch_test.go | 2 ++ integrationTests/testProcessorNode.go | 20 ++++++------- node/node.go | 3 +- node/node_test.go | 10 +++---- .../bootstrapComponentsStub.go | 6 ++++ 18 files changed, 86 insertions(+), 90 deletions(-) diff --git a/epochStart/bootstrap/common.go b/epochStart/bootstrap/common.go index 03160c08145..73eabd64bb2 100644 --- a/epochStart/bootstrap/common.go +++ b/epochStart/bootstrap/common.go @@ -106,6 +106,9 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if args.GeneralConfig.TrieSync.NumConcurrentTrieSyncers < 1 { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrInvalidNumConcurrentTrieSyncers) } + if check.IfNil(args.GuardianSigVerifier) { + return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilGuardianSigVerifier) + } return nil } diff --git a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go index fcb7b711cc3..8b1b32dde38 100644 --- a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go +++ b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go @@ -14,8 +14,6 @@ import ( disabledGenesis "github.com/ElrondNetwork/elrond-go/genesis/process/disabled" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/factory/interceptorscontainer" - "github.com/ElrondNetwork/elrond-go/process/guardedtx" - guardianChecker2 "github.com/ElrondNetwork/elrond-go/process/guardianChecker" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/storage/timecache" "github.com/ElrondNetwork/elrond-go/update" @@ -42,6 +40,7 @@ type ArgsEpochStartInterceptorContainer struct { EnableEpochs config.EnableEpochs EpochNotifier process.EpochNotifier RequestHandler process.RequestHandler + GuardianSigVerifier process.GuardianSigVerifier } // NewEpochStartInterceptorsContainer will return a real interceptors container factory, but with many disabled components @@ -52,10 +51,12 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) if check.IfNil(args.CryptoComponents) { return nil, epochStart.ErrNilCryptoComponentsHolder } - if check.IfNil(args.CoreComponents.AddressPubKeyConverter()) { return nil, epochStart.ErrNilPubkeyConverter } + if check.IfNil(args.GuardianSigVerifier) { + return nil, epochStart.ErrNilGuardianSigVerifier + } cryptoComponents := args.CryptoComponents.Clone().(process.CryptoComponentsHolder) err := cryptoComponents.SetMultiSigner(disabled.NewMultiSigner()) @@ -63,23 +64,6 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) return nil, err } - guardianChecker, err := guardianChecker2.NewAccountGuardianChecker(args.CoreComponents.InternalMarshalizer(), args.CoreComponents.EpochNotifier()) - if err != nil { - return nil, err - } - - argsGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ - SigVerifier: cryptoComponents.TxSingleSigner(), - GuardianChecker: guardianChecker, - PubKeyConverter: args.CoreComponents.AddressPubKeyConverter(), - Marshaller: args.CoreComponents.InternalMarshalizer(), - KeyGen: args.CryptoComponents.TxSignKeyGen(), - } - guardianSigVerifier, err := guardedtx.NewGuardedTxSigVerifier(argsGuardianSigVerifier) - if err != nil { - return nil, err - } - nodesCoordinator := disabled.NewNodesCoordinator() storer := disabled.NewChainStorer() antiFloodHandler := disabled.NewAntiFloodHandler() @@ -115,7 +99,7 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) EnableEpochs: args.EnableEpochs, PreferredPeersHolder: disabled.NewPreferredPeersHolder(), RequestHandler: args.RequestHandler, - GuardianSigVerifier: guardianSigVerifier, + GuardianSigVerifier: args.GuardianSigVerifier, } interceptorsContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(containerFactoryArgs) diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 54b342b5d04..0f3bb4e4c9b 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -101,6 +101,7 @@ type epochStartBootstrap struct { numConcurrentTrieSyncers int maxHardCapForMissingNodes int trieSyncerVersion int + guardianSigVerifier process.GuardianSigVerifier // created components requestHandler process.RequestHandler @@ -164,6 +165,7 @@ type ArgsEpochStartBootstrap struct { HeaderIntegrityVerifier process.HeaderIntegrityVerifier DataSyncerCreator types.ScheduledDataSyncerCreator ScheduledSCRsStorer storage.Storer + GuardianSigVerifier process.GuardianSigVerifier } type dataToSync struct { @@ -208,6 +210,7 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, dataSyncerFactory: args.DataSyncerCreator, storerScheduledSCRs: args.ScheduledSCRsStorer, shardCoordinator: args.GenesisShardCoordinator, + guardianSigVerifier: args.GuardianSigVerifier, } log.Debug("process: enable epoch for transaction signed with tx hash", "epoch", epochStartProvider.enableEpochs.TransactionSignedWithTxHashEnableEpoch) @@ -532,7 +535,7 @@ func (e *epochStartBootstrap) createSyncers() error { EnableEpochs: e.enableEpochs, EpochNotifier: e.epochNotifier, RequestHandler: e.requestHandler, - + GuardianSigVerifier: e.guardianSigVerifier, } e.interceptorContainer, err = factoryInterceptors.NewEpochStartInterceptorsContainer(args) diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index a37f99d9c17..0a031db2f8e 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -33,6 +33,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/genericMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/scheduledDataSyncer" @@ -214,6 +215,7 @@ func createMockEpochStartBootstrapArgs( }, nil }, }, + GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/epochStart/errors.go b/epochStart/errors.go index 9836200173d..4126b1a178c 100644 --- a/epochStart/errors.go +++ b/epochStart/errors.go @@ -331,3 +331,6 @@ var ErrNilScheduledTxsHandler = errors.New("nil scheduled transactions handler") // ErrNilScheduledDataSyncerFactory signals that a nil scheduled data syncer factory was provided var ErrNilScheduledDataSyncerFactory = errors.New("nil scheduled data syncer factory") + +// ErrNilGuardianSigVerifier signals that a nil guardian signature verifier was provided +var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") diff --git a/factory/bootstrapComponents.go b/factory/bootstrapComponents.go index 18e2d2f3084..f164cb845fb 100644 --- a/factory/bootstrapComponents.go +++ b/factory/bootstrapComponents.go @@ -13,6 +13,8 @@ import ( "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory/block" "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/process/guardedtx" + "github.com/ElrondNetwork/elrond-go/process/guardianChecker" "github.com/ElrondNetwork/elrond-go/process/headerCheck" "github.com/ElrondNetwork/elrond-go/process/roundActivation" "github.com/ElrondNetwork/elrond-go/process/smartContract" @@ -58,6 +60,7 @@ type bootstrapComponents struct { versionedHeaderFactory factory.VersionedHeaderFactory headerIntegrityVerifier factory.HeaderIntegrityVerifierHandler roundActivationHandler process.RoundActivationHandler + guardianSigVerifier process.GuardianSigVerifier } // NewBootstrapComponentsFactory creates an instance of bootstrapComponentsFactory @@ -160,6 +163,11 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() + guardianSigVerifier, err := bcf.newGuardianSigVerifier() + if err != nil { + return nil, err + } + epochStartBootstrapArgs := bootstrap.ArgsEpochStartBootstrap{ CoreComponentsHolder: bcf.coreComponents, CryptoComponentsHolder: bcf.cryptoComponents, @@ -181,6 +189,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { HeaderIntegrityVerifier: headerIntegrityVerifier, DataSyncerCreator: dataSyncerFactory, ScheduledSCRsStorer: nil, // will be updated after sync from network + GuardianSigVerifier: guardianSigVerifier, } var epochStartBootstrapper EpochStartBootstrapper @@ -245,9 +254,27 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { headerIntegrityVerifier: headerIntegrityVerifier, versionedHeaderFactory: versionedHeaderFactory, roundActivationHandler: roundActivationHandler, + guardianSigVerifier: guardianSigVerifier, }, nil } +func (bcf *bootstrapComponentsFactory) newGuardianSigVerifier() (process.GuardianSigVerifier, error) { + gTxChecker, err := guardianChecker.NewAccountGuardianChecker(bcf.coreComponents.InternalMarshalizer(), bcf.coreComponents.EpochNotifier()) + if err != nil { + return nil, err + } + + argGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ + SigVerifier: bcf.cryptoComponents.TxSingleSigner(), + GuardianChecker: gTxChecker, + PubKeyConverter: bcf.coreComponents.AddressPubKeyConverter(), + Marshaller: bcf.coreComponents.InternalMarshalizer(), + KeyGen: bcf.cryptoComponents.TxSignKeyGen(), + } + + return guardedtx.NewGuardedTxSigVerifier(argGuardianSigVerifier) +} + func (bcf *bootstrapComponentsFactory) createHeaderFactory(handler factory.HeaderVersionHandler, shardID uint32) (factory.VersionedHeaderFactory, error) { if shardID == core.MetachainShardId { return block.NewMetaHeaderFactory(handler) diff --git a/factory/bootstrapComponentsHandler.go b/factory/bootstrapComponentsHandler.go index 286909baa1b..990d5e9ee7e 100644 --- a/factory/bootstrapComponentsHandler.go +++ b/factory/bootstrapComponentsHandler.go @@ -117,6 +117,18 @@ func (mbf *managedBootstrapComponents) RoundActivationHandler() process.RoundAct return mbf.bootstrapComponents.roundActivationHandler } +// GuardianSigVerifier returns the guardian signature verifier +func (mbf *managedBootstrapComponents) GuardianSigVerifier() process.GuardianSigVerifier { + mbf.mutBootstrapComponents.RLock() + defer mbf.mutBootstrapComponents.RUnlock() + + if mbf.guardianSigVerifier == nil { + return nil + } + + return mbf.bootstrapComponents.guardianSigVerifier +} + // IsInterfaceNil returns true if the underlying object is nil func (mbf *managedBootstrapComponents) IsInterfaceNil() bool { return mbf == nil diff --git a/factory/bootstrapComponents_test.go b/factory/bootstrapComponents_test.go index f2f864e0302..aeca1e591fd 100644 --- a/factory/bootstrapComponents_test.go +++ b/factory/bootstrapComponents_test.go @@ -11,6 +11,7 @@ import ( "github.com/ElrondNetwork/elrond-go/factory/mock" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" + "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/stretchr/testify/require" @@ -170,5 +171,6 @@ func getDefaultCoreComponents() *mock.CoreComponentsMock { NodesConfig: &testscommon.NodesSetupStub{}, StartTime: time.Time{}, NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, } } diff --git a/factory/interface.go b/factory/interface.go index 9d54e00e023..4b67c1906a8 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -262,7 +262,7 @@ type ProcessComponentsHolder interface { CurrentEpochProvider() process.CurrentNetworkEpochProviderHandler ScheduledTxsExecutionHandler() process.ScheduledTxsExecutionHandler TxsSenderHandler() process.TxsSenderHandler - GuardianSigVerifier() process.GuardianSigVerifier + //GuardianSigVerifier() process.GuardianSigVerifier IsInterfaceNil() bool } @@ -426,6 +426,7 @@ type BootstrapComponentsHolder interface { VersionedHeaderFactory() factory.VersionedHeaderFactory HeaderVersionHandler() factory.HeaderVersionHandler HeaderIntegrityVerifier() factory.HeaderIntegrityVerifierHandler + GuardianSigVerifier() process.GuardianSigVerifier IsInterfaceNil() bool } diff --git a/factory/mock/processComponentsStub.go b/factory/mock/processComponentsStub.go index f58f8c199a5..1f66011a2ff 100644 --- a/factory/mock/processComponentsStub.go +++ b/factory/mock/processComponentsStub.go @@ -45,7 +45,6 @@ type ProcessComponentsMock struct { CurrentEpochProviderInternal process.CurrentNetworkEpochProviderHandler ScheduledTxsExecutionHandlerInternal process.ScheduledTxsExecutionHandler TxsSenderHandlerField process.TxsSenderHandler - GuardianSigVerifierField process.GuardianSigVerifier } // Create - @@ -228,11 +227,6 @@ func (pcm *ProcessComponentsMock) TxsSenderHandler() process.TxsSenderHandler { return pcm.TxsSenderHandlerField } -// GuardianSigVerifier - -func (pcm *ProcessComponentsMock) GuardianSigVerifier() process.GuardianSigVerifier { - return pcm.GuardianSigVerifierField -} - // IsInterfaceNil - func (pcm *ProcessComponentsMock) IsInterfaceNil() bool { return pcm == nil diff --git a/factory/processComponents.go b/factory/processComponents.go index ff85c353de2..633286ac336 100644 --- a/factory/processComponents.go +++ b/factory/processComponents.go @@ -41,8 +41,6 @@ import ( "github.com/ElrondNetwork/elrond-go/process/block/poolsCleaner" "github.com/ElrondNetwork/elrond-go/process/block/preprocess" "github.com/ElrondNetwork/elrond-go/process/factory/interceptorscontainer" - "github.com/ElrondNetwork/elrond-go/process/guardedtx" - "github.com/ElrondNetwork/elrond-go/process/guardianChecker" "github.com/ElrondNetwork/elrond-go/process/headerCheck" "github.com/ElrondNetwork/elrond-go/process/peer" "github.com/ElrondNetwork/elrond-go/process/smartContract" @@ -106,7 +104,6 @@ type processComponents struct { vmFactoryForProcessing process.VirtualMachinesContainerFactory scheduledTxsExecutionHandler process.ScheduledTxsExecutionHandler txsSender process.TxsSenderHandler - guardianSigVerifier process.GuardianSigVerifier } // ProcessComponentsFactoryArgs holds the arguments needed to create a process components factory @@ -244,11 +241,6 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { return nil, err } - guardianSigVerifier, err := pcf.newGuardianSigVerifier() - if err != nil { - return nil, err - } - resolversContainerFactory, err := pcf.newResolverContainerFactory(currentEpochProvider) if err != nil { return nil, err @@ -438,7 +430,7 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { blockTracker, epochStartTrigger, requestHandler, - guardianSigVerifier, + pcf.bootstrapComponents.GuardianSigVerifier(), ) if err != nil { return nil, err @@ -615,27 +607,9 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { vmFactoryForProcessing: blockProcessorComponents.vmFactoryForProcessing, scheduledTxsExecutionHandler: scheduledTxsExecutionHandler, txsSender: txsSenderWithAccumulator, - guardianSigVerifier: guardianSigVerifier, }, nil } -func (pcf *processComponentsFactory) newGuardianSigVerifier() (process.GuardianSigVerifier, error) { - gTxChecker, err := guardianChecker.NewAccountGuardianChecker(pcf.coreData.InternalMarshalizer(), pcf.coreData.EpochNotifier()) - if err != nil { - return nil, err - } - - argGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ - SigVerifier: pcf.crypto.TxSingleSigner(), - GuardianChecker: gTxChecker, - PubKeyConverter: pcf.coreData.AddressPubKeyConverter(), - Marshaller: pcf.coreData.InternalMarshalizer(), - KeyGen: pcf.crypto.TxSignKeyGen(), - } - - return guardedtx.NewGuardedTxSigVerifier(argGuardianSigVerifier) -} - func (pcf *processComponentsFactory) newValidatorStatisticsProcessor() (process.ValidatorStatisticsProcessor, error) { storageService := pcf.data.StorageService() diff --git a/factory/processComponentsHandler.go b/factory/processComponentsHandler.go index 4a152be9a17..1788c0e8eca 100644 --- a/factory/processComponentsHandler.go +++ b/factory/processComponentsHandler.go @@ -541,18 +541,6 @@ func (m *managedProcessComponents) TxsSenderHandler() process.TxsSenderHandler { return m.processComponents.txsSender } -// GuardianSigVerifier returns the guardian signature verifier -func (m *managedProcessComponents) GuardianSigVerifier() process.GuardianSigVerifier { - m.mutProcessComponents.RLock() - defer m.mutProcessComponents.RUnlock() - - if m.processComponents == nil { - return nil - } - - return m.processComponents.guardianSigVerifier -} - // IsInterfaceNil returns true if the interface is nil func (m *managedProcessComponents) IsInterfaceNil() bool { return m == nil diff --git a/integrationTests/mock/processComponentsStub.go b/integrationTests/mock/processComponentsStub.go index 41e853cf4b5..7312e6efb56 100644 --- a/integrationTests/mock/processComponentsStub.go +++ b/integrationTests/mock/processComponentsStub.go @@ -45,7 +45,6 @@ type ProcessComponentsStub struct { CurrentEpochProviderInternal process.CurrentNetworkEpochProviderHandler ScheduledTxsExecutionHandlerInternal process.ScheduledTxsExecutionHandler TxsSenderHandlerField process.TxsSenderHandler - GuardianSigVerifierField process.GuardianSigVerifier } // Create - @@ -228,11 +227,6 @@ func (pcs *ProcessComponentsStub) TxsSenderHandler() process.TxsSenderHandler { return pcs.TxsSenderHandlerField } -// GuardianSigVerifier - -func (pcs *ProcessComponentsStub) GuardianSigVerifier() process.GuardianSigVerifier { - return pcs.GuardianSigVerifierField -} - // IsInterfaceNil - func (pcs *ProcessComponentsStub) IsInterfaceNil() bool { return pcs == nil diff --git a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go index 4d1afbfcfbc..0bf8ba48051 100644 --- a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go +++ b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go @@ -29,6 +29,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/storageUnit" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/genericMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/scheduledDataSyncer" statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" @@ -239,6 +240,7 @@ func testNodeStartsInEpoch(t *testing.T, shardID uint32, expectedHighestRound ui }, }, ScheduledSCRsStorer: genericMocks.NewStorerMock("path", 0), + GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } epochStartBootstrap, err := bootstrap.NewEpochStartBootstrap(argsBootstrapHandler) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 9d2fd93317f..95ce650e238 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1196,7 +1196,7 @@ func (tpn *TestProcessorNode) initInterceptors() { cryptoComponents.BlKeyGen = tpn.OwnAccount.KeygenBlockSign cryptoComponents.TxKeyGen = tpn.OwnAccount.KeygenTxSign - processComponents := GetDefaultProcessComponents() + bootstrapComponents := getDefaultBootstrapComponents(tpn.ShardCoordinator) if tpn.ShardCoordinator.SelfId() == core.MetachainShardId { argsEpochStart := &metachain.ArgsNewMetaEpochStartTrigger{ @@ -1239,7 +1239,7 @@ func (tpn *TestProcessorNode) initInterceptors() { ArgumentsParser: smartContract.NewArgumentParser(), PreferredPeersHolder: &p2pmocks.PeersHolderStub{}, RequestHandler: tpn.RequestHandler, - GuardianSigVerifier: processComponents.GuardianSigVerifierField, + GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorContainerFactoryArgs) @@ -1296,7 +1296,7 @@ func (tpn *TestProcessorNode) initInterceptors() { ArgumentsParser: smartContract.NewArgumentParser(), PreferredPeersHolder: &p2pmocks.PeersHolderStub{}, RequestHandler: tpn.RequestHandler, - GuardianSigVerifier: processComponents.GuardianSigVerifierField, + GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewShardInterceptorsContainerFactory(shardIntereptorContainerFactoryArgs) @@ -2974,7 +2974,6 @@ func GetDefaultProcessComponents() *mock.ProcessComponentsStub { }, CurrentEpochProviderInternal: &testscommon.CurrentEpochProviderStub{}, HistoryRepositoryInternal: &dblookupextMock.HistoryRepositoryStub{}, - GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, } } @@ -3055,12 +3054,13 @@ func getDefaultBootstrapComponents(shardCoordinator sharding.Coordinator) *mainF StorageManagers: map[string]common.StorageManager{"0": &testscommon.StorageManagerStub{}}, BootstrapCalled: nil, }, - BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, - NodeRole: "", - ShCoordinator: shardCoordinator, - HdrVersionHandler: headerVersionHandler, - VersionedHdrFactory: versionedHeaderFactory, - HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, + BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, + NodeRole: "", + ShCoordinator: shardCoordinator, + HdrVersionHandler: headerVersionHandler, + VersionedHdrFactory: versionedHeaderFactory, + HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, + GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/node/node.go b/node/node.go index 94eb52ca0c8..e2f53eb84ed 100644 --- a/node/node.go +++ b/node/node.go @@ -610,9 +610,10 @@ func (n *Node) commonTransactionValidation( n.processComponents.ShardCoordinator(), whiteListRequest, n.coreComponents.AddressPubKeyConverter(), - n.processComponents.GuardianSigVerifier(), + n.bootstrapComponents.GuardianSigVerifier(), common.MaxTxNonceDeltaAllowed, ) + if err != nil { log.Warn("node.ValidateTransaction: can not instantiate a TxValidator", "error", err) diff --git a/node/node_test.go b/node/node_test.go index 266e5daf8f4..c525811da15 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -3548,7 +3548,6 @@ func getDefaultProcessComponents() *factoryMock.ProcessComponentsMock { WhiteListHandlerInternal: &testscommon.WhiteListHandlerStub{}, WhiteListerVerifiedTxsInternal: &testscommon.WhiteListHandlerStub{}, TxsSenderHandlerField: &txsSenderMock.TxsSenderHandlerMock{}, - GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, } } @@ -3572,9 +3571,10 @@ func getDefaultBootstrapComponents() *mainFactoryMocks.BootstrapComponentsStub { StorageManagers: map[string]common.StorageManager{"0": &testscommon.StorageManagerStub{}}, BootstrapCalled: nil, }, - BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, - NodeRole: "", - ShCoordinator: &mock.ShardCoordinatorMock{}, - HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, + BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, + NodeRole: "", + ShCoordinator: &mock.ShardCoordinatorMock{}, + HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, + GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go index 14daad9f5af..26011e65769 100644 --- a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go +++ b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go @@ -18,6 +18,7 @@ type BootstrapComponentsStub struct { VersionedHdrFactory nodeFactory.VersionedHeaderFactory HdrIntegrityVerifier nodeFactory.HeaderIntegrityVerifierHandler RoundActivationHandlerField process.RoundActivationHandler + GuardianSigVerifierField process.GuardianSigVerifier } // Create - @@ -75,6 +76,11 @@ func (bcs *BootstrapComponentsStub) RoundActivationHandler() process.RoundActiva return bcs.RoundActivationHandlerField } +// GuardianSigVerifier - +func (bcs *BootstrapComponentsStub) GuardianSigVerifier() process.GuardianSigVerifier { + return bcs.GuardianSigVerifierField +} + // String - func (bcs *BootstrapComponentsStub) String() string { return "BootstrapComponentsStub" From 20b3eca3bc699aca3d31c9cabd4a5e7654175644 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 14 Apr 2022 13:47:49 +0300 Subject: [PATCH 022/335] process, factory: rename guardianChecker to guardedAccount and add SetGuardian functionality --- factory/bootstrapComponents.go | 6 +- process/guardian/guardedAccount.go | 184 ++++++++++++++++++ .../guardedAccount_test.go} | 2 +- process/guardianChecker/guardianChecker.go | 112 ----------- 4 files changed, 188 insertions(+), 116 deletions(-) create mode 100644 process/guardian/guardedAccount.go rename process/{guardianChecker/guardianChecker_test.go => guardian/guardedAccount_test.go} (92%) delete mode 100644 process/guardianChecker/guardianChecker.go diff --git a/factory/bootstrapComponents.go b/factory/bootstrapComponents.go index f164cb845fb..da2f13d2bb1 100644 --- a/factory/bootstrapComponents.go +++ b/factory/bootstrapComponents.go @@ -14,7 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/factory/block" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/guardedtx" - "github.com/ElrondNetwork/elrond-go/process/guardianChecker" + "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/headerCheck" "github.com/ElrondNetwork/elrond-go/process/roundActivation" "github.com/ElrondNetwork/elrond-go/process/smartContract" @@ -26,7 +26,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/storageUnit" ) -// BootstrapComponentsFactoryArgs holds the arguments needed to create a botstrap components factory +// BootstrapComponentsFactoryArgs holds the arguments needed to create a bootstrap components factory type BootstrapComponentsFactoryArgs struct { Config config.Config EpochConfig config.EpochConfig @@ -259,7 +259,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { } func (bcf *bootstrapComponentsFactory) newGuardianSigVerifier() (process.GuardianSigVerifier, error) { - gTxChecker, err := guardianChecker.NewAccountGuardianChecker(bcf.coreComponents.InternalMarshalizer(), bcf.coreComponents.EpochNotifier()) + gTxChecker, err := guardian.NewGuardedAccount(bcf.coreComponents.InternalMarshalizer(), bcf.coreComponents.EpochNotifier()) if err != nil { return nil, err } diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go new file mode 100644 index 00000000000..a0452272445 --- /dev/null +++ b/process/guardian/guardedAccount.go @@ -0,0 +1,184 @@ +package guardian + +import ( + "fmt" + "sync" + + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/ElrondNetwork/elrond-go-core/data/guardians" + "github.com/ElrondNetwork/elrond-go-core/marshal" + "github.com/ElrondNetwork/elrond-go/process" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" +) + +var guardianKey = []byte(core.ElrondProtectedKeyPrefix + core.GuardiansKeyIdentifier) + +const epochsForActivation = 10 // TODO: take from config + +type guardedAccount struct { + marshaller marshal.Marshalizer + epochNotifier vmcommon.EpochNotifier + mutEpoch sync.RWMutex + currentEpoch uint32 + guardianActivationEpochs uint32 +} + +// NewGuardedAccount creates a new guarded account +func NewGuardedAccount(marshaller marshal.Marshalizer, epochNotifier vmcommon.EpochNotifier) (*guardedAccount, error) { + if check.IfNil(marshaller) { + return nil, process.ErrNilMarshalizer + } + if check.IfNil(epochNotifier) { + return nil, process.ErrNilEpochNotifier + } + + agc := &guardedAccount{ + marshaller: marshaller, + epochNotifier: epochNotifier, + guardianActivationEpochs: epochsForActivation, + } + + epochNotifier.RegisterNotifyHandler(agc) + + return agc, nil +} + +// GetActiveGuardian returns the active guardian +func (agc *guardedAccount) GetActiveGuardian(uah data.UserAccountHandler) ([]byte, error) { + configuredGuardians, err := agc.getConfiguredGuardians(uah) + if err != nil { + return nil, err + } + if len(configuredGuardians.Data) == 0 { + return nil, process.ErrAccountHasNoGuardianSet + } + + guardian, err := agc.getActiveGuardian(*configuredGuardians) + if err != nil { + return nil, err + } + + return guardian.Address, nil +} + +// SetGuardian sets a guardian for an account +func (agc *guardedAccount) SetGuardian(uah data.UserAccountHandler, guardianAddress []byte) error { + guardian := &guardians.Guardian{ + Address: guardianAddress, + ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochs, + } + + return agc.setAccountGuardian(uah, guardian) +} + +func (agc *guardedAccount) setAccountGuardian(uah data.UserAccountHandler, guardian *guardians.Guardian) error { + configuredGuardians, err := agc.getConfiguredGuardians(uah) + if err != nil { + return err + } + newGuardians, err := agc.updateGuardians(guardian, *configuredGuardians) + if err != nil { + return err + } + + accHandler, ok := uah.(vmcommon.UserAccountHandler) + if !ok { + return process.ErrWrongTypeAssertion + } + + return agc.saveAccountGuardians(accHandler, *newGuardians) +} + +func (agc *guardedAccount) updateGuardians(newGuardian *guardians.Guardian, accountGuardians guardians.Guardians) (*guardians.Guardians, error) { + numSetGuardians := len(accountGuardians.Data) + + if numSetGuardians == 0 { + accountGuardians.Data = append(accountGuardians.Data, newGuardian) + return &accountGuardians, nil + } + + activeGuardian, err := agc.getActiveGuardian(accountGuardians) + if err != nil { + // no active guardian, do not replace the already pending guardian + return nil, fmt.Errorf("%w in updateGuardians, with %d configured guardians", err, numSetGuardians) + } + + if activeGuardian.Equal(newGuardian) { + accountGuardians.Data = []*guardians.Guardian{activeGuardian} + } else { + accountGuardians.Data = []*guardians.Guardian{activeGuardian, newGuardian} + } + + return &accountGuardians, nil +} + +func (agc *guardedAccount) saveAccountGuardians(account vmcommon.UserAccountHandler, accountGuardians guardians.Guardians) error { + marshalledData, err := agc.marshaller.Marshal(accountGuardians) + if err != nil { + return err + } + + return account.AccountDataHandler().SaveKeyValue(guardianKey, marshalledData) +} + +func (agc *guardedAccount) getConfiguredGuardians(uah data.UserAccountHandler) (*guardians.Guardians, error) { + guardiansMarshalled, err := uah.RetrieveValueFromDataTrieTracker(guardianKey) + if err != nil { + return nil, err + } + if len(guardiansMarshalled) == 0 { + return &guardians.Guardians{Data: make([]*guardians.Guardian, 0)}, nil + } + + configuredGuardians := &guardians.Guardians{} + err = agc.marshaller.Unmarshal(configuredGuardians, guardiansMarshalled) + if err != nil { + return nil, err + } + + return configuredGuardians, nil +} + +func (agc *guardedAccount) getActiveGuardian(gs guardians.Guardians) (*guardians.Guardian, error) { + agc.mutEpoch.RLock() + defer agc.mutEpoch.RUnlock() + + var selectedGuardian *guardians.Guardian + for i, guardian := range gs.Data { + if guardian == nil { + continue + } + if guardian.ActivationEpoch > agc.currentEpoch { + continue + } + if selectedGuardian == nil { + selectedGuardian = gs.Data[i] + continue + } + + // get the most recent active guardian + if selectedGuardian.ActivationEpoch < guardian.ActivationEpoch { + selectedGuardian = gs.Data[i] + } + } + + if selectedGuardian == nil { + return nil, process.ErrActiveHasNoActiveGuardian + } + + return selectedGuardian, nil +} + +// EpochConfirmed is the registered callback function for the epoch change notifier +func (agc *guardedAccount) EpochConfirmed(epoch uint32, _ uint64) { + agc.mutEpoch.Lock() + agc.currentEpoch = epoch + agc.mutEpoch.Unlock() +} + +// IsInterfaceNil returns true if the receiver is nil +func (agc *guardedAccount) IsInterfaceNil() bool { + return agc == nil +} diff --git a/process/guardianChecker/guardianChecker_test.go b/process/guardian/guardedAccount_test.go similarity index 92% rename from process/guardianChecker/guardianChecker_test.go rename to process/guardian/guardedAccount_test.go index c42e4ca8b11..6ddd666b3e8 100644 --- a/process/guardianChecker/guardianChecker_test.go +++ b/process/guardian/guardedAccount_test.go @@ -1,4 +1,4 @@ -package guardianChecker +package guardian import "testing" diff --git a/process/guardianChecker/guardianChecker.go b/process/guardianChecker/guardianChecker.go deleted file mode 100644 index 53efb9fa9d3..00000000000 --- a/process/guardianChecker/guardianChecker.go +++ /dev/null @@ -1,112 +0,0 @@ -package guardianChecker - -import ( - "sync" - - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data" - "github.com/ElrondNetwork/elrond-go-core/data/guardians" - "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go/process" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" -) - -var guardianKey = []byte(core.ElrondProtectedKeyPrefix + core.GuardiansKeyIdentifier) - -type guardianChecker struct { - marshaller marshal.Marshalizer - epochNotifier vmcommon.EpochNotifier - mutEpoch sync.RWMutex - currentEpoch uint32 -} - -// NewAccountGuardianChecker creates a new account guardian checker -func NewAccountGuardianChecker(marshaller marshal.Marshalizer, epochNotifier vmcommon.EpochNotifier) (*guardianChecker, error) { - if check.IfNil(marshaller) { - return nil, process.ErrNilMarshalizer - } - if check.IfNil(epochNotifier) { - return nil, process.ErrNilEpochNotifier - } - - agc := &guardianChecker{ - marshaller: marshaller, - epochNotifier: epochNotifier, - } - - epochNotifier.RegisterNotifyHandler(agc) - - return agc, nil -} - -// GetActiveGuardian returns the active guardian -func (agc *guardianChecker) GetActiveGuardian(uah data.UserAccountHandler) ([]byte, error) { - guardiansMarshalled, err := uah.RetrieveValueFromDataTrieTracker(guardianKey) - if err != nil { - return nil, err - } - - if len(guardiansMarshalled) == 0 { - return nil, process.ErrAccountHasNoGuardianSet - } - - configuredGuardians := &guardians.Guardians{} - err = agc.marshaller.Unmarshal(configuredGuardians, guardiansMarshalled) - if err != nil { - return nil, err - } - - guardian, err := agc.getActiveGuardian(configuredGuardians) - if err != nil { - return nil, err - } - - return guardian.Address, nil -} - -func (agc *guardianChecker) getActiveGuardian(gs *guardians.Guardians) (*guardians.Guardian, error) { - if gs == nil { - return nil, process.ErrAccountHasNoGuardianSet - } - - agc.mutEpoch.RLock() - defer agc.mutEpoch.RUnlock() - - var selectedGuardian *guardians.Guardian - for i, guardian := range gs.Data { - if guardian == nil { - continue - } - if guardian.ActivationEpoch > agc.currentEpoch { - continue - } - if selectedGuardian == nil { - selectedGuardian = gs.Data[i] - continue - } - - // get the most recent active guardian - if selectedGuardian.ActivationEpoch < guardian.ActivationEpoch { - selectedGuardian = gs.Data[i] - } - } - - if selectedGuardian == nil { - return nil, process.ErrActiveHasNoActiveGuardian - } - - return selectedGuardian, nil -} - -// EpochConfirmed is the registered callback function for the epoch change notifier -func (agc *guardianChecker) EpochConfirmed(epoch uint32, _ uint64) { - agc.mutEpoch.Lock() - agc.currentEpoch = epoch - agc.mutEpoch.Unlock() -} - -// IsInterfaceNil returns true if the receiver is nil -func (agc *guardianChecker) IsInterfaceNil() bool { - return agc == nil -} From ea4a6d0d8f1b6148c2aa544bd017bffd4bda9cb4 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 19 Apr 2022 15:07:03 +0300 Subject: [PATCH 023/335] integrate guarded account handler --- factory/apiResolverFactory.go | 4 +++ factory/blockProcessorCreator.go | 1 + factory/bootstrapComponents.go | 8 +---- factory/bootstrapComponents_test.go | 26 ++++++++------- factory/coreComponents.go | 8 +++++ factory/coreComponentsHandler.go | 12 +++++++ factory/interface.go | 2 +- factory/mock/coreComponentsMock.go | 6 ++++ genesis/process/shardGenesisBlockCreator.go | 2 ++ integrationTests/mock/coreComponentsStub.go | 6 ++++ .../state/stateTrie/stateTrie_test.go | 2 +- integrationTests/testProcessorNode.go | 33 +++++++++++-------- ...ProcessorNodeWithStateCheckpointModulus.go | 2 ++ .../testProcessorNodeWithTestWebServer.go | 13 ++++---- integrationTests/testSyncNode.go | 2 ++ integrationTests/vm/arwen/utils.go | 14 ++++---- integrationTests/vm/testInitializer.go | 19 ++++++----- node/mock/factory/coreComponentsStub.go | 6 ++++ node/node_test.go | 27 +++++++-------- process/dataValidators/txValidator.go | 2 +- process/errors.go | 9 +++++ process/guardedtx/guardedTxVerifier.go | 4 +-- .../disabled/disabledGuardedAccount.go | 27 +++++++++++++++ process/interface.go | 15 ++------- process/mock/interceptedTxHandlerStub.go | 30 +++++++++++++---- .../interceptedRewardTransaction.go | 10 ++++++ .../smartContract/builtInFunctions/factory.go | 5 +++ .../builtInFunctions/factory_test.go | 16 +++++---- process/transaction/interceptedTransaction.go | 17 ++++++++++ .../interceptedUnsignedTransaction.go | 10 ++++++ storage/txcache/wrappedTransaction.go | 1 + .../guardianAccountHandlerStub.go | 30 +++++++++++++++++ .../guardianMocks/guardianSigVerifierStub.go | 4 +-- .../interceptedTxMocks/interceptedTxStub.go | 30 +++++++++++++---- 34 files changed, 300 insertions(+), 103 deletions(-) create mode 100644 process/guardian/disabled/disabledGuardedAccount.go create mode 100644 testscommon/guardianMocks/guardianAccountHandlerStub.go diff --git a/factory/apiResolverFactory.go b/factory/apiResolverFactory.go index 951e89eb8c0..82b4d340c2c 100644 --- a/factory/apiResolverFactory.go +++ b/factory/apiResolverFactory.go @@ -110,6 +110,7 @@ func CreateApiResolver(args *ApiResolverArgs) (facade.ApiResolver, error) { args.StateComponents.AccountsAdapterAPI(), args.BootstrapComponents.ShardCoordinator(), args.CoreComponents.EpochNotifier(), + args.CoreComponents.GuardedAccountHandler(), args.Configs.EpochConfig.EnableEpochs.ESDTMultiTransferEnableEpoch, args.Configs.EpochConfig.EnableEpochs.GlobalMintBurnDisableEpoch, args.Configs.EpochConfig.EnableEpochs.ESDTTransferRoleEnableEpoch, @@ -269,6 +270,7 @@ func createScQueryElement( args.stateComponents.AccountsAdapterAPI(), args.processComponents.ShardCoordinator(), args.coreComponents.EpochNotifier(), + args.coreComponents.GuardedAccountHandler(), args.epochConfig.EnableEpochs.ESDTMultiTransferEnableEpoch, args.epochConfig.EnableEpochs.GlobalMintBurnDisableEpoch, args.epochConfig.EnableEpochs.ESDTTransferRoleEnableEpoch, @@ -395,6 +397,7 @@ func createBuiltinFuncs( accnts state.AccountsAdapter, shardCoordinator sharding.Coordinator, epochNotifier vmcommon.EpochNotifier, + guardedAccountHandler core.GuardedAccountHandler, esdtMultiTransferEnableEpoch uint32, esdtGlobalMintBurnDisableEpoch uint32, esdtTransferRoleEnableEpoch uint32, @@ -413,6 +416,7 @@ func createBuiltinFuncs( GlobalMintBurnDisableEpoch: esdtGlobalMintBurnDisableEpoch, ESDTTransferMetaEnableEpoch: transferToMetaEnableEpoch, OptimizeNFTStoreEnableEpoch: optimizeNFTStoreEnableEpoch, + GuardedAccountHandler: guardedAccountHandler, } return builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) } diff --git a/factory/blockProcessorCreator.go b/factory/blockProcessorCreator.go index 797b45451f6..ccef04276e5 100644 --- a/factory/blockProcessorCreator.go +++ b/factory/blockProcessorCreator.go @@ -1150,6 +1150,7 @@ func (pcf *processComponentsFactory) createBuiltInFunctionContainer( GlobalMintBurnDisableEpoch: pcf.epochConfig.EnableEpochs.GlobalMintBurnDisableEpoch, ESDTTransferMetaEnableEpoch: pcf.epochConfig.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, OptimizeNFTStoreEnableEpoch: pcf.epochConfig.EnableEpochs.OptimizeNFTStoreEnableEpoch, + GuardedAccountHandler: pcf.coreData.GuardedAccountHandler(), } return builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) diff --git a/factory/bootstrapComponents.go b/factory/bootstrapComponents.go index da2f13d2bb1..4acede9ddb1 100644 --- a/factory/bootstrapComponents.go +++ b/factory/bootstrapComponents.go @@ -14,7 +14,6 @@ import ( "github.com/ElrondNetwork/elrond-go/factory/block" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/guardedtx" - "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/headerCheck" "github.com/ElrondNetwork/elrond-go/process/roundActivation" "github.com/ElrondNetwork/elrond-go/process/smartContract" @@ -259,14 +258,9 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { } func (bcf *bootstrapComponentsFactory) newGuardianSigVerifier() (process.GuardianSigVerifier, error) { - gTxChecker, err := guardian.NewGuardedAccount(bcf.coreComponents.InternalMarshalizer(), bcf.coreComponents.EpochNotifier()) - if err != nil { - return nil, err - } - argGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ SigVerifier: bcf.cryptoComponents.TxSingleSigner(), - GuardianChecker: gTxChecker, + GuardianChecker: bcf.coreComponents.GuardedAccountHandler(), PubKeyConverter: bcf.coreComponents.AddressPubKeyConverter(), Marshaller: bcf.coreComponents.InternalMarshalizer(), KeyGen: bcf.cryptoComponents.TxSignKeyGen(), diff --git a/factory/bootstrapComponents_test.go b/factory/bootstrapComponents_test.go index aeca1e591fd..354371153c7 100644 --- a/factory/bootstrapComponents_test.go +++ b/factory/bootstrapComponents_test.go @@ -12,6 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/stretchr/testify/require" @@ -160,17 +161,18 @@ func getDefaultCoreComponents() *mock.CoreComponentsMock { MinTransactionVersionCalled: func() uint32 { return 1 }, - AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, - WatchdogTimer: &testscommon.WatchdogMock{}, - AlarmSch: &testscommon.AlarmSchedulerStub{}, - NtpSyncTimer: &testscommon.SyncTimerStub{}, - RoundHandlerField: &testscommon.RoundHandlerMock{}, - EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, - RatingsConfig: &testscommon.RatingsInfoMock{}, - RatingHandler: &testscommon.RaterMock{}, - NodesConfig: &testscommon.NodesSetupStub{}, - StartTime: time.Time{}, - NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, - EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, + WatchdogTimer: &testscommon.WatchdogMock{}, + AlarmSch: &testscommon.AlarmSchedulerStub{}, + NtpSyncTimer: &testscommon.SyncTimerStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + RatingsConfig: &testscommon.RatingsInfoMock{}, + RatingHandler: &testscommon.RaterMock{}, + NodesConfig: &testscommon.NodesSetupStub{}, + StartTime: time.Time{}, + NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, } } diff --git a/factory/coreComponents.go b/factory/coreComponents.go index 0c836be7c42..24fd074fba8 100644 --- a/factory/coreComponents.go +++ b/factory/coreComponents.go @@ -32,6 +32,7 @@ import ( "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/economics" + "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/rating" "github.com/ElrondNetwork/elrond-go/process/smartContract" "github.com/ElrondNetwork/elrond-go/sharding" @@ -100,6 +101,7 @@ type coreComponents struct { nodeTypeProvider core.NodeTypeProviderHandler encodedAddressLen uint32 arwenChangeLocker common.Locker + guardedAccountHandler core.GuardedAccountHandler } // NewCoreComponentsFactory initializes the factory which is responsible to creating core components @@ -324,6 +326,11 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { // set as observer at first - it will be updated when creating the nodes coordinator nodeTypeProvider := nodetype.NewNodeTypeProvider(core.NodeTypeObserver) + guardedAccountHandler, err := guardian.NewGuardedAccount(internalMarshalizer, epochNotifier) + if err != nil { + return nil, err + } + return &coreComponents{ hasher: hasher, txSignHasher: txSignHasher, @@ -356,6 +363,7 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { encodedAddressLen: computeEncodedAddressLen(addressPubkeyConverter), nodeTypeProvider: nodeTypeProvider, arwenChangeLocker: arwenChangeLocker, + guardedAccountHandler: guardedAccountHandler, }, nil } diff --git a/factory/coreComponentsHandler.go b/factory/coreComponentsHandler.go index 038879a0079..d1f760138e0 100644 --- a/factory/coreComponentsHandler.go +++ b/factory/coreComponentsHandler.go @@ -550,6 +550,18 @@ func (mcc *managedCoreComponents) ArwenChangeLocker() common.Locker { return mcc.coreComponents.arwenChangeLocker } +// GuardedAccountHandler returns the guarded account handler +func (mcc *managedCoreComponents) GuardedAccountHandler() core.GuardedAccountHandler { + mcc.mutCoreComponents.RLock() + defer mcc.mutCoreComponents.RUnlock() + + if mcc.coreComponents == nil { + return nil + } + + return mcc.coreComponents.guardedAccountHandler +} + // IsInterfaceNil returns true if there is no value under the interface func (mcc *managedCoreComponents) IsInterfaceNil() bool { return mcc == nil diff --git a/factory/interface.go b/factory/interface.go index 4b67c1906a8..36d014287b2 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -127,6 +127,7 @@ type CoreComponentsHolder interface { EncodedAddressLen() uint32 NodeTypeProvider() core.NodeTypeProviderHandler ArwenChangeLocker() common.Locker + GuardedAccountHandler() core.GuardedAccountHandler IsInterfaceNil() bool } @@ -262,7 +263,6 @@ type ProcessComponentsHolder interface { CurrentEpochProvider() process.CurrentNetworkEpochProviderHandler ScheduledTxsExecutionHandler() process.ScheduledTxsExecutionHandler TxsSenderHandler() process.TxsSenderHandler - //GuardianSigVerifier() process.GuardianSigVerifier IsInterfaceNil() bool } diff --git a/factory/mock/coreComponentsMock.go b/factory/mock/coreComponentsMock.go index f6216b2bcb7..cc5f2eda449 100644 --- a/factory/mock/coreComponentsMock.go +++ b/factory/mock/coreComponentsMock.go @@ -55,6 +55,7 @@ type CoreComponentsMock struct { StartTime time.Time NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker + GuardedAccountHandlerField core.GuardedAccountHandler } // InternalMarshalizer - @@ -241,6 +242,11 @@ func (ccm *CoreComponentsMock) ArwenChangeLocker() common.Locker { return ccm.ArwenChangeLockerInternal } +// GuardedAccountHandler - +func (ccm *CoreComponentsMock) GuardedAccountHandler() core.GuardedAccountHandler { + return ccm.GuardedAccountHandlerField +} + // IsInterfaceNil - func (ccm *CoreComponentsMock) IsInterfaceNil() bool { return ccm == nil diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index 495dcf2e227..494e9fbcb03 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -22,6 +22,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/block/preprocess" "github.com/ElrondNetwork/elrond-go/process/coordinator" "github.com/ElrondNetwork/elrond-go/process/factory/shard" + disabledGuardian "github.com/ElrondNetwork/elrond-go/process/guardian/disabled" "github.com/ElrondNetwork/elrond-go/process/rewardTransaction" "github.com/ElrondNetwork/elrond-go/process/smartContract" "github.com/ElrondNetwork/elrond-go/process/smartContract/builtInFunctions" @@ -360,6 +361,7 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo ESDTTransferRoleEnableEpoch: enableEpochs.ESDTTransferRoleEnableEpoch, GlobalMintBurnDisableEpoch: enableEpochs.GlobalMintBurnDisableEpoch, ESDTTransferMetaEnableEpoch: enableEpochs.BuiltInFunctionOnMetaEnableEpoch, + GuardedAccountHandler: disabledGuardian.NewDisabledGuardedAccountHandler(), } builtInFuncs, nftStorageHandler, err := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) if err != nil { diff --git a/integrationTests/mock/coreComponentsStub.go b/integrationTests/mock/coreComponentsStub.go index 43acd50c18c..a10888f5147 100644 --- a/integrationTests/mock/coreComponentsStub.go +++ b/integrationTests/mock/coreComponentsStub.go @@ -51,6 +51,7 @@ type CoreComponentsStub struct { TxVersionCheckField process.TxVersionCheckerHandler NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker + GuardedAccountHandlerField core.GuardedAccountHandler } // Create - @@ -241,6 +242,11 @@ func (ccs *CoreComponentsStub) ArwenChangeLocker() common.Locker { return ccs.ArwenChangeLockerInternal } +// GuardedAccountHandler - +func (ccs *CoreComponentsStub) GuardedAccountHandler() core.GuardedAccountHandler { + return ccs.GuardedAccountHandlerField +} + // String - func (ccs *CoreComponentsStub) String() string { return "CoreComponentsStub" diff --git a/integrationTests/state/stateTrie/stateTrie_test.go b/integrationTests/state/stateTrie/stateTrie_test.go index a40ca17741a..25377358c28 100644 --- a/integrationTests/state/stateTrie/stateTrie_test.go +++ b/integrationTests/state/stateTrie/stateTrie_test.go @@ -1384,7 +1384,7 @@ func TestRollbackBlockAndCheckThatPruningIsCancelledOnAccountsTrie(t *testing.T) require.Nil(t, err) if !bytes.Equal(rootHash, rootHashOfRollbackedBlock) { - time.Sleep(time.Second * 3) + time.Sleep(time.Second * 6) err = shardNode.AccntState.RecreateTrie(rootHashOfRollbackedBlock) require.True(t, errors.Is(err, trie.ErrKeyNotFound)) } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 95ce650e238..c461b93a903 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -295,6 +295,7 @@ type TestProcessorNode struct { MultiSigner crypto.MultiSigner HeaderSigVerifier process.InterceptedHeaderSigVerifier HeaderIntegrityVerifier process.HeaderIntegrityVerifier + GuardedAccountHandler core.GuardedAccountHandler ValidatorStatisticsProcessor process.ValidatorStatisticsProcessor Rater sharding.PeerAccountListAndRatingHandler @@ -416,6 +417,7 @@ func newBaseTestProcessorNode( ArwenChangeLocker: &sync.RWMutex{}, TransactionLogProcessor: logsProcessor, Bootstrapper: mock.NewTestBootstrapperMock(), + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } tpn.ScheduledMiniBlocksEnableEpoch = uint32(1000000) @@ -710,6 +712,7 @@ func (tpn *TestProcessorNode) initValidatorStatistics() { } func (tpn *TestProcessorNode) initTestNode() { + tpn.GuardedAccountHandler = &guardianMocks.GuardedAccountHandlerStub{} tpn.initChainHandler() tpn.initHeaderValidator() tpn.initRoundHandler() @@ -831,6 +834,7 @@ func (tpn *TestProcessorNode) createFullSCQueryService() { ShardCoordinator: tpn.ShardCoordinator, EpochNotifier: tpn.EpochNotifier, GlobalMintBurnDisableEpoch: tpn.EnableEpochs.GlobalMintBurnDisableEpoch, + GuardedAccountHandler: tpn.GuardedAccountHandler, } builtInFuncs, nftStorageHandler, _ := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) @@ -1423,6 +1427,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u ShardCoordinator: tpn.ShardCoordinator, EpochNotifier: tpn.EpochNotifier, GlobalMintBurnDisableEpoch: tpn.EnableEpochs.GlobalMintBurnDisableEpoch, + GuardedAccountHandler: tpn.GuardedAccountHandler, } builtInFuncs, nftStorageHandler, _ := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) @@ -1640,6 +1645,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors() { ShardCoordinator: tpn.ShardCoordinator, EpochNotifier: tpn.EpochNotifier, GlobalMintBurnDisableEpoch: tpn.EnableEpochs.GlobalMintBurnDisableEpoch, + GuardedAccountHandler: tpn.GuardedAccountHandler, } builtInFuncs, nftStorageHandler, _ := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) argsHook := hooks.ArgBlockChainHook{ @@ -2917,19 +2923,20 @@ func GetDefaultCoreComponents() *mock.CoreComponentsStub { MinTransactionVersionCalled: func() uint32 { return 1 }, - StatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, - WatchdogField: &testscommon.WatchdogMock{}, - AlarmSchedulerField: &testscommon.AlarmSchedulerStub{}, - SyncTimerField: &testscommon.SyncTimerStub{}, - RoundHandlerField: &testscommon.RoundHandlerMock{}, - EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, - RatingsDataField: &testscommon.RatingsInfoMock{}, - RaterField: &testscommon.RaterMock{}, - GenesisNodesSetupField: &testscommon.NodesSetupStub{}, - GenesisTimeField: time.Time{}, - EpochNotifierField: &epochNotifier.EpochNotifierStub{}, - RoundNotifierField: &processMock.RoundNotifierStub{}, - TxVersionCheckField: versioning.NewTxVersionChecker(MinTransactionVersion), + StatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + WatchdogField: &testscommon.WatchdogMock{}, + AlarmSchedulerField: &testscommon.AlarmSchedulerStub{}, + SyncTimerField: &testscommon.SyncTimerStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, + RatingsDataField: &testscommon.RatingsInfoMock{}, + RaterField: &testscommon.RaterMock{}, + GenesisNodesSetupField: &testscommon.NodesSetupStub{}, + GenesisTimeField: time.Time{}, + EpochNotifierField: &epochNotifier.EpochNotifierStub{}, + RoundNotifierField: &processMock.RoundNotifierStub{}, + TxVersionCheckField: versioning.NewTxVersionChecker(MinTransactionVersion), + GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, } } diff --git a/integrationTests/testProcessorNodeWithStateCheckpointModulus.go b/integrationTests/testProcessorNodeWithStateCheckpointModulus.go index 879d49fdbe1..aaa202c9167 100644 --- a/integrationTests/testProcessorNodeWithStateCheckpointModulus.go +++ b/integrationTests/testProcessorNodeWithStateCheckpointModulus.go @@ -13,6 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" ) // NewTestProcessorNodeWithStateCheckpointModulus creates a new testNodeProcessor with custom state checkpoint modulus @@ -78,6 +79,7 @@ func NewTestProcessorNodeWithStateCheckpointModulus( EpochNotifier: forking.NewGenericEpochNotifier(), ArwenChangeLocker: &sync.RWMutex{}, TransactionLogProcessor: logsProcessor, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } tpn.NodesSetup = nodesSetup diff --git a/integrationTests/testProcessorNodeWithTestWebServer.go b/integrationTests/testProcessorNodeWithTestWebServer.go index 9896a0d066e..798aee2547e 100644 --- a/integrationTests/testProcessorNodeWithTestWebServer.go +++ b/integrationTests/testProcessorNodeWithTestWebServer.go @@ -133,12 +133,13 @@ func createFacadeComponents(tpn *TestProcessorNode) (nodeFacade.ApiResolver, nod defaults.FillGasMapInternal(gasMap, 1) gasScheduleNotifier := mock.NewGasScheduleNotifierMock(gasMap) argsBuiltIn := builtInFunctions.ArgsCreateBuiltInFunctionContainer{ - GasSchedule: gasScheduleNotifier, - MapDNSAddresses: make(map[string]struct{}), - Marshalizer: TestMarshalizer, - Accounts: tpn.AccntState, - ShardCoordinator: tpn.ShardCoordinator, - EpochNotifier: tpn.EpochNotifier, + GasSchedule: gasScheduleNotifier, + MapDNSAddresses: make(map[string]struct{}), + Marshalizer: TestMarshalizer, + Accounts: tpn.AccntState, + ShardCoordinator: tpn.ShardCoordinator, + EpochNotifier: tpn.EpochNotifier, + GuardedAccountHandler: tpn.GuardedAccountHandler, } builtInFuncs, _, err := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) log.LogIfError(err) diff --git a/integrationTests/testSyncNode.go b/integrationTests/testSyncNode.go index 59963ffe63d..089c842c9dc 100644 --- a/integrationTests/testSyncNode.go +++ b/integrationTests/testSyncNode.go @@ -22,6 +22,7 @@ import ( "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" ) // NewTestSyncNode returns a new TestProcessorNode instance with sync capabilities @@ -91,6 +92,7 @@ func NewTestSyncNode( EpochNotifier: forking.NewGenericEpochNotifier(), ArwenChangeLocker: &syncGo.RWMutex{}, TransactionLogProcessor: logsProcessor, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } kg := &mock.KeyGenMock{} diff --git a/integrationTests/vm/arwen/utils.go b/integrationTests/vm/arwen/utils.go index c5c195b7bb6..fded183bcf1 100644 --- a/integrationTests/vm/arwen/utils.go +++ b/integrationTests/vm/arwen/utils.go @@ -46,6 +46,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" vmcommon "github.com/ElrondNetwork/elrond-vm-common" vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" @@ -229,12 +230,13 @@ func (context *TestContext) initFeeHandlers() { func (context *TestContext) initVMAndBlockchainHook() { argsBuiltIn := builtInFunctions.ArgsCreateBuiltInFunctionContainer{ - GasSchedule: mock.NewGasScheduleNotifierMock(context.GasSchedule), - MapDNSAddresses: DNSAddresses, - Marshalizer: marshalizer, - Accounts: context.Accounts, - ShardCoordinator: oneShardCoordinator, - EpochNotifier: context.EpochNotifier, + GasSchedule: mock.NewGasScheduleNotifierMock(context.GasSchedule), + MapDNSAddresses: DNSAddresses, + Marshalizer: marshalizer, + Accounts: context.Accounts, + ShardCoordinator: oneShardCoordinator, + EpochNotifier: context.EpochNotifier, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } builtInFuncs, nftStorageHandler, err := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) require.Nil(context.T, err) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index e21b21e0024..89924123105 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -56,6 +56,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/txDataBuilder" "github.com/ElrondNetwork/elrond-go/trie" "github.com/ElrondNetwork/elrond-go/trie/hashesHolder" @@ -553,10 +554,11 @@ func CreateVMAndBlockchainHookAndDataPool( MapDNSAddresses: map[string]struct{}{ string(dnsAddr): {}, }, - Marshalizer: testMarshalizer, - Accounts: accnts, - ShardCoordinator: shardCoordinator, - EpochNotifier: epochNotifierInstance, + Marshalizer: testMarshalizer, + Accounts: accnts, + ShardCoordinator: shardCoordinator, + EpochNotifier: epochNotifierInstance, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } builtInFuncs, nftStorageHandler, _ := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) @@ -627,10 +629,11 @@ func CreateVMAndBlockchainHookMeta( MapDNSAddresses: map[string]struct{}{ string(dnsAddr): {}, }, - Marshalizer: testMarshalizer, - Accounts: accnts, - ShardCoordinator: shardCoordinator, - EpochNotifier: globalEpochNotifier, + Marshalizer: testMarshalizer, + Accounts: accnts, + ShardCoordinator: shardCoordinator, + EpochNotifier: globalEpochNotifier, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } builtInFuncs, nftStorageHandler, _ := builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) diff --git a/node/mock/factory/coreComponentsStub.go b/node/mock/factory/coreComponentsStub.go index 8704fdc4f30..7cceb85d216 100644 --- a/node/mock/factory/coreComponentsStub.go +++ b/node/mock/factory/coreComponentsStub.go @@ -51,6 +51,7 @@ type CoreComponentsMock struct { StartTime time.Time NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker + GuardedAccountHandlerField core.GuardedAccountHandler } // Create - @@ -241,6 +242,11 @@ func (ccm *CoreComponentsMock) ArwenChangeLocker() common.Locker { return ccm.ArwenChangeLockerInternal } +// GuardedAccountHandler - +func (ccm *CoreComponentsMock) GuardedAccountHandler() core.GuardedAccountHandler { + return ccm.GuardedAccountHandlerField +} + // String - func (ccm *CoreComponentsMock) String() string { return "CoreComponentsMock" diff --git a/node/node_test.go b/node/node_test.go index c525811da15..89e1e0effbb 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -3503,19 +3503,20 @@ func getDefaultCoreComponents() *nodeMockFactory.CoreComponentsMock { MinTransactionVersionCalled: func() uint32 { return 1 }, - AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, - WDTimer: &testscommon.WatchdogMock{}, - Alarm: &testscommon.AlarmSchedulerStub{}, - NtpTimer: &testscommon.SyncTimerStub{}, - RoundHandlerField: &testscommon.RoundHandlerMock{}, - EconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, - APIEconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, - RatingsConfig: &testscommon.RatingsInfoMock{}, - RatingHandler: &testscommon.RaterMock{}, - NodesConfig: &testscommon.NodesSetupStub{}, - StartTime: time.Time{}, - EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, - TxVersionCheckHandler: versioning.NewTxVersionChecker(0), + AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, + WDTimer: &testscommon.WatchdogMock{}, + Alarm: &testscommon.AlarmSchedulerStub{}, + NtpTimer: &testscommon.SyncTimerStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, + APIEconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, + RatingsConfig: &testscommon.RatingsInfoMock{}, + RatingHandler: &testscommon.RaterMock{}, + NodesConfig: &testscommon.NodesSetupStub{}, + StartTime: time.Time{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + TxVersionCheckHandler: versioning.NewTxVersionChecker(0), + GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, } } diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 03f21016b82..4cce1ed6f56 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -211,7 +211,7 @@ func isBuiltinFuncCallWithParam(txData []byte, function string) bool { // CheckTxWhiteList will check if the cross shard transactions are whitelisted and could be added in pools func (txv *txValidator) CheckTxWhiteList(data process.InterceptedData) error { - interceptedTx, ok := data.(process.InterceptedTransactionHandler) + interceptedTx, ok := data.(process.InterceptedTxHandler) if !ok { return process.ErrWrongTypeAssertion } diff --git a/process/errors.go b/process/errors.go index 61175128262..fab29295f42 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1091,3 +1091,12 @@ var ErrAccountHasNoGuardianSet = errors.New("account has no guardian set") // ErrActiveHasNoActiveGuardian signals that the account has no active guardian var ErrActiveHasNoActiveGuardian = errors.New("account has no active guardian") + +// ErrWrongGuardianPubKeyLen signals that the provided public key has an invalid length +var ErrWrongGuardianPubKeyLen = errors.New("provided guardian public key has wrong length") + +// ErrTransactionTypeDoesNotSupportGuardians is thrown when guardian operations are done on transactions that do not support for guardians +var ErrTransactionTypeDoesNotSupportGuardians = errors.New("this transaction type does not support guardians") + +// GuardedAccountHandler signals that a nil guarded account handler was provided +var GuardedAccountHandler = errors.New("nil guardian account handler") diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index 06873ac5dd5..3afa56a07c7 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -10,7 +10,7 @@ import ( // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error + VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error IsInterfaceNil() bool } @@ -59,7 +59,7 @@ func NewGuardedTxSigVerifier(args GuardedTxSigVerifierArgs) (*guardedTxSigVerifi } // VerifyGuardianSignature verifies the guardian signature over the guarded transaction -func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { +func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error { guardianPubKey, err := gtx.GetGuardianPublicKey(account) if err != nil { return err diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go new file mode 100644 index 00000000000..d58424b1371 --- /dev/null +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -0,0 +1,27 @@ +package disabled + +import ( + "github.com/ElrondNetwork/elrond-go-core/data" +) + +type disabledGuardedAccount struct{} + +// NewDisabledGuardedAccountHandler returns a disabled implementation +func NewDisabledGuardedAccountHandler() *disabledGuardedAccount { + return &disabledGuardedAccount{} +} + +// GetActiveGuardian returns nil, nil as this is a disabled implementation +func (dga *disabledGuardedAccount) GetActiveGuardian(uah data.UserAccountHandler) ([]byte, error) { + return nil, nil +} + +// SetGuardian returns nil as this is a disabled implementation +func (dga *disabledGuardedAccount) SetGuardian(_ data.UserAccountHandler, _ []byte) error { + return nil +} + +// IsInterfaceNil returns true if there is no value under the interface +func (dga *disabledGuardedAccount) IsInterfaceNil() bool { + return dga == nil +} diff --git a/process/interface.go b/process/interface.go index c8c9e294a31..9e52ccd13b2 100644 --- a/process/interface.go +++ b/process/interface.go @@ -80,6 +80,8 @@ type TxValidatorHandler interface { // InterceptedTxHandler defines an intercepted data wrapper over transaction handler that has // receiver and sender shard getters type InterceptedTxHandler interface { + GetInterceptorUsedGuardianPubKey() []byte + SetInterceptorUsedGuardianPubKey([]byte) error SenderShardId() uint32 ReceiverShardId() uint32 Nonce() uint64 @@ -1199,17 +1201,6 @@ type ScheduledTxsExecutionHandler interface { IsInterfaceNil() bool } -// InterceptedTransactionHandler defines an intercepted data wrapper over transaction handler that has -// receiver and sender shard getters -type InterceptedTransactionHandler interface { - SenderShardId() uint32 - ReceiverShardId() uint32 - Nonce() uint64 - SenderAddress() []byte - Fee() *big.Int - Transaction() data.TransactionHandler -} - // ShardedPool is a perspective of the sharded data pool type ShardedPool interface { AddData(key []byte, data interface{}, sizeInBytes int, cacheID string) @@ -1217,7 +1208,7 @@ type ShardedPool interface { // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account data.UserAccountHandler, inTx InterceptedTransactionHandler) error + VerifyGuardianSignature(account data.UserAccountHandler, inTx InterceptedTxHandler) error IsInterfaceNil() bool } diff --git a/process/mock/interceptedTxHandlerStub.go b/process/mock/interceptedTxHandlerStub.go index 2e21790fea7..e5b75e37047 100644 --- a/process/mock/interceptedTxHandlerStub.go +++ b/process/mock/interceptedTxHandlerStub.go @@ -8,12 +8,14 @@ import ( // InterceptedTxHandlerStub - type InterceptedTxHandlerStub struct { - SenderShardIdCalled func() uint32 - ReceiverShardIdCalled func() uint32 - NonceCalled func() uint64 - SenderAddressCalled func() []byte - FeeCalled func() *big.Int - TransactionCalled func() data.TransactionHandler + SenderShardIdCalled func() uint32 + ReceiverShardIdCalled func() uint32 + NonceCalled func() uint64 + SenderAddressCalled func() []byte + FeeCalled func() *big.Int + TransactionCalled func() data.TransactionHandler + GetInterceptorUsedGuardianPubKeyCalled func() []byte + SetInterceptorUsedGuardianPubKeyCalled func([]byte) error } // SenderShardId - @@ -56,6 +58,22 @@ func (iths *InterceptedTxHandlerStub) Fee() *big.Int { return nil } +// GetInterceptorUsedGuardianPubKey - +func (iths *InterceptedTxHandlerStub) GetInterceptorUsedGuardianPubKey() []byte { + if iths.GetInterceptorUsedGuardianPubKeyCalled != nil { + return iths.GetInterceptorUsedGuardianPubKeyCalled() + } + return nil +} + +// SetInterceptorUsedGuardianPubKey - +func (iths *InterceptedTxHandlerStub) SetInterceptorUsedGuardianPubKey(guardianPubKey []byte) error { + if iths.SetInterceptorUsedGuardianPubKeyCalled != nil { + return iths.SetInterceptorUsedGuardianPubKeyCalled(guardianPubKey) + } + return nil +} + // Transaction - func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { if iths.TransactionCalled != nil { diff --git a/process/rewardTransaction/interceptedRewardTransaction.go b/process/rewardTransaction/interceptedRewardTransaction.go index 4881bb02f94..b28ddb6f13e 100644 --- a/process/rewardTransaction/interceptedRewardTransaction.go +++ b/process/rewardTransaction/interceptedRewardTransaction.go @@ -119,6 +119,16 @@ func (inRTx *InterceptedRewardTransaction) SenderShardId() uint32 { return inRTx.sndShard } +// GetInterceptorUsedGuardianPubKey returns nil, as the reward transactions are generated by the metaChain and have no guardian +func (inRTx *InterceptedRewardTransaction) GetInterceptorUsedGuardianPubKey() []byte { + return nil +} + +// SetInterceptorUsedGuardianPubKey returns error as the rewards transactions are generated by metaChain and do not have guardian +func (inRTx *InterceptedRewardTransaction) SetInterceptorUsedGuardianPubKey([]byte) error { + return process.ErrTransactionTypeDoesNotSupportGuardians +} + // Transaction returns the reward transaction pointer that actually holds the data func (inRTx *InterceptedRewardTransaction) Transaction() data.TransactionHandler { return inRTx.rTx diff --git a/process/smartContract/builtInFunctions/factory.go b/process/smartContract/builtInFunctions/factory.go index a1d2b593e26..a9abd5d1ee7 100644 --- a/process/smartContract/builtInFunctions/factory.go +++ b/process/smartContract/builtInFunctions/factory.go @@ -20,6 +20,7 @@ type ArgsCreateBuiltInFunctionContainer struct { Accounts state.AccountsAdapter ShardCoordinator sharding.Coordinator EpochNotifier vmcommon.EpochNotifier + GuardedAccountHandler core.GuardedAccountHandler ESDTMultiTransferEnableEpoch uint32 ESDTTransferRoleEnableEpoch uint32 GlobalMintBurnDisableEpoch uint32 @@ -47,6 +48,9 @@ func CreateBuiltInFuncContainerAndNFTStorageHandler(args ArgsCreateBuiltInFuncti if check.IfNil(args.EpochNotifier) { return nil, nil, process.ErrNilEpochNotifier } + if check.IfNil(args.GuardedAccountHandler) { + return nil, nil, process.GuardedAccountHandler + } vmcommonAccounts, ok := args.Accounts.(vmcommon.AccountsAdapter) if !ok { @@ -66,6 +70,7 @@ func CreateBuiltInFuncContainerAndNFTStorageHandler(args ArgsCreateBuiltInFuncti ESDTTransferRoleEnableEpoch: args.ESDTTransferRoleEnableEpoch, GlobalMintBurnDisableEpoch: args.GlobalMintBurnDisableEpoch, SaveNFTToSystemAccountEnableEpoch: args.OptimizeNFTStoreEnableEpoch, + GuardedAccountHandler: args.GuardedAccountHandler, } bContainerFactory, err := vmcommonBuiltInFunctions.NewBuiltInFunctionsCreator(modifiedArgs) diff --git a/process/smartContract/builtInFunctions/factory_test.go b/process/smartContract/builtInFunctions/factory_test.go index 6d74a2a1113..5980d364e4f 100644 --- a/process/smartContract/builtInFunctions/factory_test.go +++ b/process/smartContract/builtInFunctions/factory_test.go @@ -8,6 +8,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommonBuiltInFunctions "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/stretchr/testify/assert" @@ -19,13 +20,14 @@ func createMockArguments() ArgsCreateBuiltInFunctionContainer { gasScheduleNotifier := mock.NewGasScheduleNotifierMock(gasMap) args := ArgsCreateBuiltInFunctionContainer{ - GasSchedule: gasScheduleNotifier, - MapDNSAddresses: make(map[string]struct{}), - EnableUserNameChange: false, - Marshalizer: &mock.MarshalizerMock{}, - Accounts: &stateMock.AccountsStub{}, - ShardCoordinator: mock.NewMultiShardsCoordinatorMock(1), - EpochNotifier: &epochNotifier.EpochNotifierStub{}, + GasSchedule: gasScheduleNotifier, + MapDNSAddresses: make(map[string]struct{}), + EnableUserNameChange: false, + Marshalizer: &mock.MarshalizerMock{}, + Accounts: &stateMock.AccountsStub{}, + ShardCoordinator: mock.NewMultiShardsCoordinatorMock(1), + EpochNotifier: &epochNotifier.EpochNotifierStub{}, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } return args diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index b523159855b..f1a3ce7ae71 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -42,6 +42,7 @@ type InterceptedTransaction struct { sndShard uint32 isForCurrentShard bool enableSignedTxWithHash bool + guardianPubKey []byte } // NewInterceptedTransaction returns a new instance of InterceptedTransaction @@ -411,6 +412,22 @@ func (inTx *InterceptedTransaction) Identifiers() [][]byte { return [][]byte{inTx.hash} } +// GetInterceptorUsedGuardianPubKey returns the guardian public key used to verify the guardian signature +func (inTx *InterceptedTransaction) GetInterceptorUsedGuardianPubKey() []byte { + return inTx.guardianPubKey +} + +// SetInterceptorUsedGuardianPubKey sets the sender account's active guardian at the moment of transaction validation on the interceptor +func (inTx *InterceptedTransaction) SetInterceptorUsedGuardianPubKey(guardianPubKey []byte) error { + if len(guardianPubKey) != inTx.pubkeyConv.Len() { + return process.ErrWrongGuardianPubKeyLen + } + + inTx.guardianPubKey = guardianPubKey + + return nil +} + // IsInterfaceNil returns true if there is no value under the interface func (inTx *InterceptedTransaction) IsInterfaceNil() bool { return inTx == nil diff --git a/process/unsigned/interceptedUnsignedTransaction.go b/process/unsigned/interceptedUnsignedTransaction.go index 6e46445b6c1..3fd3af5ca90 100644 --- a/process/unsigned/interceptedUnsignedTransaction.go +++ b/process/unsigned/interceptedUnsignedTransaction.go @@ -171,6 +171,16 @@ func (inUTx *InterceptedUnsignedTransaction) Identifiers() [][]byte { return [][]byte{inUTx.hash} } +// GetInterceptorUsedGuardianPubKey returns nil as guardians are not supported for unsigned transactions +func (inUTx *InterceptedUnsignedTransaction) GetInterceptorUsedGuardianPubKey() []byte { + return nil +} + +// SetInterceptorUsedGuardianPubKey returns error as the operation is not supported for unsigned transacitions +func (inUTx *InterceptedUnsignedTransaction) SetInterceptorUsedGuardianPubKey([]byte) error { + return process.ErrTransactionTypeDoesNotSupportGuardians +} + // IsInterfaceNil returns true if there is no value under the interface func (inUTx *InterceptedUnsignedTransaction) IsInterfaceNil() bool { return inUTx == nil diff --git a/storage/txcache/wrappedTransaction.go b/storage/txcache/wrappedTransaction.go index 4491492efc3..478ad2c60b2 100644 --- a/storage/txcache/wrappedTransaction.go +++ b/storage/txcache/wrappedTransaction.go @@ -12,6 +12,7 @@ const processFeeFactor = float64(0.8) // 80% type WrappedTransaction struct { Tx data.TransactionHandler TxHash []byte + GuardianPubKey []byte SenderShardID uint32 ReceiverShardID uint32 Size int64 diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go new file mode 100644 index 00000000000..835ff9cea09 --- /dev/null +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -0,0 +1,30 @@ +package guardianMocks + +import "github.com/ElrondNetwork/elrond-go-core/data" + +// GuardedAccountHandlerStub - +type GuardedAccountHandlerStub struct { + GetActiveGuardianCalled func(handler data.UserAccountHandler) ([]byte, error) + SetGuardianCalled func(uah data.UserAccountHandler, guardianAddress []byte) error +} + +// GetActiveGuardian - +func (gahs *GuardedAccountHandlerStub) GetActiveGuardian(handler data.UserAccountHandler) ([]byte, error) { + if gahs.GetActiveGuardianCalled != nil { + return gahs.GetActiveGuardianCalled(handler) + } + return nil, nil +} + +// SetGuardian - +func (gahs *GuardedAccountHandlerStub) SetGuardian(uah data.UserAccountHandler, guardianAddress []byte) error { + if gahs.SetGuardianCalled != nil { + return gahs.SetGuardianCalled(uah, guardianAddress) + } + return nil +} + +// IsInterfaceNil - +func (gahs *GuardedAccountHandlerStub) IsInterfaceNil() bool { + return gahs == nil +} diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go index cadd50a1c9d..5f4be5309d7 100644 --- a/testscommon/guardianMocks/guardianSigVerifierStub.go +++ b/testscommon/guardianMocks/guardianSigVerifierStub.go @@ -7,11 +7,11 @@ import ( // GuardianSigVerifierStub - type GuardianSigVerifierStub struct { - VerifyGuardianSignatureCalled func(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error + VerifyGuardianSignatureCalled func(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error } // VerifyGuardianSignature - -func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { +func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error { if gsvs.VerifyGuardianSignatureCalled != nil { return gsvs.VerifyGuardianSignatureCalled(account, inTx) } diff --git a/testscommon/interceptedTxMocks/interceptedTxStub.go b/testscommon/interceptedTxMocks/interceptedTxStub.go index 73bc325e678..8f37227c7ba 100644 --- a/testscommon/interceptedTxMocks/interceptedTxStub.go +++ b/testscommon/interceptedTxMocks/interceptedTxStub.go @@ -8,12 +8,14 @@ import ( // InterceptedTxHandlerStub - type InterceptedTxHandlerStub struct { - SenderShardIdCalled func() uint32 - ReceiverShardIdCalled func() uint32 - NonceCalled func() uint64 - SenderAddressCalled func() []byte - FeeCalled func() *big.Int - TransactionCalled func() data.TransactionHandler + SenderShardIdCalled func() uint32 + ReceiverShardIdCalled func() uint32 + NonceCalled func() uint64 + SenderAddressCalled func() []byte + FeeCalled func() *big.Int + TransactionCalled func() data.TransactionHandler + GetInterceptorUsedGuardianPubKeyCalled func() []byte + SetInterceptorUsedGuardianPubKeyCalled func([]byte) error } // SenderShardId - @@ -63,3 +65,19 @@ func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { } return nil } + +// GetInterceptorUsedGuardianPubKey - +func (iths *InterceptedTxHandlerStub) GetInterceptorUsedGuardianPubKey() []byte { + if iths.GetInterceptorUsedGuardianPubKeyCalled != nil { + return iths.GetInterceptorUsedGuardianPubKeyCalled() + } + return nil +} + +// SetInterceptorUsedGuardianPubKey - +func (iths *InterceptedTxHandlerStub) SetInterceptorUsedGuardianPubKey(guardianPubKey []byte) error { + if iths.SetInterceptorUsedGuardianPubKeyCalled != nil { + return iths.SetInterceptorUsedGuardianPubKeyCalled(guardianPubKey) + } + return nil +} From 2ac48945a06a836d40ec5d4012e861cf4b74dcce Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 19 Apr 2022 15:24:27 +0300 Subject: [PATCH 024/335] dataRetriever: adapt mem footprint test --- dataRetriever/txpool/memorytests/memory_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dataRetriever/txpool/memorytests/memory_test.go b/dataRetriever/txpool/memorytests/memory_test.go index 9ffdde03423..154fea55191 100644 --- a/dataRetriever/txpool/memorytests/memory_test.go +++ b/dataRetriever/txpool/memorytests/memory_test.go @@ -42,19 +42,19 @@ func TestShardedTxPool_MemoryFootprint(t *testing.T) { // With larger memory footprint - journals = append(journals, runScenario(t, newScenario(100000, 3, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{95, 110})) - journals = append(journals, runScenario(t, newScenario(150000, 2, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{120, 130})) + journals = append(journals, runScenario(t, newScenario(100000, 3, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{95, 120})) + journals = append(journals, runScenario(t, newScenario(150000, 2, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{120, 140})) journals = append(journals, runScenario(t, newScenario(300000, 1, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{170, 190})) - journals = append(journals, runScenario(t, newScenario(30, 10000, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{60, 70})) - journals = append(journals, runScenario(t, newScenario(300, 1000, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{60, 70})) + journals = append(journals, runScenario(t, newScenario(30, 10000, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{60, 75})) + journals = append(journals, runScenario(t, newScenario(300, 1000, 650, "0"), memoryAssertion{290, 320}, memoryAssertion{60, 80})) // Scenarios where destination == me journals = append(journals, runScenario(t, newScenario(100, 1, core.MegabyteSize, "1_0"), memoryAssertion{90, 100}, memoryAssertion{0, 1})) journals = append(journals, runScenario(t, newScenario(10000, 1, 10240, "1_0"), memoryAssertion{96, 128}, memoryAssertion{0, 4})) - journals = append(journals, runScenario(t, newScenario(10, 10000, 1000, "1_0"), memoryAssertion{96, 136}, memoryAssertion{16, 24})) - journals = append(journals, runScenario(t, newScenario(150000, 1, 128, "1_0"), memoryAssertion{50, 75}, memoryAssertion{30, 36})) - journals = append(journals, runScenario(t, newScenario(1, 150000, 128, "1_0"), memoryAssertion{50, 75}, memoryAssertion{30, 36})) + journals = append(journals, runScenario(t, newScenario(10, 10000, 1000, "1_0"), memoryAssertion{96, 136}, memoryAssertion{16, 25})) + journals = append(journals, runScenario(t, newScenario(150000, 1, 128, "1_0"), memoryAssertion{50, 75}, memoryAssertion{30, 40})) + journals = append(journals, runScenario(t, newScenario(1, 150000, 128, "1_0"), memoryAssertion{50, 75}, memoryAssertion{30, 40})) for _, journal := range journals { journal.displayFootprintsSummary() From 5e87e349cae10c159243384d4d67b78bf6d3cc05 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 19 Apr 2022 16:37:58 +0300 Subject: [PATCH 025/335] factory, integrationTests: simplify parameter list --- errors/errors.go | 3 +++ factory/processComponents.go | 13 +++++-------- integrationTests/testProcessorNode.go | 2 +- .../testProcessorNodeWithMultisigner.go | 3 +++ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/errors/errors.go b/errors/errors.go index 213d1814bb0..b1c60d80698 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -463,3 +463,6 @@ var ErrContextClosing = errors.New("context closing") // ErrNilTxsSender signals that a nil transactions sender has been provided var ErrNilTxsSender = errors.New("nil transactions sender has been provided") + +// ErrNilGuardianSigVerifier signals that a nil guardian signature verifier was provided +var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") diff --git a/factory/processComponents.go b/factory/processComponents.go index 633286ac336..d1c9ee733ab 100644 --- a/factory/processComponents.go +++ b/factory/processComponents.go @@ -430,7 +430,6 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { blockTracker, epochStartTrigger, requestHandler, - pcf.bootstrapComponents.GuardianSigVerifier(), ) if err != nil { return nil, err @@ -1088,7 +1087,6 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( validityAttester process.ValidityAttester, epochStartTrigger process.EpochStartTriggerHandler, requestHandler process.RequestHandler, - guardianSigVerifier process.GuardianSigVerifier, ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { return pcf.newShardInterceptorContainerFactory( @@ -1097,7 +1095,6 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( validityAttester, epochStartTrigger, requestHandler, - guardianSigVerifier, ) } if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { @@ -1107,7 +1104,6 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( validityAttester, epochStartTrigger, requestHandler, - guardianSigVerifier, ) } @@ -1244,7 +1240,6 @@ func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( validityAttester process.ValidityAttester, epochStartTrigger process.EpochStartTriggerHandler, requestHandler process.RequestHandler, - guardianSigVerifier process.GuardianSigVerifier, ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { headerBlackList := timecache.NewTimeCache(timeSpanForBadHeaders) shardInterceptorsContainerFactoryArgs := interceptorscontainer.CommonInterceptorsContainerFactoryArgs{ @@ -1271,7 +1266,7 @@ func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( EnableEpochs: pcf.epochConfig.EnableEpochs, PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), RequestHandler: requestHandler, - GuardianSigVerifier: guardianSigVerifier, + GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), } interceptorContainerFactory, err := interceptorscontainer.NewShardInterceptorsContainerFactory(shardInterceptorsContainerFactoryArgs) @@ -1288,7 +1283,6 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( validityAttester process.ValidityAttester, epochStartTrigger process.EpochStartTriggerHandler, requestHandler process.RequestHandler, - guardianSigVerifier process.GuardianSigVerifier, ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { headerBlackList := timecache.NewTimeCache(timeSpanForBadHeaders) metaInterceptorsContainerFactoryArgs := interceptorscontainer.CommonInterceptorsContainerFactoryArgs{ @@ -1315,7 +1309,7 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( EnableEpochs: pcf.epochConfig.EnableEpochs, PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), RequestHandler: requestHandler, - GuardianSigVerifier: guardianSigVerifier, + GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), } interceptorContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorsContainerFactoryArgs) @@ -1488,6 +1482,9 @@ func checkProcessComponentsArgs(args ProcessComponentsFactoryArgs) error { if check.IfNil(args.StatusComponents) { return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilStatusComponentsHolder) } + if check.IfNil(args.BootstrapComponents.GuardianSigVerifier()){ + return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilGuardianSigVerifier) + } return nil } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index c461b93a903..d4669b9fb06 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -602,6 +602,7 @@ func NewTestProcessorNodeWithCustomDataPool(maxShards uint32, nodeShardId uint32 EpochNotifier: forking.NewGenericEpochNotifier(), ArwenChangeLocker: &sync.RWMutex{}, TransactionLogProcessor: logsProcessor, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } tpn.NodeKeys = &TestKeyPair{ @@ -712,7 +713,6 @@ func (tpn *TestProcessorNode) initValidatorStatistics() { } func (tpn *TestProcessorNode) initTestNode() { - tpn.GuardedAccountHandler = &guardianMocks.GuardedAccountHandlerStub{} tpn.initChainHandler() tpn.initHeaderValidator() tpn.initRoundHandler() diff --git a/integrationTests/testProcessorNodeWithMultisigner.go b/integrationTests/testProcessorNodeWithMultisigner.go index d9c4159a56f..52d76c06db0 100644 --- a/integrationTests/testProcessorNodeWithMultisigner.go +++ b/integrationTests/testProcessorNodeWithMultisigner.go @@ -31,6 +31,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/storageUnit" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" ) @@ -68,6 +69,7 @@ func NewTestProcessorNodeWithCustomNodesCoordinator( ArwenChangeLocker: &sync.RWMutex{}, TransactionLogProcessor: logsProcessor, Bootstrapper: mock.NewTestBootstrapperMock(), + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } tpn.ScheduledMiniBlocksEnableEpoch = uint32(1000000) @@ -254,6 +256,7 @@ func CreateNodeWithBLSAndTxKeys( EpochNotifier: forking.NewGenericEpochNotifier(), ArwenChangeLocker: &sync.RWMutex{}, TransactionLogProcessor: logsProcessor, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } tpn.ScheduledMiniBlocksEnableEpoch = uint32(1000000) From 189d287f4bec6a14bd1447f5d68894a3de0be70b Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 20 Apr 2022 18:08:56 +0300 Subject: [PATCH 026/335] factory, process, integrationTests: change the interface used for the guarded user account --- factory/apiResolverFactory.go | 2 +- factory/coreComponents.go | 2 +- factory/coreComponentsHandler.go | 2 +- factory/interface.go | 2 +- factory/mock/coreComponentsMock.go | 4 +- integrationTests/mock/coreComponentsStub.go | 4 +- integrationTests/testProcessorNode.go | 2 +- node/mock/factory/coreComponentsStub.go | 4 +- process/dataValidators/txValidator.go | 6 +- process/errors.go | 4 +- process/guardedtx/guardedTxVerifier.go | 11 +- process/guardedtx/guardedTxVerifier_test.go | 7 +- .../disabled/disabledGuardedAccount.go | 6 +- process/guardian/guardedAccount.go | 24 ++- process/interface.go | 15 +- .../smartContract/builtInFunctions/factory.go | 4 +- .../guardianAccountHandlerStub.go | 12 +- .../guardianMocks/guardianCheckerStub.go | 8 +- .../guardianMocks/guardianSigVerifierStub.go | 6 +- testscommon/vmcommonMocks/userAccountStub.go | 165 ++++++++++++++++++ 20 files changed, 244 insertions(+), 46 deletions(-) create mode 100644 testscommon/vmcommonMocks/userAccountStub.go diff --git a/factory/apiResolverFactory.go b/factory/apiResolverFactory.go index 82b4d340c2c..37cd11c996c 100644 --- a/factory/apiResolverFactory.go +++ b/factory/apiResolverFactory.go @@ -397,7 +397,7 @@ func createBuiltinFuncs( accnts state.AccountsAdapter, shardCoordinator sharding.Coordinator, epochNotifier vmcommon.EpochNotifier, - guardedAccountHandler core.GuardedAccountHandler, + guardedAccountHandler vmcommon.GuardedAccountHandler, esdtMultiTransferEnableEpoch uint32, esdtGlobalMintBurnDisableEpoch uint32, esdtTransferRoleEnableEpoch uint32, diff --git a/factory/coreComponents.go b/factory/coreComponents.go index 24fd074fba8..c5e9b2c5b4c 100644 --- a/factory/coreComponents.go +++ b/factory/coreComponents.go @@ -101,7 +101,7 @@ type coreComponents struct { nodeTypeProvider core.NodeTypeProviderHandler encodedAddressLen uint32 arwenChangeLocker common.Locker - guardedAccountHandler core.GuardedAccountHandler + guardedAccountHandler process.GuardedAccountHandler } // NewCoreComponentsFactory initializes the factory which is responsible to creating core components diff --git a/factory/coreComponentsHandler.go b/factory/coreComponentsHandler.go index d1f760138e0..d1f7ed28e07 100644 --- a/factory/coreComponentsHandler.go +++ b/factory/coreComponentsHandler.go @@ -551,7 +551,7 @@ func (mcc *managedCoreComponents) ArwenChangeLocker() common.Locker { } // GuardedAccountHandler returns the guarded account handler -func (mcc *managedCoreComponents) GuardedAccountHandler() core.GuardedAccountHandler { +func (mcc *managedCoreComponents) GuardedAccountHandler() process.GuardedAccountHandler { mcc.mutCoreComponents.RLock() defer mcc.mutCoreComponents.RUnlock() diff --git a/factory/interface.go b/factory/interface.go index 36d014287b2..db1d75be647 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -127,7 +127,7 @@ type CoreComponentsHolder interface { EncodedAddressLen() uint32 NodeTypeProvider() core.NodeTypeProviderHandler ArwenChangeLocker() common.Locker - GuardedAccountHandler() core.GuardedAccountHandler + GuardedAccountHandler() process.GuardedAccountHandler IsInterfaceNil() bool } diff --git a/factory/mock/coreComponentsMock.go b/factory/mock/coreComponentsMock.go index cc5f2eda449..61ff3b1f069 100644 --- a/factory/mock/coreComponentsMock.go +++ b/factory/mock/coreComponentsMock.go @@ -55,7 +55,7 @@ type CoreComponentsMock struct { StartTime time.Time NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker - GuardedAccountHandlerField core.GuardedAccountHandler + GuardedAccountHandlerField process.GuardedAccountHandler } // InternalMarshalizer - @@ -243,7 +243,7 @@ func (ccm *CoreComponentsMock) ArwenChangeLocker() common.Locker { } // GuardedAccountHandler - -func (ccm *CoreComponentsMock) GuardedAccountHandler() core.GuardedAccountHandler { +func (ccm *CoreComponentsMock) GuardedAccountHandler() process.GuardedAccountHandler { return ccm.GuardedAccountHandlerField } diff --git a/integrationTests/mock/coreComponentsStub.go b/integrationTests/mock/coreComponentsStub.go index a10888f5147..2644ecda178 100644 --- a/integrationTests/mock/coreComponentsStub.go +++ b/integrationTests/mock/coreComponentsStub.go @@ -51,7 +51,7 @@ type CoreComponentsStub struct { TxVersionCheckField process.TxVersionCheckerHandler NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker - GuardedAccountHandlerField core.GuardedAccountHandler + GuardedAccountHandlerField process.GuardedAccountHandler } // Create - @@ -243,7 +243,7 @@ func (ccs *CoreComponentsStub) ArwenChangeLocker() common.Locker { } // GuardedAccountHandler - -func (ccs *CoreComponentsStub) GuardedAccountHandler() core.GuardedAccountHandler { +func (ccs *CoreComponentsStub) GuardedAccountHandler() process.GuardedAccountHandler { return ccs.GuardedAccountHandlerField } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index d4669b9fb06..a4d3f0ec228 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -295,7 +295,7 @@ type TestProcessorNode struct { MultiSigner crypto.MultiSigner HeaderSigVerifier process.InterceptedHeaderSigVerifier HeaderIntegrityVerifier process.HeaderIntegrityVerifier - GuardedAccountHandler core.GuardedAccountHandler + GuardedAccountHandler process.GuardedAccountHandler ValidatorStatisticsProcessor process.ValidatorStatisticsProcessor Rater sharding.PeerAccountListAndRatingHandler diff --git a/node/mock/factory/coreComponentsStub.go b/node/mock/factory/coreComponentsStub.go index 7cceb85d216..9a80f0f389d 100644 --- a/node/mock/factory/coreComponentsStub.go +++ b/node/mock/factory/coreComponentsStub.go @@ -51,7 +51,7 @@ type CoreComponentsMock struct { StartTime time.Time NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker - GuardedAccountHandlerField core.GuardedAccountHandler + GuardedAccountHandlerField process.GuardedAccountHandler } // Create - @@ -243,7 +243,7 @@ func (ccm *CoreComponentsMock) ArwenChangeLocker() common.Locker { } // GuardedAccountHandler - -func (ccm *CoreComponentsMock) GuardedAccountHandler() core.GuardedAccountHandler { +func (ccm *CoreComponentsMock) GuardedAccountHandler() process.GuardedAccountHandler { return ccm.GuardedAccountHandlerField } diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 4cce1ed6f56..679e799db63 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -144,7 +144,11 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTxHandl return state.ErrOperationNotPermitted } - errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(account, interceptedTx) + vmUserAccount, ok := account.(vmcommon.UserAccountHandler) + if !ok { + return state.ErrWrongTypeAssertion + } + errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(vmUserAccount, interceptedTx) if errGuardianSignature != nil { return fmt.Errorf("%w due to error in signature verification %s", state.ErrOperationNotPermitted, errGuardianSignature.Error()) } diff --git a/process/errors.go b/process/errors.go index fab29295f42..07e8ce67d3d 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1098,5 +1098,5 @@ var ErrWrongGuardianPubKeyLen = errors.New("provided guardian public key has wro // ErrTransactionTypeDoesNotSupportGuardians is thrown when guardian operations are done on transactions that do not support for guardians var ErrTransactionTypeDoesNotSupportGuardians = errors.New("this transaction type does not support guardians") -// GuardedAccountHandler signals that a nil guarded account handler was provided -var GuardedAccountHandler = errors.New("nil guardian account handler") +// ErrNilGuardedAccountHandler signals that a nil guarded account handler was provided +var ErrNilGuardedAccountHandler = errors.New("nil guarded account handler") diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index 3afa56a07c7..c9987e36732 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -6,18 +6,19 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error + VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error IsInterfaceNil() bool } // GuardedTxSigVerifierArgs holds the argument to instantiate a guarded tx signature verifier type GuardedTxSigVerifierArgs struct { SigVerifier crypto.SingleSigner - GuardianChecker core.GuardianChecker + GuardianChecker process.GuardianChecker PubKeyConverter core.PubkeyConverter Marshaller data.Marshaller KeyGen crypto.KeyGenerator @@ -25,7 +26,7 @@ type GuardedTxSigVerifierArgs struct { type guardedTxSigVerifier struct { sigVerifier crypto.SingleSigner - guardianChecker core.GuardianChecker + guardianChecker process.GuardianChecker encoder core.PubkeyConverter marshaller data.Marshaller keyGen crypto.KeyGenerator @@ -59,7 +60,7 @@ func NewGuardedTxSigVerifier(args GuardedTxSigVerifierArgs) (*guardedTxSigVerifi } // VerifyGuardianSignature verifies the guardian signature over the guarded transaction -func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error { +func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error { guardianPubKey, err := gtx.GetGuardianPublicKey(account) if err != nil { return err @@ -84,7 +85,7 @@ func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account data.UserAccoun } // GetGuardianPublicKey returns the guardian public key for the given account -func (gtx *guardedTxSigVerifier) GetGuardianPublicKey(account data.UserAccountHandler) (crypto.PublicKey, error) { +func (gtx *guardedTxSigVerifier) GetGuardianPublicKey(account vmcommon.UserAccountHandler) (crypto.PublicKey, error) { guardianPubKeyBytes, err := gtx.guardianChecker.GetActiveGuardian(account) if err != nil { return nil, err diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 332ecc67543..6f77f32455d 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -20,7 +20,8 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/interceptedTxMocks" - "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/ElrondNetwork/elrond-go/testscommon/vmcommonMocks" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/require" ) @@ -82,9 +83,9 @@ func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { signer := &singlesig.Ed25519Signer{} - acc := &state.UserAccountStub{} + acc := &vmcommonMocks.UserAccountStub{} guardianChecker := &guardianMocks.GuardianCheckerStub{ - GetActiveGuardianCalled: func(handler data.UserAccountHandler) ([]byte, error) { + GetActiveGuardianCalled: func(handler vmcommon.UserAccountHandler) ([]byte, error) { return pubKeyGuardianBytes, nil }, } diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go index d58424b1371..4ed75ccb43d 100644 --- a/process/guardian/disabled/disabledGuardedAccount.go +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -1,7 +1,7 @@ package disabled import ( - "github.com/ElrondNetwork/elrond-go-core/data" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) type disabledGuardedAccount struct{} @@ -12,12 +12,12 @@ func NewDisabledGuardedAccountHandler() *disabledGuardedAccount { } // GetActiveGuardian returns nil, nil as this is a disabled implementation -func (dga *disabledGuardedAccount) GetActiveGuardian(uah data.UserAccountHandler) ([]byte, error) { +func (dga *disabledGuardedAccount) GetActiveGuardian(_ vmcommon.UserAccountHandler) ([]byte, error) { return nil, nil } // SetGuardian returns nil as this is a disabled implementation -func (dga *disabledGuardedAccount) SetGuardian(_ data.UserAccountHandler, _ []byte) error { +func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte) error { return nil } diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index a0452272445..56197125707 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -6,10 +6,10 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -46,8 +46,13 @@ func NewGuardedAccount(marshaller marshal.Marshalizer, epochNotifier vmcommon.Ep } // GetActiveGuardian returns the active guardian -func (agc *guardedAccount) GetActiveGuardian(uah data.UserAccountHandler) ([]byte, error) { - configuredGuardians, err := agc.getConfiguredGuardians(uah) +func (agc *guardedAccount) GetActiveGuardian(uah vmcommon.UserAccountHandler) ([]byte, error) { + stateUserAccount, ok := uah.(state.UserAccountHandler) + if !ok { + return nil, process.ErrWrongTypeAssertion + } + + configuredGuardians, err := agc.getConfiguredGuardians(stateUserAccount) if err != nil { return nil, err } @@ -64,16 +69,21 @@ func (agc *guardedAccount) GetActiveGuardian(uah data.UserAccountHandler) ([]byt } // SetGuardian sets a guardian for an account -func (agc *guardedAccount) SetGuardian(uah data.UserAccountHandler, guardianAddress []byte) error { +func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte) error { guardian := &guardians.Guardian{ Address: guardianAddress, ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochs, } - return agc.setAccountGuardian(uah, guardian) + stateUserAccount, ok := uah.(state.UserAccountHandler) + if !ok { + return process.ErrWrongTypeAssertion + } + + return agc.setAccountGuardian(stateUserAccount, guardian) } -func (agc *guardedAccount) setAccountGuardian(uah data.UserAccountHandler, guardian *guardians.Guardian) error { +func (agc *guardedAccount) setAccountGuardian(uah state.UserAccountHandler, guardian *guardians.Guardian) error { configuredGuardians, err := agc.getConfiguredGuardians(uah) if err != nil { return err @@ -123,7 +133,7 @@ func (agc *guardedAccount) saveAccountGuardians(account vmcommon.UserAccountHand return account.AccountDataHandler().SaveKeyValue(guardianKey, marshalledData) } -func (agc *guardedAccount) getConfiguredGuardians(uah data.UserAccountHandler) (*guardians.Guardians, error) { +func (agc *guardedAccount) getConfiguredGuardians(uah state.UserAccountHandler) (*guardians.Guardians, error) { guardiansMarshalled, err := uah.RetrieveValueFromDataTrieTracker(guardianKey) if err != nil { return nil, err diff --git a/process/interface.go b/process/interface.go index 9e52ccd13b2..287413eea47 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1208,7 +1208,20 @@ type ShardedPool interface { // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account data.UserAccountHandler, inTx InterceptedTxHandler) error + VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx InterceptedTxHandler) error + IsInterfaceNil() bool +} + +// GuardianChecker can check an account guardian +type GuardianChecker interface { + GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) + IsInterfaceNil() bool +} + +// GuardedAccountHandler allows setting and getting the configured account guardian +type GuardedAccountHandler interface { + GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) + SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte) error IsInterfaceNil() bool } diff --git a/process/smartContract/builtInFunctions/factory.go b/process/smartContract/builtInFunctions/factory.go index a9abd5d1ee7..29947ccae43 100644 --- a/process/smartContract/builtInFunctions/factory.go +++ b/process/smartContract/builtInFunctions/factory.go @@ -20,7 +20,7 @@ type ArgsCreateBuiltInFunctionContainer struct { Accounts state.AccountsAdapter ShardCoordinator sharding.Coordinator EpochNotifier vmcommon.EpochNotifier - GuardedAccountHandler core.GuardedAccountHandler + GuardedAccountHandler vmcommon.GuardedAccountHandler ESDTMultiTransferEnableEpoch uint32 ESDTTransferRoleEnableEpoch uint32 GlobalMintBurnDisableEpoch uint32 @@ -49,7 +49,7 @@ func CreateBuiltInFuncContainerAndNFTStorageHandler(args ArgsCreateBuiltInFuncti return nil, nil, process.ErrNilEpochNotifier } if check.IfNil(args.GuardedAccountHandler) { - return nil, nil, process.GuardedAccountHandler + return nil, nil, process.ErrNilGuardedAccountHandler } vmcommonAccounts, ok := args.Accounts.(vmcommon.AccountsAdapter) diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go index 835ff9cea09..56ed550899c 100644 --- a/testscommon/guardianMocks/guardianAccountHandlerStub.go +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -1,15 +1,17 @@ package guardianMocks -import "github.com/ElrondNetwork/elrond-go-core/data" +import ( + vmcommon "github.com/ElrondNetwork/elrond-vm-common" +) // GuardedAccountHandlerStub - type GuardedAccountHandlerStub struct { - GetActiveGuardianCalled func(handler data.UserAccountHandler) ([]byte, error) - SetGuardianCalled func(uah data.UserAccountHandler, guardianAddress []byte) error + GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) + SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte) error } // GetActiveGuardian - -func (gahs *GuardedAccountHandlerStub) GetActiveGuardian(handler data.UserAccountHandler) ([]byte, error) { +func (gahs *GuardedAccountHandlerStub) GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) { if gahs.GetActiveGuardianCalled != nil { return gahs.GetActiveGuardianCalled(handler) } @@ -17,7 +19,7 @@ func (gahs *GuardedAccountHandlerStub) GetActiveGuardian(handler data.UserAccoun } // SetGuardian - -func (gahs *GuardedAccountHandlerStub) SetGuardian(uah data.UserAccountHandler, guardianAddress []byte) error { +func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte) error { if gahs.SetGuardianCalled != nil { return gahs.SetGuardianCalled(uah, guardianAddress) } diff --git a/testscommon/guardianMocks/guardianCheckerStub.go b/testscommon/guardianMocks/guardianCheckerStub.go index ec47c9a757d..130bfb981bc 100644 --- a/testscommon/guardianMocks/guardianCheckerStub.go +++ b/testscommon/guardianMocks/guardianCheckerStub.go @@ -1,14 +1,16 @@ package guardianMocks -import "github.com/ElrondNetwork/elrond-go-core/data" +import ( + vmcommon "github.com/ElrondNetwork/elrond-vm-common" +) // GuardianCheckerStub - type GuardianCheckerStub struct { - GetActiveGuardianCalled func(handler data.UserAccountHandler) ([]byte, error) + GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) } // GetActiveGuardian - -func (gcs *GuardianCheckerStub) GetActiveGuardian(handler data.UserAccountHandler) ([]byte, error) { +func (gcs *GuardianCheckerStub) GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) { if gcs.GetActiveGuardianCalled != nil { return gcs.GetActiveGuardianCalled(handler) } diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go index 5f4be5309d7..d29eb3b4b56 100644 --- a/testscommon/guardianMocks/guardianSigVerifierStub.go +++ b/testscommon/guardianMocks/guardianSigVerifierStub.go @@ -1,17 +1,17 @@ package guardianMocks import ( - "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go/process" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // GuardianSigVerifierStub - type GuardianSigVerifierStub struct { - VerifyGuardianSignatureCalled func(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error + VerifyGuardianSignatureCalled func(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error } // VerifyGuardianSignature - -func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account data.UserAccountHandler, inTx process.InterceptedTxHandler) error { +func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error { if gsvs.VerifyGuardianSignatureCalled != nil { return gsvs.VerifyGuardianSignatureCalled(account, inTx) } diff --git a/testscommon/vmcommonMocks/userAccountStub.go b/testscommon/vmcommonMocks/userAccountStub.go new file mode 100644 index 00000000000..20bc8131446 --- /dev/null +++ b/testscommon/vmcommonMocks/userAccountStub.go @@ -0,0 +1,165 @@ +package vmcommonMocks + +import ( + "math/big" + + vmcommon "github.com/ElrondNetwork/elrond-vm-common" +) + +// UserAccountStub - +type UserAccountStub struct { + GetCodeMetadataCalled func() []byte + SetCodeMetadataCalled func(codeMetadata []byte) + GetCodeHashCalled func() []byte + GetRootHashCalled func() []byte + AccountDataHandlerCalled func() vmcommon.AccountDataHandler + AddToBalanceCalled func(value *big.Int) error + GetBalanceCalled func() *big.Int + ClaimDeveloperRewardsCalled func([]byte) (*big.Int, error) + GetDeveloperRewardCalled func() *big.Int + ChangeOwnerAddressCalled func([]byte, []byte) error + SetOwnerAddressCalled func([]byte) + GetOwnerAddressCalled func() []byte + SetUserNameCalled func(userName []byte) + GetUserNameCalled func() []byte + AddressBytesCalled func() []byte + IncreaseNonceCalled func(nonce uint64) + GetNonceCalled func() uint64 +} + +// GetCodeMetadata - +func (uas *UserAccountStub) GetCodeMetadata() []byte { + if uas.GetCodeMetadataCalled != nil { + uas.GetCodeMetadataCalled() + } + return nil +} + +// SetCodeMetadata - +func (uas *UserAccountStub) SetCodeMetadata(codeMetaData []byte) { + if uas.SetCodeMetadataCalled != nil { + uas.SetCodeMetadataCalled(codeMetaData) + } +} + +// GetCodeHash - +func (uas *UserAccountStub) GetCodeHash() []byte { + if uas.GetCodeHashCalled != nil { + return uas.GetCodeHashCalled() + } + return nil +} + +// GetRootHash - +func (uas *UserAccountStub) GetRootHash() []byte { + if uas.GetRootHashCalled != nil { + return uas.GetRootHashCalled() + } + return nil +} + +// AccountDataHandler - +func (uas *UserAccountStub) AccountDataHandler() vmcommon.AccountDataHandler { + if uas.AccountDataHandlerCalled != nil { + return uas.AccountDataHandlerCalled() + } + return nil +} + +// AddToBalance - +func (uas *UserAccountStub) AddToBalance(value *big.Int) error { + if uas.AddToBalanceCalled != nil { + return uas.AddToBalanceCalled(value) + } + return nil +} + +// GetBalance - +func (uas *UserAccountStub) GetBalance() *big.Int { + if uas.GetBalanceCalled != nil { + return uas.GetBalanceCalled() + } + return nil +} + +// ClaimDeveloperRewards - +func (uas *UserAccountStub) ClaimDeveloperRewards(sndAddress []byte) (*big.Int, error) { + if uas.ClaimDeveloperRewardsCalled != nil { + return uas.ClaimDeveloperRewardsCalled(sndAddress) + } + return nil, nil +} + +// GetDeveloperReward - +func (uas *UserAccountStub) GetDeveloperReward() *big.Int { + if uas.GetDeveloperRewardCalled != nil { + return uas.GetDeveloperRewardCalled() + } + return nil +} + +// ChangeOwnerAddress - +func (uas *UserAccountStub) ChangeOwnerAddress(sndAddress []byte, newAddress []byte) error { + if uas.ChangeOwnerAddressCalled != nil { + return uas.ChangeOwnerAddressCalled(sndAddress, newAddress) + } + return nil +} + +// SetOwnerAddress - +func (uas *UserAccountStub) SetOwnerAddress(address []byte) { + if uas.SetOwnerAddressCalled != nil { + uas.SetOwnerAddressCalled(address) + } +} + +// GetOwnerAddress - +func (uas *UserAccountStub) GetOwnerAddress() []byte { + if uas.GetOwnerAddressCalled != nil { + return uas.GetOwnerAddressCalled() + } + return nil +} + +// SetUserName - +func (uas *UserAccountStub) SetUserName(userName []byte) { + if uas.SetUserNameCalled != nil { + uas.SetUserNameCalled(userName) + } +} + +// GetUserName - +func (uas *UserAccountStub) GetUserName() []byte { + if uas.GetUserNameCalled != nil { + return uas.GetUserNameCalled() + } + return nil +} + +// AddressBytes - +func (uas *UserAccountStub) AddressBytes() []byte { + if uas.AddressBytesCalled != nil { + return uas.AddressBytesCalled() + } + return nil +} + +// IncreaseNonce - +func (uas *UserAccountStub) IncreaseNonce(nonce uint64) { + if uas.IncreaseNonceCalled != nil { + uas.IncreaseNonceCalled(nonce) + } +} + +// GetNonce - +func (uas *UserAccountStub) GetNonce() uint64 { + if uas.GetNonceCalled != nil { + return uas.GetNonceCalled() + } + return 0 +} + +//IsInterfaceNil - +func (uas *UserAccountStub) IsInterfaceNil() bool { + return uas == nil +} From 3a1c2e3f1b8cd01c9399821b2a66d2f3e2797fe1 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 27 Apr 2022 14:24:04 +0300 Subject: [PATCH 027/335] process: rename interface --- node/node.go | 2 +- process/dataValidators/disabledTxValidator.go | 2 +- process/dataValidators/txValidator.go | 20 +++++++++---------- process/dataValidators/txValidator_test.go | 8 ++++---- process/guardedtx/guardedTxVerifier.go | 4 ++-- .../processor/txInterceptorProcessor.go | 4 ++-- .../processor/txInterceptorProcessor_test.go | 4 ++-- process/interface.go | 8 ++++---- process/mock/txValidatorStub.go | 4 ++-- .../guardianMocks/guardianSigVerifierStub.go | 4 ++-- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/node/node.go b/node/node.go index e2f53eb84ed..847d5f94b02 100644 --- a/node/node.go +++ b/node/node.go @@ -604,7 +604,7 @@ func (n *Node) commonTransactionValidation( whiteListerVerifiedTxs process.WhiteListHandler, whiteListRequest process.WhiteListHandler, checkSignature bool, -) (process.TxValidator, process.InterceptedTxHandler, error) { +) (process.TxValidator, process.InterceptedTransactionHandler, error) { txValidator, err := dataValidators.NewTxValidator( n.stateComponents.AccountsAdapterAPI(), n.processComponents.ShardCoordinator(), diff --git a/process/dataValidators/disabledTxValidator.go b/process/dataValidators/disabledTxValidator.go index c13bedf2bdd..94075f9e54b 100644 --- a/process/dataValidators/disabledTxValidator.go +++ b/process/dataValidators/disabledTxValidator.go @@ -14,7 +14,7 @@ func NewDisabledTxValidator() *disabledTxValidator { } // CheckTxValidity is a disabled implementation that will return nil -func (dtv *disabledTxValidator) CheckTxValidity(_ process.InterceptedTxHandler) error { +func (dtv *disabledTxValidator) CheckTxValidity(_ process.InterceptedTransactionHandler) error { return nil } diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 679e799db63..df5335d3f9e 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -61,7 +61,7 @@ func NewTxValidator( } // CheckTxValidity will filter transactions that needs to be added in pools -func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandler) error { +func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTransactionHandler) error { interceptedData, ok := interceptedTx.(process.InterceptedData) if ok { if txv.whiteListHandler.IsWhiteListed(interceptedData) { @@ -82,7 +82,7 @@ func (txv *txValidator) CheckTxValidity(interceptedTx process.InterceptedTxHandl } func (txv *txValidator) checkAccount( - interceptedTx process.InterceptedTxHandler, + interceptedTx process.InterceptedTransactionHandler, accountHandler vmcommon.AccountHandler, ) error { err := txv.checkNonce(interceptedTx, accountHandler) @@ -104,7 +104,7 @@ func (txv *txValidator) checkAccount( } func (txv *txValidator) getSenderUserAccount( - interceptedTx process.InterceptedTxHandler, + interceptedTx process.InterceptedTransactionHandler, accountHandler vmcommon.AccountHandler, ) (state.UserAccountHandler, error) { senderAddress := interceptedTx.SenderAddress() @@ -118,7 +118,7 @@ func (txv *txValidator) getSenderUserAccount( return account, nil } -func (txv *txValidator) checkBalance(interceptedTx process.InterceptedTxHandler, account state.UserAccountHandler) error { +func (txv *txValidator) checkBalance(interceptedTx process.InterceptedTransactionHandler, account state.UserAccountHandler) error { accountBalance := account.GetBalance() txFee := interceptedTx.Fee() if accountBalance.Cmp(txFee) < 0 { @@ -134,7 +134,7 @@ func (txv *txValidator) checkBalance(interceptedTx process.InterceptedTxHandler, return nil } -func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTxHandler, account state.UserAccountHandler) error { +func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransactionHandler, account state.UserAccountHandler) error { txData, err := getTxData(interceptedTx) if err != nil { return err @@ -157,7 +157,7 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTxHandl return nil } -func (txv *txValidator) checkNonce(interceptedTx process.InterceptedTxHandler, accountHandler vmcommon.AccountHandler) error { +func (txv *txValidator) checkNonce(interceptedTx process.InterceptedTransactionHandler, accountHandler vmcommon.AccountHandler) error { accountNonce := accountHandler.GetNonce() txNonce := interceptedTx.Nonce() lowerNonceInTx := txNonce < accountNonce @@ -172,13 +172,13 @@ func (txv *txValidator) checkNonce(interceptedTx process.InterceptedTxHandler, a return nil } -func (txv *txValidator) isSenderInDifferentShard(interceptedTx process.InterceptedTxHandler) bool { +func (txv *txValidator) isSenderInDifferentShard(interceptedTx process.InterceptedTransactionHandler) bool { shardID := txv.shardCoordinator.SelfId() txShardID := interceptedTx.SenderShardId() return shardID != txShardID } -func (txv *txValidator) getSenderAccount(interceptedTx process.InterceptedTxHandler) (vmcommon.AccountHandler, error) { +func (txv *txValidator) getSenderAccount(interceptedTx process.InterceptedTransactionHandler) (vmcommon.AccountHandler, error) { senderAddress := interceptedTx.SenderAddress() accountHandler, err := txv.accounts.GetExistingAccount(senderAddress) if err != nil { @@ -193,7 +193,7 @@ func (txv *txValidator) getSenderAccount(interceptedTx process.InterceptedTxHand return accountHandler, nil } -func getTxData(interceptedTx process.InterceptedTxHandler) ([]byte, error) { +func getTxData(interceptedTx process.InterceptedTransactionHandler) ([]byte, error) { tx := interceptedTx.Transaction() if tx == nil { return nil, process.ErrNilTransaction @@ -215,7 +215,7 @@ func isBuiltinFuncCallWithParam(txData []byte, function string) bool { // CheckTxWhiteList will check if the cross shard transactions are whitelisted and could be added in pools func (txv *txValidator) CheckTxWhiteList(data process.InterceptedData) error { - interceptedTx, ok := data.(process.InterceptedTxHandler) + interceptedTx, ok := data.(process.InterceptedTransactionHandler) if !ok { return process.ErrWrongTypeAssertion } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 4714fe8a82b..0c2057eeaab 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -50,7 +50,7 @@ func getTxValidatorHandler( nonce uint64, sndAddr []byte, fee *big.Int, -) process.InterceptedTxHandler { +) process.InterceptedTransactionHandler { return &mock.InterceptedTxHandlerStub{ SenderShardIdCalled: func() uint32 { return sndShardId @@ -349,10 +349,10 @@ func TestTxValidator_CheckTxValidityAccountNotExitsButWhiteListedShouldReturnTru interceptedTx := struct { process.InterceptedData - process.InterceptedTxHandler + process.InterceptedTransactionHandler }{ - InterceptedData: nil, - InterceptedTxHandler: txValidatorHandler, + InterceptedData: nil, + InterceptedTransactionHandler: txValidatorHandler, } // interceptedTx needs to be of type InterceptedData & TxValidatorHandler diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index c9987e36732..be91a3bea3c 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -11,7 +11,7 @@ import ( // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error + VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error IsInterfaceNil() bool } @@ -60,7 +60,7 @@ func NewGuardedTxSigVerifier(args GuardedTxSigVerifierArgs) (*guardedTxSigVerifi } // VerifyGuardianSignature verifies the guardian signature over the guarded transaction -func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error { +func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { guardianPubKey, err := gtx.GetGuardianPublicKey(account) if err != nil { return err diff --git a/process/interceptors/processor/txInterceptorProcessor.go b/process/interceptors/processor/txInterceptorProcessor.go index 8fba07d32af..7f61c360677 100644 --- a/process/interceptors/processor/txInterceptorProcessor.go +++ b/process/interceptors/processor/txInterceptorProcessor.go @@ -38,7 +38,7 @@ func NewTxInterceptorProcessor(argument *ArgTxInterceptorProcessor) (*TxIntercep // Validate checks if the intercepted data can be processed func (txip *TxInterceptorProcessor) Validate(data process.InterceptedData, _ core.PeerID) error { - interceptedTx, ok := data.(process.InterceptedTxHandler) + interceptedTx, ok := data.(process.InterceptedTransactionHandler) if !ok { return process.ErrWrongTypeAssertion } @@ -48,7 +48,7 @@ func (txip *TxInterceptorProcessor) Validate(data process.InterceptedData, _ cor // Save will save the received data into the cacher func (txip *TxInterceptorProcessor) Save(data process.InterceptedData, peerOriginator core.PeerID, _ string) error { - interceptedTx, ok := data.(process.InterceptedTxHandler) + interceptedTx, ok := data.(process.InterceptedTransactionHandler) if !ok { return process.ErrWrongTypeAssertion } diff --git a/process/interceptors/processor/txInterceptorProcessor_test.go b/process/interceptors/processor/txInterceptorProcessor_test.go index 3a9f42f5915..a0640559745 100644 --- a/process/interceptors/processor/txInterceptorProcessor_test.go +++ b/process/interceptors/processor/txInterceptorProcessor_test.go @@ -80,7 +80,7 @@ func TestTxInterceptorProcessor_ValidateReturnsFalseShouldErr(t *testing.T) { expectedErr := errors.New("tx validation error") arg := createMockTxArgument() arg.TxValidator = &mock.TxValidatorStub{ - CheckTxValidityCalled: func(interceptedTx process.InterceptedTxHandler) error { + CheckTxValidityCalled: func(interceptedTx process.InterceptedTransactionHandler) error { return expectedErr }, } @@ -101,7 +101,7 @@ func TestTxInterceptorProcessor_ValidateReturnsTrueShouldWork(t *testing.T) { arg := createMockTxArgument() arg.TxValidator = &mock.TxValidatorStub{ - CheckTxValidityCalled: func(interceptedTx process.InterceptedTxHandler) error { + CheckTxValidityCalled: func(interceptedTx process.InterceptedTransactionHandler) error { return nil }, } diff --git a/process/interface.go b/process/interface.go index 287413eea47..a2bebd1edeb 100644 --- a/process/interface.go +++ b/process/interface.go @@ -63,7 +63,7 @@ type TxTypeHandler interface { // TxValidator can determine if a provided transaction handler is valid or not from the process point of view type TxValidator interface { - CheckTxValidity(interceptedTx InterceptedTxHandler) error + CheckTxValidity(interceptedTx InterceptedTransactionHandler) error CheckTxWhiteList(data InterceptedData) error IsInterfaceNil() bool } @@ -77,9 +77,9 @@ type TxValidatorHandler interface { Fee() *big.Int } -// InterceptedTxHandler defines an intercepted data wrapper over transaction handler that has +// InterceptedTransactionHandler defines an intercepted data wrapper over transaction handler that has // receiver and sender shard getters -type InterceptedTxHandler interface { +type InterceptedTransactionHandler interface { GetInterceptorUsedGuardianPubKey() []byte SetInterceptorUsedGuardianPubKey([]byte) error SenderShardId() uint32 @@ -1208,7 +1208,7 @@ type ShardedPool interface { // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx InterceptedTxHandler) error + VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx InterceptedTransactionHandler) error IsInterfaceNil() bool } diff --git a/process/mock/txValidatorStub.go b/process/mock/txValidatorStub.go index 790ea87ff22..d2c79feee5c 100644 --- a/process/mock/txValidatorStub.go +++ b/process/mock/txValidatorStub.go @@ -6,13 +6,13 @@ import ( // TxValidatorStub - type TxValidatorStub struct { - CheckTxValidityCalled func(interceptedTx process.InterceptedTxHandler) error + CheckTxValidityCalled func(interceptedTx process.InterceptedTransactionHandler) error CheckTxWhiteListCalled func(data process.InterceptedData) error RejectedTxsCalled func() uint64 } // CheckTxValidity - -func (t *TxValidatorStub) CheckTxValidity(interceptedTx process.InterceptedTxHandler) error { +func (t *TxValidatorStub) CheckTxValidity(interceptedTx process.InterceptedTransactionHandler) error { return t.CheckTxValidityCalled(interceptedTx) } diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go index d29eb3b4b56..492440e64a8 100644 --- a/testscommon/guardianMocks/guardianSigVerifierStub.go +++ b/testscommon/guardianMocks/guardianSigVerifierStub.go @@ -7,11 +7,11 @@ import ( // GuardianSigVerifierStub - type GuardianSigVerifierStub struct { - VerifyGuardianSignatureCalled func(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error + VerifyGuardianSignatureCalled func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error } // VerifyGuardianSignature - -func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTxHandler) error { +func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { if gsvs.VerifyGuardianSignatureCalled != nil { return gsvs.VerifyGuardianSignatureCalled(account, inTx) } From 8c2dd64f0d6b58b266ad84873414d4c551a403a3 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 29 Apr 2022 15:47:46 +0300 Subject: [PATCH 028/335] node, process, state: integrate new transaction with guardian address --- facade/interface.go | 3 +- genesis/mock/userAccountMock.go | 5 ++ node/mock/accountsWrapperMock.go | 6 ++ node/node.go | 48 +++++++++---- process/dataValidators/txValidator.go | 69 ++++++++++++++----- process/errors.go | 12 ++-- process/interface.go | 2 - process/mock/accountWrapperMock.go | 6 ++ process/mock/interceptedTxHandlerStub.go | 18 ----- .../interceptedRewardTransaction.go | 10 --- process/transaction/baseProcess.go | 27 ++++++-- process/transaction/interceptedTransaction.go | 16 ----- process/transaction/metaProcess.go | 15 ++++ process/transaction/shardProcess.go | 29 ++++++++ .../interceptedUnsignedTransaction.go | 10 --- state/interface.go | 1 + state/userAccount.go | 9 +++ storage/txcache/wrappedTransaction.go | 1 - .../interceptedTxMocks/interceptedTxStub.go | 18 ----- testscommon/state/accountWrapperMock.go | 6 ++ testscommon/state/userAccountStub.go | 9 +++ 21 files changed, 203 insertions(+), 117 deletions(-) diff --git a/facade/interface.go b/facade/interface.go index fc39b8ec07f..a9439b99932 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -54,7 +54,8 @@ type NodeHandler interface { // CreateTransaction will return a transaction from all needed fields CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*transaction.Transaction, []byte, error) + gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, + guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) // ValidateTransaction will validate a transaction ValidateTransaction(tx *transaction.Transaction) error diff --git a/genesis/mock/userAccountMock.go b/genesis/mock/userAccountMock.go index 90d1aa77a33..ac5c20e9e30 100644 --- a/genesis/mock/userAccountMock.go +++ b/genesis/mock/userAccountMock.go @@ -139,3 +139,8 @@ func (uam *UserAccountMock) SetUserName(_ []byte) { func (uam *UserAccountMock) GetUserName() []byte { return nil } + +// IsFrozen - +func (uam *UserAccountMock) IsFrozen() bool { + return false +} \ No newline at end of file diff --git a/node/mock/accountsWrapperMock.go b/node/mock/accountsWrapperMock.go index b2d80d80976..686ade61e6a 100644 --- a/node/mock/accountsWrapperMock.go +++ b/node/mock/accountsWrapperMock.go @@ -18,6 +18,7 @@ type AccountWrapMock struct { rootHash []byte address []byte trackableDataTrie state.DataTrieTracker + frozen bool SetNonceWithJournalCalled func(nonce uint64) error `json:"-"` SetCodeHashWithJournalCalled func(codeHash []byte) error `json:"-"` @@ -159,6 +160,11 @@ func (awm *AccountWrapMock) GetNonce() uint64 { return awm.nonce } +// IsFrozen - +func (awm *AccountWrapMock) IsFrozen() bool { + return awm.frozen +} + // IsInterfaceNil - func (awm *AccountWrapMock) IsInterfaceNil() bool { return awm == nil diff --git a/node/node.go b/node/node.go index 847d5f94b02..820b348b36b 100644 --- a/node/node.go +++ b/node/node.go @@ -611,6 +611,7 @@ func (n *Node) commonTransactionValidation( whiteListRequest, n.coreComponents.AddressPubKeyConverter(), n.bootstrapComponents.GuardianSigVerifier(), + n.coreComponents.TxVersionChecker(), common.MaxTxNonceDeltaAllowed, ) @@ -689,6 +690,8 @@ func (n *Node) CreateTransaction( chainID string, version uint32, options uint32, + guardian string, + guardianSigHex string, ) (*transaction.Transaction, []byte, error) { if version == 0 { return nil, nil, ErrInvalidTransactionVersion @@ -706,12 +709,19 @@ func (n *Node) CreateTransaction( if len(signatureHex) > n.addressSignatureHexSize { return nil, nil, ErrInvalidSignatureLength } + if len(guardianSigHex) > n.addressSignatureHexSize { + return nil, nil, fmt.Errorf("%w for guardian signature", ErrInvalidSignatureLength) + } + if uint32(len(receiver)) > n.coreComponents.EncodedAddressLen() { return nil, nil, fmt.Errorf("%w for receiver", ErrInvalidAddressLength) } if uint32(len(sender)) > n.coreComponents.EncodedAddressLen() { return nil, nil, fmt.Errorf("%w for sender", ErrInvalidAddressLength) } + if uint32(len(guardian)) > n.coreComponents.EncodedAddressLen() { + return nil, nil, fmt.Errorf("%w for guardian", ErrInvalidAddressLength) + } if len(senderUsername) > core.MaxUserNameLength { return nil, nil, ErrInvalidSenderUsernameLength } @@ -732,11 +742,21 @@ func (n *Node) CreateTransaction( return nil, nil, errors.New("could not create sender address from provided param") } + guardianAddress, err := addrPubKeyConverter.Decode(guardian) + if err != nil { + return nil, nil, errors.New("could not create guardian address from provided param") + } + signatureBytes, err := hex.DecodeString(signatureHex) if err != nil { return nil, nil, errors.New("could not fetch signature bytes") } + guardianSigBytes, err := hex.DecodeString(guardianSigHex) + if err != nil { + return nil, nil, errors.New("could not fetch guardian signature bytes") + } + if len(value) > len(n.coreComponents.EconomicsData().GenesisTotalSupply().String())+1 { return nil, nil, ErrTransactionValueLengthTooBig } @@ -747,19 +767,21 @@ func (n *Node) CreateTransaction( } tx := &transaction.Transaction{ - Nonce: nonce, - Value: valAsBigInt, - RcvAddr: receiverAddress, - RcvUserName: receiverUsername, - SndAddr: senderAddress, - SndUserName: senderUsername, - GasPrice: gasPrice, - GasLimit: gasLimit, - Data: dataField, - Signature: signatureBytes, - ChainID: []byte(chainID), - Version: version, - Options: options, + Nonce: nonce, + Value: valAsBigInt, + RcvAddr: receiverAddress, + RcvUserName: receiverUsername, + SndAddr: senderAddress, + SndUserName: senderUsername, + GasPrice: gasPrice, + GasLimit: gasLimit, + Data: dataField, + Signature: signatureBytes, + ChainID: []byte(chainID), + Version: version, + Options: options, + GuardianAddr: guardianAddress, + GuardianSignature: guardianSigBytes, } var txHash []byte diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index df5335d3f9e..e37c41a13ca 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/guardedtx" "github.com/ElrondNetwork/elrond-go/sharding" @@ -22,6 +23,7 @@ type txValidator struct { whiteListHandler process.WhiteListHandler pubKeyConverter core.PubkeyConverter guardianSigVerifier guardedtx.GuardianSigVerifier + txVersionChecker process.TxVersionCheckerHandler maxNonceDeltaAllowed int } @@ -32,6 +34,7 @@ func NewTxValidator( whiteListHandler process.WhiteListHandler, pubKeyConverter core.PubkeyConverter, guardianSigVerifier guardedtx.GuardianSigVerifier, + txVersionChecker process.TxVersionCheckerHandler, maxNonceDeltaAllowed int, ) (*txValidator, error) { if check.IfNil(accounts) { @@ -49,6 +52,9 @@ func NewTxValidator( if check.IfNil(guardianSigVerifier) { return nil, process.ErrNilGuardianSigVerifier } + if check.IfNil(txVersionChecker) { + return nil, process.ErrNilTransactionVersionChecker + } return &txValidator{ accounts: accounts, @@ -57,6 +63,7 @@ func NewTxValidator( maxNonceDeltaAllowed: maxNonceDeltaAllowed, pubKeyConverter: pubKeyConverter, guardianSigVerifier: guardianSigVerifier, + txVersionChecker: txVersionChecker, }, nil } @@ -139,24 +146,60 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac if err != nil { return err } - if isAccountFrozen(account) { - if isBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { - return state.ErrOperationNotPermitted - } - vmUserAccount, ok := account.(vmcommon.UserAccountHandler) - if !ok { - return state.ErrWrongTypeAssertion + if account.IsFrozen() { + err = txv.checkGuardedTransaction(interceptedTx, account) + if err == nil { + return nil } - errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(vmUserAccount, interceptedTx) - if errGuardianSignature != nil { - return fmt.Errorf("%w due to error in signature verification %s", state.ErrOperationNotPermitted, errGuardianSignature.Error()) + + err = checkOperationAllowedToBypassGuardian(txData) + if err != nil { + return err } } return nil } +// Setting a guardian is allowed with regular transactions on a frozen account +// but in this case is set with the default epochs delay +func checkOperationAllowedToBypassGuardian(txData []byte) error { + if isBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { + return nil + } + + return process.ErrOperationNotPermitted +} + +func (txv *txValidator) checkGuardedTransaction(interceptedTx process.InterceptedTransactionHandler, account state.UserAccountHandler) error { + txHandler := interceptedTx.Transaction() + if check.IfNil(txHandler) { + return process.ErrNilTransaction + } + + tx, ok := txHandler.(*transaction.Transaction) + if !ok { + return fmt.Errorf("%w on transaction handler", process.ErrWrongTypeAssertion) + } + + if !txv.txVersionChecker.IsGuardedTransaction(tx) { + return fmt.Errorf("%w without guardian signature", process.ErrOperationNotPermitted) + } + + vmUserAccount, ok := account.(vmcommon.UserAccountHandler) + if !ok { + return fmt.Errorf("%w on account", process.ErrWrongTypeAssertion) + } + + errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(vmUserAccount, interceptedTx) + if errGuardianSignature != nil { + return fmt.Errorf("%w due to error in signature verification %s", process.ErrOperationNotPermitted, errGuardianSignature.Error()) + } + + return nil +} + func (txv *txValidator) checkNonce(interceptedTx process.InterceptedTransactionHandler, accountHandler vmcommon.AccountHandler) error { accountNonce := accountHandler.GetNonce() txNonce := interceptedTx.Nonce() @@ -202,12 +245,6 @@ func getTxData(interceptedTx process.InterceptedTransactionHandler) ([]byte, err return tx.GetData(), nil } -func isAccountFrozen(account state.UserAccountHandler) bool { - codeMetaDataBytes := account.GetCodeMetadata() - codeMetaData := vmcommon.CodeMetadataFromBytes(codeMetaDataBytes) - return codeMetaData.Frozen -} - func isBuiltinFuncCallWithParam(txData []byte, function string) bool { expectedTxDataPrefix := []byte(function + "@") return bytes.HasPrefix(txData, expectedTxDataPrefix) diff --git a/process/errors.go b/process/errors.go index 07e8ce67d3d..6b82a599b4c 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1092,11 +1092,11 @@ var ErrAccountHasNoGuardianSet = errors.New("account has no guardian set") // ErrActiveHasNoActiveGuardian signals that the account has no active guardian var ErrActiveHasNoActiveGuardian = errors.New("account has no active guardian") -// ErrWrongGuardianPubKeyLen signals that the provided public key has an invalid length -var ErrWrongGuardianPubKeyLen = errors.New("provided guardian public key has wrong length") - -// ErrTransactionTypeDoesNotSupportGuardians is thrown when guardian operations are done on transactions that do not support for guardians -var ErrTransactionTypeDoesNotSupportGuardians = errors.New("this transaction type does not support guardians") - // ErrNilGuardedAccountHandler signals that a nil guarded account handler was provided var ErrNilGuardedAccountHandler = errors.New("nil guarded account handler") + +// ErrOperationNotPermitted signals that operation is not permitted +var ErrOperationNotPermitted = errors.New("operation in account not permitted") + +// ErrTransactionAndAccountGuardianMismatch signals a mismatch between the guardian on the account and the one on the transaction +var ErrTransactionAndAccountGuardianMismatch = errors.New("mismatch between transaction guardian and configured account guardian") diff --git a/process/interface.go b/process/interface.go index a2bebd1edeb..5d081ccdd25 100644 --- a/process/interface.go +++ b/process/interface.go @@ -80,8 +80,6 @@ type TxValidatorHandler interface { // InterceptedTransactionHandler defines an intercepted data wrapper over transaction handler that has // receiver and sender shard getters type InterceptedTransactionHandler interface { - GetInterceptorUsedGuardianPubKey() []byte - SetInterceptorUsedGuardianPubKey([]byte) error SenderShardId() uint32 ReceiverShardId() uint32 Nonce() uint64 diff --git a/process/mock/accountWrapperMock.go b/process/mock/accountWrapperMock.go index e3f46dad3e5..38f379988d2 100644 --- a/process/mock/accountWrapperMock.go +++ b/process/mock/accountWrapperMock.go @@ -19,6 +19,7 @@ type AccountWrapMock struct { rootHash []byte address []byte trackableDataTrie state.DataTrieTracker + frozen bool SetNonceWithJournalCalled func(nonce uint64) error `json:"-"` SetCodeHashWithJournalCalled func(codeHash []byte) error `json:"-"` @@ -172,6 +173,11 @@ func (awm *AccountWrapMock) GetNonce() uint64 { return awm.nonce } +// IsFrozen - +func (awm *AccountWrapMock) IsFrozen() bool { + return awm.frozen +} + // IsInterfaceNil - func (awm *AccountWrapMock) IsInterfaceNil() bool { return awm == nil diff --git a/process/mock/interceptedTxHandlerStub.go b/process/mock/interceptedTxHandlerStub.go index e5b75e37047..a4d528cbc39 100644 --- a/process/mock/interceptedTxHandlerStub.go +++ b/process/mock/interceptedTxHandlerStub.go @@ -14,8 +14,6 @@ type InterceptedTxHandlerStub struct { SenderAddressCalled func() []byte FeeCalled func() *big.Int TransactionCalled func() data.TransactionHandler - GetInterceptorUsedGuardianPubKeyCalled func() []byte - SetInterceptorUsedGuardianPubKeyCalled func([]byte) error } // SenderShardId - @@ -58,22 +56,6 @@ func (iths *InterceptedTxHandlerStub) Fee() *big.Int { return nil } -// GetInterceptorUsedGuardianPubKey - -func (iths *InterceptedTxHandlerStub) GetInterceptorUsedGuardianPubKey() []byte { - if iths.GetInterceptorUsedGuardianPubKeyCalled != nil { - return iths.GetInterceptorUsedGuardianPubKeyCalled() - } - return nil -} - -// SetInterceptorUsedGuardianPubKey - -func (iths *InterceptedTxHandlerStub) SetInterceptorUsedGuardianPubKey(guardianPubKey []byte) error { - if iths.SetInterceptorUsedGuardianPubKeyCalled != nil { - return iths.SetInterceptorUsedGuardianPubKeyCalled(guardianPubKey) - } - return nil -} - // Transaction - func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { if iths.TransactionCalled != nil { diff --git a/process/rewardTransaction/interceptedRewardTransaction.go b/process/rewardTransaction/interceptedRewardTransaction.go index b28ddb6f13e..4881bb02f94 100644 --- a/process/rewardTransaction/interceptedRewardTransaction.go +++ b/process/rewardTransaction/interceptedRewardTransaction.go @@ -119,16 +119,6 @@ func (inRTx *InterceptedRewardTransaction) SenderShardId() uint32 { return inRTx.sndShard } -// GetInterceptorUsedGuardianPubKey returns nil, as the reward transactions are generated by the metaChain and have no guardian -func (inRTx *InterceptedRewardTransaction) GetInterceptorUsedGuardianPubKey() []byte { - return nil -} - -// SetInterceptorUsedGuardianPubKey returns error as the rewards transactions are generated by metaChain and do not have guardian -func (inRTx *InterceptedRewardTransaction) SetInterceptorUsedGuardianPubKey([]byte) error { - return process.ErrTransactionTypeDoesNotSupportGuardians -} - // Transaction returns the reward transaction pointer that actually holds the data func (inRTx *InterceptedRewardTransaction) Transaction() data.TransactionHandler { return inRTx.rTx diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 393427ff198..392522642dc 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) type baseTxProcessor struct { @@ -25,6 +26,8 @@ type baseTxProcessor struct { marshalizer marshal.Marshalizer scProcessor process.SmartContractProcessor flagPenalizedTooMuchGas atomic.Flag + txVersionChecker process.TxVersionCheckerHandler + guardianChecker process.GuardianChecker } func (txProc *baseTxProcessor) getAccounts( @@ -201,16 +204,28 @@ func (txProc *baseTxProcessor) processIfTxErrorCrossShard(tx *transaction.Transa return nil } -// VerifyTransaction verifies the account states in respect with the transaction data -func (txProc *txProcessor) VerifyTransaction(tx *transaction.Transaction) error { - if check.IfNil(tx) { - return process.ErrNilTransaction +func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, account state.UserAccountHandler) error { + if !account.IsFrozen() { + return nil + } + + if !txProc.txVersionChecker.IsGuardedTransaction(tx) { + return nil + } + + acc, ok := account.(vmcommon.UserAccountHandler) + if !ok { + return process.ErrWrongTypeAssertion } - senderAccount, receiverAccount, err := txProc.getAccounts(tx.SndAddr, tx.RcvAddr) + guardian, err := txProc.guardianChecker.GetActiveGuardian(acc) if err != nil { return err } - return txProc.checkTxValues(tx, senderAccount, receiverAccount, false) + if !bytes.Equal(guardian, tx.GuardianAddr) { + return process.ErrTransactionAndAccountGuardianMismatch + } + + return nil } diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index f1a3ce7ae71..f3610164ee8 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -412,22 +412,6 @@ func (inTx *InterceptedTransaction) Identifiers() [][]byte { return [][]byte{inTx.hash} } -// GetInterceptorUsedGuardianPubKey returns the guardian public key used to verify the guardian signature -func (inTx *InterceptedTransaction) GetInterceptorUsedGuardianPubKey() []byte { - return inTx.guardianPubKey -} - -// SetInterceptorUsedGuardianPubKey sets the sender account's active guardian at the moment of transaction validation on the interceptor -func (inTx *InterceptedTransaction) SetInterceptorUsedGuardianPubKey(guardianPubKey []byte) error { - if len(guardianPubKey) != inTx.pubkeyConv.Len() { - return process.ErrWrongGuardianPubKeyLen - } - - inTx.guardianPubKey = guardianPubKey - - return nil -} - // IsInterfaceNil returns true if there is no value under the interface func (inTx *InterceptedTransaction) IsInterfaceNil() bool { return inTx == nil diff --git a/process/transaction/metaProcess.go b/process/transaction/metaProcess.go index 277ac3d7172..5b2d1ac9a11 100644 --- a/process/transaction/metaProcess.go +++ b/process/transaction/metaProcess.go @@ -38,6 +38,8 @@ type ArgsNewMetaTxProcessor struct { ESDTEnableEpoch uint32 BuiltInFunctionOnMetachainEnableEpoch uint32 EpochNotifier process.EpochNotifier + TxVersionChecker process.TxVersionCheckerHandler + GuardianChecker process.GuardianChecker } // NewMetaTxProcessor creates a new txProcessor engine @@ -64,6 +66,12 @@ func NewMetaTxProcessor(args ArgsNewMetaTxProcessor) (*metaTxProcessor, error) { if check.IfNil(args.EpochNotifier) { return nil, process.ErrNilEpochNotifier } + if check.IfNil(args.TxVersionChecker) { + return nil, process.ErrNilTransactionVersionChecker + } + if check.IfNil(args.GuardianChecker) { + return nil, process.ErrNilGuardianChecker + } baseTxProcess := &baseTxProcessor{ accounts: args.Accounts, @@ -74,6 +82,8 @@ func NewMetaTxProcessor(args ArgsNewMetaTxProcessor) (*metaTxProcessor, error) { marshalizer: args.Marshalizer, scProcessor: args.ScProcessor, flagPenalizedTooMuchGas: atomic.Flag{}, + txVersionChecker: args.TxVersionChecker, + guardianChecker: args.GuardianChecker, } // backwards compatibility baseTxProcess.flagPenalizedTooMuchGas.Reset() @@ -103,6 +113,11 @@ func (txProc *metaTxProcessor) ProcessTransaction(tx *transaction.Transaction) ( return 0, err } + err = txProc.verifyGuardian(tx, acntSnd) + if err != nil { + return 0, err + } + txHash, err := core.CalculateHash(txProc.marshalizer, txProc.hasher, tx) if err != nil { return 0, err diff --git a/process/transaction/shardProcess.go b/process/transaction/shardProcess.go index adb575a45d1..e5d6307def6 100644 --- a/process/transaction/shardProcess.go +++ b/process/transaction/shardProcess.go @@ -78,6 +78,8 @@ type ArgsNewTxProcessor struct { MetaProtectionEnableEpoch uint32 AddFailedRelayedToInvalidDisableEpoch uint32 EpochNotifier process.EpochNotifier + TxVersionChecker process.TxVersionCheckerHandler + GuardianChecker process.GuardianChecker } // NewTxProcessor creates a new txProcessor engine @@ -127,6 +129,12 @@ func NewTxProcessor(args ArgsNewTxProcessor) (*txProcessor, error) { if check.IfNil(args.EpochNotifier) { return nil, process.ErrNilEpochNotifier } + if check.IfNil(args.TxVersionChecker) { + return nil, process.ErrNilTransactionVersionChecker + } + if check.IfNil(args.GuardianChecker) { + return nil, process.ErrNilGuardianChecker + } baseTxProcess := &baseTxProcessor{ accounts: args.Accounts, @@ -136,6 +144,8 @@ func NewTxProcessor(args ArgsNewTxProcessor) (*txProcessor, error) { hasher: args.Hasher, marshalizer: args.Marshalizer, scProcessor: args.ScProcessor, + txVersionChecker: args.TxVersionChecker, + guardianChecker: args.GuardianChecker, } txProc := &txProcessor{ @@ -175,6 +185,11 @@ func (txProc *txProcessor) ProcessTransaction(tx *transaction.Transaction) (vmco return 0, err } + err = txProc.verifyGuardian(tx, acntSnd) + if err != nil { + return 0, err + } + process.DisplayProcessTxDetails( "ProcessTransaction: sender account details", acntSnd, @@ -231,6 +246,20 @@ func (txProc *txProcessor) ProcessTransaction(tx *transaction.Transaction) (vmco return vmcommon.UserError, txProc.executingFailedTransaction(tx, acntSnd, process.ErrWrongTransaction) } +// VerifyTransaction verifies the account states in respect with the transaction data +func (txProc *txProcessor) VerifyTransaction(tx *transaction.Transaction) error { + if check.IfNil(tx) { + return process.ErrNilTransaction + } + + senderAccount, receiverAccount, err := txProc.getAccounts(tx.SndAddr, tx.RcvAddr) + if err != nil { + return err + } + + return txProc.checkTxValues(tx, senderAccount, receiverAccount, false) +} + func (txProc *txProcessor) executeAfterFailedMoveBalanceTransaction( tx *transaction.Transaction, txError error, diff --git a/process/unsigned/interceptedUnsignedTransaction.go b/process/unsigned/interceptedUnsignedTransaction.go index 3fd3af5ca90..6e46445b6c1 100644 --- a/process/unsigned/interceptedUnsignedTransaction.go +++ b/process/unsigned/interceptedUnsignedTransaction.go @@ -171,16 +171,6 @@ func (inUTx *InterceptedUnsignedTransaction) Identifiers() [][]byte { return [][]byte{inUTx.hash} } -// GetInterceptorUsedGuardianPubKey returns nil as guardians are not supported for unsigned transactions -func (inUTx *InterceptedUnsignedTransaction) GetInterceptorUsedGuardianPubKey() []byte { - return nil -} - -// SetInterceptorUsedGuardianPubKey returns error as the operation is not supported for unsigned transacitions -func (inUTx *InterceptedUnsignedTransaction) SetInterceptorUsedGuardianPubKey([]byte) error { - return process.ErrTransactionTypeDoesNotSupportGuardians -} - // IsInterfaceNil returns true if there is no value under the interface func (inUTx *InterceptedUnsignedTransaction) IsInterfaceNil() bool { return inUTx == nil diff --git a/state/interface.go b/state/interface.go index df013c5f85a..1712402f88a 100644 --- a/state/interface.go +++ b/state/interface.go @@ -84,6 +84,7 @@ type UserAccountHandler interface { GetOwnerAddress() []byte SetUserName(userName []byte) GetUserName() []byte + IsFrozen() bool vmcommon.AccountHandler } diff --git a/state/userAccount.go b/state/userAccount.go index b30754767b4..8aabf124c3e 100644 --- a/state/userAccount.go +++ b/state/userAccount.go @@ -4,6 +4,8 @@ package state import ( "bytes" "math/big" + + vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) var _ UserAccountHandler = (*userAccount)(nil) @@ -140,6 +142,13 @@ func (a *userAccount) SetCodeMetadata(codeMetadata []byte) { a.CodeMetadata = codeMetadata } +// IsFrozen returns true if the account is in frozen state +func (a *userAccount) IsFrozen() bool { + codeMetaDataBytes := a.GetCodeMetadata() + codeMetaData := vmcommon.CodeMetadataFromBytes(codeMetaDataBytes) + return codeMetaData.Frozen +} + // IsInterfaceNil returns true if there is no value under the interface func (a *userAccount) IsInterfaceNil() bool { return a == nil diff --git a/storage/txcache/wrappedTransaction.go b/storage/txcache/wrappedTransaction.go index 478ad2c60b2..4491492efc3 100644 --- a/storage/txcache/wrappedTransaction.go +++ b/storage/txcache/wrappedTransaction.go @@ -12,7 +12,6 @@ const processFeeFactor = float64(0.8) // 80% type WrappedTransaction struct { Tx data.TransactionHandler TxHash []byte - GuardianPubKey []byte SenderShardID uint32 ReceiverShardID uint32 Size int64 diff --git a/testscommon/interceptedTxMocks/interceptedTxStub.go b/testscommon/interceptedTxMocks/interceptedTxStub.go index 8f37227c7ba..3ae689033fa 100644 --- a/testscommon/interceptedTxMocks/interceptedTxStub.go +++ b/testscommon/interceptedTxMocks/interceptedTxStub.go @@ -14,8 +14,6 @@ type InterceptedTxHandlerStub struct { SenderAddressCalled func() []byte FeeCalled func() *big.Int TransactionCalled func() data.TransactionHandler - GetInterceptorUsedGuardianPubKeyCalled func() []byte - SetInterceptorUsedGuardianPubKeyCalled func([]byte) error } // SenderShardId - @@ -65,19 +63,3 @@ func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { } return nil } - -// GetInterceptorUsedGuardianPubKey - -func (iths *InterceptedTxHandlerStub) GetInterceptorUsedGuardianPubKey() []byte { - if iths.GetInterceptorUsedGuardianPubKeyCalled != nil { - return iths.GetInterceptorUsedGuardianPubKeyCalled() - } - return nil -} - -// SetInterceptorUsedGuardianPubKey - -func (iths *InterceptedTxHandlerStub) SetInterceptorUsedGuardianPubKey(guardianPubKey []byte) error { - if iths.SetInterceptorUsedGuardianPubKeyCalled != nil { - return iths.SetInterceptorUsedGuardianPubKeyCalled(guardianPubKey) - } - return nil -} diff --git a/testscommon/state/accountWrapperMock.go b/testscommon/state/accountWrapperMock.go index e2e72f18233..f895d0325a3 100644 --- a/testscommon/state/accountWrapperMock.go +++ b/testscommon/state/accountWrapperMock.go @@ -21,6 +21,7 @@ type AccountWrapMock struct { RootHash []byte address []byte trackableDataTrie state.DataTrieTracker + frozen bool SetNonceWithJournalCalled func(nonce uint64) error `json:"-"` SetCodeHashWithJournalCalled func(codeHash []byte) error `json:"-"` @@ -169,3 +170,8 @@ func (awm *AccountWrapMock) IncreaseNonce(val uint64) { func (awm *AccountWrapMock) GetNonce() uint64 { return awm.nonce } + +// IsFrozen - +func (awm *AccountWrapMock) IsFrozen() bool { + return awm.frozen +} diff --git a/testscommon/state/userAccountStub.go b/testscommon/state/userAccountStub.go index edb8454db2b..16fdf204d38 100644 --- a/testscommon/state/userAccountStub.go +++ b/testscommon/state/userAccountStub.go @@ -15,6 +15,7 @@ type UserAccountStub struct { Balance *big.Int AddToBalanceCalled func(value *big.Int) error DataTrieTrackerCalled func() state.DataTrieTracker + IsFrozenCalled func() bool } // HasNewCode - @@ -150,6 +151,14 @@ func (u *UserAccountStub) DataTrieTracker() state.DataTrieTracker { return nil } +// IsFrozen - +func (u *UserAccountStub) IsFrozen() bool { + if u.IsFrozenCalled != nil { + return u.IsFrozenCalled() + } + return false +} + // IsInterfaceNil - func (u *UserAccountStub) IsInterfaceNil() bool { return false From a20dd957c2fb106c9b8cf194b5ad9f5f6651bae7 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 5 May 2022 19:05:47 +0300 Subject: [PATCH 029/335] process, facade, api, node: new field in tx integration & unit tests fixes --- api/groups/transactionGroup.go | 38 +++++++----- api/groups/transactionGroup_test.go | 18 +++--- api/mock/facadeStub.go | 6 +- api/shared/interface.go | 2 +- facade/initial/initialNodeFacade.go | 4 +- facade/initial/initialNodeFacade_test.go | 2 +- facade/mock/nodeStub.go | 6 +- facade/nodeFacade.go | 4 +- facade/nodeFacade_test.go | 4 +- factory/blockProcessorCreator.go | 6 ++ genesis/mock/coreComponentsMock.go | 7 +++ genesis/process/argGenesisBlockCreator.go | 1 + genesis/process/genesisBlockCreator_test.go | 1 + genesis/process/metaGenesisBlockCreator.go | 3 + genesis/process/shardGenesisBlockCreator.go | 2 + integrationTests/interface.go | 2 +- integrationTests/testProcessorNode.go | 6 ++ integrationTests/vm/arwen/utils.go | 2 + integrationTests/vm/testInitializer.go | 4 ++ node/node.go | 61 +++++++++++-------- node/node_test.go | 42 +++++++------ process/dataValidators/txValidator_test.go | 34 +++++++++++ .../baseInterceptorsContainerFactory.go | 1 + process/transaction/baseProcess.go | 2 +- process/transaction/shardProcess_test.go | 5 +- testscommon/TxVersionCheckerStub.go | 41 +++++++++++++ update/factory/fullSyncInterceptors.go | 1 + 27 files changed, 223 insertions(+), 82 deletions(-) create mode 100644 testscommon/TxVersionCheckerStub.go diff --git a/api/groups/transactionGroup.go b/api/groups/transactionGroup.go index 41ba2b0996b..0bc69ea1a93 100644 --- a/api/groups/transactionGroup.go +++ b/api/groups/transactionGroup.go @@ -36,7 +36,7 @@ const ( // transactionFacadeHandler defines the methods to be implemented by a facade for transaction requests type transactionFacadeHandler interface { CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*transaction.Transaction, []byte, error) + gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) ValidateTransaction(tx *transaction.Transaction) error ValidateTransactionForSimulation(tx *transaction.Transaction, checkSignature bool) error SendBulkTransactions([]*transaction.Transaction) (uint64, error) @@ -138,19 +138,21 @@ type MultipleTxRequest struct { // SendTxRequest represents the structure that maps and validates user input for publishing a new transaction type SendTxRequest struct { - Sender string `form:"sender" json:"sender"` - Receiver string `form:"receiver" json:"receiver"` - SenderUsername []byte `json:"senderUsername,omitempty"` - ReceiverUsername []byte `json:"receiverUsername,omitempty"` - Value string `form:"value" json:"value"` - Data []byte `form:"data" json:"data"` - Nonce uint64 `form:"nonce" json:"nonce"` - GasPrice uint64 `form:"gasPrice" json:"gasPrice"` - GasLimit uint64 `form:"gasLimit" json:"gasLimit"` - Signature string `form:"signature" json:"signature"` - ChainID string `form:"chainID" json:"chainID"` - Version uint32 `form:"version" json:"version"` - Options uint32 `json:"options,omitempty"` + Sender string `form:"sender" json:"sender"` + Receiver string `form:"receiver" json:"receiver"` + SenderUsername []byte `json:"senderUsername,omitempty"` + ReceiverUsername []byte `json:"receiverUsername,omitempty"` + Value string `form:"value" json:"value"` + Data []byte `form:"data" json:"data"` + Nonce uint64 `form:"nonce" json:"nonce"` + GasPrice uint64 `form:"gasPrice" json:"gasPrice"` + GasLimit uint64 `form:"gasLimit" json:"gasLimit"` + Signature string `form:"signature" json:"signature"` + ChainID string `form:"chainID" json:"chainID"` + Version uint32 `form:"version" json:"version"` + Options uint32 `json:"options,omitempty"` + GuardianAddr string `json:"guardian,omitempty"` + GuardianSignature string `json:"guardianSignature,omitempty"` } // TxResponse represents the structure on which the response will be validated against @@ -206,6 +208,8 @@ func (tg *transactionGroup) simulateTransaction(c *gin.Context) { gtx.ChainID, gtx.Version, gtx.Options, + gtx.GuardianAddr, + gtx.GuardianSignature, ) if err != nil { c.JSON( @@ -286,6 +290,8 @@ func (tg *transactionGroup) sendTransaction(c *gin.Context) { gtx.ChainID, gtx.Version, gtx.Options, + gtx.GuardianAddr, + gtx.GuardianSignature, ) if err != nil { c.JSON( @@ -374,6 +380,8 @@ func (tg *transactionGroup) sendMultipleTransactions(c *gin.Context) { receivedTx.ChainID, receivedTx.Version, receivedTx.Options, + receivedTx.GuardianAddr, + receivedTx.GuardianSignature, ) if err != nil { continue @@ -495,6 +503,8 @@ func (tg *transactionGroup) computeTransactionGasLimit(c *gin.Context) { gtx.ChainID, gtx.Version, gtx.Options, + gtx.GuardianAddr, + gtx.GuardianSignature, ) if err != nil { c.JSON( diff --git a/api/groups/transactionGroup_test.go b/api/groups/transactionGroup_test.go index 2a0f335656a..214795eff1e 100644 --- a/api/groups/transactionGroup_test.go +++ b/api/groups/transactionGroup_test.go @@ -267,7 +267,7 @@ func TestSendTransaction_ErrorWhenFacadeSendTransactionError(t *testing.T) { errorString := "send transaction error" facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { return nil, nil, nil }, SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, err error) { @@ -315,7 +315,7 @@ func TestSendTransaction_ReturnsSuccessfully(t *testing.T) { hexTxHash := "deadbeef" facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { txHash, _ := hex.DecodeString(hexTxHash) return nil, txHash, nil }, @@ -421,7 +421,7 @@ func TestSendMultipleTransactions_OkPayloadShouldWork(t *testing.T) { sendBulkTxsWasCalled := false facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { createTxWasCalled = true return &dataTx.Transaction{}, make([]byte, 0), nil }, @@ -474,7 +474,7 @@ func TestComputeTransactionGasLimit(t *testing.T) { expectedGasLimit := uint64(37) facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, nil, nil }, ComputeTransactionGasLimitHandler: func(tx *dataTx.Transaction) (*dataTx.CostResponse, error) { @@ -553,7 +553,7 @@ func TestSimulateTransaction_CreateErrorsShouldErr(t *testing.T) { Hash: "hash", }, nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { return nil, nil, expectedErr }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { @@ -608,7 +608,7 @@ func TestSimulateTransaction_ValidateErrorsShouldErr(t *testing.T) { Hash: "hash", }, nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { @@ -688,7 +688,7 @@ func TestSimulateTransaction_UseQueryParameterShouldWork(t *testing.T) { assert.True(t, bypassSignature) return nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { @@ -732,7 +732,7 @@ func TestSimulateTransaction_ProcessErrorsShouldErr(t *testing.T) { SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { return nil, expectedErr }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { @@ -785,7 +785,7 @@ func TestSimulateTransaction(t *testing.T) { Hash: "hash", }, nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index f7161c78c29..c39f72bf7c8 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -28,7 +28,7 @@ type FacadeStub struct { GenerateTransactionHandler func(sender string, receiver string, value *big.Int, code string) (*transaction.Transaction, error) GetTransactionHandler func(hash string, withResults bool) (*transaction.ApiTransactionResult, error) CreateTransactionHandler func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*transaction.Transaction, []byte, error) + gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) ValidateTransactionHandler func(tx *transaction.Transaction) error ValidateTransactionForSimulationHandler func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) @@ -245,8 +245,10 @@ func (f *FacadeStub) CreateTransaction( chainID string, version uint32, options uint32, + guardian string, + guardianSigHex string, ) (*transaction.Transaction, []byte, error) { - return f.CreateTransactionHandler(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, data, signatureHex, chainID, version, options) + return f.CreateTransactionHandler(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, data, signatureHex, chainID, version, options, guardian, guardianSigHex) } // GetTransaction is the mock implementation of a handler's GetTransaction method diff --git a/api/shared/interface.go b/api/shared/interface.go index 6337869f86f..5a649f51034 100644 --- a/api/shared/interface.go +++ b/api/shared/interface.go @@ -92,7 +92,7 @@ type FacadeHandler interface { VerifyProof(rootHash string, address string, proof [][]byte) (bool, error) GetThrottlerForEndpoint(endpoint string) (core.Throttler, bool) CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*transaction.Transaction, []byte, error) + gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) ValidateTransaction(tx *transaction.Transaction) error ValidateTransactionForSimulation(tx *transaction.Transaction, checkSignature bool) error SendBulkTransactions([]*transaction.Transaction) (uint64, error) diff --git a/facade/initial/initialNodeFacade.go b/facade/initial/initialNodeFacade.go index 7fc34474c41..abfbbeaca92 100644 --- a/facade/initial/initialNodeFacade.go +++ b/facade/initial/initialNodeFacade.go @@ -122,7 +122,9 @@ func (inf *initialNodeFacade) CreateTransaction( _ string, _ string, _ uint32, - _ uint32) (*transaction.Transaction, []byte, error) { + _ uint32, + _ string, + _ string) (*transaction.Transaction, []byte, error) { return nil, nil, errNodeStarting } diff --git a/facade/initial/initialNodeFacade_test.go b/facade/initial/initialNodeFacade_test.go index a4d2930b435..7cdd2f1427f 100644 --- a/facade/initial/initialNodeFacade_test.go +++ b/facade/initial/initialNodeFacade_test.go @@ -46,7 +46,7 @@ func TestDisabledNodeFacade_AllMethodsShouldNotPanic(t *testing.T) { assert.Equal(t, errNodeStarting, err) n1, n2, err := inf.CreateTransaction(uint64(0), "", "", []byte{0}, "", - []byte{0}, uint64(0), uint64(0), []byte{0}, "", "", uint32(0), uint32(0)) + []byte{0}, uint64(0), uint64(0), []byte{0}, "", "", uint32(0), uint32(0), "", "") assert.Nil(t, n1) assert.Nil(t, n2) assert.Equal(t, errNodeStarting, err) diff --git a/facade/mock/nodeStub.go b/facade/mock/nodeStub.go index 3267e6dbf7e..470acbd76a1 100644 --- a/facade/mock/nodeStub.go +++ b/facade/mock/nodeStub.go @@ -21,7 +21,7 @@ type NodeStub struct { GetBalanceHandler func(address string) (*big.Int, error) GenerateTransactionHandler func(sender string, receiver string, amount string, code string) (*transaction.Transaction, error) CreateTransactionHandler func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version, options uint32) (*transaction.Transaction, []byte, error) + gasLimit uint64, data []byte, signatureHex string, chainID string, version, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) ValidateTransactionHandler func(tx *transaction.Transaction) error ValidateTransactionForSimulationCalled func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) @@ -121,9 +121,9 @@ func (ns *NodeStub) GetBalance(address string) (*big.Int, error) { // CreateTransaction - func (ns *NodeStub) CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*transaction.Transaction, []byte, error) { + gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) { - return ns.CreateTransactionHandler(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, data, signatureHex, chainID, version, options) + return ns.CreateTransactionHandler(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, data, signatureHex, chainID, version, options, guardian, guardianSigHex) } //ValidateTransaction - diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index e278cdea16a..36a077cfbb9 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -231,9 +231,11 @@ func (nf *nodeFacade) CreateTransaction( chainID string, version uint32, options uint32, + guardian string, + guardianSigHex string, ) (*transaction.Transaction, []byte, error) { - return nf.node.CreateTransaction(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, txData, signatureHex, chainID, version, options) + return nf.node.CreateTransaction(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, txData, signatureHex, chainID, version, options, guardian, guardianSigHex) } // ValidateTransaction will validate a transaction diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 7ce88208875..c89592922e5 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -489,7 +489,7 @@ func TestNodeFacade_CreateTransaction(t *testing.T) { nodeCreateTxWasCalled := false node := &mock.NodeStub{ - CreateTransactionHandler: func(_ uint64, _ string, _ string, _ []byte, _ string, _ []byte, _ uint64, _ uint64, _ []byte, _ string, _ string, _, _ uint32) (*transaction.Transaction, []byte, error) { + CreateTransactionHandler: func(_ uint64, _ string, _ string, _ []byte, _ string, _ []byte, _ uint64, _ uint64, _ []byte, _ string, _ string, _, _ uint32, _ string, _ string) (*transaction.Transaction, []byte, error) { nodeCreateTxWasCalled = true return nil, nil, nil }, @@ -498,7 +498,7 @@ func TestNodeFacade_CreateTransaction(t *testing.T) { arg.Node = node nf, _ := NewNodeFacade(arg) - _, _, _ = nf.CreateTransaction(0, "0", "0", nil, "0", nil, 0, 0, []byte("0"), "0", "chainID", 1, 0) + _, _, _ = nf.CreateTransaction(0, "0", "0", nil, "0", nil, 0, 0, []byte("0"), "0", "chainID", 1, 0, "", "") assert.True(t, nodeCreateTxWasCalled) } diff --git a/factory/blockProcessorCreator.go b/factory/blockProcessorCreator.go index ccef04276e5..6ef1f55a764 100644 --- a/factory/blockProcessorCreator.go +++ b/factory/blockProcessorCreator.go @@ -261,6 +261,8 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( EpochNotifier: pcf.epochNotifier, RelayedTxV2EnableEpoch: enableEpochs.RelayedTransactionsV2EnableEpoch, AddFailedRelayedToInvalidDisableEpoch: enableEpochs.AddFailedRelayedTxToInvalidMBsDisableEpoch, + GuardianChecker: pcf.coreData.GuardedAccountHandler(), + TxVersionChecker: pcf.coreData.TxVersionChecker(), } transactionProcessor, err := transaction.NewTxProcessor(argsNewTxProcessor) if err != nil { @@ -555,6 +557,8 @@ func (pcf *processComponentsFactory) newMetaBlockProcessor( ESDTEnableEpoch: pcf.epochConfig.EnableEpochs.ESDTEnableEpoch, BuiltInFunctionOnMetachainEnableEpoch: pcf.epochConfig.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, EpochNotifier: pcf.epochNotifier, + GuardianChecker: pcf.coreData.GuardedAccountHandler(), + TxVersionChecker: pcf.coreData.TxVersionChecker(), } transactionProcessor, err := transaction.NewMetaTxProcessor(argsNewMetaTxProcessor) @@ -1026,6 +1030,8 @@ func (pcf *processComponentsFactory) createMetaTxSimulatorProcessor( ESDTEnableEpoch: pcf.epochConfig.EnableEpochs.ESDTEnableEpoch, BuiltInFunctionOnMetachainEnableEpoch: pcf.epochConfig.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, EpochNotifier: pcf.epochNotifier, + TxVersionChecker: pcf.coreData.TxVersionChecker(), + GuardianChecker: pcf.coreData.GuardedAccountHandler(), } txSimulatorProcessorArgs.TransactionProcessor, err = transaction.NewMetaTxProcessor(argsNewMetaTx) diff --git a/genesis/mock/coreComponentsMock.go b/genesis/mock/coreComponentsMock.go index 31cfc834c57..ec9af59f359 100644 --- a/genesis/mock/coreComponentsMock.go +++ b/genesis/mock/coreComponentsMock.go @@ -5,6 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" + "github.com/ElrondNetwork/elrond-go/process" ) // CoreComponentsMock - @@ -18,6 +19,7 @@ type CoreComponentsMock struct { Chain string MinTxVersion uint32 StatHandler core.AppStatusHandler + TxVersionCheck process.TxVersionCheckerHandler } // InternalMarshalizer - @@ -60,6 +62,11 @@ func (ccm *CoreComponentsMock) MinTransactionVersion() uint32 { return ccm.MinTxVersion } +// TxVersionChecker - +func (ccm *CoreComponentsMock) TxVersionChecker() process.TxVersionCheckerHandler { + return ccm.TxVersionCheck +} + // IsInterfaceNil - func (ccm *CoreComponentsMock) IsInterfaceNil() bool { return ccm == nil diff --git a/genesis/process/argGenesisBlockCreator.go b/genesis/process/argGenesisBlockCreator.go index 518aca21d6b..9e08f6036b0 100644 --- a/genesis/process/argGenesisBlockCreator.go +++ b/genesis/process/argGenesisBlockCreator.go @@ -25,6 +25,7 @@ type coreComponentsHandler interface { Hasher() hashing.Hasher AddressPubKeyConverter() core.PubkeyConverter Uint64ByteSliceConverter() typeConverters.Uint64ByteSliceConverter + TxVersionChecker() process.TxVersionCheckerHandler ChainID() string IsInterfaceNil() bool } diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index b18f4d8aad4..793b09773f4 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -62,6 +62,7 @@ func createMockArgument( UInt64ByteSliceConv: &mock.Uint64ByteSliceConverterMock{}, AddrPubKeyConv: mock.NewPubkeyConverterMock(32), Chain: "chainID", + TxVersionCheck: &testscommon.TxVersionCheckerStub{}, MinTxVersion: 1, }, Data: &mock.DataComponentsMock{ diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index afc895e6fd0..8251dbb026a 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -26,6 +26,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/coordinator" "github.com/ElrondNetwork/elrond-go/process/factory" "github.com/ElrondNetwork/elrond-go/process/factory/metachain" + disabledGuardian "github.com/ElrondNetwork/elrond-go/process/guardian/disabled" "github.com/ElrondNetwork/elrond-go/process/smartContract" "github.com/ElrondNetwork/elrond-go/process/smartContract/hooks" syncDisabled "github.com/ElrondNetwork/elrond-go/process/sync/disabled" @@ -427,6 +428,8 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc ESDTEnableEpoch: enableEpochs.ESDTEnableEpoch, BuiltInFunctionOnMetachainEnableEpoch: enableEpochs.BuiltInFunctionOnMetaEnableEpoch, EpochNotifier: epochNotifier, + TxVersionChecker: arg.Core.TxVersionChecker(), + GuardianChecker: disabledGuardian.NewDisabledGuardedAccountHandler(), } txProcessor, err := processTransaction.NewMetaTxProcessor(argsNewMetaTxProcessor) if err != nil { diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index 494e9fbcb03..073541352f2 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -539,6 +539,8 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo MetaProtectionEnableEpoch: enableEpochs.MetaProtectionEnableEpoch, RelayedTxV2EnableEpoch: enableEpochs.RelayedTransactionsV2EnableEpoch, AddFailedRelayedToInvalidDisableEpoch: enableEpochs.AddFailedRelayedTxToInvalidMBsDisableEpoch, + TxVersionChecker: arg.Core.TxVersionChecker(), + GuardianChecker: disabledGuardian.NewDisabledGuardedAccountHandler(), } transactionProcessor, err := transaction.NewTxProcessor(argsNewTxProcessor) if err != nil { diff --git a/integrationTests/interface.go b/integrationTests/interface.go index b8c298b3619..9cafa1cc337 100644 --- a/integrationTests/interface.go +++ b/integrationTests/interface.go @@ -80,7 +80,7 @@ type Facade interface { GetNumCheckpointsFromAccountState() uint32 GetNumCheckpointsFromPeerState() uint32 CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32) (*transaction.Transaction, []byte, error) + gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) ValidateTransaction(tx *transaction.Transaction) error ValidateTransactionForSimulation(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactions([]*transaction.Transaction) (uint64, error) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index a4d3f0ec228..22c51258ea8 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1544,6 +1544,8 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u EpochNotifier: tpn.EpochNotifier, RelayedTxEnableEpoch: tpn.EnableEpochs.RelayedTransactionsEnableEpoch, PenalizedTooMuchGasEnableEpoch: tpn.EnableEpochs.PenalizedTooMuchGasEnableEpoch, + GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } tpn.TxProcessor, _ = transaction.NewTxProcessor(argsNewTxProcessor) scheduledTxsExecutionHandler, _ := preprocess.NewScheduledTxsExecution( @@ -1787,6 +1789,8 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors() { ESDTEnableEpoch: 0, EpochNotifier: tpn.EpochNotifier, BuiltInFunctionOnMetachainEnableEpoch: tpn.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, + GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } tpn.TxProcessor, _ = transaction.NewMetaTxProcessor(argsNewMetaTxProc) scheduledTxsExecutionHandler, _ := preprocess.NewScheduledTxsExecution( @@ -2328,6 +2332,8 @@ func (tpn *TestProcessorNode) SendTransaction(tx *dataTransaction.Transaction) ( string(tx.ChainID), tx.Version, tx.Options, + TestAddressPubkeyConverter.Encode(tx.GuardianAddr), + hex.EncodeToString(tx.GuardianSignature), ) if err != nil { return "", err diff --git a/integrationTests/vm/arwen/utils.go b/integrationTests/vm/arwen/utils.go index fded183bcf1..32d74503530 100644 --- a/integrationTests/vm/arwen/utils.go +++ b/integrationTests/vm/arwen/utils.go @@ -368,6 +368,8 @@ func (context *TestContext) initTxProcessorWithOneSCExecutorWithVMs() { RelayedTxEnableEpoch: 0, PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: forking.NewGenericEpochNotifier(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, } context.TxProcessor, err = processTransaction.NewTxProcessor(argsNewTxProcessor) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 89924123105..7a0507fdd72 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -502,6 +502,8 @@ func CreateTxProcessorWithOneSCExecutorMockVM( PenalizedTooMuchGasEnableEpoch: enableEpochs.PenalizedTooMuchGasEnableEpoch, MetaProtectionEnableEpoch: enableEpochs.MetaProtectionEnableEpoch, RelayedTxEnableEpoch: enableEpochs.RelayedTransactionsEnableEpoch, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, } return transaction.NewTxProcessor(argsNewTxProcessor) @@ -859,6 +861,8 @@ func CreateTxProcessorWithOneSCExecutorWithVMs( MetaProtectionEnableEpoch: enableEpochs.MetaProtectionEnableEpoch, RelayedTxV2EnableEpoch: enableEpochs.RelayedTransactionsV2EnableEpoch, AddFailedRelayedToInvalidDisableEpoch: enableEpochs.AddFailedRelayedTxToInvalidMBsDisableEpoch, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, } txProcessor, err := transaction.NewTxProcessor(argsNewTxProcessor) if err != nil { diff --git a/node/node.go b/node/node.go index 820b348b36b..306187a318a 100644 --- a/node/node.go +++ b/node/node.go @@ -742,21 +742,11 @@ func (n *Node) CreateTransaction( return nil, nil, errors.New("could not create sender address from provided param") } - guardianAddress, err := addrPubKeyConverter.Decode(guardian) - if err != nil { - return nil, nil, errors.New("could not create guardian address from provided param") - } - signatureBytes, err := hex.DecodeString(signatureHex) if err != nil { return nil, nil, errors.New("could not fetch signature bytes") } - guardianSigBytes, err := hex.DecodeString(guardianSigHex) - if err != nil { - return nil, nil, errors.New("could not fetch guardian signature bytes") - } - if len(value) > len(n.coreComponents.EconomicsData().GenesisTotalSupply().String())+1 { return nil, nil, ErrTransactionValueLengthTooBig } @@ -767,21 +757,26 @@ func (n *Node) CreateTransaction( } tx := &transaction.Transaction{ - Nonce: nonce, - Value: valAsBigInt, - RcvAddr: receiverAddress, - RcvUserName: receiverUsername, - SndAddr: senderAddress, - SndUserName: senderUsername, - GasPrice: gasPrice, - GasLimit: gasLimit, - Data: dataField, - Signature: signatureBytes, - ChainID: []byte(chainID), - Version: version, - Options: options, - GuardianAddr: guardianAddress, - GuardianSignature: guardianSigBytes, + Nonce: nonce, + Value: valAsBigInt, + RcvAddr: receiverAddress, + RcvUserName: receiverUsername, + SndAddr: senderAddress, + SndUserName: senderUsername, + GasPrice: gasPrice, + GasLimit: gasLimit, + Data: dataField, + Signature: signatureBytes, + ChainID: []byte(chainID), + Version: version, + Options: options, + } + + if len(guardian) > 0 { + err = n.setTxGuardianData(guardian, guardianSigHex, tx) + if err != nil { + return nil, nil, err + } } var txHash []byte @@ -793,6 +788,22 @@ func (n *Node) CreateTransaction( return tx, txHash, nil } +func (n *Node) setTxGuardianData(guardian string, guardianSigHex string, tx *transaction.Transaction) error { + addrPubKeyConverter := n.coreComponents.AddressPubKeyConverter() + guardianAddress, err := addrPubKeyConverter.Decode(guardian) + if err != nil { + return errors.New("could not create guardian address from provided param") + } + guardianSigBytes, err := hex.DecodeString(guardianSigHex) + if err != nil { + return errors.New("could not fetch guardian signature bytes") + } + tx.GuardianAddr = guardianAddress + tx.GuardianSignature = guardianSigBytes + + return nil +} + // GetAccount will return account details for a given address func (n *Node) GetAccount(address string) (api.AccountResponse, error) { if check.IfNil(n.coreComponents.AddressPubKeyConverter()) { diff --git a/node/node_test.go b/node/node_test.go index 89e1e0effbb..ad7bdeec66c 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -1240,7 +1240,7 @@ func TestCreateTransaction_NilAddrConverterShouldErr(t *testing.T) { coreComponents.AddrPubKeyConv = nil chainID := coreComponents.ChainID() - tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Nil(t, txHash) @@ -1294,6 +1294,8 @@ func TestCreateTransaction_NilAccountsAdapterShouldErr(t *testing.T) { coreComponents.ChainID(), 1, 0, + "", + "", ) assert.Nil(t, tx) @@ -1331,7 +1333,7 @@ func TestCreateTransaction_InvalidSignatureShouldErr(t *testing.T) { txData := []byte("-") signature := "-" - tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, "chainID", 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, "chainID", 1, 0, "", "") assert.Nil(t, tx) assert.Nil(t, txHash) @@ -1383,17 +1385,17 @@ func TestCreateTransaction_ChainIDFieldChecks(t *testing.T) { signature := hex.EncodeToString([]byte(strings.Repeat("s", 10))) emptyChainID := "" - _, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, emptyChainID, 1, 0) + _, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, emptyChainID, 1, 0, "", "") assert.Equal(t, node.ErrInvalidChainIDInTransaction, err) for i := 1; i < len(chainID); i++ { newChainID := strings.Repeat("c", i) - _, _, err = n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, newChainID, 1, 0) + _, _, err = n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, newChainID, 1, 0, "", "") assert.NoError(t, err) } newChainID := chainID + "additional text" - _, _, err = n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, newChainID, 1, 0) + _, _, err = n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, newChainID, 1, 0, "", "") assert.Equal(t, node.ErrInvalidChainIDInTransaction, err) } @@ -1437,7 +1439,7 @@ func TestCreateTransaction_InvalidTxVersionShouldErr(t *testing.T) { gasLimit := uint64(20) txData := []byte("-") signature := "617eff4f" - _, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, "", 0, 0) + _, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, "", 0, 0, "", "") assert.Equal(t, node.ErrInvalidTransactionVersion, err) } @@ -1515,7 +1517,7 @@ func TestCreateTransaction_SenderShardIdIsInDifferentShardShouldNotValidate(t *t txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, string(chainID), version, 0) + tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, string(chainID), version, 0, "", "") assert.NotNil(t, tx) assert.Equal(t, expectedHash, txHash) assert.Nil(t, err) @@ -1580,14 +1582,14 @@ func TestCreateTransaction_SignatureLengthChecks(t *testing.T) { for i := 0; i <= signatureLength; i++ { signatureBytes := []byte(strings.Repeat("a", i)) signatureHex := hex.EncodeToString(signatureBytes) - tx, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signatureHex, chainID, 1, 0) + tx, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signatureHex, chainID, 1, 0, "", "") assert.NotNil(t, tx) assert.NoError(t, err) assert.Equal(t, signatureBytes, tx.Signature) } signature := hex.EncodeToString([]byte(strings.Repeat("a", signatureLength+1))) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Empty(t, txHash) assert.Equal(t, node.ErrInvalidSignatureLength, err) @@ -1645,12 +1647,12 @@ func TestCreateTransaction_SenderLengthChecks(t *testing.T) { for i := 0; i <= encodedAddressLen; i++ { sender := strings.Repeat("s", i) - _, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + _, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.NoError(t, err) } sender := strings.Repeat("s", encodedAddressLen) + "additional" - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1709,12 +1711,12 @@ func TestCreateTransaction_ReceiverLengthChecks(t *testing.T) { for i := 0; i <= encodedAddressLen; i++ { receiver := strings.Repeat("r", i) - _, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + _, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.NoError(t, err) } receiver := strings.Repeat("r", encodedAddressLen) + "additional" - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1773,7 +1775,7 @@ func TestCreateTransaction_TooBigSenderUsernameShouldErr(t *testing.T) { senderUsername := bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, senderUsername, gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, senderUsername, gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1832,7 +1834,7 @@ func TestCreateTransaction_TooBigReceiverUsernameShouldErr(t *testing.T) { receiverUsername := bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, receiverUsername, sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value, receiver, receiverUsername, sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1888,7 +1890,7 @@ func TestCreateTransaction_DataFieldSizeExceedsMaxShouldErr(t *testing.T) { txData := bytes.Repeat([]byte{0}, core.MegabyteSize+1) signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1945,7 +1947,7 @@ func TestCreateTransaction_TooLargeValueFieldShouldErr(t *testing.T) { txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0) + tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -2018,7 +2020,7 @@ func TestCreateTransaction_OkValsShouldWork(t *testing.T) { tx, txHash, err := n.CreateTransaction( nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, - signature, coreComponents.ChainID(), coreComponents.MinTransactionVersion(), 0, + signature, coreComponents.ChainID(), coreComponents.MinTransactionVersion(), 0,"", "", ) assert.NotNil(t, tx) assert.Equal(t, expectedHash, txHash) @@ -2119,7 +2121,7 @@ func TestCreateTransaction_TxSignedWithHashShouldErrVersionShoudBe2(t *testing.T signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) options := transaction.MaskSignedWithHash - tx, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version, options) + tx, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version, options, "", "") require.Nil(t, err) err = n.ValidateTransaction(tx) assert.Equal(t, process.ErrInvalidTransactionVersion, err) @@ -2220,7 +2222,7 @@ func TestCreateTransaction_TxSignedWithHashNoEnabledShouldErr(t *testing.T) { signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) options := transaction.MaskSignedWithHash - tx, _, _ := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version+1, options) + tx, _, _ := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version+1, options, "", "") err := n.ValidateTransaction(tx) assert.Equal(t, process.ErrTransactionSignedWithHashIsNotEnabled, err) diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 0c2057eeaab..18876fa9155 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -84,6 +84,7 @@ func TestNewTxValidator_NilAccountsShouldErr(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -102,6 +103,7 @@ func TestNewTxValidator_NilShardCoordinatorShouldErr(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -121,6 +123,7 @@ func TestTxValidator_NewValidatorNilWhiteListHandlerShouldErr(t *testing.T) { nil, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -140,6 +143,7 @@ func TestNewTxValidator_NilPubkeyConverterShouldErr(t *testing.T) { &testscommon.WhiteListHandlerStub{}, nil, &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -159,12 +163,32 @@ func TestNewTxValidator_NilGuardianSigVerifierShouldErr(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), nil, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, txValidator) assert.True(t, errors.Is(err, process.ErrNilGuardianSigVerifier)) } +func TestNewTxValidator_NilTxVersionCheckerShouldErr(t *testing.T) { + t.Parallel() + + adb := getAccAdapter(0, big.NewInt(0)) + shardCoordinator := createMockCoordinator("_", 0) + maxNonceDeltaAllowed := 100 + txValidator, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, + nil, + maxNonceDeltaAllowed, + ) + assert.Nil(t, txValidator) + assert.True(t, errors.Is(err, process.ErrNilTransactionVersionChecker)) +} + func TestNewTxValidator_ShouldWork(t *testing.T) { t.Parallel() @@ -177,6 +201,7 @@ func TestNewTxValidator_ShouldWork(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -200,6 +225,7 @@ func TestTxValidator_CheckTxValidityTxCrossShardShouldWork(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -226,6 +252,7 @@ func TestTxValidator_CheckTxValidityAccountNonceIsGreaterThanTxNonceShouldReturn &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -253,6 +280,7 @@ func TestTxValidator_CheckTxValidityTxNonceIsTooHigh(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -282,6 +310,7 @@ func TestTxValidator_CheckTxValidityAccountBalanceIsLessThanTxTotalValueShouldRe &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) assert.Nil(t, err) @@ -310,6 +339,7 @@ func TestTxValidator_CheckTxValidityAccountNotExitsShouldReturnFalse(t *testing. &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -340,6 +370,7 @@ func TestTxValidator_CheckTxValidityAccountNotExitsButWhiteListedShouldReturnTru }, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -375,6 +406,7 @@ func TestTxValidator_CheckTxValidityWrongAccountTypeShouldReturnFalse(t *testing &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -400,6 +432,7 @@ func TestTxValidator_CheckTxValidityTxIsOkShouldReturnTrue(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -424,6 +457,7 @@ func TestTxValidator_IsInterfaceNil(t *testing.T) { &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, 100, ) _ = txValidator diff --git a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go index c1d93dccc44..c3f62bd001d 100644 --- a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go @@ -212,6 +212,7 @@ func (bicf *baseInterceptorsContainerFactory) createOneTxInterceptor(topic strin bicf.whiteListHandler, addrPubKeyConverter, bicf.argInterceptorFactory.GuardianSigVerifier, + bicf.argInterceptorFactory.CoreComponents.TxVersionChecker(), bicf.maxTxNonceDeltaAllowed, ) if err != nil { diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 392522642dc..5c360a8a88a 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -205,7 +205,7 @@ func (txProc *baseTxProcessor) processIfTxErrorCrossShard(tx *transaction.Transa } func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, account state.UserAccountHandler) error { - if !account.IsFrozen() { + if !check.IfNil(account) && !account.IsFrozen() { return nil } diff --git a/process/transaction/shardProcess_test.go b/process/transaction/shardProcess_test.go index c45df730409..857c0fdc48e 100644 --- a/process/transaction/shardProcess_test.go +++ b/process/transaction/shardProcess_test.go @@ -21,9 +21,10 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" - stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" + stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" "github.com/ElrondNetwork/elrond-go/vm" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" @@ -88,6 +89,8 @@ func createArgsForTxProcessor() txproc.ArgsNewTxProcessor { ArgsParser: &mock.ArgumentParserMock{}, ScrForwarder: &mock.IntermediateTransactionHandlerMock{}, EpochNotifier: &epochNotifier.EpochNotifierStub{}, + GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return args } diff --git a/testscommon/TxVersionCheckerStub.go b/testscommon/TxVersionCheckerStub.go new file mode 100644 index 00000000000..1f7b9089efb --- /dev/null +++ b/testscommon/TxVersionCheckerStub.go @@ -0,0 +1,41 @@ +package testscommon + +import ( + "github.com/ElrondNetwork/elrond-go-core/data/transaction" +) + +// TxVersionCheckerStub - +type TxVersionCheckerStub struct { + IsSignedWithHashCalled func(tx *transaction.Transaction) bool + IsGuardedTransactionCalled func(tx *transaction.Transaction) bool + CheckTxVersionCalled func(tx *transaction.Transaction) error +} + +// IsSignedWithHash will return true if transaction is signed with hash +func (tvcs *TxVersionCheckerStub) IsSignedWithHash(tx *transaction.Transaction) bool { + if tvcs.IsSignedWithHashCalled != nil { + return tvcs.IsSignedWithHashCalled(tx) + } + return false +} + +// IsGuardedTransaction will return true if transaction also holds a guardian signature +func (tvcs *TxVersionCheckerStub) IsGuardedTransaction(tx *transaction.Transaction) bool { + if tvcs.IsGuardedTransactionCalled != nil { + return tvcs.IsGuardedTransactionCalled(tx) + } + return false +} + +// CheckTxVersion will check transaction version +func (tvcs *TxVersionCheckerStub) CheckTxVersion(tx *transaction.Transaction) error { + if tvcs.CheckTxVersionCalled != nil { + return tvcs.CheckTxVersionCalled(tx) + } + return nil +} + +// IsInterfaceNil returns true if there is no value under the interface +func (tvcs *TxVersionCheckerStub) IsInterfaceNil() bool { + return tvcs == nil +} diff --git a/update/factory/fullSyncInterceptors.go b/update/factory/fullSyncInterceptors.go index a1ba2a0b7a7..ce54cbaf7ef 100644 --- a/update/factory/fullSyncInterceptors.go +++ b/update/factory/fullSyncInterceptors.go @@ -488,6 +488,7 @@ func (ficf *fullSyncInterceptorsContainerFactory) createOneTxInterceptor(topic s ficf.whiteListHandler, ficf.addressPubkeyConv, ficf.argInterceptorFactory.GuardianSigVerifier, + ficf.argInterceptorFactory.CoreComponents.TxVersionChecker(), ficf.maxTxNonceDeltaAllowed, ) if err != nil { From b9af8278a74238a3cd6285166e2e8b23b2e07e6c Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 5 May 2022 19:21:17 +0300 Subject: [PATCH 030/335] integrationTests, process: tests fixes --- integrationTests/testInitializer.go | 3 +++ process/transaction/metaProcess_test.go | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index c29f0526125..4d8f06e6ed9 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -62,6 +62,7 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/genesisMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/ElrondNetwork/elrond-go/trie" @@ -1049,6 +1050,8 @@ func CreateSimpleTxProcessor(accnts state.AccountsAdapter) process.TransactionPr ArgsParser: smartContract.NewArgumentParser(), ScrForwarder: &mock.IntermediateTransactionHandlerMock{}, EpochNotifier: forking.NewGenericEpochNotifier(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardianCheckerStub{}, } txProcessor, _ := txProc.NewTxProcessor(argsNewTxProcessor) diff --git a/process/transaction/metaProcess_test.go b/process/transaction/metaProcess_test.go index f6589c3396a..f5a9b5602bb 100644 --- a/process/transaction/metaProcess_test.go +++ b/process/transaction/metaProcess_test.go @@ -13,9 +13,10 @@ import ( txproc "github.com/ElrondNetwork/elrond-go/process/transaction" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" - stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" + stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/ElrondNetwork/elrond-vm-common/parsers" @@ -34,6 +35,8 @@ func createMockNewMetaTxArgs() txproc.ArgsNewMetaTxProcessor { EconomicsFee: createFreeTxFeeHandler(), ESDTEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, + GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return args } From f8f9ad5062daa04b8ab3e299be27263ae578ed78 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 16 May 2022 10:58:10 +0300 Subject: [PATCH 031/335] gomod: update elrond-go-core and elrond-vm-common versions --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index aabf5f90018..9f79bf1f418 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,10 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.1.34 - github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220408095449-e179fadf3449 + github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220428101223-76d1bd8b4ed4 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.6 - github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c + github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220516075228-1771b35bd311 github.com/ElrondNetwork/notifier-go v1.0.3 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta diff --git a/go.sum b/go.sum index 06390664cf1..2edf85d311b 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.9/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.10/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220408095449-e179fadf3449 h1:szcj1iYXH/r9CFWQvOM+fPFoE0vlld5ckxx57j06qYA= -github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220408095449-e179fadf3449/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220428101223-76d1bd8b4ed4 h1:FvWVq5yVhUrsYFG4B1co2x/cJzJG27v62zrKGAcARto= +github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220428101223-76d1bd8b4ed4/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= @@ -43,8 +43,9 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.6 h1:FGbO2C/s9cfNHag9jaKSB+sjuWUo github.com/ElrondNetwork/elrond-go-logger v1.0.6/go.mod h1:cBfgx0ST/CJx8jrxJSC5aiSrvkGzcnF7sK06RD8mFxQ= github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= -github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c h1:BpzHwmC0haU60hP/qkWyWlGm7Ts1rI+If/1mF0kFToo= github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c/go.mod h1:XQoxE2MmrhVpyBMghK3fWvnRAw/iirc0KPtbKAOEPBM= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220516075228-1771b35bd311 h1:DAiGFSeHLynl7Br/u3BtryNoeWIWqJXBGF2+6QQ5/a0= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220516075228-1771b35bd311/go.mod h1:3JwKIWi7jdTWxJfXiSrY5Ts73qooRBxfvk8MeoEyvSw= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= github.com/ElrondNetwork/notifier-go v1.0.3/go.mod h1:GOv7j2o90e/GVmmBddWwyfJZ/JW4V4pvyXIpukd6FfY= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= From faf4143242e83160eb13ac74be5699946b06d41e Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 17 May 2022 18:25:31 +0300 Subject: [PATCH 032/335] factory, process, node: move guardedAccountHandler to bootstrap components, some fixes after review --- factory/apiResolverFactory.go | 108 +++++++++--------- factory/blockProcessorCreator.go | 8 +- factory/bootstrapComponents.go | 14 ++- factory/bootstrapComponentsHandler.go | 14 ++- factory/bootstrapComponents_test.go | 26 ++--- factory/coreComponents.go | 8 -- factory/coreComponentsHandler.go | 12 -- factory/interface.go | 2 +- factory/mock/coreComponentsMock.go | 6 - genesis/mock/userAccountMock.go | 2 +- go.mod | 4 +- go.sum | 8 +- integrationTests/mock/coreComponentsStub.go | 6 - integrationTests/testProcessorNode.go | 42 +++---- node/mock/factory/coreComponentsStub.go | 6 - node/node.go | 4 + node/node_test.go | 40 +++---- process/guardedtx/guardedTxVerifier.go | 4 +- process/guardedtx/guardedTxVerifier_test.go | 8 +- process/guardian/guardedAccount.go | 34 +++--- process/transaction/baseProcess.go | 19 ++- process/transaction/metaProcess.go | 14 --- process/transaction/shardProcess.go | 14 --- .../bootstrapComponentsStub.go | 6 + 24 files changed, 196 insertions(+), 213 deletions(-) diff --git a/factory/apiResolverFactory.go b/factory/apiResolverFactory.go index 37cd11c996c..1de16e598ea 100644 --- a/factory/apiResolverFactory.go +++ b/factory/apiResolverFactory.go @@ -50,34 +50,36 @@ type ApiResolverArgs struct { } type scQueryServiceArgs struct { - generalConfig *config.Config - epochConfig *config.EpochConfig - coreComponents CoreComponentsHolder - stateComponents StateComponentsHolder - dataComponents DataComponentsHolder - processComponents ProcessComponentsHolder - gasScheduleNotifier core.GasScheduleNotifier - messageSigVerifier vm.MessageSignVerifier - systemSCConfig *config.SystemSmartContractsConfig - bootstrapper process.Bootstrapper - allowVMQueriesChan chan struct{} - workingDir string + generalConfig *config.Config + epochConfig *config.EpochConfig + coreComponents CoreComponentsHolder + stateComponents StateComponentsHolder + dataComponents DataComponentsHolder + processComponents ProcessComponentsHolder + gasScheduleNotifier core.GasScheduleNotifier + messageSigVerifier vm.MessageSignVerifier + systemSCConfig *config.SystemSmartContractsConfig + bootstrapper process.Bootstrapper + guardedAccountHandler process.GuardedAccountHandler + allowVMQueriesChan chan struct{} + workingDir string } type scQueryElementArgs struct { - generalConfig *config.Config - epochConfig *config.EpochConfig - coreComponents CoreComponentsHolder - stateComponents StateComponentsHolder - dataComponents DataComponentsHolder - processComponents ProcessComponentsHolder - gasScheduleNotifier core.GasScheduleNotifier - messageSigVerifier vm.MessageSignVerifier - systemSCConfig *config.SystemSmartContractsConfig - bootstrapper process.Bootstrapper - allowVMQueriesChan chan struct{} - workingDir string - index int + generalConfig *config.Config + epochConfig *config.EpochConfig + coreComponents CoreComponentsHolder + stateComponents StateComponentsHolder + dataComponents DataComponentsHolder + processComponents ProcessComponentsHolder + gasScheduleNotifier core.GasScheduleNotifier + messageSigVerifier vm.MessageSignVerifier + systemSCConfig *config.SystemSmartContractsConfig + bootstrapper process.Bootstrapper + guardedAccountHandler process.GuardedAccountHandler + allowVMQueriesChan chan struct{} + workingDir string + index int } // CreateApiResolver is able to create an ApiResolver instance that will solve the REST API requests through the node facade @@ -85,18 +87,19 @@ 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, - gasScheduleNotifier: args.GasScheduleNotifier, - messageSigVerifier: args.CryptoComponents.MessageSignVerifier(), - systemSCConfig: args.Configs.SystemSCConfig, - bootstrapper: args.Bootstrapper, - allowVMQueriesChan: args.AllowVMQueriesChan, - workingDir: apiWorkingDir, + generalConfig: args.Configs.GeneralConfig, + epochConfig: args.Configs.EpochConfig, + coreComponents: args.CoreComponents, + dataComponents: args.DataComponents, + stateComponents: args.StateComponents, + processComponents: args.ProcessComponents, + gasScheduleNotifier: args.GasScheduleNotifier, + messageSigVerifier: args.CryptoComponents.MessageSignVerifier(), + systemSCConfig: args.Configs.SystemSCConfig, + bootstrapper: args.Bootstrapper, + guardedAccountHandler: args.BootstrapComponents.GuardedAccountHandler(), + allowVMQueriesChan: args.AllowVMQueriesChan, + workingDir: apiWorkingDir, } scQueryService, err := createScQueryService(argsSCQuery) @@ -110,7 +113,7 @@ func CreateApiResolver(args *ApiResolverArgs) (facade.ApiResolver, error) { args.StateComponents.AccountsAdapterAPI(), args.BootstrapComponents.ShardCoordinator(), args.CoreComponents.EpochNotifier(), - args.CoreComponents.GuardedAccountHandler(), + args.BootstrapComponents.GuardedAccountHandler(), args.Configs.EpochConfig.EnableEpochs.ESDTMultiTransferEnableEpoch, args.Configs.EpochConfig.EnableEpochs.GlobalMintBurnDisableEpoch, args.Configs.EpochConfig.EnableEpochs.ESDTTransferRoleEnableEpoch, @@ -221,19 +224,20 @@ func createScQueryService( } argsQueryElem := &scQueryElementArgs{ - generalConfig: args.generalConfig, - epochConfig: args.epochConfig, - coreComponents: args.coreComponents, - dataComponents: args.dataComponents, - stateComponents: args.stateComponents, - processComponents: args.processComponents, - gasScheduleNotifier: args.gasScheduleNotifier, - messageSigVerifier: args.messageSigVerifier, - systemSCConfig: args.systemSCConfig, - workingDir: args.workingDir, - bootstrapper: args.bootstrapper, - allowVMQueriesChan: args.allowVMQueriesChan, - index: 0, + generalConfig: args.generalConfig, + epochConfig: args.epochConfig, + coreComponents: args.coreComponents, + dataComponents: args.dataComponents, + stateComponents: args.stateComponents, + processComponents: args.processComponents, + gasScheduleNotifier: args.gasScheduleNotifier, + messageSigVerifier: args.messageSigVerifier, + systemSCConfig: args.systemSCConfig, + workingDir: args.workingDir, + bootstrapper: args.bootstrapper, + guardedAccountHandler: args.guardedAccountHandler, + allowVMQueriesChan: args.allowVMQueriesChan, + index: 0, } var err error @@ -270,7 +274,7 @@ func createScQueryElement( args.stateComponents.AccountsAdapterAPI(), args.processComponents.ShardCoordinator(), args.coreComponents.EpochNotifier(), - args.coreComponents.GuardedAccountHandler(), + args.guardedAccountHandler, args.epochConfig.EnableEpochs.ESDTMultiTransferEnableEpoch, args.epochConfig.EnableEpochs.GlobalMintBurnDisableEpoch, args.epochConfig.EnableEpochs.ESDTTransferRoleEnableEpoch, diff --git a/factory/blockProcessorCreator.go b/factory/blockProcessorCreator.go index 6ef1f55a764..1cd9e00f398 100644 --- a/factory/blockProcessorCreator.go +++ b/factory/blockProcessorCreator.go @@ -261,7 +261,7 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( EpochNotifier: pcf.epochNotifier, RelayedTxV2EnableEpoch: enableEpochs.RelayedTransactionsV2EnableEpoch, AddFailedRelayedToInvalidDisableEpoch: enableEpochs.AddFailedRelayedTxToInvalidMBsDisableEpoch, - GuardianChecker: pcf.coreData.GuardedAccountHandler(), + GuardianChecker: pcf.bootstrapComponents.GuardedAccountHandler(), TxVersionChecker: pcf.coreData.TxVersionChecker(), } transactionProcessor, err := transaction.NewTxProcessor(argsNewTxProcessor) @@ -557,7 +557,7 @@ func (pcf *processComponentsFactory) newMetaBlockProcessor( ESDTEnableEpoch: pcf.epochConfig.EnableEpochs.ESDTEnableEpoch, BuiltInFunctionOnMetachainEnableEpoch: pcf.epochConfig.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, EpochNotifier: pcf.epochNotifier, - GuardianChecker: pcf.coreData.GuardedAccountHandler(), + GuardianChecker: pcf.bootstrapComponents.GuardedAccountHandler(), TxVersionChecker: pcf.coreData.TxVersionChecker(), } @@ -1031,7 +1031,7 @@ func (pcf *processComponentsFactory) createMetaTxSimulatorProcessor( BuiltInFunctionOnMetachainEnableEpoch: pcf.epochConfig.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, EpochNotifier: pcf.epochNotifier, TxVersionChecker: pcf.coreData.TxVersionChecker(), - GuardianChecker: pcf.coreData.GuardedAccountHandler(), + GuardianChecker: pcf.bootstrapComponents.GuardedAccountHandler(), } txSimulatorProcessorArgs.TransactionProcessor, err = transaction.NewMetaTxProcessor(argsNewMetaTx) @@ -1156,7 +1156,7 @@ func (pcf *processComponentsFactory) createBuiltInFunctionContainer( GlobalMintBurnDisableEpoch: pcf.epochConfig.EnableEpochs.GlobalMintBurnDisableEpoch, ESDTTransferMetaEnableEpoch: pcf.epochConfig.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, OptimizeNFTStoreEnableEpoch: pcf.epochConfig.EnableEpochs.OptimizeNFTStoreEnableEpoch, - GuardedAccountHandler: pcf.coreData.GuardedAccountHandler(), + GuardedAccountHandler: pcf.bootstrapComponents.GuardedAccountHandler(), } return builtInFunctions.CreateBuiltInFuncContainerAndNFTStorageHandler(argsBuiltIn) diff --git a/factory/bootstrapComponents.go b/factory/bootstrapComponents.go index 4acede9ddb1..582eb26c338 100644 --- a/factory/bootstrapComponents.go +++ b/factory/bootstrapComponents.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/factory/block" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/guardedtx" + "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/headerCheck" "github.com/ElrondNetwork/elrond-go/process/roundActivation" "github.com/ElrondNetwork/elrond-go/process/smartContract" @@ -59,6 +60,7 @@ type bootstrapComponents struct { versionedHeaderFactory factory.VersionedHeaderFactory headerIntegrityVerifier factory.HeaderIntegrityVerifierHandler roundActivationHandler process.RoundActivationHandler + guardedAccountHandler process.GuardedAccountHandler guardianSigVerifier process.GuardianSigVerifier } @@ -162,7 +164,12 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() - guardianSigVerifier, err := bcf.newGuardianSigVerifier() + guardedAccountHandler, err := guardian.NewGuardedAccount(bcf.coreComponents.InternalMarshalizer(), bcf.coreComponents.EpochNotifier()) + if err != nil { + return nil, err + } + + guardianSigVerifier, err := bcf.newGuardianSigVerifier(guardedAccountHandler) if err != nil { return nil, err } @@ -254,13 +261,14 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { versionedHeaderFactory: versionedHeaderFactory, roundActivationHandler: roundActivationHandler, guardianSigVerifier: guardianSigVerifier, + guardedAccountHandler: guardedAccountHandler, }, nil } -func (bcf *bootstrapComponentsFactory) newGuardianSigVerifier() (process.GuardianSigVerifier, error) { +func (bcf *bootstrapComponentsFactory) newGuardianSigVerifier(guardedAccountHandler process.GuardedAccountHandler) (process.GuardianSigVerifier, error) { argGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ SigVerifier: bcf.cryptoComponents.TxSingleSigner(), - GuardianChecker: bcf.coreComponents.GuardedAccountHandler(), + GuardianChecker: guardedAccountHandler, PubKeyConverter: bcf.coreComponents.AddressPubKeyConverter(), Marshaller: bcf.coreComponents.InternalMarshalizer(), KeyGen: bcf.cryptoComponents.TxSignKeyGen(), diff --git a/factory/bootstrapComponentsHandler.go b/factory/bootstrapComponentsHandler.go index 990d5e9ee7e..e7e7728e729 100644 --- a/factory/bootstrapComponentsHandler.go +++ b/factory/bootstrapComponentsHandler.go @@ -122,13 +122,25 @@ func (mbf *managedBootstrapComponents) GuardianSigVerifier() process.GuardianSig mbf.mutBootstrapComponents.RLock() defer mbf.mutBootstrapComponents.RUnlock() - if mbf.guardianSigVerifier == nil { + if mbf.bootstrapComponents == nil { return nil } return mbf.bootstrapComponents.guardianSigVerifier } +// GuardedAccountHandler returns the guarded account handler +func (mbf *managedBootstrapComponents) GuardedAccountHandler() process.GuardedAccountHandler { + mbf.mutBootstrapComponents.RLock() + defer mbf.mutBootstrapComponents.RUnlock() + + if mbf.bootstrapComponents == nil { + return nil + } + + return mbf.bootstrapComponents.guardedAccountHandler +} + // IsInterfaceNil returns true if the underlying object is nil func (mbf *managedBootstrapComponents) IsInterfaceNil() bool { return mbf == nil diff --git a/factory/bootstrapComponents_test.go b/factory/bootstrapComponents_test.go index 354371153c7..aeca1e591fd 100644 --- a/factory/bootstrapComponents_test.go +++ b/factory/bootstrapComponents_test.go @@ -12,7 +12,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" "github.com/stretchr/testify/require" @@ -161,18 +160,17 @@ func getDefaultCoreComponents() *mock.CoreComponentsMock { MinTransactionVersionCalled: func() uint32 { return 1 }, - AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, - WatchdogTimer: &testscommon.WatchdogMock{}, - AlarmSch: &testscommon.AlarmSchedulerStub{}, - NtpSyncTimer: &testscommon.SyncTimerStub{}, - RoundHandlerField: &testscommon.RoundHandlerMock{}, - EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, - RatingsConfig: &testscommon.RatingsInfoMock{}, - RatingHandler: &testscommon.RaterMock{}, - NodesConfig: &testscommon.NodesSetupStub{}, - StartTime: time.Time{}, - NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, - EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, - GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, + AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, + WatchdogTimer: &testscommon.WatchdogMock{}, + AlarmSch: &testscommon.AlarmSchedulerStub{}, + NtpSyncTimer: &testscommon.SyncTimerStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + RatingsConfig: &testscommon.RatingsInfoMock{}, + RatingHandler: &testscommon.RaterMock{}, + NodesConfig: &testscommon.NodesSetupStub{}, + StartTime: time.Time{}, + NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, } } diff --git a/factory/coreComponents.go b/factory/coreComponents.go index c5e9b2c5b4c..0c836be7c42 100644 --- a/factory/coreComponents.go +++ b/factory/coreComponents.go @@ -32,7 +32,6 @@ import ( "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/economics" - "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/rating" "github.com/ElrondNetwork/elrond-go/process/smartContract" "github.com/ElrondNetwork/elrond-go/sharding" @@ -101,7 +100,6 @@ type coreComponents struct { nodeTypeProvider core.NodeTypeProviderHandler encodedAddressLen uint32 arwenChangeLocker common.Locker - guardedAccountHandler process.GuardedAccountHandler } // NewCoreComponentsFactory initializes the factory which is responsible to creating core components @@ -326,11 +324,6 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { // set as observer at first - it will be updated when creating the nodes coordinator nodeTypeProvider := nodetype.NewNodeTypeProvider(core.NodeTypeObserver) - guardedAccountHandler, err := guardian.NewGuardedAccount(internalMarshalizer, epochNotifier) - if err != nil { - return nil, err - } - return &coreComponents{ hasher: hasher, txSignHasher: txSignHasher, @@ -363,7 +356,6 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { encodedAddressLen: computeEncodedAddressLen(addressPubkeyConverter), nodeTypeProvider: nodeTypeProvider, arwenChangeLocker: arwenChangeLocker, - guardedAccountHandler: guardedAccountHandler, }, nil } diff --git a/factory/coreComponentsHandler.go b/factory/coreComponentsHandler.go index d1f7ed28e07..038879a0079 100644 --- a/factory/coreComponentsHandler.go +++ b/factory/coreComponentsHandler.go @@ -550,18 +550,6 @@ func (mcc *managedCoreComponents) ArwenChangeLocker() common.Locker { return mcc.coreComponents.arwenChangeLocker } -// GuardedAccountHandler returns the guarded account handler -func (mcc *managedCoreComponents) GuardedAccountHandler() process.GuardedAccountHandler { - mcc.mutCoreComponents.RLock() - defer mcc.mutCoreComponents.RUnlock() - - if mcc.coreComponents == nil { - return nil - } - - return mcc.coreComponents.guardedAccountHandler -} - // IsInterfaceNil returns true if there is no value under the interface func (mcc *managedCoreComponents) IsInterfaceNil() bool { return mcc == nil diff --git a/factory/interface.go b/factory/interface.go index db1d75be647..2a7ed5a52dd 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -127,7 +127,6 @@ type CoreComponentsHolder interface { EncodedAddressLen() uint32 NodeTypeProvider() core.NodeTypeProviderHandler ArwenChangeLocker() common.Locker - GuardedAccountHandler() process.GuardedAccountHandler IsInterfaceNil() bool } @@ -427,6 +426,7 @@ type BootstrapComponentsHolder interface { HeaderVersionHandler() factory.HeaderVersionHandler HeaderIntegrityVerifier() factory.HeaderIntegrityVerifierHandler GuardianSigVerifier() process.GuardianSigVerifier + GuardedAccountHandler() process.GuardedAccountHandler IsInterfaceNil() bool } diff --git a/factory/mock/coreComponentsMock.go b/factory/mock/coreComponentsMock.go index 61ff3b1f069..f6216b2bcb7 100644 --- a/factory/mock/coreComponentsMock.go +++ b/factory/mock/coreComponentsMock.go @@ -55,7 +55,6 @@ type CoreComponentsMock struct { StartTime time.Time NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker - GuardedAccountHandlerField process.GuardedAccountHandler } // InternalMarshalizer - @@ -242,11 +241,6 @@ func (ccm *CoreComponentsMock) ArwenChangeLocker() common.Locker { return ccm.ArwenChangeLockerInternal } -// GuardedAccountHandler - -func (ccm *CoreComponentsMock) GuardedAccountHandler() process.GuardedAccountHandler { - return ccm.GuardedAccountHandlerField -} - // IsInterfaceNil - func (ccm *CoreComponentsMock) IsInterfaceNil() bool { return ccm == nil diff --git a/genesis/mock/userAccountMock.go b/genesis/mock/userAccountMock.go index ac5c20e9e30..e724dbe4ca7 100644 --- a/genesis/mock/userAccountMock.go +++ b/genesis/mock/userAccountMock.go @@ -143,4 +143,4 @@ func (uam *UserAccountMock) GetUserName() []byte { // IsFrozen - func (uam *UserAccountMock) IsFrozen() bool { return false -} \ No newline at end of file +} diff --git a/go.mod b/go.mod index 9f79bf1f418..f7f62a90f1e 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,10 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.1.34 - github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220428101223-76d1bd8b4ed4 + github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.6 - github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220516075228-1771b35bd311 + github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220517132451-65bc142a2e5f github.com/ElrondNetwork/notifier-go v1.0.3 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta diff --git a/go.sum b/go.sum index 2edf85d311b..af22365ed1a 100644 --- a/go.sum +++ b/go.sum @@ -32,8 +32,8 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.9/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.10/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220428101223-76d1bd8b4ed4 h1:FvWVq5yVhUrsYFG4B1co2x/cJzJG27v62zrKGAcARto= -github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220428101223-76d1bd8b4ed4/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f h1:GXrCspczDctP5Jd3nHSFwUu2KzKDJea7H6RAX0m0hHc= +github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= @@ -44,8 +44,8 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.6/go.mod h1:cBfgx0ST/CJx8jrxJSC5a github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c/go.mod h1:XQoxE2MmrhVpyBMghK3fWvnRAw/iirc0KPtbKAOEPBM= -github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220516075228-1771b35bd311 h1:DAiGFSeHLynl7Br/u3BtryNoeWIWqJXBGF2+6QQ5/a0= -github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220516075228-1771b35bd311/go.mod h1:3JwKIWi7jdTWxJfXiSrY5Ts73qooRBxfvk8MeoEyvSw= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220517132451-65bc142a2e5f h1:kwSsEEkQ8Y4LEsS0qAfGh3oTVV5hPZ5nOhIzDuhfHUg= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220517132451-65bc142a2e5f/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= github.com/ElrondNetwork/notifier-go v1.0.3/go.mod h1:GOv7j2o90e/GVmmBddWwyfJZ/JW4V4pvyXIpukd6FfY= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= diff --git a/integrationTests/mock/coreComponentsStub.go b/integrationTests/mock/coreComponentsStub.go index 2644ecda178..43acd50c18c 100644 --- a/integrationTests/mock/coreComponentsStub.go +++ b/integrationTests/mock/coreComponentsStub.go @@ -51,7 +51,6 @@ type CoreComponentsStub struct { TxVersionCheckField process.TxVersionCheckerHandler NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker - GuardedAccountHandlerField process.GuardedAccountHandler } // Create - @@ -242,11 +241,6 @@ func (ccs *CoreComponentsStub) ArwenChangeLocker() common.Locker { return ccs.ArwenChangeLockerInternal } -// GuardedAccountHandler - -func (ccs *CoreComponentsStub) GuardedAccountHandler() process.GuardedAccountHandler { - return ccs.GuardedAccountHandlerField -} - // String - func (ccs *CoreComponentsStub) String() string { return "CoreComponentsStub" diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 22c51258ea8..14c7de0aae3 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -2929,20 +2929,19 @@ func GetDefaultCoreComponents() *mock.CoreComponentsStub { MinTransactionVersionCalled: func() uint32 { return 1 }, - StatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, - WatchdogField: &testscommon.WatchdogMock{}, - AlarmSchedulerField: &testscommon.AlarmSchedulerStub{}, - SyncTimerField: &testscommon.SyncTimerStub{}, - RoundHandlerField: &testscommon.RoundHandlerMock{}, - EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, - RatingsDataField: &testscommon.RatingsInfoMock{}, - RaterField: &testscommon.RaterMock{}, - GenesisNodesSetupField: &testscommon.NodesSetupStub{}, - GenesisTimeField: time.Time{}, - EpochNotifierField: &epochNotifier.EpochNotifierStub{}, - RoundNotifierField: &processMock.RoundNotifierStub{}, - TxVersionCheckField: versioning.NewTxVersionChecker(MinTransactionVersion), - GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, + StatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + WatchdogField: &testscommon.WatchdogMock{}, + AlarmSchedulerField: &testscommon.AlarmSchedulerStub{}, + SyncTimerField: &testscommon.SyncTimerStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, + RatingsDataField: &testscommon.RatingsInfoMock{}, + RaterField: &testscommon.RaterMock{}, + GenesisNodesSetupField: &testscommon.NodesSetupStub{}, + GenesisTimeField: time.Time{}, + EpochNotifierField: &epochNotifier.EpochNotifierStub{}, + RoundNotifierField: &processMock.RoundNotifierStub{}, + TxVersionCheckField: versioning.NewTxVersionChecker(MinTransactionVersion), } } @@ -3067,13 +3066,14 @@ func getDefaultBootstrapComponents(shardCoordinator sharding.Coordinator) *mainF StorageManagers: map[string]common.StorageManager{"0": &testscommon.StorageManagerStub{}}, BootstrapCalled: nil, }, - BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, - NodeRole: "", - ShCoordinator: shardCoordinator, - HdrVersionHandler: headerVersionHandler, - VersionedHdrFactory: versionedHeaderFactory, - HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, - GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, + BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, + NodeRole: "", + ShCoordinator: shardCoordinator, + HdrVersionHandler: headerVersionHandler, + VersionedHdrFactory: versionedHeaderFactory, + HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, + GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, + GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, } } diff --git a/node/mock/factory/coreComponentsStub.go b/node/mock/factory/coreComponentsStub.go index 9a80f0f389d..8704fdc4f30 100644 --- a/node/mock/factory/coreComponentsStub.go +++ b/node/mock/factory/coreComponentsStub.go @@ -51,7 +51,6 @@ type CoreComponentsMock struct { StartTime time.Time NodeTypeProviderField core.NodeTypeProviderHandler ArwenChangeLockerInternal common.Locker - GuardedAccountHandlerField process.GuardedAccountHandler } // Create - @@ -242,11 +241,6 @@ func (ccm *CoreComponentsMock) ArwenChangeLocker() common.Locker { return ccm.ArwenChangeLockerInternal } -// GuardedAccountHandler - -func (ccm *CoreComponentsMock) GuardedAccountHandler() process.GuardedAccountHandler { - return ccm.GuardedAccountHandlerField -} - // String - func (ccm *CoreComponentsMock) String() string { return "CoreComponentsMock" diff --git a/node/node.go b/node/node.go index 306187a318a..f67153825cf 100644 --- a/node/node.go +++ b/node/node.go @@ -798,6 +798,10 @@ func (n *Node) setTxGuardianData(guardian string, guardianSigHex string, tx *tra if err != nil { return errors.New("could not fetch guardian signature bytes") } + if !tx.HasOptionGuardianSet() { + return errors.New("transaction has guardian but guardian option not set") + } + tx.GuardianAddr = guardianAddress tx.GuardianSignature = guardianSigBytes diff --git a/node/node_test.go b/node/node_test.go index ad7bdeec66c..02a6a38a14f 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -2020,7 +2020,7 @@ func TestCreateTransaction_OkValsShouldWork(t *testing.T) { tx, txHash, err := n.CreateTransaction( nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, - signature, coreComponents.ChainID(), coreComponents.MinTransactionVersion(), 0,"", "", + signature, coreComponents.ChainID(), coreComponents.MinTransactionVersion(), 0, "", "", ) assert.NotNil(t, tx) assert.Equal(t, expectedHash, txHash) @@ -3505,20 +3505,19 @@ func getDefaultCoreComponents() *nodeMockFactory.CoreComponentsMock { MinTransactionVersionCalled: func() uint32 { return 1 }, - AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, - WDTimer: &testscommon.WatchdogMock{}, - Alarm: &testscommon.AlarmSchedulerStub{}, - NtpTimer: &testscommon.SyncTimerStub{}, - RoundHandlerField: &testscommon.RoundHandlerMock{}, - EconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, - APIEconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, - RatingsConfig: &testscommon.RatingsInfoMock{}, - RatingHandler: &testscommon.RaterMock{}, - NodesConfig: &testscommon.NodesSetupStub{}, - StartTime: time.Time{}, - EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, - TxVersionCheckHandler: versioning.NewTxVersionChecker(0), - GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, + AppStatusHdl: &statusHandler.AppStatusHandlerStub{}, + WDTimer: &testscommon.WatchdogMock{}, + Alarm: &testscommon.AlarmSchedulerStub{}, + NtpTimer: &testscommon.SyncTimerStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, + APIEconomicsHandler: &economicsmocks.EconomicsHandlerMock{}, + RatingsConfig: &testscommon.RatingsInfoMock{}, + RatingHandler: &testscommon.RaterMock{}, + NodesConfig: &testscommon.NodesSetupStub{}, + StartTime: time.Time{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + TxVersionCheckHandler: versioning.NewTxVersionChecker(0), } } @@ -3574,10 +3573,11 @@ func getDefaultBootstrapComponents() *mainFactoryMocks.BootstrapComponentsStub { StorageManagers: map[string]common.StorageManager{"0": &testscommon.StorageManagerStub{}}, BootstrapCalled: nil, }, - BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, - NodeRole: "", - ShCoordinator: &mock.ShardCoordinatorMock{}, - HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, - GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, + BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, + NodeRole: "", + ShCoordinator: &mock.ShardCoordinatorMock{}, + HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, + GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, + GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, } } diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index be91a3bea3c..795d192b5ae 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -71,8 +71,8 @@ func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAc return process.ErrNilTransaction } - guardedTxHandler, castOK := txHandler.(data.GuardedTransactionHandler) - if !castOK { + guardedTxHandler, ok := txHandler.(data.GuardedTransactionHandler) + if !ok { return process.ErrWrongTypeAssertion } diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 6f77f32455d..9eb3d7300d0 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -39,26 +39,26 @@ func TestNewGuardedTxSigVerifier(t *testing.T) { changedArgs.SigVerifier = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilSingleSigner, err) - require.Nil(t, gtxSigVerifier) + require.True(t, check.IfNil(gtxSigVerifier)) }) t.Run("nil guardian checker", func(t *testing.T) { changedArgs := *&args changedArgs.GuardianChecker = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilGuardianChecker, err) - require.Nil(t, gtxSigVerifier) + require.True(t, check.IfNil(gtxSigVerifier)) }) t.Run("nil public key converter", func(t *testing.T) { changedArgs := *&args changedArgs.PubKeyConverter = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilPubkeyConverter, err) - require.Nil(t, gtxSigVerifier) + require.True(t, check.IfNil(gtxSigVerifier)) }) t.Run("ok params", func(t *testing.T) { gtxSigVerifier, err := NewGuardedTxSigVerifier(args) require.Nil(t, err) - require.NotNil(t, gtxSigVerifier) + require.False(t, check.IfNil(gtxSigVerifier)) }) } diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 56197125707..e9ad500296b 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -56,11 +56,11 @@ func (agc *guardedAccount) GetActiveGuardian(uah vmcommon.UserAccountHandler) ([ if err != nil { return nil, err } - if len(configuredGuardians.Data) == 0 { + if len(configuredGuardians.Slice) == 0 { return nil, process.ErrAccountHasNoGuardianSet } - guardian, err := agc.getActiveGuardian(*configuredGuardians) + guardian, err := agc.getActiveGuardian(configuredGuardians) if err != nil { return nil, err } @@ -88,7 +88,7 @@ func (agc *guardedAccount) setAccountGuardian(uah state.UserAccountHandler, guar if err != nil { return err } - newGuardians, err := agc.updateGuardians(guardian, *configuredGuardians) + newGuardians, err := agc.updateGuardians(guardian, configuredGuardians) if err != nil { return err } @@ -98,15 +98,15 @@ func (agc *guardedAccount) setAccountGuardian(uah state.UserAccountHandler, guar return process.ErrWrongTypeAssertion } - return agc.saveAccountGuardians(accHandler, *newGuardians) + return agc.saveAccountGuardians(accHandler, newGuardians) } -func (agc *guardedAccount) updateGuardians(newGuardian *guardians.Guardian, accountGuardians guardians.Guardians) (*guardians.Guardians, error) { - numSetGuardians := len(accountGuardians.Data) +func (agc *guardedAccount) updateGuardians(newGuardian *guardians.Guardian, accountGuardians *guardians.Guardians) (*guardians.Guardians, error) { + numSetGuardians := len(accountGuardians.Slice) if numSetGuardians == 0 { - accountGuardians.Data = append(accountGuardians.Data, newGuardian) - return &accountGuardians, nil + accountGuardians.Slice = append(accountGuardians.Slice, newGuardian) + return accountGuardians, nil } activeGuardian, err := agc.getActiveGuardian(accountGuardians) @@ -116,15 +116,15 @@ func (agc *guardedAccount) updateGuardians(newGuardian *guardians.Guardian, acco } if activeGuardian.Equal(newGuardian) { - accountGuardians.Data = []*guardians.Guardian{activeGuardian} + accountGuardians.Slice = []*guardians.Guardian{activeGuardian} } else { - accountGuardians.Data = []*guardians.Guardian{activeGuardian, newGuardian} + accountGuardians.Slice = []*guardians.Guardian{activeGuardian, newGuardian} } - return &accountGuardians, nil + return accountGuardians, nil } -func (agc *guardedAccount) saveAccountGuardians(account vmcommon.UserAccountHandler, accountGuardians guardians.Guardians) error { +func (agc *guardedAccount) saveAccountGuardians(account vmcommon.UserAccountHandler, accountGuardians *guardians.Guardians) error { marshalledData, err := agc.marshaller.Marshal(accountGuardians) if err != nil { return err @@ -139,7 +139,7 @@ func (agc *guardedAccount) getConfiguredGuardians(uah state.UserAccountHandler) return nil, err } if len(guardiansMarshalled) == 0 { - return &guardians.Guardians{Data: make([]*guardians.Guardian, 0)}, nil + return &guardians.Guardians{Slice: make([]*guardians.Guardian, 0)}, nil } configuredGuardians := &guardians.Guardians{} @@ -151,12 +151,12 @@ func (agc *guardedAccount) getConfiguredGuardians(uah state.UserAccountHandler) return configuredGuardians, nil } -func (agc *guardedAccount) getActiveGuardian(gs guardians.Guardians) (*guardians.Guardian, error) { +func (agc *guardedAccount) getActiveGuardian(gs *guardians.Guardians) (*guardians.Guardian, error) { agc.mutEpoch.RLock() defer agc.mutEpoch.RUnlock() var selectedGuardian *guardians.Guardian - for i, guardian := range gs.Data { + for i, guardian := range gs.Slice { if guardian == nil { continue } @@ -164,13 +164,13 @@ func (agc *guardedAccount) getActiveGuardian(gs guardians.Guardians) (*guardians continue } if selectedGuardian == nil { - selectedGuardian = gs.Data[i] + selectedGuardian = gs.Slice[i] continue } // get the most recent active guardian if selectedGuardian.ActivationEpoch < guardian.ActivationEpoch { - selectedGuardian = gs.Data[i] + selectedGuardian = gs.Slice[i] } } diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 5c360a8a88a..b16acb35170 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -204,8 +204,25 @@ func (txProc *baseTxProcessor) processIfTxErrorCrossShard(tx *transaction.Transa return nil } +// VerifyTransaction verifies the account states in respect with the transaction data +func (txProc *baseTxProcessor) VerifyTransaction(tx *transaction.Transaction) error { + if check.IfNil(tx) { + return process.ErrNilTransaction + } + + senderAccount, receiverAccount, err := txProc.getAccounts(tx.SndAddr, tx.RcvAddr) + if err != nil { + return err + } + + return txProc.checkTxValues(tx, senderAccount, receiverAccount, false) +} + func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, account state.UserAccountHandler) error { - if !check.IfNil(account) && !account.IsFrozen() { + if check.IfNil(account) { + return nil + } + if !account.IsFrozen() { return nil } diff --git a/process/transaction/metaProcess.go b/process/transaction/metaProcess.go index 5b2d1ac9a11..4e68a71f7ac 100644 --- a/process/transaction/metaProcess.go +++ b/process/transaction/metaProcess.go @@ -161,20 +161,6 @@ func (txProc *metaTxProcessor) ProcessTransaction(tx *transaction.Transaction) ( return vmcommon.UserError, nil } -// VerifyTransaction verifies the account states in respect with the transaction data -func (txProc *metaTxProcessor) VerifyTransaction(tx *transaction.Transaction) error { - if check.IfNil(tx) { - return process.ErrNilTransaction - } - - senderAccount, receiverAccount, err := txProc.getAccounts(tx.SndAddr, tx.RcvAddr) - if err != nil { - return err - } - - return txProc.checkTxValues(tx, senderAccount, receiverAccount, false) -} - func (txProc *metaTxProcessor) processSCDeployment( tx *transaction.Transaction, adrSrc []byte, diff --git a/process/transaction/shardProcess.go b/process/transaction/shardProcess.go index e5d6307def6..82ccecf789c 100644 --- a/process/transaction/shardProcess.go +++ b/process/transaction/shardProcess.go @@ -246,20 +246,6 @@ func (txProc *txProcessor) ProcessTransaction(tx *transaction.Transaction) (vmco return vmcommon.UserError, txProc.executingFailedTransaction(tx, acntSnd, process.ErrWrongTransaction) } -// VerifyTransaction verifies the account states in respect with the transaction data -func (txProc *txProcessor) VerifyTransaction(tx *transaction.Transaction) error { - if check.IfNil(tx) { - return process.ErrNilTransaction - } - - senderAccount, receiverAccount, err := txProc.getAccounts(tx.SndAddr, tx.RcvAddr) - if err != nil { - return err - } - - return txProc.checkTxValues(tx, senderAccount, receiverAccount, false) -} - func (txProc *txProcessor) executeAfterFailedMoveBalanceTransaction( tx *transaction.Transaction, txError error, diff --git a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go index 26011e65769..9b87ffac668 100644 --- a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go +++ b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go @@ -18,6 +18,7 @@ type BootstrapComponentsStub struct { VersionedHdrFactory nodeFactory.VersionedHeaderFactory HdrIntegrityVerifier nodeFactory.HeaderIntegrityVerifierHandler RoundActivationHandlerField process.RoundActivationHandler + GuardedAccountHandlerField process.GuardedAccountHandler GuardianSigVerifierField process.GuardianSigVerifier } @@ -81,6 +82,11 @@ func (bcs *BootstrapComponentsStub) GuardianSigVerifier() process.GuardianSigVer return bcs.GuardianSigVerifierField } +// GuardedAccountHandler - +func (bcs *BootstrapComponentsStub) GuardedAccountHandler() process.GuardedAccountHandler { + return bcs.GuardedAccountHandlerField +} + // String - func (bcs *BootstrapComponentsStub) String() string { return "BootstrapComponentsStub" From 90d69ff3c52a1be4321d1514081eb77612aac522 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 18 May 2022 18:31:03 +0300 Subject: [PATCH 033/335] genesis: process: add unit tests, fix review findings --- genesis/process/disabled/txVersionChecker.go | 31 ++ genesis/process/metaGenesisBlockCreator.go | 2 +- process/dataValidators/export_test.go | 46 ++ process/dataValidators/txValidator_test.go | 404 +++++++++++++++++- process/guardedtx/guardedTxVerifier_test.go | 14 + process/guardian/guardedAccount.go | 6 +- process/guardian/guardedAccount_test.go | 28 +- process/smartContract/hooks/blockChainHook.go | 2 +- testscommon/blockChainHookStub.go | 2 +- 9 files changed, 518 insertions(+), 17 deletions(-) create mode 100644 genesis/process/disabled/txVersionChecker.go create mode 100644 process/dataValidators/export_test.go diff --git a/genesis/process/disabled/txVersionChecker.go b/genesis/process/disabled/txVersionChecker.go new file mode 100644 index 00000000000..99a19e34631 --- /dev/null +++ b/genesis/process/disabled/txVersionChecker.go @@ -0,0 +1,31 @@ +package disabled + +import "github.com/ElrondNetwork/elrond-go-core/data/transaction" + +// TxVersionChecker implements the TxVersionChecker interface, it does nothing as it is a disabled component +type TxVersionChecker struct{} + +// NewDisabledTxVersionChecker is the constructor for the disabled tx version checker +func NewDisabledTxVersionChecker() *TxVersionChecker { + return &TxVersionChecker{} +} + +// IsGuardedTransaction returns false as this is a disabled component +func (tvc *TxVersionChecker) IsGuardedTransaction(_ *transaction.Transaction) bool { + return false +} + +// IsSignedWithHash returns false as this is a disabled component +func (tvc *TxVersionChecker) IsSignedWithHash(_ *transaction.Transaction) bool { + return false +} + +// CheckTxVersion returns nil as this is a disabled component +func (tvc *TxVersionChecker) CheckTxVersion(_ *transaction.Transaction) error { + return nil +} + +// IsInterfaceNil does the nil check for the receiver +func (tvc *TxVersionChecker) IsInterfaceNil() bool { + return tvc == nil +} diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index 8251dbb026a..ec1e34fcebc 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -428,7 +428,7 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc ESDTEnableEpoch: enableEpochs.ESDTEnableEpoch, BuiltInFunctionOnMetachainEnableEpoch: enableEpochs.BuiltInFunctionOnMetaEnableEpoch, EpochNotifier: epochNotifier, - TxVersionChecker: arg.Core.TxVersionChecker(), + TxVersionChecker: disabled.NewDisabledTxVersionChecker(), GuardianChecker: disabledGuardian.NewDisabledGuardedAccountHandler(), } txProcessor, err := processTransaction.NewMetaTxProcessor(argsNewMetaTxProcessor) diff --git a/process/dataValidators/export_test.go b/process/dataValidators/export_test.go new file mode 100644 index 00000000000..5a735cb18de --- /dev/null +++ b/process/dataValidators/export_test.go @@ -0,0 +1,46 @@ +package dataValidators + +import ( + "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/state" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" +) + +// CheckAccount - +func (txv *txValidator) CheckAccount( + interceptedTx process.InterceptedTransactionHandler, + accountHandler vmcommon.AccountHandler, +) error { + return txv.checkAccount(interceptedTx, accountHandler) +} + +// CheckPermission - +func (txv *txValidator) CheckPermission( + interceptedTx process.InterceptedTransactionHandler, + account state.UserAccountHandler, +) error { + return txv.checkPermission(interceptedTx, account) +} + +// CheckGuardedTransaction - +func (txv *txValidator) CheckGuardedTransaction( + interceptedTx process.InterceptedTransactionHandler, + account state.UserAccountHandler, +) error { + return txv.checkGuardedTransaction(interceptedTx, account) +} + +// CheckOperationAllowedToBypassGuardian - +func CheckOperationAllowedToBypassGuardian(txData []byte) error { + return checkOperationAllowedToBypassGuardian(txData) +} + +// GetTxData - +func GetTxData(interceptedTx process.InterceptedTransactionHandler) ([]byte, error) { + return getTxData(interceptedTx) +} + +// IsBuiltInFuncCallWithParam - +func IsBuiltInFuncCallWithParam(txData []byte, function string) bool { + return isBuiltinFuncCallWithParam(txData, function) +} diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 18876fa9155..2a6f21d13c8 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -4,10 +4,12 @@ import ( "errors" "math/big" "strconv" + "strings" "testing" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/ElrondNetwork/elrond-go-core/data/receipt" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/dataValidators" @@ -18,6 +20,7 @@ import ( stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func getAccAdapter(nonce uint64, balance *big.Int) *stateMock.AccountsStub { @@ -44,7 +47,7 @@ func createMockCoordinator(identifierPrefix string, currentShardID uint32) *mock } } -func getTxValidatorHandler( +func getInterceptedTxHandler( sndShardId uint32, rcvShardId uint32, nonce uint64, @@ -231,7 +234,7 @@ func TestTxValidator_CheckTxValidityTxCrossShardShouldWork(t *testing.T) { assert.Nil(t, err) addressMock := []byte("address") - txValidatorHandler := getTxValidatorHandler(currentShard+1, currentShard, 1, addressMock, big.NewInt(0)) + txValidatorHandler := getInterceptedTxHandler(currentShard+1, currentShard, 1, addressMock, big.NewInt(0)) result := txValidator.CheckTxValidity(txValidatorHandler) assert.Nil(t, result) @@ -259,7 +262,7 @@ func TestTxValidator_CheckTxValidityAccountNonceIsGreaterThanTxNonceShouldReturn addressMock := []byte("address") currentShard := uint32(0) - txValidatorHandler := getTxValidatorHandler(currentShard, currentShard, txNonce, addressMock, big.NewInt(0)) + txValidatorHandler := getInterceptedTxHandler(currentShard, currentShard, txNonce, addressMock, big.NewInt(0)) result := txValidator.CheckTxValidity(txValidatorHandler) assert.True(t, errors.Is(result, process.ErrWrongTransaction)) @@ -287,7 +290,7 @@ func TestTxValidator_CheckTxValidityTxNonceIsTooHigh(t *testing.T) { addressMock := []byte("address") currentShard := uint32(0) - txValidatorHandler := getTxValidatorHandler(currentShard, currentShard, txNonce, addressMock, big.NewInt(0)) + txValidatorHandler := getInterceptedTxHandler(currentShard, currentShard, txNonce, addressMock, big.NewInt(0)) result := txValidator.CheckTxValidity(txValidatorHandler) assert.True(t, errors.Is(result, process.ErrWrongTransaction)) @@ -317,7 +320,7 @@ func TestTxValidator_CheckTxValidityAccountBalanceIsLessThanTxTotalValueShouldRe addressMock := []byte("address") currentShard := uint32(0) - txValidatorHandler := getTxValidatorHandler(currentShard, currentShard, txNonce, addressMock, fee) + txValidatorHandler := getInterceptedTxHandler(currentShard, currentShard, txNonce, addressMock, fee) result := txValidator.CheckTxValidity(txValidatorHandler) assert.NotNil(t, result) @@ -345,7 +348,7 @@ func TestTxValidator_CheckTxValidityAccountNotExitsShouldReturnFalse(t *testing. addressMock := []byte("address") currentShard := uint32(0) - txValidatorHandler := getTxValidatorHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) + txValidatorHandler := getInterceptedTxHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) result := txValidator.CheckTxValidity(txValidatorHandler) assert.True(t, errors.Is(result, process.ErrAccountNotFound)) @@ -376,7 +379,7 @@ func TestTxValidator_CheckTxValidityAccountNotExitsButWhiteListedShouldReturnTru addressMock := []byte("address") currentShard := uint32(0) - txValidatorHandler := getTxValidatorHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) + txValidatorHandler := getInterceptedTxHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) interceptedTx := struct { process.InterceptedData @@ -412,7 +415,7 @@ func TestTxValidator_CheckTxValidityWrongAccountTypeShouldReturnFalse(t *testing addressMock := []byte("address") currentShard := uint32(0) - txValidatorHandler := getTxValidatorHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) + txValidatorHandler := getInterceptedTxHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) result := txValidator.CheckTxValidity(txValidatorHandler) assert.True(t, errors.Is(result, process.ErrWrongTypeAssertion)) @@ -438,12 +441,365 @@ func TestTxValidator_CheckTxValidityTxIsOkShouldReturnTrue(t *testing.T) { addressMock := []byte("address") currentShard := uint32(0) - txValidatorHandler := getTxValidatorHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) + txValidatorHandler := getInterceptedTxHandler(currentShard, currentShard, 1, addressMock, big.NewInt(0)) result := txValidator.CheckTxValidity(txValidatorHandler) assert.Nil(t, result) } +func TestTxValidator_checkPermission(t *testing.T) { + adb := getAccAdapter(0, big.NewInt(0)) + shardCoordinator := createMockCoordinator("_", 0) + maxNonceDeltaAllowed := 100 + txValidator, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + + t.Run("non frozen account with getTxData error should err", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return nil + } + acc := &stateMock.UserAccountStub{ + IsFrozenCalled: func() bool { + return false + }, + } + err = txValidator.CheckPermission(inTx, acc) + require.Equal(t, process.ErrNilTransaction, err) + }) + t.Run("non frozen account without getTxData error should allow", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{} + } + + acc := &stateMock.UserAccountStub{ + IsFrozenCalled: func() bool { + return false + }, + } + err = txValidator.CheckPermission(inTx, acc) + require.Nil(t, err) + }) + t.Run("frozen account with no guarded tx and no bypass permission should err", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{ + Data: []byte("dummy data"), + } + } + + acc := createDummyFrozenAccount() + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{ + VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + return errors.New("error") + }, + }, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return false + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + + err = txV.CheckPermission(inTx, acc) + require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) + }) + t.Run("frozen account with no guarded tx and bypass permission should allow", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{ + Data: []byte("SetGuardian@..."), + } + } + + acc := createDummyFrozenAccount() + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{ + VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + return errors.New("error") + }, + }, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return false + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + + err = txV.CheckPermission(inTx, acc) + require.Nil(t, err) + }) + t.Run("frozen account with guarded Tx should allow", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{ + Data: []byte("dummy data"), + } + } + + acc := createDummyFrozenAccount() + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{ + VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + return nil + }, + }, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + + err = txV.CheckPermission(inTx, acc) + require.Nil(t, err) + }) +} + +func TestTxValidator_checkGuardedTransaction(t *testing.T) { + adb := getAccAdapter(0, big.NewInt(0)) + shardCoordinator := createMockCoordinator("_", 0) + maxNonceDeltaAllowed := 100 + txValidator, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{}, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + + t.Run("nil tx should err", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return nil + } + acc := &stateMock.UserAccountStub{} + err = txValidator.CheckGuardedTransaction(inTx, acc) + require.Equal(t, process.ErrNilTransaction, err) + }) + t.Run("invalid transaction should fail", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &receipt.Receipt{} + } + acc := &stateMock.UserAccountStub{} + err = txValidator.CheckGuardedTransaction(inTx, acc) + require.True(t, errors.Is(err, process.ErrWrongTypeAssertion)) + }) + t.Run("not guarded Tx should err", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{} + } + acc := &stateMock.UserAccountStub{} + + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return false + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + err = txV.CheckGuardedTransaction(inTx, acc) + require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) + }) + t.Run("non user account should err", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{} + } + + var acc state.UserAccountHandler + + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{}, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + err = txV.CheckGuardedTransaction(inTx, acc) + require.True(t, errors.Is(err, process.ErrWrongTypeAssertion)) + }) + t.Run("invalid guardian signature should err", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{} + } + + acc := state.NewEmptyUserAccount() + + expectedSigVerifyError := errors.New("expected error") + + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{ + VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + return expectedSigVerifyError + }, + }, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + err = txV.CheckGuardedTransaction(inTx, acc) + require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) + require.True(t, strings.Contains(err.Error(), expectedSigVerifyError.Error())) + }) + t.Run("valid signed guarded tx OK", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{} + } + + acc := state.NewEmptyUserAccount() + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{ + VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + return nil + }, + }, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + err = txV.CheckGuardedTransaction(inTx, acc) + require.Nil(t, err) + }) +} + +func Test_checkOperationAllowedToBypassGuardian(t *testing.T) { + t.Run("operations not allowed to bypass", func(t *testing.T) { + txData := []byte("#@!") + require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) + txData = []byte(nil) + require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) + txData = []byte("SomeOtherFunction@") + require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) + }) + t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { + txData := []byte("setGuardian") + require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) + }) + t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { + txData := []byte("SetGuardian@") + require.Nil(t, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) + }) +} + +func Test_getTxData(t *testing.T) { + t.Run("nil tx in intercepted tx returns error", func(t *testing.T) { + interceptedTx := getDefaultInterceptedTx() + interceptedTx.TransactionCalled = func() data.TransactionHandler { return nil } + txData, err := dataValidators.GetTxData(interceptedTx) + require.Equal(t, process.ErrNilTransaction, err) + require.Nil(t, txData) + }) + t.Run("non nil intercepted tx without data", func(t *testing.T) { + expectedData := []byte(nil) + interceptedTx := getDefaultInterceptedTx() + interceptedTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{ + Data: expectedData, + } + } + txData, err := dataValidators.GetTxData(interceptedTx) + require.Nil(t, err) + require.Equal(t, expectedData, txData) + }) + t.Run("non nil intercepted tx with data", func(t *testing.T) { + expectedData := []byte("expected data") + interceptedTx := getDefaultInterceptedTx() + interceptedTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{ + Data: expectedData, + } + } + txData, err := dataValidators.GetTxData(interceptedTx) + require.Nil(t, err) + require.Equal(t, expectedData, txData) + }) +} + +func Test_isBuiltinFuncCallWithParam(t *testing.T) { + txDataNoFunction := []byte("dummy data") + targetFunction := "function" + nonTargetFunction := "differentFunction" + suffix := "@dummy@params" + txDataWithFunc := []byte(targetFunction + suffix) + txDataNonTargetFunc := []byte(nonTargetFunction + suffix) + + t.Run("no function", func(t *testing.T) { + require.False(t, dataValidators.IsBuiltInFuncCallWithParam(txDataNoFunction, targetFunction)) + }) + t.Run("non target function", func(t *testing.T) { + require.False(t, dataValidators.IsBuiltInFuncCallWithParam(txDataNonTargetFunc, targetFunction)) + }) + t.Run("target function", func(t *testing.T) { + require.True(t, dataValidators.IsBuiltInFuncCallWithParam(txDataWithFunc, targetFunction)) + }) +} + //------- IsInterfaceNil func TestTxValidator_IsInterfaceNil(t *testing.T) { @@ -465,3 +821,33 @@ func TestTxValidator_IsInterfaceNil(t *testing.T) { assert.True(t, check.IfNil(txValidator)) } + +func getDefaultInterceptedTx() *mock.InterceptedTxHandlerStub { + return &mock.InterceptedTxHandlerStub{ + SenderShardIdCalled: func() uint32 { + return 0 + }, + ReceiverShardIdCalled: func() uint32 { + return 1 + }, + NonceCalled: func() uint64 { + return 0 + }, + SenderAddressCalled: func() []byte { + return []byte("sender address") + }, + FeeCalled: func() *big.Int { + return big.NewInt(100000) + }, + TransactionCalled: func() data.TransactionHandler { + return &transaction.Transaction{} + }, + } +} + +func createDummyFrozenAccount() state.UserAccountHandler { + acc := state.NewEmptyUserAccount() + metadata := &vmcommon.CodeMetadata{Frozen: true} + acc.SetCodeMetadata( metadata.ToBytes()) + return acc +} \ No newline at end of file diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 9eb3d7300d0..3afee85936d 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -55,6 +55,20 @@ func TestNewGuardedTxSigVerifier(t *testing.T) { require.Equal(t, process.ErrNilPubkeyConverter, err) require.True(t, check.IfNil(gtxSigVerifier)) }) + t.Run("nil marshaller", func(t *testing.T) { + changedArgs := *&args + changedArgs.Marshaller = nil + gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) + require.Equal(t, process.ErrNilMarshalizer, err) + require.True(t, check.IfNil(gtxSigVerifier)) + }) + t.Run("nil keyGen", func(t *testing.T) { + changedArgs := *&args + changedArgs.KeyGen = nil + gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) + require.Equal(t, process.ErrNilKeyGen, err) + require.True(t, check.IfNil(gtxSigVerifier)) + }) t.Run("ok params", func(t *testing.T) { gtxSigVerifier, err := NewGuardedTxSigVerifier(args) require.Nil(t, err) diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index e9ad500296b..43a694e3e46 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -156,7 +156,7 @@ func (agc *guardedAccount) getActiveGuardian(gs *guardians.Guardians) (*guardian defer agc.mutEpoch.RUnlock() var selectedGuardian *guardians.Guardian - for i, guardian := range gs.Slice { + for _, guardian := range gs.Slice { if guardian == nil { continue } @@ -164,13 +164,13 @@ func (agc *guardedAccount) getActiveGuardian(gs *guardians.Guardians) (*guardian continue } if selectedGuardian == nil { - selectedGuardian = gs.Slice[i] + selectedGuardian = guardian continue } // get the most recent active guardian if selectedGuardian.ActivationEpoch < guardian.ActivationEpoch { - selectedGuardian = gs.Slice[i] + selectedGuardian = guardian } } diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 6ddd666b3e8..33c2d973d6f 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -6,11 +6,35 @@ func TestNewAccountGuardianChecker(t *testing.T) { } -func TestAccountGuardianChecker_GetActiveGuardian(t *testing.T) { +func TestGuardedAccount_getActiveGuardian(t *testing.T) { } -func TestAccountGuardianChecker_EpochConfirmed(t *testing.T) { +func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { + +} + +func TestGuardedAccount_saveAccountGuardians(t *testing.T) { + +} + +func TestGuardedAccount_updateGuardians(t *testing.T) { + +} + +func TestGuardedAccount_setAccountGuardian(t *testing.T) { + +} + +func TestGuardedAccount_EpochConfirmed(t *testing.T) { + +} + +func TestGuardedAccount_GetActiveGuardian(t *testing.T) { + +} + +func TestGuardedAccount_SetGuardian(t *testing.T) { } diff --git a/process/smartContract/hooks/blockChainHook.go b/process/smartContract/hooks/blockChainHook.go index 2d7422ee9d6..aac0e86d248 100644 --- a/process/smartContract/hooks/blockChainHook.go +++ b/process/smartContract/hooks/blockChainHook.go @@ -489,7 +489,7 @@ func (bh *BlockChainHookImpl) FilterCodeMetadataForUpgrade(input []byte) ([]byte return nil, parsers.ErrInvalidCodeMetadata } -// ApplyFiltersOnCodeMetadata will apply all known filters on the provided code metadata value +// ApplyFiltersOnSCCodeMetadata will apply all known filters on the provided code metadata value func (bh *BlockChainHookImpl) ApplyFiltersOnSCCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata { codeMetadata.PayableBySC = codeMetadata.PayableBySC && bh.flagIsPayableBySC.IsSet() codeMetadata.Frozen = false diff --git a/testscommon/blockChainHookStub.go b/testscommon/blockChainHookStub.go index ce31e5aad4d..bfb74c44f7a 100644 --- a/testscommon/blockChainHookStub.go +++ b/testscommon/blockChainHookStub.go @@ -344,7 +344,7 @@ func (stub *BlockChainHookStub) FilterCodeMetadataForUpgrade(input []byte) ([]by return input, nil } -// ApplyFiltersOnCodeMetadata - +// ApplyFiltersOnSCCodeMetadata - func (stub *BlockChainHookStub) ApplyFiltersOnSCCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata { if stub.ApplyFiltersOnCodeMetadataCalled != nil { stub.ApplyFiltersOnCodeMetadataCalled(codeMetadata) From cf944cb8af8f7b188730736004617b960bae5362 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 18 May 2022 19:10:14 +0300 Subject: [PATCH 034/335] node: add unit tests for setTxGuardianData --- node/export_test.go | 6 ++++++ node/node_test.go | 49 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/node/export_test.go b/node/export_test.go index afbb4bc85ed..7d5de6e677f 100644 --- a/node/export_test.go +++ b/node/export_test.go @@ -1,6 +1,7 @@ package node import ( + "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/factory" ) @@ -19,3 +20,8 @@ func (n *Node) ComputeProof(rootHash []byte, key []byte) (*common.GetProofRespon func (n *Node) AddClosableComponents(components ...factory.Closer) { n.closableComponents = append(n.closableComponents, components...) } + +// SetTxGuardianData - +func (n *Node) SetTxGuardianData(guardian string, guardianSigHex string, tx *transaction.Transaction) error { + return n.setTxGuardianData(guardian, guardianSigHex, tx) +} diff --git a/node/node_test.go b/node/node_test.go index 02a6a38a14f..1af2f6d1c1e 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -3488,6 +3488,55 @@ func TestNode_SendBulkTransactions(t *testing.T) { require.Nil(t, err) } +func TestNode_setTxGuardianData(t *testing.T) { + t.Parallel() + lenPubKey := 32 + coreComponents := getDefaultCoreComponents() + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + ) + guardianPubKey := bytes.Repeat([]byte{1}, lenPubKey) + guardian := coreComponents.AddrPubKeyConv.Encode(guardianPubKey) + guardianSig := []byte("guardian sig") + guardianSigHex := hex.EncodeToString(guardianSig) + + t.Run("invalid guardian address should err", func(t *testing.T) { + tx := &transaction.Transaction{} + tx.Options |= transaction.MaskGuardedTransaction + + err := n.SetTxGuardianData("invalid guardian address", guardianSigHex, tx) + require.NotNil(t, err) + require.Nil(t, tx.GuardianAddr) + require.Nil(t, tx.GuardianSignature) + }) + t.Run("invalid guardian sig hex should err", func(t *testing.T) { + tx := &transaction.Transaction{} + tx.Options |= transaction.MaskGuardedTransaction + + err := n.SetTxGuardianData(guardian, "invalid guardian sig hex", tx) + require.NotNil(t, err) + require.Nil(t, tx.GuardianAddr) + require.Nil(t, tx.GuardianSignature) + }) + t.Run("no guardian option set on tx should err", func(t *testing.T) { + tx := &transaction.Transaction{} + + err := n.SetTxGuardianData(guardian, guardianSigHex, tx) + require.NotNil(t, err) + require.Nil(t, tx.GuardianAddr) + require.Nil(t, tx.GuardianSignature) + }) + t.Run("setTxGuardianData ok", func(t *testing.T) { + tx := &transaction.Transaction{} + tx.Options |= transaction.MaskGuardedTransaction + + err := n.SetTxGuardianData(guardian, guardianSigHex, tx) + require.Nil(t, err) + require.Equal(t, guardianPubKey, tx.GuardianAddr) + require.Equal(t, guardianSig, tx.GuardianSignature) + }) +} + func getDefaultCoreComponents() *nodeMockFactory.CoreComponentsMock { return &nodeMockFactory.CoreComponentsMock{ IntMarsh: &testscommon.MarshalizerMock{}, From d659ab9f6d3bb2814cdeabf106f90853397b7416 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 23 May 2022 18:30:11 +0300 Subject: [PATCH 035/335] process: immediately set the guardian if tx is cosigned by active guardian --- .../disabled/disabledGuardedAccount.go | 2 +- process/guardian/guardedAccount.go | 52 ++++++++++++++++--- process/guardian/guardedAccount_test.go | 27 +++++++++- process/smartContract/vmInput.go | 5 ++ .../guardianAccountHandlerStub.go | 6 +-- 5 files changed, 80 insertions(+), 12 deletions(-) diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go index 4ed75ccb43d..90ae584e85f 100644 --- a/process/guardian/disabled/disabledGuardedAccount.go +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -17,7 +17,7 @@ func (dga *disabledGuardedAccount) GetActiveGuardian(_ vmcommon.UserAccountHandl } // SetGuardian returns nil as this is a disabled implementation -func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte) error { +func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte, _ []byte) error { return nil } diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 43a694e3e46..b2f24f53f46 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -1,6 +1,7 @@ package guardian import ( + "bytes" "fmt" "sync" @@ -69,17 +70,21 @@ func (agc *guardedAccount) GetActiveGuardian(uah vmcommon.UserAccountHandler) ([ } // SetGuardian sets a guardian for an account -func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte) error { - guardian := &guardians.Guardian{ - Address: guardianAddress, - ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochs, - } - +func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error { stateUserAccount, ok := uah.(state.UserAccountHandler) if !ok { return process.ErrWrongTypeAssertion } + if len(txGuardianAddress) > 0 { + return agc.instantSetGuardian(stateUserAccount, guardianAddress, txGuardianAddress) + } + + guardian := &guardians.Guardian{ + Address: guardianAddress, + ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochs, + } + return agc.setAccountGuardian(stateUserAccount, guardian) } @@ -88,6 +93,7 @@ func (agc *guardedAccount) setAccountGuardian(uah state.UserAccountHandler, guar if err != nil { return err } + newGuardians, err := agc.updateGuardians(guardian, configuredGuardians) if err != nil { return err @@ -101,6 +107,40 @@ func (agc *guardedAccount) setAccountGuardian(uah state.UserAccountHandler, guar return agc.saveAccountGuardians(accHandler, newGuardians) } +func (agc *guardedAccount) instantSetGuardian( + uah state.UserAccountHandler, + guardianAddress []byte, + txGuardianAddress []byte, +) error { + accountGuardians, err := agc.getConfiguredGuardians(uah) + if err != nil { + return err + } + + activeGuardian, err := agc.getActiveGuardian(accountGuardians) + if err != nil { + return err + } + + if !bytes.Equal(activeGuardian.Address, txGuardianAddress) { + return process.ErrTransactionAndAccountGuardianMismatch + } + + // immediately set the new guardian + guardian := &guardians.Guardian{ + Address: guardianAddress, + ActivationEpoch: agc.currentEpoch, + } + + accountGuardians.Slice = []*guardians.Guardian{guardian} + accHandler, ok := uah.(vmcommon.UserAccountHandler) + if !ok { + return process.ErrWrongTypeAssertion + } + + return agc.saveAccountGuardians(accHandler, accountGuardians) +} + func (agc *guardedAccount) updateGuardians(newGuardian *guardians.Guardian, accountGuardians *guardians.Guardians) (*guardians.Guardians, error) { numSetGuardians := len(accountGuardians.Slice) diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 33c2d973d6f..bf006b523f4 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -1,9 +1,28 @@ package guardian -import "testing" +import ( + "testing" -func TestNewAccountGuardianChecker(t *testing.T) { + "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/stretchr/testify/require" +) +func TestNewAccountGuardianChecker(t *testing.T) { + marshaller := &testscommon.MarshalizerMock{} + en := &epochNotifier.EpochNotifierStub{} + ga, err := NewGuardedAccount(marshaller, en) + require.Nil(t, err) + require.NotNil(t, ga) + + ga, err = NewGuardedAccount(nil, en) + require.Equal(t, process.ErrNilMarshalizer, err) + require.Nil(t, ga) + + ga, err = NewGuardedAccount(marshaller, nil) + require.Equal(t, process.ErrNilEpochNotifier, err) + require.Nil(t, ga) } func TestGuardedAccount_getActiveGuardian(t *testing.T) { @@ -26,6 +45,10 @@ func TestGuardedAccount_setAccountGuardian(t *testing.T) { } +func TestGuardedAccount_instantSetGuardian(t *testing.T) { + +} + func TestGuardedAccount_EpochConfirmed(t *testing.T) { } diff --git a/process/smartContract/vmInput.go b/process/smartContract/vmInput.go index 6920eabda37..dde7c8406ba 100644 --- a/process/smartContract/vmInput.go +++ b/process/smartContract/vmInput.go @@ -95,6 +95,11 @@ func (sc *scProcessor) createVMCallInput( vmCallInput.CurrentTxHash = txHash vmCallInput.GasLocked = gasLocked + gtx, isGuardedTx := tx.(data.GuardedTransactionHandler) + if isGuardedTx { + vmCallInput.TxGuardian = gtx.GetGuardianAddr() + } + scr, isSCR := tx.(*smartContractResult.SmartContractResult) if isSCR { vmCallInput.OriginalTxHash = scr.GetOriginalTxHash() diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go index 56ed550899c..fccea8182ba 100644 --- a/testscommon/guardianMocks/guardianAccountHandlerStub.go +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -7,7 +7,7 @@ import ( // GuardedAccountHandlerStub - type GuardedAccountHandlerStub struct { GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) - SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte) error + SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error } // GetActiveGuardian - @@ -19,9 +19,9 @@ func (gahs *GuardedAccountHandlerStub) GetActiveGuardian(handler vmcommon.UserAc } // SetGuardian - -func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte) error { +func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error { if gahs.SetGuardianCalled != nil { - return gahs.SetGuardianCalled(uah, guardianAddress) + return gahs.SetGuardianCalled(uah, guardianAddress, txGuardianAddress) } return nil } From 2efbec377c140c73604b240ca803ecd4d784be02 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 24 May 2022 14:39:41 +0300 Subject: [PATCH 036/335] added createtransaction args as dto in node/external --- node/external/dtos.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 node/external/dtos.go diff --git a/node/external/dtos.go b/node/external/dtos.go new file mode 100644 index 00000000000..f884d8d32c9 --- /dev/null +++ b/node/external/dtos.go @@ -0,0 +1,20 @@ +package external + +// ArgsCreateTransaction defines arguments for creating a transaction +type ArgsCreateTransaction struct { + Nonce uint64 + Value string + Receiver string + ReceiverUsername []byte + Sender string + SenderUsername []byte + GasPrice uint64 + GasLimit uint64 + DataField []byte + SignatureHex string + ChainID string + Version uint32 + Options uint32 + Guardian string + GuardianSigHex string +} From a457f415688904a0f24d8e90549ad345b6ae4094 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 24 May 2022 14:40:15 +0300 Subject: [PATCH 037/335] refactor create transaction to use dto args --- facade/interface.go | 4 +- facade/mock/nodeStub.go | 17 +- facade/nodeFacade.go | 20 +- facade/nodeFacade_test.go | 2 +- node/node.go | 71 +++---- node/node_test.go | 420 ++++++++++++++++++++++++++++++++++---- 6 files changed, 436 insertions(+), 98 deletions(-) diff --git a/facade/interface.go b/facade/interface.go index a9439b99932..79c59926019 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -53,9 +53,7 @@ type NodeHandler interface { GetTokenSupply(token string) (*api.ESDTSupply, error) // CreateTransaction will return a transaction from all needed fields - CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, - guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) + CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) // ValidateTransaction will validate a transaction ValidateTransaction(tx *transaction.Transaction) error diff --git a/facade/mock/nodeStub.go b/facade/mock/nodeStub.go index 470acbd76a1..48e144467f3 100644 --- a/facade/mock/nodeStub.go +++ b/facade/mock/nodeStub.go @@ -11,17 +11,17 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/state" ) // NodeStub - type NodeStub struct { - AddressHandler func() (string, error) - ConnectToAddressesHandler func([]string) error - GetBalanceHandler func(address string) (*big.Int, error) - GenerateTransactionHandler func(sender string, receiver string, amount string, code string) (*transaction.Transaction, error) - CreateTransactionHandler func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) + AddressHandler func() (string, error) + ConnectToAddressesHandler func([]string) error + GetBalanceHandler func(address string) (*big.Int, error) + GenerateTransactionHandler func(sender string, receiver string, amount string, code string) (*transaction.Transaction, error) + CreateTransactionHandler func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransactionHandler func(tx *transaction.Transaction) error ValidateTransactionForSimulationCalled func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) @@ -120,10 +120,9 @@ func (ns *NodeStub) GetBalance(address string) (*big.Int, error) { } // CreateTransaction - -func (ns *NodeStub) CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) { +func (ns *NodeStub) CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { - return ns.CreateTransactionHandler(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, data, signatureHex, chainID, version, options, guardian, guardianSigHex) + return ns.CreateTransactionHandler(txArgs) } //ValidateTransaction - diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index 36a077cfbb9..bd2705376ec 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -234,8 +234,24 @@ func (nf *nodeFacade) CreateTransaction( guardian string, guardianSigHex string, ) (*transaction.Transaction, []byte, error) { - - return nf.node.CreateTransaction(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, txData, signatureHex, chainID, version, options, guardian, guardianSigHex) + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: receiverUsername, + Sender: sender, + SenderUsername: senderUsername, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signatureHex, + ChainID: chainID, + Version: version, + Options: options, + Guardian: guardian, + GuardianSigHex: guardianSigHex, + } + return nf.node.CreateTransaction(txArgs) } // ValidateTransaction will validate a transaction diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index c89592922e5..901f49284c7 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -489,7 +489,7 @@ func TestNodeFacade_CreateTransaction(t *testing.T) { nodeCreateTxWasCalled := false node := &mock.NodeStub{ - CreateTransactionHandler: func(_ uint64, _ string, _ string, _ []byte, _ string, _ []byte, _ uint64, _ uint64, _ []byte, _ string, _ string, _, _ uint32, _ string, _ string) (*transaction.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { nodeCreateTxWasCalled = true return nil, nil, nil }, diff --git a/node/node.go b/node/node.go index f67153825cf..d31a77b8a19 100644 --- a/node/node.go +++ b/node/node.go @@ -26,6 +26,7 @@ import ( mainFactory "github.com/ElrondNetwork/elrond-go/factory" heartbeatData "github.com/ElrondNetwork/elrond-go/heartbeat/data" "github.com/ElrondNetwork/elrond-go/node/disabled" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/p2p" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/dataValidators" @@ -676,27 +677,11 @@ func (n *Node) checkSenderIsInShard(tx *transaction.Transaction) error { } // CreateTransaction will return a transaction from all the required fields -func (n *Node) CreateTransaction( - nonce uint64, - value string, - receiver string, - receiverUsername []byte, - sender string, - senderUsername []byte, - gasPrice uint64, - gasLimit uint64, - dataField []byte, - signatureHex string, - chainID string, - version uint32, - options uint32, - guardian string, - guardianSigHex string, -) (*transaction.Transaction, []byte, error) { - if version == 0 { +func (n *Node) CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { + if txArgs.Version == 0 { return nil, nil, ErrInvalidTransactionVersion } - if chainID == "" || len(chainID) > len(n.coreComponents.ChainID()) { + if txArgs.ChainID == "" || len(txArgs.ChainID) > len(n.coreComponents.ChainID()) { return nil, nil, ErrInvalidChainIDInTransaction } addrPubKeyConverter := n.coreComponents.AddressPubKeyConverter() @@ -706,74 +691,74 @@ func (n *Node) CreateTransaction( if check.IfNil(n.stateComponents.AccountsAdapterAPI()) { return nil, nil, ErrNilAccountsAdapter } - if len(signatureHex) > n.addressSignatureHexSize { + if len(txArgs.SignatureHex) > n.addressSignatureHexSize { return nil, nil, ErrInvalidSignatureLength } - if len(guardianSigHex) > n.addressSignatureHexSize { + if len(txArgs.GuardianSigHex) > n.addressSignatureHexSize { return nil, nil, fmt.Errorf("%w for guardian signature", ErrInvalidSignatureLength) } - if uint32(len(receiver)) > n.coreComponents.EncodedAddressLen() { + if uint32(len(txArgs.Receiver)) > n.coreComponents.EncodedAddressLen() { return nil, nil, fmt.Errorf("%w for receiver", ErrInvalidAddressLength) } - if uint32(len(sender)) > n.coreComponents.EncodedAddressLen() { + if uint32(len(txArgs.Sender)) > n.coreComponents.EncodedAddressLen() { return nil, nil, fmt.Errorf("%w for sender", ErrInvalidAddressLength) } - if uint32(len(guardian)) > n.coreComponents.EncodedAddressLen() { + if uint32(len(txArgs.Guardian)) > n.coreComponents.EncodedAddressLen() { return nil, nil, fmt.Errorf("%w for guardian", ErrInvalidAddressLength) } - if len(senderUsername) > core.MaxUserNameLength { + if len(txArgs.SenderUsername) > core.MaxUserNameLength { return nil, nil, ErrInvalidSenderUsernameLength } - if len(receiverUsername) > core.MaxUserNameLength { + if len(txArgs.ReceiverUsername) > core.MaxUserNameLength { return nil, nil, ErrInvalidReceiverUsernameLength } - if len(dataField) > core.MegabyteSize { + if len(txArgs.DataField) > core.MegabyteSize { return nil, nil, ErrDataFieldTooBig } - receiverAddress, err := addrPubKeyConverter.Decode(receiver) + receiverAddress, err := addrPubKeyConverter.Decode(txArgs.Receiver) if err != nil { return nil, nil, errors.New("could not create receiver address from provided param") } - senderAddress, err := addrPubKeyConverter.Decode(sender) + senderAddress, err := addrPubKeyConverter.Decode(txArgs.Sender) if err != nil { return nil, nil, errors.New("could not create sender address from provided param") } - signatureBytes, err := hex.DecodeString(signatureHex) + signatureBytes, err := hex.DecodeString(txArgs.SignatureHex) if err != nil { return nil, nil, errors.New("could not fetch signature bytes") } - if len(value) > len(n.coreComponents.EconomicsData().GenesisTotalSupply().String())+1 { + if len(txArgs.Value) > len(n.coreComponents.EconomicsData().GenesisTotalSupply().String())+1 { return nil, nil, ErrTransactionValueLengthTooBig } - valAsBigInt, ok := big.NewInt(0).SetString(value, 10) + valAsBigInt, ok := big.NewInt(0).SetString(txArgs.Value, 10) if !ok { return nil, nil, ErrInvalidValue } tx := &transaction.Transaction{ - Nonce: nonce, + Nonce: txArgs.Nonce, Value: valAsBigInt, RcvAddr: receiverAddress, - RcvUserName: receiverUsername, + RcvUserName: txArgs.ReceiverUsername, SndAddr: senderAddress, - SndUserName: senderUsername, - GasPrice: gasPrice, - GasLimit: gasLimit, - Data: dataField, + SndUserName: txArgs.SenderUsername, + GasPrice: txArgs.GasPrice, + GasLimit: txArgs.GasLimit, + Data: txArgs.DataField, Signature: signatureBytes, - ChainID: []byte(chainID), - Version: version, - Options: options, + ChainID: []byte(txArgs.ChainID), + Version: txArgs.Version, + Options: txArgs.Options, } - if len(guardian) > 0 { - err = n.setTxGuardianData(guardian, guardianSigHex, tx) + if len(txArgs.Guardian) > 0 { + err = n.setTxGuardianData(txArgs.Guardian, txArgs.GuardianSigHex, tx) if err != nil { return nil, nil, err } diff --git a/node/node_test.go b/node/node_test.go index 1af2f6d1c1e..bb5557ad2bf 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -33,6 +33,7 @@ import ( "github.com/ElrondNetwork/elrond-go/factory" factoryMock "github.com/ElrondNetwork/elrond-go/factory/mock" "github.com/ElrondNetwork/elrond-go/node" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/node/mock" nodeMockFactory "github.com/ElrondNetwork/elrond-go/node/mock/factory" "github.com/ElrondNetwork/elrond-go/process" @@ -1240,7 +1241,24 @@ func TestCreateTransaction_NilAddrConverterShouldErr(t *testing.T) { coreComponents.AddrPubKeyConv = nil chainID := coreComponents.ChainID() - tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Nil(t, txHash) @@ -1280,23 +1298,24 @@ func TestCreateTransaction_NilAccountsAdapterShouldErr(t *testing.T) { stateComponents.AccountsAPI = nil - tx, txHash, err := n.CreateTransaction( - nonce, - value.String(), - receiver, - nil, - sender, - nil, - gasPrice, - gasLimit, - txData, - signature, - coreComponents.ChainID(), - 1, - 0, - "", - "", - ) + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: coreComponents.ChainID(), + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Nil(t, txHash) @@ -1333,7 +1352,24 @@ func TestCreateTransaction_InvalidSignatureShouldErr(t *testing.T) { txData := []byte("-") signature := "-" - tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, "chainID", 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: "chainID", + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Nil(t, txHash) @@ -1385,17 +1421,68 @@ func TestCreateTransaction_ChainIDFieldChecks(t *testing.T) { signature := hex.EncodeToString([]byte(strings.Repeat("s", 10))) emptyChainID := "" - _, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, emptyChainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: emptyChainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + _, _, err := n.CreateTransaction(txArgs) assert.Equal(t, node.ErrInvalidChainIDInTransaction, err) for i := 1; i < len(chainID); i++ { newChainID := strings.Repeat("c", i) - _, _, err = n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, newChainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: newChainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + _, _, err = n.CreateTransaction(txArgs) assert.NoError(t, err) } newChainID := chainID + "additional text" - _, _, err = n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, newChainID, 1, 0, "", "") + txArgs = &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: newChainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + _, _, err = n.CreateTransaction(txArgs) assert.Equal(t, node.ErrInvalidChainIDInTransaction, err) } @@ -1439,7 +1526,25 @@ func TestCreateTransaction_InvalidTxVersionShouldErr(t *testing.T) { gasLimit := uint64(20) txData := []byte("-") signature := "617eff4f" - _, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, "", 0, 0, "", "") + + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: "", + Version: 0, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + _, _, err := n.CreateTransaction(txArgs) assert.Equal(t, node.ErrInvalidTransactionVersion, err) } @@ -1517,7 +1622,24 @@ func TestCreateTransaction_SenderShardIdIsInDifferentShardShouldNotValidate(t *t txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - tx, txHash, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, string(chainID), version, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: string(chainID), + Version: version, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.NotNil(t, tx) assert.Equal(t, expectedHash, txHash) assert.Nil(t, err) @@ -1582,14 +1704,48 @@ func TestCreateTransaction_SignatureLengthChecks(t *testing.T) { for i := 0; i <= signatureLength; i++ { signatureBytes := []byte(strings.Repeat("a", i)) signatureHex := hex.EncodeToString(signatureBytes) - tx, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signatureHex, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signatureHex, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, _, err := n.CreateTransaction(txArgs) assert.NotNil(t, tx) assert.NoError(t, err) assert.Equal(t, signatureBytes, tx.Signature) } signature := hex.EncodeToString([]byte(strings.Repeat("a", signatureLength+1))) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) assert.Equal(t, node.ErrInvalidSignatureLength, err) @@ -1647,12 +1803,46 @@ func TestCreateTransaction_SenderLengthChecks(t *testing.T) { for i := 0; i <= encodedAddressLen; i++ { sender := strings.Repeat("s", i) - _, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + _, _, err := n.CreateTransaction(txArgs) assert.NoError(t, err) } sender := strings.Repeat("s", encodedAddressLen) + "additional" - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1711,12 +1901,46 @@ func TestCreateTransaction_ReceiverLengthChecks(t *testing.T) { for i := 0; i <= encodedAddressLen; i++ { receiver := strings.Repeat("r", i) - _, _, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + _, _, err := n.CreateTransaction(txArgs) assert.NoError(t, err) } receiver := strings.Repeat("r", encodedAddressLen) + "additional" - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1775,7 +1999,24 @@ func TestCreateTransaction_TooBigSenderUsernameShouldErr(t *testing.T) { senderUsername := bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, senderUsername, gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: senderUsername, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1834,7 +2075,24 @@ func TestCreateTransaction_TooBigReceiverUsernameShouldErr(t *testing.T) { receiverUsername := bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, receiverUsername, sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: receiverUsername, + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1890,7 +2148,24 @@ func TestCreateTransaction_DataFieldSizeExceedsMaxShouldErr(t *testing.T) { txData := bytes.Repeat([]byte{0}, core.MegabyteSize+1) signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -1947,7 +2222,24 @@ func TestCreateTransaction_TooLargeValueFieldShouldErr(t *testing.T) { txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - tx, txHash, err := n.CreateTransaction(nonce, value, receiver, []byte("rcvrUsername"), sender, []byte("sndrUsername"), gasPrice, gasLimit, txData, signature, chainID, 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value, + Receiver: receiver, + ReceiverUsername: []byte("rcvrUsername"), + Sender: sender, + SenderUsername: []byte("sndrUsername"), + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) assert.Error(t, err) @@ -2018,10 +2310,24 @@ func TestCreateTransaction_OkValsShouldWork(t *testing.T) { txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - tx, txHash, err := n.CreateTransaction( - nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, - signature, coreComponents.ChainID(), coreComponents.MinTransactionVersion(), 0, "", "", - ) + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: coreComponents.ChainID(), + Version: coreComponents.MinTransactionVersion(), + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + tx, txHash, err := n.CreateTransaction(txArgs) assert.NotNil(t, tx) assert.Equal(t, expectedHash, txHash) assert.Nil(t, err) @@ -2121,7 +2427,24 @@ func TestCreateTransaction_TxSignedWithHashShouldErrVersionShoudBe2(t *testing.T signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) options := transaction.MaskSignedWithHash - tx, _, err := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version, options, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: version, + Options: options, + Guardian: "", + GuardianSigHex: "", + } + tx, _, err := n.CreateTransaction(txArgs) require.Nil(t, err) err = n.ValidateTransaction(tx) assert.Equal(t, process.ErrInvalidTransactionVersion, err) @@ -2222,7 +2545,24 @@ func TestCreateTransaction_TxSignedWithHashNoEnabledShouldErr(t *testing.T) { signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) options := transaction.MaskSignedWithHash - tx, _, _ := n.CreateTransaction(nonce, value.String(), receiver, nil, sender, nil, gasPrice, gasLimit, txData, signature, chainID, version+1, options, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: chainID, + Version: version + 1, + Options: options, + Guardian: "", + GuardianSigHex: "", + } + tx, _, _ := n.CreateTransaction(txArgs) err := n.ValidateTransaction(tx) assert.Equal(t, process.ErrTransactionSignedWithHashIsNotEnabled, err) From bf651372ff674ddfa1a150c9f4fe2749e464a797 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 24 May 2022 14:59:06 +0300 Subject: [PATCH 038/335] refactor create transaction also in integration tests --- integrationTests/testProcessorNode.go | 37 ++++++++++++++------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 14c7de0aae3..11f68a4ca83 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -24,7 +24,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing/keccak" "github.com/ElrondNetwork/elrond-go-core/hashing/sha256" "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go-crypto" + crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" @@ -2318,23 +2318,24 @@ func (tpn *TestProcessorNode) initNode() { // SendTransaction can send a transaction (it does the dispatching) func (tpn *TestProcessorNode) SendTransaction(tx *dataTransaction.Transaction) (string, error) { - tx, txHash, err := tpn.Node.CreateTransaction( - tx.Nonce, - tx.Value.String(), - TestAddressPubkeyConverter.Encode(tx.RcvAddr), - nil, - TestAddressPubkeyConverter.Encode(tx.SndAddr), - nil, - tx.GasPrice, - tx.GasLimit, - tx.Data, - hex.EncodeToString(tx.Signature), - string(tx.ChainID), - tx.Version, - tx.Options, - TestAddressPubkeyConverter.Encode(tx.GuardianAddr), - hex.EncodeToString(tx.GuardianSignature), - ) + txArgs := &external.ArgsCreateTransaction{ + Nonce: tx.Nonce, + Value: tx.Value.String(), + Receiver: TestAddressPubkeyConverter.Encode(tx.RcvAddr), + ReceiverUsername: nil, + Sender: TestAddressPubkeyConverter.Encode(tx.SndAddr), + SenderUsername: nil, + GasPrice: tx.GasPrice, + GasLimit: tx.GasLimit, + DataField: tx.Data, + SignatureHex: hex.EncodeToString(tx.Signature), + ChainID: string(tx.ChainID), + Version: tx.Version, + Options: tx.Options, + Guardian: TestAddressPubkeyConverter.Encode(tx.GuardianAddr), + GuardianSigHex: hex.EncodeToString(tx.GuardianSignature), + } + tx, txHash, err := tpn.Node.CreateTransaction(txArgs) if err != nil { return "", err } From ea8bf9e69f41d6efb107e712208cd2e0f1bc2815 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 24 May 2022 17:14:14 +0300 Subject: [PATCH 039/335] createTransaction: added check for guardian, sender, receiver fields --- node/node_test.go | 240 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) diff --git a/node/node_test.go b/node/node_test.go index bb5557ad2bf..ae1b0690ac4 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -2246,6 +2246,246 @@ func TestCreateTransaction_TooLargeValueFieldShouldErr(t *testing.T) { assert.Equal(t, node.ErrTransactionValueLengthTooBig, err) } +func TestCreateTransaction_InvalidGuardianSigShouldErr(t *testing.T) { + t.Parallel() + + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.TxMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + coreComponents.AddrPubKeyConv = &mock.PubkeyConverterStub{ + DecodeCalled: func(hexAddress string) ([]byte, error) { + return []byte(hexAddress), nil + }, + } + stateComponents := getDefaultStateComponents() + stateComponents.AccountsAPI = &stateMock.AccountsStub{} + + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithAddressSignatureSize(16), + ) + + nonce := uint64(0) + value := new(big.Int).SetInt64(10) + receiver := "rcv" + sender := "snd" + gasPrice := uint64(10) + gasLimit := uint64(20) + txData := []byte("-") + signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 1)) + guardianSig := hex.EncodeToString(bytes.Repeat([]byte{0}, 32)) + + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: "chainID", + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: guardianSig, + } + tx, txHash, err := n.CreateTransaction(txArgs) + + assert.Nil(t, tx) + assert.Nil(t, txHash) + assert.NotNil(t, err) + assert.True(t, errors.Is(err, node.ErrInvalidSignatureLength)) +} + +func TestCreateTransaction_InvalidGuardianAddressLenShouldErr(t *testing.T) { + t.Parallel() + + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.TxMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + encodedAddressLen := 8 + coreComponents.AddrPubKeyConv = &mock.PubkeyConverterStub{ + DecodeCalled: func(hexAddress string) ([]byte, error) { + return []byte(hexAddress), nil + }, + LenCalled: func() int { + return encodedAddressLen + }, + } + stateComponents := getDefaultStateComponents() + stateComponents.AccountsAPI = &stateMock.AccountsStub{} + + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithAddressSignatureSize(16), + ) + + nonce := uint64(0) + value := new(big.Int).SetInt64(10) + receiver := "rcv" + sender := "snd" + gasPrice := uint64(10) + gasLimit := uint64(20) + txData := []byte("-") + signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) + guardianSig := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) + guardian := strings.Repeat("g", encodedAddressLen) + "additional" + + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: "chainID", + Version: 1, + Options: 0, + Guardian: guardian, + GuardianSigHex: guardianSig, + } + tx, txHash, err := n.CreateTransaction(txArgs) + + assert.Nil(t, tx) + assert.Nil(t, txHash) + assert.NotNil(t, err) + assert.True(t, errors.Is(err, node.ErrInvalidAddressLength)) +} + +func TestCreateTransaction_AddressPubKeyConverterDecode(t *testing.T) { + t.Parallel() + + minAddrLen := 4 + encodedAddressLen := 8 + addrPubKeyConverter := &mock.PubkeyConverterStub{ + DecodeCalled: func(hexAddress string) ([]byte, error) { + if len(hexAddress) < minAddrLen { + return nil, errors.New("decode error") + } + return []byte(hexAddress), nil + }, + LenCalled: func() int { + return encodedAddressLen + }, + } + + // transaction parameters + nonce := uint64(0) + value := new(big.Int).SetInt64(10) + gasPrice := uint64(10) + gasLimit := uint64(20) + txData := []byte("-") + signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) + guardianSig := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) + guardian := strings.Repeat("g", encodedAddressLen) + + t.Run("fail to decode receiver", func(t *testing.T) { + t.Parallel() + + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.TxMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + coreComponents.AddrPubKeyConv = addrPubKeyConverter + stateComponents := getDefaultStateComponents() + stateComponents.AccountsAPI = &stateMock.AccountsStub{} + + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithAddressSignatureSize(16), + ) + + receiver := "rcv" + sender := "snd" + + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: "chainID", + Version: 1, + Options: 0, + Guardian: guardian, + GuardianSigHex: guardianSig, + } + tx, txHash, err := n.CreateTransaction(txArgs) + + assert.Nil(t, tx) + assert.Nil(t, txHash) + assert.True(t, strings.Contains(err.Error(), "receiver address")) + }) + + t.Run("fail to decode sender", func(t *testing.T) { + t.Parallel() + + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.TxMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + coreComponents.AddrPubKeyConv = addrPubKeyConverter + stateComponents := getDefaultStateComponents() + stateComponents.AccountsAPI = &stateMock.AccountsStub{} + + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithAddressSignatureSize(16), + ) + + receiver := strings.Repeat("r", minAddrLen+1) + sender := "snd" + + txArgs := &external.ArgsCreateTransaction{ + Nonce: nonce, + Value: value.String(), + Receiver: receiver, + ReceiverUsername: nil, + Sender: sender, + SenderUsername: nil, + GasPrice: gasPrice, + GasLimit: gasLimit, + DataField: txData, + SignatureHex: signature, + ChainID: "chainID", + Version: 1, + Options: 0, + Guardian: guardian, + GuardianSigHex: guardianSig, + } + tx, txHash, err := n.CreateTransaction(txArgs) + + assert.Nil(t, tx) + assert.Nil(t, txHash) + assert.True(t, strings.Contains(err.Error(), "sender address")) + }) +} + func TestCreateTransaction_OkValsShouldWork(t *testing.T) { t.Parallel() From bc49f7397825f75971e6b79acb8563d14bdf7f6d Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 24 May 2022 18:42:40 +0300 Subject: [PATCH 040/335] cmd, process, factory: move guardian activation delay const to config and add some unit tests --- cmd/node/config/config.toml | 5 + config/config.go | 1 + factory/bootstrapComponents.go | 3 +- process/dataValidators/txValidator_test.go | 4 +- process/errors.go | 7 +- process/guardian/guardedAccount.go | 23 +- process/guardian/guardedAccount_test.go | 252 ++++++++++++++++++++- process/interface.go | 2 +- testscommon/state/userAccountStub.go | 14 +- 9 files changed, 290 insertions(+), 21 deletions(-) diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index 4c5fb1b054f..10558f32cd8 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -28,6 +28,10 @@ # than this value, then the validators rating decrease should stop so they won't get jailed MaxConsecutiveRoundsOfRatingDecrease = 600 + # SetGuardianEpochsDelay represents the delay in epochs between the execution time of the SetGuardian transaction and + # the activation of the configured guardian + SetGuardianEpochsDelay = 20 + [Versions] DefaultVersion = "default" VersionsByEpochs = [ @@ -66,6 +70,7 @@ # it is a good idea to increase the maximum number of opened files allowed by the operating system FullArchiveNumActivePersisters = 10 + [MiniBlocksStorage] [MiniBlocksStorage.Cache] Name = "MiniBlocksStorage" diff --git a/config/config.go b/config/config.go index afff935ce41..5e864394a96 100644 --- a/config/config.go +++ b/config/config.go @@ -241,6 +241,7 @@ type GeneralSettingsConfig struct { MinTransactionVersion uint32 GenesisString string GenesisMaxNumberOfShards uint32 + SetGuardianEpochsDelay uint32 } // FacadeConfig will hold different configuration option that will be passed to the main ElrondFacade diff --git a/factory/bootstrapComponents.go b/factory/bootstrapComponents.go index 582eb26c338..76261b2b32f 100644 --- a/factory/bootstrapComponents.go +++ b/factory/bootstrapComponents.go @@ -164,7 +164,8 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() - guardedAccountHandler, err := guardian.NewGuardedAccount(bcf.coreComponents.InternalMarshalizer(), bcf.coreComponents.EpochNotifier()) + setGuardianEpochsDelay := bcf.config.GeneralSettings.SetGuardianEpochsDelay + guardedAccountHandler, err := guardian.NewGuardedAccount(bcf.coreComponents.InternalMarshalizer(), bcf.coreComponents.EpochNotifier(), setGuardianEpochsDelay) if err != nil { return nil, err } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 2a6f21d13c8..741561a9bd2 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -848,6 +848,6 @@ func getDefaultInterceptedTx() *mock.InterceptedTxHandlerStub { func createDummyFrozenAccount() state.UserAccountHandler { acc := state.NewEmptyUserAccount() metadata := &vmcommon.CodeMetadata{Frozen: true} - acc.SetCodeMetadata( metadata.ToBytes()) + acc.SetCodeMetadata(metadata.ToBytes()) return acc -} \ No newline at end of file +} diff --git a/process/errors.go b/process/errors.go index 6b82a599b4c..ed0f2e6c361 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1089,8 +1089,8 @@ var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") // ErrAccountHasNoGuardianSet signals that the account has no guardians set var ErrAccountHasNoGuardianSet = errors.New("account has no guardian set") -// ErrActiveHasNoActiveGuardian signals that the account has no active guardian -var ErrActiveHasNoActiveGuardian = errors.New("account has no active guardian") +// ErrAccountHasNoActiveGuardian signals that the account has no active guardian +var ErrAccountHasNoActiveGuardian = errors.New("account has no active guardian") // ErrNilGuardedAccountHandler signals that a nil guarded account handler was provided var ErrNilGuardedAccountHandler = errors.New("nil guarded account handler") @@ -1100,3 +1100,6 @@ var ErrOperationNotPermitted = errors.New("operation in account not permitted") // ErrTransactionAndAccountGuardianMismatch signals a mismatch between the guardian on the account and the one on the transaction var ErrTransactionAndAccountGuardianMismatch = errors.New("mismatch between transaction guardian and configured account guardian") + +// ErrInvalidSetGuardianEpochsDelay signals an invalid configuration for the epochs delay +var ErrInvalidSetGuardianEpochsDelay = errors.New("incorrect setting for set guardian epochs delay") diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index b2f24f53f46..7437d9e97a3 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -16,29 +16,35 @@ import ( var guardianKey = []byte(core.ElrondProtectedKeyPrefix + core.GuardiansKeyIdentifier) -const epochsForActivation = 10 // TODO: take from config - type guardedAccount struct { marshaller marshal.Marshalizer epochNotifier vmcommon.EpochNotifier mutEpoch sync.RWMutex - currentEpoch uint32 guardianActivationEpochs uint32 + currentEpoch uint32 + epochsForActivation uint32 } // NewGuardedAccount creates a new guarded account -func NewGuardedAccount(marshaller marshal.Marshalizer, epochNotifier vmcommon.EpochNotifier) (*guardedAccount, error) { +func NewGuardedAccount( + marshaller marshal.Marshalizer, + epochNotifier vmcommon.EpochNotifier, + setGuardianEpochsDelay uint32, +) (*guardedAccount, error) { if check.IfNil(marshaller) { return nil, process.ErrNilMarshalizer } if check.IfNil(epochNotifier) { return nil, process.ErrNilEpochNotifier } + if setGuardianEpochsDelay == 0 { + return nil, process.ErrInvalidSetGuardianEpochsDelay + } agc := &guardedAccount{ marshaller: marshaller, epochNotifier: epochNotifier, - guardianActivationEpochs: epochsForActivation, + guardianActivationEpochs: setGuardianEpochsDelay, } epochNotifier.RegisterNotifyHandler(agc) @@ -141,6 +147,9 @@ func (agc *guardedAccount) instantSetGuardian( return agc.saveAccountGuardians(accHandler, accountGuardians) } +// TODO: add constraints on not co-signed txs on interceptor, for setGuardian +// 1. Gas price cannot exceed a preconfigured limit +// 2. If there is already one guardian pending, do not allow setting another one func (agc *guardedAccount) updateGuardians(newGuardian *guardians.Guardian, accountGuardians *guardians.Guardians) (*guardians.Guardians, error) { numSetGuardians := len(accountGuardians.Slice) @@ -155,7 +164,7 @@ func (agc *guardedAccount) updateGuardians(newGuardian *guardians.Guardian, acco return nil, fmt.Errorf("%w in updateGuardians, with %d configured guardians", err, numSetGuardians) } - if activeGuardian.Equal(newGuardian) { + if bytes.Equal(activeGuardian.Address, newGuardian.Address) { accountGuardians.Slice = []*guardians.Guardian{activeGuardian} } else { accountGuardians.Slice = []*guardians.Guardian{activeGuardian, newGuardian} @@ -215,7 +224,7 @@ func (agc *guardedAccount) getActiveGuardian(gs *guardians.Guardians) (*guardian } if selectedGuardian == nil { - return nil, process.ErrActiveHasNoActiveGuardian + return nil, process.ErrAccountHasNoActiveGuardian } return selectedGuardian, nil diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index bf006b523f4..284bc963140 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -1,44 +1,278 @@ package guardian import ( + "errors" "testing" + "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" + "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/ElrondNetwork/elrond-go/testscommon/trie" + "github.com/ElrondNetwork/elrond-go/testscommon/vmcommonMocks" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/require" ) func TestNewAccountGuardianChecker(t *testing.T) { marshaller := &testscommon.MarshalizerMock{} en := &epochNotifier.EpochNotifierStub{} - ga, err := NewGuardedAccount(marshaller, en) + ga, err := NewGuardedAccount(marshaller, en, 10) require.Nil(t, err) require.NotNil(t, ga) - ga, err = NewGuardedAccount(nil, en) + ga, err = NewGuardedAccount(nil, en, 10) require.Equal(t, process.ErrNilMarshalizer, err) require.Nil(t, ga) - ga, err = NewGuardedAccount(marshaller, nil) + ga, err = NewGuardedAccount(marshaller, nil, 10) require.Equal(t, process.ErrNilEpochNotifier, err) require.Nil(t, ga) + + ga, err = NewGuardedAccount(marshaller, en, 0) + require.Equal(t, process.ErrInvalidSetGuardianEpochsDelay, err) + require.Nil(t, ga) } func TestGuardedAccount_getActiveGuardian(t *testing.T) { + ga := createGuardedAccountWithEpoch(9) + + t.Run("no guardians", func(t *testing.T) { + t.Parallel() + + configuredGuardians := &guardians.Guardians{} + activeGuardian, err := ga.getActiveGuardian(configuredGuardians) + require.Nil(t, activeGuardian) + require.Equal(t, process.ErrAccountHasNoActiveGuardian, err) + }) + t.Run("one pending guardian", func(t *testing.T) { + t.Parallel() + g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 11} + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + activeGuardian, err := ga.getActiveGuardian(configuredGuardians) + require.Nil(t, activeGuardian) + require.Equal(t, process.ErrAccountHasNoActiveGuardian, err) + }) + t.Run("one active guardian", func(t *testing.T) { + t.Parallel() + + g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 9} + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + activeGuardian, err := ga.getActiveGuardian(configuredGuardians) + require.Nil(t, err) + require.Equal(t, g1, activeGuardian) + }) + t.Run("one active and one pending", func(t *testing.T) { + t.Parallel() + + g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 9} + g2 := &guardians.Guardian{Address: []byte("addr2"), ActivationEpoch: 30} + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1, g2}} + activeGuardian, err := ga.getActiveGuardian(configuredGuardians) + require.Nil(t, err) + require.Equal(t, g1, activeGuardian) + }) + t.Run("one active and one too old", func(t *testing.T) { + t.Parallel() + + g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 8} + g2 := &guardians.Guardian{Address: []byte("addr2"), ActivationEpoch: 9} + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g2, g1}} + activeGuardian, err := ga.getActiveGuardian(configuredGuardians) + require.Nil(t, err) + require.Equal(t, g2, activeGuardian) + }) } func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { + ga := createGuardedAccountWithEpoch(10) + + t.Run("guardians key not found should err", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + acc := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } + + configuredGuardians, err := ga.getConfiguredGuardians(acc) + require.Nil(t, configuredGuardians) + require.Equal(t, expectedErr, err) + }) + t.Run("key found but no guardians, should return empty", func(t *testing.T) { + t.Parallel() + + acc := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, nil + }, + } + + configuredGuardians, err := ga.getConfiguredGuardians(acc) + require.Nil(t, err) + require.NotNil(t, configuredGuardians) + require.True(t, len(configuredGuardians.Slice) == 0) + }) + t.Run("unmarshal guardians error should return error", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + ga := createGuardedAccountWithEpoch(10) + ga.marshaller = &testscommon.MarshalizerStub{ + UnmarshalCalled: func(obj interface{}, buff []byte) error { + return expectedErr + }, + } + acc := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return []byte("wrongly marshalled guardians"), nil + }, + } + + configuredGuardians, err := ga.getConfiguredGuardians(acc) + require.Nil(t, configuredGuardians) + require.Equal(t, expectedErr, err) + }) + t.Run("unmarshal guardians error should return error", func(t *testing.T) { + t.Parallel() + + g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 9} + expectedConfiguredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + + acc := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(expectedConfiguredGuardians) + }, + } + configuredGuardians, err := ga.getConfiguredGuardians(acc) + require.Nil(t, err) + require.Equal(t, expectedConfiguredGuardians, configuredGuardians) + }) } func TestGuardedAccount_saveAccountGuardians(t *testing.T) { + userAccount := &vmcommonMocks.UserAccountStub{ + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + return nil + }, + } + }, + } + t.Run("marshaling error should return err", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + ga := createGuardedAccountWithEpoch(10) + ga.marshaller = &testscommon.MarshalizerStub{ + MarshalCalled: func(obj interface{}) ([]byte, error) { + return nil, expectedErr + }, + } + + err := ga.saveAccountGuardians(userAccount, nil) + require.Equal(t, expectedErr, err) + }) + t.Run("", func(t *testing.T) { + t.Parallel() + + SaveKeyValueCalled := false + userAccount.AccountDataHandlerCalled = func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + SaveKeyValueCalled = true + return nil + }, + } + } + + ga := createGuardedAccountWithEpoch(10) + err := ga.saveAccountGuardians(userAccount, nil) + require.Nil(t, err) + require.True(t, SaveKeyValueCalled) + }) } func TestGuardedAccount_updateGuardians(t *testing.T) { + ga := createGuardedAccountWithEpoch(10) + newGuardian:= &guardians.Guardian{ + Address: []byte("new guardian address"), + ActivationEpoch: 20, + } + + t.Run("update empty guardian list with new guardian", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} + expectedGuardians := append(configuredGuardians.Slice, newGuardian) + updatedGuardians, err := ga.updateGuardians(newGuardian, configuredGuardians) + require.Nil(t, err) + require.Equal(t, expectedGuardians, updatedGuardians.Slice) + }) + t.Run("updating when there is an existing pending guardian and no active should error", func(t *testing.T) { + existingGuardian:= &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: 11, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} + + updatedGuardians, err := ga.updateGuardians(newGuardian, configuredGuardians) + require.Nil(t, updatedGuardians) + require.True(t, errors.Is(err, process.ErrAccountHasNoActiveGuardian)) + }) + t.Run("updating the existing same active guardian should leave the active guardian unchanged", func(t *testing.T) { + existingGuardian:= &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: 9, + } + + newGuardian:= newGuardian + newGuardian.Address = existingGuardian.Address + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} + + updatedGuardians, err := ga.updateGuardians(newGuardian, configuredGuardians) + require.Nil(t, err) + require.Equal(t, configuredGuardians, updatedGuardians) + }) + t.Run("updating the existing same active guardian, when there is also a pending guardian configured, should clean up pending and leave active unchanged", func(t *testing.T) { + existingActiveGuardian:= &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: 9, + } + existingPendingGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: 13, + } + newGuardian:= newGuardian + newGuardian.Address = existingPendingGuardian.Address + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingActiveGuardian, existingPendingGuardian}} + expectedUpdatedGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingActiveGuardian, newGuardian}} + + updatedGuardians, err := ga.updateGuardians(newGuardian, configuredGuardians) + require.Nil(t, err) + require.Equal(t, expectedUpdatedGuardians, updatedGuardians) + }) + // todo: if todo in guarded account is implemented, this will need to be changed + t.Run("updating the existing same pending guardian while there is an active one should leave the active guardian unchanged but update the pending", func(t *testing.T) { + existingGuardian:= &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: 9, + } + + newGuardian:= newGuardian + newGuardian.Address = existingGuardian.Address + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} + + updatedGuardians, err := ga.updateGuardians(newGuardian, configuredGuardians) + require.Nil(t, err) + require.Equal(t, configuredGuardians, updatedGuardians) + }) } func TestGuardedAccount_setAccountGuardian(t *testing.T) { @@ -64,3 +298,15 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { func TestAccountGuardianChecker_IsInterfaceNil(t *testing.T) { } + +func createGuardedAccountWithEpoch(epoch uint32) *guardedAccount { + marshaller := &testscommon.MarshalizerMock{} + en := &epochNotifier.EpochNotifierStub{ + RegisterNotifyHandlerCalled: func(handler vmcommon.EpochSubscriberHandler) { + handler.EpochConfirmed(epoch, 0) + }, + } + + ga, _ := NewGuardedAccount(marshaller, en, 10) + return ga +} diff --git a/process/interface.go b/process/interface.go index 5d081ccdd25..b1832161581 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1219,7 +1219,7 @@ type GuardianChecker interface { // GuardedAccountHandler allows setting and getting the configured account guardian type GuardedAccountHandler interface { GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) - SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte) error + SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error IsInterfaceNil() bool } diff --git a/testscommon/state/userAccountStub.go b/testscommon/state/userAccountStub.go index 16fdf204d38..30c94f8ebf6 100644 --- a/testscommon/state/userAccountStub.go +++ b/testscommon/state/userAccountStub.go @@ -12,10 +12,11 @@ var _ state.UserAccountHandler = (*UserAccountStub)(nil) // UserAccountStub - type UserAccountStub struct { - Balance *big.Int - AddToBalanceCalled func(value *big.Int) error - DataTrieTrackerCalled func() state.DataTrieTracker - IsFrozenCalled func() bool + Balance *big.Int + AddToBalanceCalled func(value *big.Int) error + DataTrieTrackerCalled func() state.DataTrieTracker + IsFrozenCalled func() bool + RetrieveValueFromDataTrieTrackerCalled func(key []byte) ([]byte, error) } // HasNewCode - @@ -139,7 +140,10 @@ func (u *UserAccountStub) DataTrie() common.Trie { } // RetrieveValueFromDataTrieTracker - -func (u *UserAccountStub) RetrieveValueFromDataTrieTracker(_ []byte) ([]byte, error) { +func (u *UserAccountStub) RetrieveValueFromDataTrieTracker(key []byte) ([]byte, error) { + if u.RetrieveValueFromDataTrieTrackerCalled != nil { + return u.RetrieveValueFromDataTrieTrackerCalled(key) + } return nil, nil } From d7d32bfd49517241278a15f831d4e011de4867a4 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 24 May 2022 22:52:56 +0300 Subject: [PATCH 041/335] refactor unit tests for createTransation in order to reduce duplicated args code --- node/node_test.go | 627 ++++++++-------------------------------------- 1 file changed, 102 insertions(+), 525 deletions(-) diff --git a/node/node_test.go b/node/node_test.go index ae1b0690ac4..fbb4646c30a 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -1214,6 +1214,26 @@ func TestGenerateTransaction_CorrectParamsShouldNotError(t *testing.T) { assert.Nil(t, err) } +func getDefaultTransactionArgs() *external.ArgsCreateTransaction { + return &external.ArgsCreateTransaction{ + Nonce: uint64(0), + Value: new(big.Int).SetInt64(10).String(), + Receiver: "rcv", + ReceiverUsername: []byte("rcvrUsername"), + Sender: "snd", + SenderUsername: []byte("sndrUsername"), + GasPrice: uint64(10), + GasLimit: uint64(20), + DataField: []byte("-"), + SignatureHex: hex.EncodeToString(bytes.Repeat([]byte{0}, 10)), + ChainID: "chainID", + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } +} + func TestCreateTransaction_NilAddrConverterShouldErr(t *testing.T) { t.Parallel() @@ -1230,34 +1250,8 @@ func TestCreateTransaction_NilAddrConverterShouldErr(t *testing.T) { node.WithStateComponents(stateComponents), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "" - sender := "" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := "-" - coreComponents.AddrPubKeyConv = nil - chainID := coreComponents.ChainID() - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs := getDefaultTransactionArgs() tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) @@ -1287,34 +1281,9 @@ func TestCreateTransaction_NilAccountsAdapterShouldErr(t *testing.T) { node.WithProcessComponents(processComponents), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "" - sender := "" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := "-" - stateComponents.AccountsAPI = nil - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: coreComponents.ChainID(), - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs := getDefaultTransactionArgs() tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) @@ -1343,32 +1312,8 @@ func TestCreateTransaction_InvalidSignatureShouldErr(t *testing.T) { node.WithStateComponents(stateComponents), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := "-" - - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: "chainID", - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs := getDefaultTransactionArgs() + txArgs.SignatureHex = "-" tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) @@ -1411,77 +1356,28 @@ func TestCreateTransaction_ChainIDFieldChecks(t *testing.T) { node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") signature := hex.EncodeToString([]byte(strings.Repeat("s", 10))) - emptyChainID := "" - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: emptyChainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs := getDefaultTransactionArgs() + txArgs.SignatureHex = signature + txArgs.ChainID = emptyChainID _, _, err := n.CreateTransaction(txArgs) assert.Equal(t, node.ErrInvalidChainIDInTransaction, err) for i := 1; i < len(chainID); i++ { newChainID := strings.Repeat("c", i) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: newChainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs = getDefaultTransactionArgs() + txArgs.SignatureHex = signature + txArgs.ChainID = newChainID _, _, err = n.CreateTransaction(txArgs) assert.NoError(t, err) } newChainID := chainID + "additional text" - txArgs = &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: newChainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs = getDefaultTransactionArgs() + txArgs.SignatureHex = signature + txArgs.ChainID = newChainID + _, _, err = n.CreateTransaction(txArgs) assert.Equal(t, node.ErrInvalidChainIDInTransaction, err) } @@ -1518,32 +1414,11 @@ func TestCreateTransaction_InvalidTxVersionShouldErr(t *testing.T) { node.WithStateComponents(stateComponents), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := "617eff4f" + txArgs := getDefaultTransactionArgs() + txArgs.Version = 0 + txArgs.ChainID = "" + txArgs.SignatureHex = "617eff4f" - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: "", - Version: 0, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } _, _, err := n.CreateTransaction(txArgs) assert.Equal(t, node.ErrInvalidTransactionVersion, err) } @@ -1616,30 +1491,15 @@ func TestCreateTransaction_SenderShardIdIsInDifferentShardShouldNotValidate(t *t nonce := uint64(0) value := new(big.Int).SetInt64(10) receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: string(chainID), - Version: version, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs := getDefaultTransactionArgs() + txArgs.Version = version + txArgs.Nonce = nonce + txArgs.Value = value.String() + txArgs.Receiver = receiver + tx, txHash, err := n.CreateTransaction(txArgs) + assert.NotNil(t, tx) assert.Equal(t, expectedHash, txHash) assert.Nil(t, err) @@ -1693,34 +1553,16 @@ func TestCreateTransaction_SignatureLengthChecks(t *testing.T) { node.WithAddressSignatureSize(signatureLength), ) - nonce := uint64(0) value := "1" + strings.Repeat("0", maxValueLength) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") + txArgs := getDefaultTransactionArgs() + txArgs.Value = value for i := 0; i <= signatureLength; i++ { signatureBytes := []byte(strings.Repeat("a", i)) signatureHex := hex.EncodeToString(signatureBytes) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signatureHex, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + + txArgs.SignatureHex = signatureHex + tx, _, err := n.CreateTransaction(txArgs) assert.NotNil(t, tx) assert.NoError(t, err) @@ -1728,23 +1570,8 @@ func TestCreateTransaction_SignatureLengthChecks(t *testing.T) { } signature := hex.EncodeToString([]byte(strings.Repeat("a", signatureLength+1))) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs.SignatureHex = signature + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) @@ -1793,55 +1620,18 @@ func TestCreateTransaction_SenderLengthChecks(t *testing.T) { node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := "10" - receiver := "rcv" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) + txArgs := getDefaultTransactionArgs() + txArgs.ChainID = chainID for i := 0; i <= encodedAddressLen; i++ { - sender := strings.Repeat("s", i) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs.Sender = strings.Repeat("s", i) + _, _, err := n.CreateTransaction(txArgs) assert.NoError(t, err) } - sender := strings.Repeat("s", encodedAddressLen) + "additional" - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs.Sender = strings.Repeat("s", encodedAddressLen) + "additional" + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) @@ -1891,55 +1681,18 @@ func TestCreateTransaction_ReceiverLengthChecks(t *testing.T) { node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := "10" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) + txArgs := getDefaultTransactionArgs() + txArgs.ChainID = chainID for i := 0; i <= encodedAddressLen; i++ { - receiver := strings.Repeat("r", i) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs.Receiver = strings.Repeat("r", i) + _, _, err := n.CreateTransaction(txArgs) assert.NoError(t, err) } - receiver := strings.Repeat("r", encodedAddressLen) + "additional" - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs.Receiver = strings.Repeat("r", encodedAddressLen) + "additional" + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) @@ -1988,34 +1741,11 @@ func TestCreateTransaction_TooBigSenderUsernameShouldErr(t *testing.T) { node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := "1" + strings.Repeat("0", maxLength+1) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - - senderUsername := bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) + txArgs := getDefaultTransactionArgs() + txArgs.Value = "1" + strings.Repeat("0", maxLength+1) + txArgs.ChainID = chainID + txArgs.SenderUsername = bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: senderUsername, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) @@ -2064,34 +1794,11 @@ func TestCreateTransaction_TooBigReceiverUsernameShouldErr(t *testing.T) { node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := "1" + strings.Repeat("0", maxLength+1) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - - receiverUsername := bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) + txArgs := getDefaultTransactionArgs() + txArgs.ChainID = chainID + txArgs.ReceiverUsername = bytes.Repeat([]byte{0}, core.MaxUserNameLength+1) + txArgs.Value = "1" + strings.Repeat("0", maxLength+1) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: receiverUsername, - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) @@ -2139,32 +1846,12 @@ func TestCreateTransaction_DataFieldSizeExceedsMaxShouldErr(t *testing.T) { node.WithStateComponents(stateComponents), node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := "1" + strings.Repeat("0", maxLength+1) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := bytes.Repeat([]byte{0}, core.MegabyteSize+1) - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs := getDefaultTransactionArgs() + txArgs.ChainID = chainID + txArgs.DataField = bytes.Repeat([]byte{0}, core.MegabyteSize+1) + txArgs.Value = "1" + strings.Repeat("0", maxLength+1) + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) @@ -2213,32 +1900,10 @@ func TestCreateTransaction_TooLargeValueFieldShouldErr(t *testing.T) { node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := "1" + strings.Repeat("0", maxLength+1) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) + txArgs := getDefaultTransactionArgs() + txArgs.ChainID = chainID + txArgs.Value = "1" + strings.Repeat("0", maxLength+1) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: []byte("rcvrUsername"), - Sender: sender, - SenderUsername: []byte("sndrUsername"), - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) assert.Empty(t, txHash) @@ -2268,33 +1933,10 @@ func TestCreateTransaction_InvalidGuardianSigShouldErr(t *testing.T) { node.WithAddressSignatureSize(16), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 1)) - guardianSig := hex.EncodeToString(bytes.Repeat([]byte{0}, 32)) + txArgs := getDefaultTransactionArgs() + txArgs.SignatureHex = hex.EncodeToString(bytes.Repeat([]byte{0}, 1)) + txArgs.GuardianSigHex = hex.EncodeToString(bytes.Repeat([]byte{0}, 32)) - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: "chainID", - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: guardianSig, - } tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) @@ -2330,34 +1972,11 @@ func TestCreateTransaction_InvalidGuardianAddressLenShouldErr(t *testing.T) { node.WithAddressSignatureSize(16), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) - guardianSig := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) - guardian := strings.Repeat("g", encodedAddressLen) + "additional" + txArgs := getDefaultTransactionArgs() + txArgs.SignatureHex = hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) + txArgs.GuardianSigHex = hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) + txArgs.Guardian = strings.Repeat("g", encodedAddressLen) + "additional" - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: "chainID", - Version: 1, - Options: 0, - Guardian: guardian, - GuardianSigHex: guardianSig, - } tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) @@ -2383,13 +2002,6 @@ func TestCreateTransaction_AddressPubKeyConverterDecode(t *testing.T) { }, } - // transaction parameters - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) guardianSig := hex.EncodeToString(bytes.Repeat([]byte{0}, 8)) guardian := strings.Repeat("g", encodedAddressLen) @@ -2412,26 +2024,10 @@ func TestCreateTransaction_AddressPubKeyConverterDecode(t *testing.T) { node.WithAddressSignatureSize(16), ) - receiver := "rcv" - sender := "snd" - - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: "chainID", - Version: 1, - Options: 0, - Guardian: guardian, - GuardianSigHex: guardianSig, - } + txArgs := getDefaultTransactionArgs() + txArgs.Guardian = guardian + txArgs.GuardianSigHex = guardianSig + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) @@ -2458,26 +2054,11 @@ func TestCreateTransaction_AddressPubKeyConverterDecode(t *testing.T) { node.WithAddressSignatureSize(16), ) - receiver := strings.Repeat("r", minAddrLen+1) - sender := "snd" - - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: "chainID", - Version: 1, - Options: 0, - Guardian: guardian, - GuardianSigHex: guardianSig, - } + txArgs := getDefaultTransactionArgs() + txArgs.Guardian = guardian + txArgs.GuardianSigHex = guardianSig + txArgs.Receiver = strings.Repeat("r", minAddrLen+1) + tx, txHash, err := n.CreateTransaction(txArgs) assert.Nil(t, tx) @@ -2544,22 +2125,18 @@ func TestCreateTransaction_OkValsShouldWork(t *testing.T) { nonce := uint64(0) value := new(big.Int).SetInt64(10) receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, + Nonce: uint64(0), Value: value.String(), - Receiver: receiver, + Receiver: "rcv", ReceiverUsername: nil, - Sender: sender, + Sender: "snd", SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, + GasPrice: uint64(10), + GasLimit: uint64(20), + DataField: []byte("-"), SignatureHex: signature, ChainID: coreComponents.ChainID(), Version: coreComponents.MinTransactionVersion(), From 569ff99f5900c3053fa427a2e87f03f41f818e11 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Tue, 24 May 2022 23:01:11 +0300 Subject: [PATCH 042/335] refactor unit tests for createTransation: remove duplicated code for remaining ok tests --- node/node_test.go | 89 ++++++++++------------------------------------- 1 file changed, 19 insertions(+), 70 deletions(-) diff --git a/node/node_test.go b/node/node_test.go index fbb4646c30a..3321e42455a 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -2125,25 +2125,14 @@ func TestCreateTransaction_OkValsShouldWork(t *testing.T) { nonce := uint64(0) value := new(big.Int).SetInt64(10) receiver := "rcv" - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - txArgs := &external.ArgsCreateTransaction{ - Nonce: uint64(0), - Value: value.String(), - Receiver: "rcv", - ReceiverUsername: nil, - Sender: "snd", - SenderUsername: nil, - GasPrice: uint64(10), - GasLimit: uint64(20), - DataField: []byte("-"), - SignatureHex: signature, - ChainID: coreComponents.ChainID(), - Version: coreComponents.MinTransactionVersion(), - Options: 0, - Guardian: "", - GuardianSigHex: "", - } + txArgs := getDefaultTransactionArgs() + txArgs.Receiver = receiver + txArgs.Nonce = nonce + txArgs.Value = value.String() + txArgs.ChainID = coreComponents.ChainID() + txArgs.Version = coreComponents.MinTransactionVersion() + tx, txHash, err := n.CreateTransaction(txArgs) assert.NotNil(t, tx) assert.Equal(t, expectedHash, txHash) @@ -2234,33 +2223,13 @@ func TestCreateTransaction_TxSignedWithHashShouldErrVersionShoudBe2(t *testing.T node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - options := transaction.MaskSignedWithHash - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: version, - Options: options, - Guardian: "", - GuardianSigHex: "", - } + + txArgs := getDefaultTransactionArgs() + txArgs.ChainID = chainID + txArgs.Version = version + txArgs.Options = options + tx, _, err := n.CreateTransaction(txArgs) require.Nil(t, err) err = n.ValidateTransaction(tx) @@ -2352,33 +2321,13 @@ func TestCreateTransaction_TxSignedWithHashNoEnabledShouldErr(t *testing.T) { node.WithAddressSignatureSize(10), ) - nonce := uint64(0) - value := new(big.Int).SetInt64(10) - receiver := "rcv" - sender := "snd" - gasPrice := uint64(10) - gasLimit := uint64(20) - txData := []byte("-") - signature := hex.EncodeToString(bytes.Repeat([]byte{0}, 10)) - options := transaction.MaskSignedWithHash - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value.String(), - Receiver: receiver, - ReceiverUsername: nil, - Sender: sender, - SenderUsername: nil, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signature, - ChainID: chainID, - Version: version + 1, - Options: options, - Guardian: "", - GuardianSigHex: "", - } + + txArgs := getDefaultTransactionArgs() + txArgs.ChainID = chainID + txArgs.Version = version + 1 + txArgs.Options = options + tx, _, _ := n.CreateTransaction(txArgs) err := n.ValidateTransaction(tx) From a9ec6e32af99e5d30d35a6a20feb2774bac90e2a Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 25 May 2022 10:59:48 +0300 Subject: [PATCH 043/335] refactor createTransaction in facade and api --- api/groups/transactionGroup.go | 144 ++++++++++++++-------------- api/groups/transactionGroup_test.go | 19 ++-- api/mock/facadeStub.go | 37 ++----- api/shared/interface.go | 3 +- facade/initial/initialNodeFacade.go | 17 +--- facade/nodeFacade.go | 36 +------ facade/nodeFacade_test.go | 19 +++- 7 files changed, 116 insertions(+), 159 deletions(-) diff --git a/api/groups/transactionGroup.go b/api/groups/transactionGroup.go index 0bc69ea1a93..cd0808f085d 100644 --- a/api/groups/transactionGroup.go +++ b/api/groups/transactionGroup.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/api/errors" "github.com/ElrondNetwork/elrond-go/api/middleware" "github.com/ElrondNetwork/elrond-go/api/shared" + nodeExternal "github.com/ElrondNetwork/elrond-go/node/external" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/gin-gonic/gin" ) @@ -35,8 +36,7 @@ const ( // transactionFacadeHandler defines the methods to be implemented by a facade for transaction requests type transactionFacadeHandler interface { - CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) + CreateTransaction(txArgs *nodeExternal.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransaction(tx *transaction.Transaction) error ValidateTransactionForSimulation(tx *transaction.Transaction, checkSignature bool) error SendBulkTransactions([]*transaction.Transaction) (uint64, error) @@ -194,23 +194,24 @@ func (tg *transactionGroup) simulateTransaction(c *gin.Context) { return } - tx, txHash, err := tg.getFacade().CreateTransaction( - gtx.Nonce, - gtx.Value, - gtx.Receiver, - gtx.ReceiverUsername, - gtx.Sender, - gtx.SenderUsername, - gtx.GasPrice, - gtx.GasLimit, - gtx.Data, - gtx.Signature, - gtx.ChainID, - gtx.Version, - gtx.Options, - gtx.GuardianAddr, - gtx.GuardianSignature, - ) + txArgs := &nodeExternal.ArgsCreateTransaction{ + Nonce: gtx.Nonce, + Value: gtx.Value, + Receiver: gtx.Receiver, + ReceiverUsername: gtx.ReceiverUsername, + Sender: gtx.Sender, + SenderUsername: gtx.SenderUsername, + GasPrice: gtx.GasPrice, + GasLimit: gtx.GasLimit, + DataField: gtx.Data, + SignatureHex: gtx.Signature, + ChainID: gtx.ChainID, + Version: gtx.Version, + Options: gtx.Options, + Guardian: gtx.GuardianAddr, + GuardianSigHex: gtx.GuardianSignature, + } + tx, txHash, err := tg.getFacade().CreateTransaction(txArgs) if err != nil { c.JSON( http.StatusBadRequest, @@ -276,23 +277,24 @@ func (tg *transactionGroup) sendTransaction(c *gin.Context) { return } - tx, txHash, err := tg.getFacade().CreateTransaction( - gtx.Nonce, - gtx.Value, - gtx.Receiver, - gtx.ReceiverUsername, - gtx.Sender, - gtx.SenderUsername, - gtx.GasPrice, - gtx.GasLimit, - gtx.Data, - gtx.Signature, - gtx.ChainID, - gtx.Version, - gtx.Options, - gtx.GuardianAddr, - gtx.GuardianSignature, - ) + txArgs := &nodeExternal.ArgsCreateTransaction{ + Nonce: gtx.Nonce, + Value: gtx.Value, + Receiver: gtx.Receiver, + ReceiverUsername: gtx.ReceiverUsername, + Sender: gtx.Sender, + SenderUsername: gtx.SenderUsername, + GasPrice: gtx.GasPrice, + GasLimit: gtx.GasLimit, + DataField: gtx.Data, + SignatureHex: gtx.Signature, + ChainID: gtx.ChainID, + Version: gtx.Version, + Options: gtx.Options, + Guardian: gtx.GuardianAddr, + GuardianSigHex: gtx.GuardianSignature, + } + tx, txHash, err := tg.getFacade().CreateTransaction(txArgs) if err != nil { c.JSON( http.StatusBadRequest, @@ -366,23 +368,24 @@ func (tg *transactionGroup) sendMultipleTransactions(c *gin.Context) { txsHashes := make(map[int]string) for idx, receivedTx := range gtx { - tx, txHash, err = tg.getFacade().CreateTransaction( - receivedTx.Nonce, - receivedTx.Value, - receivedTx.Receiver, - receivedTx.ReceiverUsername, - receivedTx.Sender, - receivedTx.SenderUsername, - receivedTx.GasPrice, - receivedTx.GasLimit, - receivedTx.Data, - receivedTx.Signature, - receivedTx.ChainID, - receivedTx.Version, - receivedTx.Options, - receivedTx.GuardianAddr, - receivedTx.GuardianSignature, - ) + txArgs := &nodeExternal.ArgsCreateTransaction{ + Nonce: receivedTx.Nonce, + Value: receivedTx.Value, + Receiver: receivedTx.Receiver, + ReceiverUsername: receivedTx.ReceiverUsername, + Sender: receivedTx.Sender, + SenderUsername: receivedTx.SenderUsername, + GasPrice: receivedTx.GasPrice, + GasLimit: receivedTx.GasLimit, + DataField: receivedTx.Data, + SignatureHex: receivedTx.Signature, + ChainID: receivedTx.ChainID, + Version: receivedTx.Version, + Options: receivedTx.Options, + Guardian: receivedTx.GuardianAddr, + GuardianSigHex: receivedTx.GuardianSignature, + } + tx, txHash, err = tg.getFacade().CreateTransaction(txArgs) if err != nil { continue } @@ -489,23 +492,24 @@ func (tg *transactionGroup) computeTransactionGasLimit(c *gin.Context) { return } - tx, _, err := tg.getFacade().CreateTransaction( - gtx.Nonce, - gtx.Value, - gtx.Receiver, - gtx.ReceiverUsername, - gtx.Sender, - gtx.SenderUsername, - gtx.GasPrice, - gtx.GasLimit, - gtx.Data, - gtx.Signature, - gtx.ChainID, - gtx.Version, - gtx.Options, - gtx.GuardianAddr, - gtx.GuardianSignature, - ) + txArgs := &nodeExternal.ArgsCreateTransaction{ + Nonce: gtx.Nonce, + Value: gtx.Value, + Receiver: gtx.Receiver, + ReceiverUsername: gtx.ReceiverUsername, + Sender: gtx.Sender, + SenderUsername: gtx.SenderUsername, + GasPrice: gtx.GasPrice, + GasLimit: gtx.GasLimit, + DataField: gtx.Data, + SignatureHex: gtx.Signature, + ChainID: gtx.ChainID, + Version: gtx.Version, + Options: gtx.Options, + Guardian: gtx.GuardianAddr, + GuardianSigHex: gtx.GuardianSignature, + } + tx, _, err := tg.getFacade().CreateTransaction(txArgs) if err != nil { c.JSON( http.StatusInternalServerError, diff --git a/api/groups/transactionGroup_test.go b/api/groups/transactionGroup_test.go index 214795eff1e..34db9f1d45a 100644 --- a/api/groups/transactionGroup_test.go +++ b/api/groups/transactionGroup_test.go @@ -19,6 +19,7 @@ import ( "github.com/ElrondNetwork/elrond-go/api/mock" "github.com/ElrondNetwork/elrond-go/api/shared" "github.com/ElrondNetwork/elrond-go/config" + "github.com/ElrondNetwork/elrond-go/node/external" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -267,7 +268,7 @@ func TestSendTransaction_ErrorWhenFacadeSendTransactionError(t *testing.T) { errorString := "send transaction error" facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return nil, nil, nil }, SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, err error) { @@ -315,7 +316,7 @@ func TestSendTransaction_ReturnsSuccessfully(t *testing.T) { hexTxHash := "deadbeef" facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { txHash, _ := hex.DecodeString(hexTxHash) return nil, txHash, nil }, @@ -421,7 +422,7 @@ func TestSendMultipleTransactions_OkPayloadShouldWork(t *testing.T) { sendBulkTxsWasCalled := false facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { createTxWasCalled = true return &dataTx.Transaction{}, make([]byte, 0), nil }, @@ -474,7 +475,7 @@ func TestComputeTransactionGasLimit(t *testing.T) { expectedGasLimit := uint64(37) facade := mock.FacadeStub{ - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, nil, nil }, ComputeTransactionGasLimitHandler: func(tx *dataTx.Transaction) (*dataTx.CostResponse, error) { @@ -553,7 +554,7 @@ func TestSimulateTransaction_CreateErrorsShouldErr(t *testing.T) { Hash: "hash", }, nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return nil, nil, expectedErr }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { @@ -608,7 +609,7 @@ func TestSimulateTransaction_ValidateErrorsShouldErr(t *testing.T) { Hash: "hash", }, nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { @@ -688,7 +689,7 @@ func TestSimulateTransaction_UseQueryParameterShouldWork(t *testing.T) { assert.True(t, bypassSignature) return nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { @@ -732,7 +733,7 @@ func TestSimulateTransaction_ProcessErrorsShouldErr(t *testing.T) { SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { return nil, expectedErr }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { @@ -785,7 +786,7 @@ func TestSimulateTransaction(t *testing.T) { Hash: "hash", }, nil }, - CreateTransactionHandler: func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*dataTx.Transaction, []byte, error) { + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, []byte("hash"), nil }, ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index c39f72bf7c8..fa17eb473bc 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -20,15 +20,14 @@ import ( // FacadeStub is the mock implementation of a node router handler type FacadeStub struct { - ShouldErrorStart bool - ShouldErrorStop bool - GetHeartbeatsHandler func() ([]data.PubKeyHeartbeat, error) - BalanceHandler func(string) (*big.Int, error) - GetAccountHandler func(address string) (api.AccountResponse, error) - GenerateTransactionHandler func(sender string, receiver string, value *big.Int, code string) (*transaction.Transaction, error) - GetTransactionHandler func(hash string, withResults bool) (*transaction.ApiTransactionResult, error) - CreateTransactionHandler func(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) + ShouldErrorStart bool + ShouldErrorStop bool + GetHeartbeatsHandler func() ([]data.PubKeyHeartbeat, error) + BalanceHandler func(string) (*big.Int, error) + GetAccountHandler func(address string) (api.AccountResponse, error) + GenerateTransactionHandler func(sender string, receiver string, value *big.Int, code string) (*transaction.Transaction, error) + GetTransactionHandler func(hash string, withResults bool) (*transaction.ApiTransactionResult, error) + CreateTransactionHandler func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransactionHandler func(tx *transaction.Transaction) error ValidateTransactionForSimulationHandler func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) @@ -231,24 +230,8 @@ func (f *FacadeStub) GetAccount(address string) (api.AccountResponse, error) { } // CreateTransaction is mock implementation of a handler's CreateTransaction method -func (f *FacadeStub) CreateTransaction( - nonce uint64, - value string, - receiver string, - receiverUsername []byte, - sender string, - senderUsername []byte, - gasPrice uint64, - gasLimit uint64, - data []byte, - signatureHex string, - chainID string, - version uint32, - options uint32, - guardian string, - guardianSigHex string, -) (*transaction.Transaction, []byte, error) { - return f.CreateTransactionHandler(nonce, value, receiver, receiverUsername, sender, senderUsername, gasPrice, gasLimit, data, signatureHex, chainID, version, options, guardian, guardianSigHex) +func (f *FacadeStub) CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { + return f.CreateTransactionHandler(txArgs) } // GetTransaction is the mock implementation of a handler's GetTransaction method diff --git a/api/shared/interface.go b/api/shared/interface.go index 5a649f51034..db19adf3028 100644 --- a/api/shared/interface.go +++ b/api/shared/interface.go @@ -91,8 +91,7 @@ type FacadeHandler interface { GetProofCurrentRootHash(address string) (*common.GetProofResponse, error) VerifyProof(rootHash string, address string, proof [][]byte) (bool, error) GetThrottlerForEndpoint(endpoint string) (core.Throttler, bool) - CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) + CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransaction(tx *transaction.Transaction) error ValidateTransactionForSimulation(tx *transaction.Transaction, checkSignature bool) error SendBulkTransactions([]*transaction.Transaction) (uint64, error) diff --git a/facade/initial/initialNodeFacade.go b/facade/initial/initialNodeFacade.go index abfbbeaca92..e2d940c3b16 100644 --- a/facade/initial/initialNodeFacade.go +++ b/facade/initial/initialNodeFacade.go @@ -109,22 +109,7 @@ func (inf *initialNodeFacade) GetESDTsWithRole(_ string, _ string) ([]string, er } // CreateTransaction return nil and error -func (inf *initialNodeFacade) CreateTransaction( - _ uint64, - _ string, - _ string, - _ []byte, - _ string, - _ []byte, - _ uint64, - _ uint64, - _ []byte, - _ string, - _ string, - _ uint32, - _ uint32, - _ string, - _ string) (*transaction.Transaction, []byte, error) { +func (inf *initialNodeFacade) CreateTransaction(_ *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { return nil, nil, errNodeStarting } diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index bd2705376ec..028078bfbfc 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -21,6 +21,7 @@ import ( "github.com/ElrondNetwork/elrond-go/debug" "github.com/ElrondNetwork/elrond-go/heartbeat/data" "github.com/ElrondNetwork/elrond-go/node/external" + nodeExternal "github.com/ElrondNetwork/elrond-go/node/external" "github.com/ElrondNetwork/elrond-go/ntp" "github.com/ElrondNetwork/elrond-go/process" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" @@ -217,40 +218,7 @@ func (nf *nodeFacade) GetAllIssuedESDTs(tokenType string) ([]string, error) { } // CreateTransaction creates a transaction from all needed fields -func (nf *nodeFacade) CreateTransaction( - nonce uint64, - value string, - receiver string, - receiverUsername []byte, - sender string, - senderUsername []byte, - gasPrice uint64, - gasLimit uint64, - txData []byte, - signatureHex string, - chainID string, - version uint32, - options uint32, - guardian string, - guardianSigHex string, -) (*transaction.Transaction, []byte, error) { - txArgs := &external.ArgsCreateTransaction{ - Nonce: nonce, - Value: value, - Receiver: receiver, - ReceiverUsername: receiverUsername, - Sender: sender, - SenderUsername: senderUsername, - GasPrice: gasPrice, - GasLimit: gasLimit, - DataField: txData, - SignatureHex: signatureHex, - ChainID: chainID, - Version: version, - Options: options, - Guardian: guardian, - GuardianSigHex: guardianSigHex, - } +func (nf *nodeFacade) CreateTransaction(txArgs *nodeExternal.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { return nf.node.CreateTransaction(txArgs) } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 901f49284c7..431cee29546 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -498,7 +498,24 @@ func TestNodeFacade_CreateTransaction(t *testing.T) { arg.Node = node nf, _ := NewNodeFacade(arg) - _, _, _ = nf.CreateTransaction(0, "0", "0", nil, "0", nil, 0, 0, []byte("0"), "0", "chainID", 1, 0, "", "") + txArgs := &external.ArgsCreateTransaction{ + Nonce: uint64(0), + Value: "0", + Receiver: "0", + ReceiverUsername: nil, + Sender: "0", + SenderUsername: nil, + GasPrice: 0, + GasLimit: 0, + DataField: []byte("0"), + SignatureHex: "0", + ChainID: "chainID", + Version: 1, + Options: 0, + Guardian: "", + GuardianSigHex: "", + } + _, _, _ = nf.CreateTransaction(txArgs) assert.True(t, nodeCreateTxWasCalled) } From fccdbbf995aba850c5bbdb040bb6677485061d2a Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 25 May 2022 11:04:03 +0300 Subject: [PATCH 044/335] refactor createTransaction in facade: update in initial, fix unit test --- facade/initial/initialNodeFacade_test.go | 4 ++-- facade/nodeFacade_test.go | 19 +------------------ 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/facade/initial/initialNodeFacade_test.go b/facade/initial/initialNodeFacade_test.go index 7cdd2f1427f..563f6f0f1dc 100644 --- a/facade/initial/initialNodeFacade_test.go +++ b/facade/initial/initialNodeFacade_test.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data/api" + "github.com/ElrondNetwork/elrond-go/node/external" "github.com/stretchr/testify/assert" ) @@ -45,8 +46,7 @@ func TestDisabledNodeFacade_AllMethodsShouldNotPanic(t *testing.T) { assert.Nil(t, s3) assert.Equal(t, errNodeStarting, err) - n1, n2, err := inf.CreateTransaction(uint64(0), "", "", []byte{0}, "", - []byte{0}, uint64(0), uint64(0), []byte{0}, "", "", uint32(0), uint32(0), "", "") + n1, n2, err := inf.CreateTransaction(&external.ArgsCreateTransaction{}) assert.Nil(t, n1) assert.Nil(t, n2) assert.Equal(t, errNodeStarting, err) diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 431cee29546..e2ad43e54a7 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -498,24 +498,7 @@ func TestNodeFacade_CreateTransaction(t *testing.T) { arg.Node = node nf, _ := NewNodeFacade(arg) - txArgs := &external.ArgsCreateTransaction{ - Nonce: uint64(0), - Value: "0", - Receiver: "0", - ReceiverUsername: nil, - Sender: "0", - SenderUsername: nil, - GasPrice: 0, - GasLimit: 0, - DataField: []byte("0"), - SignatureHex: "0", - ChainID: "chainID", - Version: 1, - Options: 0, - Guardian: "", - GuardianSigHex: "", - } - _, _, _ = nf.CreateTransaction(txArgs) + _, _, _ = nf.CreateTransaction(&external.ArgsCreateTransaction{}) assert.True(t, nodeCreateTxWasCalled) } From b767f317248a2ee0aec16fba8279abd9a721021c Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 25 May 2022 11:29:35 +0300 Subject: [PATCH 045/335] refactor createTransaction: fix integration test --- integrationTests/interface.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/integrationTests/interface.go b/integrationTests/interface.go index 9cafa1cc337..34b48c0fa7c 100644 --- a/integrationTests/interface.go +++ b/integrationTests/interface.go @@ -79,8 +79,7 @@ type Facade interface { GetPeerInfo(pid string) ([]core.QueryP2PPeerInfo, error) GetNumCheckpointsFromAccountState() uint32 GetNumCheckpointsFromPeerState() uint32 - CreateTransaction(nonce uint64, value string, receiver string, receiverUsername []byte, sender string, senderUsername []byte, gasPrice uint64, - gasLimit uint64, data []byte, signatureHex string, chainID string, version uint32, options uint32, guardian string, guardianSigHex string) (*transaction.Transaction, []byte, error) + CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransaction(tx *transaction.Transaction) error ValidateTransactionForSimulation(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactions([]*transaction.Transaction) (uint64, error) From c7a52575f30cf0604f9361a85752cc039d3612c3 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Wed, 25 May 2022 12:19:06 +0300 Subject: [PATCH 046/335] nil check for txArgs when creating transaction --- node/errors.go | 3 +++ node/node.go | 3 +++ node/node_test.go | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/node/errors.go b/node/errors.go index 3b433ae51f3..a372c056c87 100644 --- a/node/errors.go +++ b/node/errors.go @@ -144,3 +144,6 @@ var ErrCannotCastUserAccountHandlerToVmCommonUserAccountHandler = errors.New("ca // ErrNilBlockHeader signals that current block header is nil var ErrNilBlockHeader = errors.New("nil block header") + +// ErrNilCreateTransactionArgs signals that create transaction args is nil +var ErrNilCreateTransactionArgs = errors.New("nil args for create transaction") diff --git a/node/node.go b/node/node.go index d31a77b8a19..b781e03a8b6 100644 --- a/node/node.go +++ b/node/node.go @@ -678,6 +678,9 @@ func (n *Node) checkSenderIsInShard(tx *transaction.Transaction) error { // CreateTransaction will return a transaction from all the required fields func (n *Node) CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { + if txArgs == nil { + return nil, nil, ErrNilCreateTransactionArgs + } if txArgs.Version == 0 { return nil, nil, ErrInvalidTransactionVersion } diff --git a/node/node_test.go b/node/node_test.go index 3321e42455a..b8db35756c5 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -1234,6 +1234,29 @@ func getDefaultTransactionArgs() *external.ArgsCreateTransaction { } } +func TestCreateTransaction_NilArgsShouldErr(t *testing.T) { + t.Parallel() + + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.TxMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + stateComponents := getDefaultStateComponents() + stateComponents.AccountsAPI = &stateMock.AccountsStub{} + + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + tx, txHash, err := n.CreateTransaction(nil) + + assert.Nil(t, tx) + assert.Nil(t, txHash) + assert.Equal(t, node.ErrNilCreateTransactionArgs, err) +} + func TestCreateTransaction_NilAddrConverterShouldErr(t *testing.T) { t.Parallel() From aafd07b4de5acdb945e8dbd27a70d310739d51e8 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 26 May 2022 18:10:20 +0300 Subject: [PATCH 047/335] process: add unit tests for guarded account --- factory/coreComponents_test.go | 1 + go.mod | 2 +- go.sum | 4 +- process/guardian/guardedAccount.go | 19 +- process/guardian/guardedAccount_test.go | 364 +++++++++++++++++- .../hooks/blockChainHook_test.go | 2 +- testscommon/generalConfig.go | 1 + testscommon/state/userAccountStub.go | 10 + 8 files changed, 377 insertions(+), 26 deletions(-) diff --git a/factory/coreComponents_test.go b/factory/coreComponents_test.go index 062f59a45ee..22f58ec741b 100644 --- a/factory/coreComponents_test.go +++ b/factory/coreComponents_test.go @@ -278,6 +278,7 @@ func getCoreArgs() factory.CoreComponentsFactoryArgs { ChainID: "undefined", MinTransactionVersion: 1, GenesisMaxNumberOfShards: 3, + SetGuardianEpochsDelay: 20, }, Marshalizer: config.MarshalizerConfig{ Type: testMarshalizer, diff --git a/go.mod b/go.mod index f7f62a90f1e..8e4f6edf471 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.6 - github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220517132451-65bc142a2e5f + github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220523152821-4a1f295414c2 github.com/ElrondNetwork/notifier-go v1.0.3 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta diff --git a/go.sum b/go.sum index af22365ed1a..180c345c10b 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,8 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.6/go.mod h1:cBfgx0ST/CJx8jrxJSC5a github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c/go.mod h1:XQoxE2MmrhVpyBMghK3fWvnRAw/iirc0KPtbKAOEPBM= -github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220517132451-65bc142a2e5f h1:kwSsEEkQ8Y4LEsS0qAfGh3oTVV5hPZ5nOhIzDuhfHUg= -github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220517132451-65bc142a2e5f/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220523152821-4a1f295414c2 h1:Ocemk7ZBNqysUHCpcfTSo8jCmmLq4vKDjmDIwRMJSM4= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220523152821-4a1f295414c2/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= github.com/ElrondNetwork/notifier-go v1.0.3/go.mod h1:GOv7j2o90e/GVmmBddWwyfJZ/JW4V4pvyXIpukd6FfY= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 7437d9e97a3..475c8b50ab2 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -17,12 +17,11 @@ import ( var guardianKey = []byte(core.ElrondProtectedKeyPrefix + core.GuardiansKeyIdentifier) type guardedAccount struct { - marshaller marshal.Marshalizer - epochNotifier vmcommon.EpochNotifier - mutEpoch sync.RWMutex - guardianActivationEpochs uint32 - currentEpoch uint32 - epochsForActivation uint32 + marshaller marshal.Marshalizer + epochNotifier vmcommon.EpochNotifier + mutEpoch sync.RWMutex + guardianActivationEpochsDelay uint32 + currentEpoch uint32 } // NewGuardedAccount creates a new guarded account @@ -42,9 +41,9 @@ func NewGuardedAccount( } agc := &guardedAccount{ - marshaller: marshaller, - epochNotifier: epochNotifier, - guardianActivationEpochs: setGuardianEpochsDelay, + marshaller: marshaller, + epochNotifier: epochNotifier, + guardianActivationEpochsDelay: setGuardianEpochsDelay, } epochNotifier.RegisterNotifyHandler(agc) @@ -88,7 +87,7 @@ func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardian guardian := &guardians.Guardian{ Address: guardianAddress, - ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochs, + ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochsDelay, } return agc.setAccountGuardian(stateUserAccount, guardian) diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 284bc963140..113a661d00e 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -4,6 +4,7 @@ import ( "errors" "testing" + "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/testscommon" @@ -77,6 +78,16 @@ func TestGuardedAccount_getActiveGuardian(t *testing.T) { t.Run("one active and one too old", func(t *testing.T) { t.Parallel() + g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 8} + g2 := &guardians.Guardian{Address: []byte("addr2"), ActivationEpoch: 9} + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1, g2}} + activeGuardian, err := ga.getActiveGuardian(configuredGuardians) + require.Nil(t, err) + require.Equal(t, g2, activeGuardian) + }) + t.Run("one active and one too old, saved in reverse order", func(t *testing.T) { + t.Parallel() + g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 8} g2 := &guardians.Guardian{Address: []byte("addr2"), ActivationEpoch: 9} configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g2, g1}} @@ -180,7 +191,7 @@ func TestGuardedAccount_saveAccountGuardians(t *testing.T) { err := ga.saveAccountGuardians(userAccount, nil) require.Equal(t, expectedErr, err) }) - t.Run("", func(t *testing.T) { + t.Run("save account guardians OK", func(t *testing.T) { t.Parallel() SaveKeyValueCalled := false @@ -202,7 +213,7 @@ func TestGuardedAccount_saveAccountGuardians(t *testing.T) { func TestGuardedAccount_updateGuardians(t *testing.T) { ga := createGuardedAccountWithEpoch(10) - newGuardian:= &guardians.Guardian{ + newGuardian := &guardians.Guardian{ Address: []byte("new guardian address"), ActivationEpoch: 20, } @@ -215,7 +226,7 @@ func TestGuardedAccount_updateGuardians(t *testing.T) { require.Equal(t, expectedGuardians, updatedGuardians.Slice) }) t.Run("updating when there is an existing pending guardian and no active should error", func(t *testing.T) { - existingGuardian:= &guardians.Guardian{ + existingGuardian := &guardians.Guardian{ Address: []byte("guardian address"), ActivationEpoch: 11, } @@ -226,12 +237,12 @@ func TestGuardedAccount_updateGuardians(t *testing.T) { require.True(t, errors.Is(err, process.ErrAccountHasNoActiveGuardian)) }) t.Run("updating the existing same active guardian should leave the active guardian unchanged", func(t *testing.T) { - existingGuardian:= &guardians.Guardian{ + existingGuardian := &guardians.Guardian{ Address: []byte("guardian address"), ActivationEpoch: 9, } - newGuardian:= newGuardian + newGuardian := newGuardian newGuardian.Address = existingGuardian.Address configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} @@ -240,16 +251,16 @@ func TestGuardedAccount_updateGuardians(t *testing.T) { require.Equal(t, configuredGuardians, updatedGuardians) }) t.Run("updating the existing same active guardian, when there is also a pending guardian configured, should clean up pending and leave active unchanged", func(t *testing.T) { - existingActiveGuardian:= &guardians.Guardian{ + existingActiveGuardian := &guardians.Guardian{ Address: []byte("guardian address"), ActivationEpoch: 9, } existingPendingGuardian := &guardians.Guardian{ - Address: []byte("pending guardian address"), + Address: []byte("pending guardian address"), ActivationEpoch: 13, } - newGuardian:= newGuardian + newGuardian := newGuardian newGuardian.Address = existingPendingGuardian.Address configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingActiveGuardian, existingPendingGuardian}} expectedUpdatedGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingActiveGuardian, newGuardian}} @@ -260,12 +271,12 @@ func TestGuardedAccount_updateGuardians(t *testing.T) { }) // todo: if todo in guarded account is implemented, this will need to be changed t.Run("updating the existing same pending guardian while there is an active one should leave the active guardian unchanged but update the pending", func(t *testing.T) { - existingGuardian:= &guardians.Guardian{ + existingGuardian := &guardians.Guardian{ Address: []byte("guardian address"), ActivationEpoch: 9, } - newGuardian:= newGuardian + newGuardian := newGuardian newGuardian.Address = existingGuardian.Address configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} @@ -276,27 +287,356 @@ func TestGuardedAccount_updateGuardians(t *testing.T) { } func TestGuardedAccount_setAccountGuardian(t *testing.T) { + ga := createGuardedAccountWithEpoch(10) + newGuardian := &guardians.Guardian{ + Address: []byte("new guardian address"), + ActivationEpoch: 20, + } + + t.Run("getConfiguredGuardians with err", func(t *testing.T) { + expectedErr := errors.New("expected error") + ua := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } + + err := ga.setAccountGuardian(ua, newGuardian) + require.Equal(t, expectedErr, err) + }) + t.Run("if updateGuardians returns err, the err should be propagated", func(t *testing.T) { + existingGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: 11, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} + ua := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + err := ga.setAccountGuardian(ua, newGuardian) + require.True(t, errors.Is(err, process.ErrAccountHasNoActiveGuardian)) + }) + t.Run("setGuardian same guardian ok, not changing existing config", func(t *testing.T) { + existingGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: 9, + } + newGuardian := newGuardian + newGuardian.Address = existingGuardian.Address + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} + + expectedValue := []byte(nil) + ua := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + expectedValue, _ = ga.marshaller.Marshal(configuredGuardians) + return expectedValue, nil + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Equal(t, guardianKey, key) + require.Equal(t, expectedValue, value) + return nil + }, + } + }, + } + err := ga.setAccountGuardian(ua, newGuardian) + require.Nil(t, err) + }) } func TestGuardedAccount_instantSetGuardian(t *testing.T) { + currentEpoch := uint32(10) + ga := createGuardedAccountWithEpoch(currentEpoch) + newGuardian := &guardians.Guardian{ + Address: []byte("new guardian address"), + ActivationEpoch: 20, + } + txGuardianAddress := []byte("guardian address") -} + t.Run("getConfiguredGuardians with err", func(t *testing.T) { + expectedErr := errors.New("expected error") + ua := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } -func TestGuardedAccount_EpochConfirmed(t *testing.T) { + err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) + require.Equal(t, expectedErr, err) + }) + t.Run("getActiveGuardianErr with err (no active guardian) should error", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} + ua := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) + require.Equal(t, process.ErrAccountHasNoActiveGuardian, err) + }) + t.Run("tx signed by different than active guardian should err", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("active guardian address"), + ActivationEpoch: 1, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} + + ua := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) + require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err) + }) + t.Run("immediately set the guardian if setGuardian tx is signed by active guardian", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: txGuardianAddress, + ActivationEpoch: 1, + } + newGuardian := &guardians.Guardian{ + Address: []byte("new guardian address"), + ActivationEpoch: currentEpoch, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} + expectedValue, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}}) + + ua := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Equal(t, guardianKey, key) + require.Equal(t, expectedValue, value) + return nil + }, + } + }} + + err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) + require.Nil(t, err) + }) } func TestGuardedAccount_GetActiveGuardian(t *testing.T) { + currentEpoch := uint32(10) + ga := createGuardedAccountWithEpoch(currentEpoch) + + t.Run("wrong account type should err", func(t *testing.T) { + var uah *vmcommonMocks.UserAccountStub + activeGuardian, err := ga.GetActiveGuardian(uah) + require.Nil(t, activeGuardian) + require.Equal(t, process.ErrWrongTypeAssertion, err) + }) + t.Run("getConfiguredGuardians with err should propagate the err", func(t *testing.T) { + expectedErr := errors.New("expected error") + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } + activeGuardian, err := ga.GetActiveGuardian(uah) + require.Nil(t, activeGuardian) + require.Equal(t, expectedErr, err) + }) + t.Run("no guardian should return err", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{} + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + activeGuardian, err := ga.GetActiveGuardian(uah) + require.Nil(t, activeGuardian) + require.Equal(t, process.ErrAccountHasNoGuardianSet, err) + }) + t.Run("one pending guardian should return err", func(t *testing.T) { + pendingGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch + 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + activeGuardian, err := ga.GetActiveGuardian(uah) + require.Nil(t, activeGuardian) + require.Equal(t, process.ErrAccountHasNoActiveGuardian, err) + }) + t.Run("one active guardian should return the active", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + guardian, err := ga.GetActiveGuardian(uah) + require.Equal(t, activeGuardian.Address, guardian) + require.Nil(t, err) + }) + t.Run("one active guardian and one pending new guardian", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + pendingGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch + 1, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + guardian, err := ga.GetActiveGuardian(uah) + require.Equal(t, activeGuardian.Address, guardian) + require.Nil(t, err) + }) + t.Run("one active guardian and one disabled (old) guardian", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + oldGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch - 5, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + guardian, err := ga.GetActiveGuardian(uah) + require.Equal(t, activeGuardian.Address, guardian) + require.Nil(t, err) + }) } func TestGuardedAccount_SetGuardian(t *testing.T) { + currentEpoch := uint32(10) + ga := createGuardedAccountWithEpoch(currentEpoch) + g1 := &guardians.Guardian{ + Address: []byte("guardian address 1"), + ActivationEpoch: currentEpoch - 2, + } + g2 := &guardians.Guardian{ + Address: []byte("guardian address 2"), + ActivationEpoch: currentEpoch - 1, + } + newGuardianAddress := []byte("new guardian address") + + t.Run("invalid user account handler should err", func(t *testing.T) { + err := ga.SetGuardian(nil, newGuardianAddress, g1.Address) + require.Equal(t, process.ErrWrongTypeAssertion, err) + }) + t.Run("transaction signed by current active guardian but instantSetGuardian returns error", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + err := ga.SetGuardian(uah, newGuardianAddress, g2.Address) + require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err) + }) + t.Run("instantly set guardian if tx signed by current active guardian", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + newGuardian := &guardians.Guardian{ + Address: newGuardianAddress, + ActivationEpoch: currentEpoch, + } + expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}}) + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Equal(t, guardianKey, key) + require.Equal(t, expectedNewGuardians, value) + return nil + }, + } + }, + } + err := ga.SetGuardian(uah, newGuardianAddress, g1.Address) + require.Nil(t, err) + }) + t.Run("tx not signed by active guardian sets guardian with delay", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + newGuardian := &guardians.Guardian{ + Address: newGuardianAddress, + ActivationEpoch: currentEpoch + ga.guardianActivationEpochsDelay, + } + expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{g1, newGuardian}}) + + uah := &state.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Equal(t, guardianKey, key) + require.Equal(t, expectedNewGuardians, value) + return nil + }, + } + }, + } + err := ga.SetGuardian(uah, newGuardianAddress, nil) + require.Nil(t, err) + }) +} + +func TestGuardedAccount_EpochConfirmed(t *testing.T) { + ga := createGuardedAccountWithEpoch(0) + ga.EpochConfirmed(1, 0) + require.Equal(t, uint32(1), ga.currentEpoch) + + ga.EpochConfirmed(111, 0) + require.Equal(t, uint32(111), ga.currentEpoch) } func TestAccountGuardianChecker_IsInterfaceNil(t *testing.T) { + var gah process.GuardedAccountHandler + require.True(t, check.IfNil(gah)) + + var ga *guardedAccount + require.True(t, check.IfNil(ga)) + ga, _ = NewGuardedAccount(&testscommon.MarshalizerMock{}, &epochNotifier.EpochNotifierStub{}, 10) + require.False(t, check.IfNil(ga)) } func createGuardedAccountWithEpoch(epoch uint32) *guardedAccount { diff --git a/process/smartContract/hooks/blockChainHook_test.go b/process/smartContract/hooks/blockChainHook_test.go index be5eac15389..8584d443f9b 100644 --- a/process/smartContract/hooks/blockChainHook_test.go +++ b/process/smartContract/hooks/blockChainHook_test.go @@ -1287,7 +1287,7 @@ func TestBlockChainHookImpl_ProcessBuiltInFunction(t *testing.T) { LoadAccountCalled: func(addressContainer []byte) (vmcommon.AccountHandler, error) { require.Equal(t, addrReceiver, addressContainer) - return &stateMock.UserAccountStub{}, nil + return &stateMock.AccountWrapMock{}, nil }, } diff --git a/testscommon/generalConfig.go b/testscommon/generalConfig.go index 1405cd90610..5f693c66f38 100644 --- a/testscommon/generalConfig.go +++ b/testscommon/generalConfig.go @@ -49,6 +49,7 @@ func GetGeneralConfig() config.Config { GenesisMaxNumberOfShards: 100, MaxComputableRounds: 1000, MaxConsecutiveRoundsOfRatingDecrease: 2000, + SetGuardianEpochsDelay: 20, }, EpochStartConfig: config.EpochStartConfig{ MinRoundsBetweenEpochs: 5, diff --git a/testscommon/state/userAccountStub.go b/testscommon/state/userAccountStub.go index 30c94f8ebf6..f94eb5e08cb 100644 --- a/testscommon/state/userAccountStub.go +++ b/testscommon/state/userAccountStub.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/state" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) var _ state.UserAccountHandler = (*UserAccountStub)(nil) @@ -17,6 +18,7 @@ type UserAccountStub struct { DataTrieTrackerCalled func() state.DataTrieTracker IsFrozenCalled func() bool RetrieveValueFromDataTrieTrackerCalled func(key []byte) ([]byte, error) + AccountDataHandlerCalled func() vmcommon.AccountDataHandler } // HasNewCode - @@ -167,3 +169,11 @@ func (u *UserAccountStub) IsFrozen() bool { func (u *UserAccountStub) IsInterfaceNil() bool { return false } + +// AccountDataHandler - +func (u *UserAccountStub) AccountDataHandler() vmcommon.AccountDataHandler { + if u.AccountDataHandlerCalled != nil { + return u.AccountDataHandlerCalled() + } + return nil +} From 24d0f2d8c2063394eb96bea451cde7cb64a5b62e Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 3 Jun 2022 11:00:06 +0300 Subject: [PATCH 048/335] config, epochStart, process: add gas config for guarded tx --- cmd/node/config/economics.toml | 1 + config/economicsConfig.go | 9 +- config/tomlConfig_test.go | 5 +- epochStart/metachain/systemSCs_test.go | 1 + factory/coreComponents_test.go | 1 + integrationTests/testProcessorNode.go | 1 + integrationTests/vm/arwen/utils.go | 7 +- integrationTests/vm/testInitializer.go | 1 + process/economics/economicsData.go | 203 +++++++++--------- process/economics/economicsData_test.go | 14 +- .../metachain/vmContainerFactory_test.go | 1 + process/peer/process_test.go | 7 +- process/smartContract/process_test.go | 7 +- 13 files changed, 136 insertions(+), 122 deletions(-) diff --git a/cmd/node/config/economics.toml b/cmd/node/config/economics.toml index e6743b25f1b..ee273c85407 100644 --- a/cmd/node/config/economics.toml +++ b/cmd/node/config/economics.toml @@ -47,3 +47,4 @@ GasPriceModifier = 0.01 GasPerDataByte = "1500" DataLimitForBaseCalc = "10000" + ExtraGasLimitGuardedTx = "50000" diff --git a/config/economicsConfig.go b/config/economicsConfig.go index f5fcd3dea43..a2054d3b6af 100644 --- a/config/economicsConfig.go +++ b/config/economicsConfig.go @@ -44,10 +44,11 @@ type GasLimitSetting struct { // FeeSettings will hold economics fee settings type FeeSettings struct { - GasLimitSettings []GasLimitSetting - GasPerDataByte string - MinGasPrice string - GasPriceModifier float64 + GasLimitSettings []GasLimitSetting + GasPerDataByte string + MinGasPrice string + GasPriceModifier float64 + ExtraGasLimitGuardedTx string } // EconomicsConfig will hold economics config diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 5f57093fc9b..3e027dd8535 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -224,6 +224,7 @@ func TestTomlEconomicsParser(t *testing.T) { maxGasLimitPerBlock := "18446744073709551615" minGasPrice := "18446744073709551615" minGasLimit := "18446744073709551615" + extraGasLimitGuardedTx := "50000" protocolSustainabilityAddress := "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp" denomination := 18 @@ -256,7 +257,8 @@ func TestTomlEconomicsParser(t *testing.T) { MinGasLimit: minGasLimit, }, }, - MinGasPrice: minGasPrice, + MinGasPrice: minGasPrice, + ExtraGasLimitGuardedTx: extraGasLimitGuardedTx, }, } @@ -281,6 +283,7 @@ func TestTomlEconomicsParser(t *testing.T) { [FeeSettings] GasLimitSettings = [{EnableEpoch = 0, MaxGasLimitPerBlock = "` + maxGasLimitPerBlock + `", MaxGasLimitPerMiniBlock = "", MaxGasLimitPerMetaBlock = "", MaxGasLimitPerMetaMiniBlock = "", MaxGasLimitPerTx = "", MinGasLimit = "` + minGasLimit + `"}] MinGasPrice = "` + minGasPrice + `" + ExtraGasLimitGuardedTx = "` + extraGasLimitGuardedTx + `" ` cfg := EconomicsConfig{} diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index 20dcfc0cca8..a3ffa1dd82d 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -1069,6 +1069,7 @@ func createEconomicsData() process.EconomicsDataHandler { MinGasPrice: minGasPrice, GasPerDataByte: "1", GasPriceModifier: 1.0, + ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/factory/coreComponents_test.go b/factory/coreComponents_test.go index 22f58ec741b..2a75a6e1a3a 100644 --- a/factory/coreComponents_test.go +++ b/factory/coreComponents_test.go @@ -384,6 +384,7 @@ func createDummyEconomicsConfig() config.EconomicsConfig { MinGasPrice: "1000000000", GasPerDataByte: "1500", GasPriceModifier: 1, + ExtraGasLimitGuardedTx: "50000", }, } } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 11f68a4ca83..e9a74d6460a 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1073,6 +1073,7 @@ func (tpn *TestProcessorNode) createDefaultEconomicsConfig() *config.EconomicsCo MinGasPrice: minGasPrice, GasPerDataByte: "1", GasPriceModifier: 0.01, + ExtraGasLimitGuardedTx: "50000", }, } } diff --git a/integrationTests/vm/arwen/utils.go b/integrationTests/vm/arwen/utils.go index 32d74503530..38e1ee4a1f6 100644 --- a/integrationTests/vm/arwen/utils.go +++ b/integrationTests/vm/arwen/utils.go @@ -214,9 +214,10 @@ func (context *TestContext) initFeeHandlers() { MinGasLimit: minGasLimit, }, }, - MinGasPrice: minGasPrice, - GasPerDataByte: "1", - GasPriceModifier: 1.0, + MinGasPrice: minGasPrice, + GasPerDataByte: "1", + GasPriceModifier: 1.0, + ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 7a0507fdd72..794d3eb3fdb 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -392,6 +392,7 @@ func createEconomicsData(penalizedTooMuchGasEnableEpoch uint32) (process.Economi MinGasPrice: minGasPrice, GasPerDataByte: "1", GasPriceModifier: 1.0, + ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: penalizedTooMuchGasEnableEpoch, diff --git a/process/economics/economicsData.go b/process/economics/economicsData.go index 416d4db6ea2..eb402bb92e6 100644 --- a/process/economics/economicsData.go +++ b/process/economics/economicsData.go @@ -26,8 +26,19 @@ var _ process.FeeHandler = (*economicsData)(nil) var epsilon = 0.00000001 var log = logger.GetOrCreate("process/economics") +type gasConfig struct { + gasLimitSettingEpoch uint32 + maxGasLimitPerBlock uint64 + maxGasLimitPerMiniBlock uint64 + maxGasLimitPerMetaBlock uint64 + maxGasLimitPerMetaMiniBlock uint64 + maxGasLimitPerTx uint64 + minGasLimit uint64 +} + // economicsData will store information about economics type economicsData struct { + gasConfig rewardsSettings []config.EpochRewardSettings rewardsSettingEpoch uint32 leaderPercentage float64 @@ -38,17 +49,11 @@ type economicsData struct { topUpFactor float64 mutRewardsSettings sync.RWMutex gasLimitSettings []config.GasLimitSetting - gasLimitSettingEpoch uint32 - maxGasLimitPerBlock uint64 - maxGasLimitPerMiniBlock uint64 - maxGasLimitPerMetaBlock uint64 - maxGasLimitPerMetaMiniBlock uint64 - maxGasLimitPerTx uint64 mutGasLimitSettings sync.RWMutex gasPerDataByte uint64 minGasPrice uint64 + extraGasLimitGuardedTx uint64 gasPriceModifier float64 - minGasLimit uint64 genesisTotalSupply *big.Int minInflation float64 yearSettings map[uint32]*config.YearSetting @@ -138,56 +143,18 @@ func NewEconomicsData(args ArgsNewEconomicsData) (*economicsData, error) { } } - err = ed.setGasLimitSetting(gasLimitSettings[0]) + var gc *gasConfig + gc, err = checkAndParseGasLimitSettings(gasLimitSettings[0]) if err != nil { return nil, err } + ed.gasConfig = *gc args.EpochNotifier.RegisterNotifyHandler(ed) return ed, nil } -func (ed *economicsData) setGasLimitSetting(gasLimitSetting config.GasLimitSetting) error { - var err error - conversionBase := 10 - bitConversionSize := 64 - - ed.gasLimitSettingEpoch = gasLimitSetting.EnableEpoch - - ed.maxGasLimitPerBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerBlock, conversionBase, bitConversionSize) - if err != nil { - return process.ErrInvalidMaxGasLimitPerBlock - } - - ed.maxGasLimitPerMiniBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMiniBlock, conversionBase, bitConversionSize) - if err != nil { - return process.ErrInvalidMaxGasLimitPerMiniBlock - } - - ed.maxGasLimitPerMetaBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMetaBlock, conversionBase, bitConversionSize) - if err != nil { - return process.ErrInvalidMaxGasLimitPerMetaBlock - } - - ed.maxGasLimitPerMetaMiniBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMetaMiniBlock, conversionBase, bitConversionSize) - if err != nil { - return process.ErrInvalidMaxGasLimitPerMetaMiniBlock - } - - ed.maxGasLimitPerTx, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerTx, conversionBase, bitConversionSize) - if err != nil { - return process.ErrInvalidMaxGasLimitPerTx - } - - ed.minGasLimit, err = strconv.ParseUint(gasLimitSetting.MinGasLimit, conversionBase, bitConversionSize) - if err != nil { - return process.ErrInvalidMinimumGasLimitForTx - } - - return nil -} - func convertValues(economics *config.EconomicsConfig) (*economicsData, error) { conversionBase := 10 bitConversionSize := 64 @@ -222,7 +189,28 @@ func checkValues(economics *config.EconomicsConfig) error { if len(economics.RewardsSettings.RewardsConfigByEpoch) == 0 { return process.ErrEmptyEpochRewardsConfig } - for _, rewardsConfig := range economics.RewardsSettings.RewardsConfigByEpoch { + + err := checkRewarsSettings(economics.RewardsSettings) + if err != nil { + return err + } + + if len(economics.GlobalSettings.YearSettings) == 0 { + return process.ErrEmptyYearSettings + } + for _, yearSetting := range economics.GlobalSettings.YearSettings { + if isPercentageInvalid(yearSetting.MaximumInflation) { + return process.ErrInvalidInflationPercentages + } + } + + err = checkFeeSettings(economics.FeeSettings) + + return err +} + +func checkRewarsSettings(rewardsSettings config.RewardsSettings) error { + for _, rewardsConfig := range rewardsSettings.RewardsConfigByEpoch { if isPercentageInvalid(rewardsConfig.LeaderPercentage) || isPercentageInvalid(rewardsConfig.DeveloperPercentage) || isPercentageInvalid(rewardsConfig.ProtocolSustainabilityPercentage) || @@ -239,74 +227,83 @@ func checkValues(economics *config.EconomicsConfig) error { return process.ErrInvalidRewardsTopUpGradientPoint } } + return nil +} - if len(economics.GlobalSettings.YearSettings) == 0 { - return process.ErrEmptyYearSettings - } - for _, yearSetting := range economics.GlobalSettings.YearSettings { - if isPercentageInvalid(yearSetting.MaximumInflation) { - return process.ErrInvalidInflationPercentages - } - } - - if economics.FeeSettings.GasPriceModifier > 1.0 || economics.FeeSettings.GasPriceModifier < epsilon { +func checkFeeSettings(feeSettings config.FeeSettings) error { + if feeSettings.GasPriceModifier > 1.0 || feeSettings.GasPriceModifier < epsilon { return process.ErrInvalidGasModifier } - if len(economics.FeeSettings.GasLimitSettings) == 0 { + if len(feeSettings.GasLimitSettings) == 0 { return process.ErrEmptyGasLimitSettings } - conversionBase := 10 - bitConversionSize := 64 - for _, gasLimitSetting := range economics.FeeSettings.GasLimitSettings { - minGasLimit, err := strconv.ParseUint(gasLimitSetting.MinGasLimit, conversionBase, bitConversionSize) - if err != nil { - return process.ErrInvalidMinimumGasLimitForTx - } - maxGasLimitPerBlock, err := strconv.ParseUint(gasLimitSetting.MaxGasLimitPerBlock, conversionBase, bitConversionSize) + var err error + for _, gasLimitSetting := range feeSettings.GasLimitSettings { + _, err = checkAndParseGasLimitSettings(gasLimitSetting) if err != nil { - return fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerBlock, gasLimitSetting.EnableEpoch) + return err } + } + return nil +} - maxGasLimitPerMiniBlock, err := strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMiniBlock, conversionBase, bitConversionSize) - if err != nil { - return fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerMiniBlock, gasLimitSetting.EnableEpoch) - } +func checkAndParseGasLimitSettings(gasLimitSetting config.GasLimitSetting) (*gasConfig, error) { + conversionBase := 10 + bitConversionSize := 64 - maxGasLimitPerMetaBlock, err := strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMetaBlock, conversionBase, bitConversionSize) - if err != nil { - return fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerMetaBlock, gasLimitSetting.EnableEpoch) - } + gc := &gasConfig{} + var err error - maxGasLimitPerMetaMiniBlock, err := strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMetaMiniBlock, conversionBase, bitConversionSize) - if err != nil { - return fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerMetaMiniBlock, gasLimitSetting.EnableEpoch) - } + gc.gasLimitSettingEpoch = gasLimitSetting.EnableEpoch + gc.minGasLimit, err = strconv.ParseUint(gasLimitSetting.MinGasLimit, conversionBase, bitConversionSize) + if err != nil { + return nil, process.ErrInvalidMinimumGasLimitForTx + } - maxGasLimitPerTx, err := strconv.ParseUint(gasLimitSetting.MaxGasLimitPerTx, conversionBase, bitConversionSize) - if err != nil { - return fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerTx, gasLimitSetting.EnableEpoch) - } + gc.maxGasLimitPerBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerBlock, conversionBase, bitConversionSize) + if err != nil { + return nil, fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerBlock, gasLimitSetting.EnableEpoch) + } - if maxGasLimitPerBlock < minGasLimit { - return fmt.Errorf("%w: maxGasLimitPerBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerBlock, maxGasLimitPerBlock, minGasLimit, gasLimitSetting.EnableEpoch) - } - if maxGasLimitPerMiniBlock < minGasLimit { - return fmt.Errorf("%w: maxGasLimitPerMiniBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerMiniBlock, maxGasLimitPerMiniBlock, minGasLimit, gasLimitSetting.EnableEpoch) - } - if maxGasLimitPerMetaBlock < minGasLimit { - return fmt.Errorf("%w: maxGasLimitPerMetaBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerMetaBlock, maxGasLimitPerMetaBlock, minGasLimit, gasLimitSetting.EnableEpoch) - } - if maxGasLimitPerMetaMiniBlock < minGasLimit { - return fmt.Errorf("%w: maxGasLimitPerMetaMiniBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerMetaMiniBlock, maxGasLimitPerMetaMiniBlock, minGasLimit, gasLimitSetting.EnableEpoch) - } - if maxGasLimitPerTx < minGasLimit { - return fmt.Errorf("%w: maxGasLimitPerTx = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerTx, maxGasLimitPerTx, minGasLimit, gasLimitSetting.EnableEpoch) - } + gc.maxGasLimitPerMiniBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMiniBlock, conversionBase, bitConversionSize) + if err != nil { + return nil, fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerMiniBlock, gasLimitSetting.EnableEpoch) } - return nil + gc.maxGasLimitPerMetaBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMetaBlock, conversionBase, bitConversionSize) + if err != nil { + return nil, fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerMetaBlock, gasLimitSetting.EnableEpoch) + } + + gc.maxGasLimitPerMetaMiniBlock, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerMetaMiniBlock, conversionBase, bitConversionSize) + if err != nil { + return nil, fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerMetaMiniBlock, gasLimitSetting.EnableEpoch) + } + + gc.maxGasLimitPerTx, err = strconv.ParseUint(gasLimitSetting.MaxGasLimitPerTx, conversionBase, bitConversionSize) + if err != nil { + return nil, fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerTx, gasLimitSetting.EnableEpoch) + } + + if gc.maxGasLimitPerBlock < gc.minGasLimit { + return nil, fmt.Errorf("%w: maxGasLimitPerBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerBlock, gc.maxGasLimitPerBlock, gc.minGasLimit, gasLimitSetting.EnableEpoch) + } + if gc.maxGasLimitPerMiniBlock < gc.minGasLimit { + return nil, fmt.Errorf("%w: maxGasLimitPerMiniBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerMiniBlock, gc.maxGasLimitPerMiniBlock, gc.minGasLimit, gasLimitSetting.EnableEpoch) + } + if gc.maxGasLimitPerMetaBlock < gc.minGasLimit { + return nil, fmt.Errorf("%w: maxGasLimitPerMetaBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerMetaBlock, gc.maxGasLimitPerMetaBlock, gc.minGasLimit, gasLimitSetting.EnableEpoch) + } + if gc.maxGasLimitPerMetaMiniBlock < gc.minGasLimit { + return nil, fmt.Errorf("%w: maxGasLimitPerMetaMiniBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerMetaMiniBlock, gc.maxGasLimitPerMetaMiniBlock, gc.minGasLimit, gasLimitSetting.EnableEpoch) + } + if gc.maxGasLimitPerTx < gc.minGasLimit { + return nil, fmt.Errorf("%w: maxGasLimitPerTx = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerTx, gc.maxGasLimitPerTx, gc.minGasLimit, gasLimitSetting.EnableEpoch) + } + + return gc, nil } func isPercentageInvalid(percentage float64) bool { @@ -717,9 +714,11 @@ func (ed *economicsData) setGasLimitConfig(currentEpoch uint32) { } if ed.gasLimitSettingEpoch != gasLimitSetting.EnableEpoch { - err := ed.setGasLimitSetting(gasLimitSetting) + gc, err := checkAndParseGasLimitSettings(gasLimitSetting) if err != nil { log.Error("setGasLimitConfig", "error", err.Error()) + } else { + ed.gasConfig = *gc } } diff --git a/process/economics/economicsData_test.go b/process/economics/economicsData_test.go index 1e1e8fac072..64f8d901c9d 100644 --- a/process/economics/economicsData_test.go +++ b/process/economics/economicsData_test.go @@ -62,9 +62,10 @@ func feeSettingsDummy(gasModifier float64) config.FeeSettings { MinGasLimit: "500", }, }, - MinGasPrice: "18446744073709551615", - GasPerDataByte: "1", - GasPriceModifier: gasModifier, + MinGasPrice: "18446744073709551615", + GasPerDataByte: "1", + GasPriceModifier: gasModifier, + ExtraGasLimitGuardedTx: "50000", } } @@ -80,9 +81,10 @@ func feeSettingsReal() config.FeeSettings { MinGasLimit: "50000", }, }, - MinGasPrice: "1000000000", - GasPerDataByte: "1500", - GasPriceModifier: 0.01, + MinGasPrice: "1000000000", + GasPerDataByte: "1500", + GasPriceModifier: 0.01, + ExtraGasLimitGuardedTx: "50000", } } diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index 615e2fa0241..deb23f544cd 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -268,6 +268,7 @@ func TestVmContainerFactory_Create(t *testing.T) { MinGasPrice: "10", GasPerDataByte: "1", GasPriceModifier: 1.0, + ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/process/peer/process_test.go b/process/peer/process_test.go index 1e64b708e01..a04c18dbfbb 100644 --- a/process/peer/process_test.go +++ b/process/peer/process_test.go @@ -87,9 +87,10 @@ func createMockArguments() peer.ArgValidatorStatisticsProcessor { MinGasLimit: "10", }, }, - MinGasPrice: "10", - GasPerDataByte: "1", - GasPriceModifier: 1.0, + MinGasPrice: "10", + GasPerDataByte: "1", + GasPriceModifier: 1.0, + ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/process/smartContract/process_test.go b/process/smartContract/process_test.go index 3d7ad7de907..03e142841f0 100644 --- a/process/smartContract/process_test.go +++ b/process/smartContract/process_test.go @@ -4041,9 +4041,10 @@ func createRealEconomicsDataArgs() *economics.ArgsNewEconomicsData { MinGasLimit: "50000", }, }, - GasPerDataByte: "1500", - MinGasPrice: "1000000000", - GasPriceModifier: 0.01, + GasPerDataByte: "1500", + MinGasPrice: "1000000000", + GasPriceModifier: 0.01, + ExtraGasLimitGuardedTx: "50000", }, }, EpochNotifier: &epochNotifier.EpochNotifierStub{}, From 9bb45f90767a2d25059d57db632825ba14a80e0f Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 3 Jun 2022 12:00:07 +0300 Subject: [PATCH 049/335] process, factory, epochStart: use txVersionChecker to identify guarded transactions --- epochStart/metachain/systemSCs_test.go | 7 ++++--- factory/coreComponents.go | 5 +++-- integrationTests/testProcessorNode.go | 7 ++++--- integrationTests/vm/arwen/utils.go | 1 + integrationTests/vm/testInitializer.go | 1 + process/economics/economicsData.go | 12 ++++++++++++ process/economics/economicsData_test.go | 3 +++ process/factory/metachain/vmContainerFactory_test.go | 1 + process/peer/process_test.go | 2 ++ process/smartContract/process_test.go | 1 + 10 files changed, 32 insertions(+), 8 deletions(-) diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index a3ffa1dd82d..a6aea14a287 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -1066,15 +1066,16 @@ func createEconomicsData() process.EconomicsDataHandler { MinGasLimit: minGasLimit, }, }, - MinGasPrice: minGasPrice, - GasPerDataByte: "1", - GasPriceModifier: 1.0, + MinGasPrice: minGasPrice, + GasPerDataByte: "1", + GasPriceModifier: 1.0, ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } economicsData, _ := economicsHandler.NewEconomicsData(argsNewEconomicsData) return economicsData diff --git a/factory/coreComponents.go b/factory/coreComponents.go index 0c836be7c42..caea5b9dad1 100644 --- a/factory/coreComponents.go +++ b/factory/coreComponents.go @@ -246,6 +246,8 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { return nil, err } + txVersionChecker := versioning.NewTxVersionChecker(ccf.config.GeneralSettings.MinTransactionVersion) + log.Trace("creating economics data components") argsNewEconomicsData := economics.ArgsNewEconomicsData{ Economics: &ccf.economicsConfig, @@ -253,6 +255,7 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { GasPriceModifierEnableEpoch: ccf.epochConfig.EnableEpochs.GasPriceModifierEnableEpoch, EpochNotifier: epochNotifier, BuiltInFunctionsCostHandler: builtInCostHandler, + TxVersionChecker: txVersionChecker, } economicsData, err := economics.NewEconomicsData(argsNewEconomicsData) if err != nil { @@ -319,8 +322,6 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { return nil, err } - txVersionChecker := versioning.NewTxVersionChecker(ccf.config.GeneralSettings.MinTransactionVersion) - // set as observer at first - it will be updated when creating the nodes coordinator nodeTypeProvider := nodetype.NewNodeTypeProvider(core.NodeTypeObserver) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index e9a74d6460a..bd5c943b433 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1026,6 +1026,7 @@ func (tpn *TestProcessorNode) initEconomicsData(economicsConfig *config.Economic PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } economicsData, _ := economics.NewEconomicsData(argsNewEconomicsData) tpn.EconomicsData = economics.NewTestEconomicsData(economicsData) @@ -1070,9 +1071,9 @@ func (tpn *TestProcessorNode) createDefaultEconomicsConfig() *config.EconomicsCo MinGasLimit: minGasLimit, }, }, - MinGasPrice: minGasPrice, - GasPerDataByte: "1", - GasPriceModifier: 0.01, + MinGasPrice: minGasPrice, + GasPerDataByte: "1", + GasPriceModifier: 0.01, ExtraGasLimitGuardedTx: "50000", }, } diff --git a/integrationTests/vm/arwen/utils.go b/integrationTests/vm/arwen/utils.go index 38e1ee4a1f6..d20edc29dd2 100644 --- a/integrationTests/vm/arwen/utils.go +++ b/integrationTests/vm/arwen/utils.go @@ -223,6 +223,7 @@ func (context *TestContext) initFeeHandlers() { PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: context.EpochNotifier, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } economicsData, _ := economics.NewEconomicsData(argsNewEconomicsData) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 794d3eb3fdb..7c425f3776b 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -398,6 +398,7 @@ func createEconomicsData(penalizedTooMuchGasEnableEpoch uint32) (process.Economi PenalizedTooMuchGasEnableEpoch: penalizedTooMuchGasEnableEpoch, EpochNotifier: &epochNotifier.EpochNotifierStub{}, BuiltInFunctionsCostHandler: builtInCost, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return economics.NewEconomicsData(argsNewEconomicsData) diff --git a/process/economics/economicsData.go b/process/economics/economicsData.go index eb402bb92e6..ad0fce13e34 100644 --- a/process/economics/economicsData.go +++ b/process/economics/economicsData.go @@ -12,6 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/smartContractResult" + "github.com/ElrondNetwork/elrond-go-core/data/transaction" logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" @@ -64,10 +65,12 @@ type economicsData struct { gasPriceModifierEnableEpoch uint32 statusHandler core.AppStatusHandler builtInFunctionsCostHandler BuiltInFunctionsCostHandler + txVersionHandler process.TxVersionCheckerHandler } // ArgsNewEconomicsData defines the arguments needed for new economics economicsData type ArgsNewEconomicsData struct { + TxVersionChecker process.TxVersionCheckerHandler BuiltInFunctionsCostHandler BuiltInFunctionsCostHandler Economics *config.EconomicsConfig EpochNotifier process.EpochNotifier @@ -80,6 +83,9 @@ func NewEconomicsData(args ArgsNewEconomicsData) (*economicsData, error) { if check.IfNil(args.BuiltInFunctionsCostHandler) { return nil, process.ErrNilBuiltInFunctionsCostHandler } + if check.IfNil(args.TxVersionChecker) { + return nil, process.ErrNilTransactionVersionChecker + } err := checkValues(args.Economics) if err != nil { @@ -131,6 +137,7 @@ func NewEconomicsData(args ArgsNewEconomicsData) (*economicsData, error) { gasPriceModifier: args.Economics.FeeSettings.GasPriceModifier, statusHandler: statusHandler.NewNilStatusHandler(), builtInFunctionsCostHandler: args.BuiltInFunctionsCostHandler, + txVersionHandler: args.TxVersionChecker, } log.Debug("economicsData: enable epoch for penalized too much gas", "epoch", ed.penalizedTooMuchGasEnableEpoch) log.Debug("economicsData: enable epoch for gas price modifier", "epoch", ed.gasPriceModifierEnableEpoch) @@ -581,6 +588,10 @@ func (ed *economicsData) ComputeGasLimit(tx data.TransactionWithFeeHandler) uint dataLen := uint64(len(tx.GetData())) gasLimit += dataLen * ed.gasPerDataByte + txInstance, ok := tx.(*transaction.Transaction) + if ok && ed.txVersionHandler.IsGuardedTransaction(txInstance) { + gasLimit += ed.extraGasLimitGuardedTx + } return gasLimit } @@ -730,6 +741,7 @@ func (ed *economicsData) setGasLimitConfig(currentEpoch uint32) { "maxGasLimitPerMetaMiniBlock", ed.maxGasLimitPerMetaMiniBlock, "maxGasLimitPerTx", ed.maxGasLimitPerTx, "minGasLimit", ed.minGasLimit, + "extraGasLimitGuardedTx", ed.extraGasLimitGuardedTx, ) ed.statusHandler.SetUInt64Value(common.MetricMaxGasPerTransaction, ed.maxGasLimitPerTx) diff --git a/process/economics/economicsData_test.go b/process/economics/economicsData_test.go index 64f8d901c9d..ec8962aa605 100644 --- a/process/economics/economicsData_test.go +++ b/process/economics/economicsData_test.go @@ -15,6 +15,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/economics" "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/process/smartContract" + "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/vm/systemSmartContracts/defaults" "github.com/stretchr/testify/assert" @@ -95,6 +96,7 @@ func createArgsForEconomicsData(gasModifier float64) economics.ArgsNewEconomicsD PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return args } @@ -106,6 +108,7 @@ func createArgsForEconomicsDataRealFees(handler economics.BuiltInFunctionsCostHa PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, BuiltInFunctionsCostHandler: handler, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return args } diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index deb23f544cd..e6b54aa2630 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -274,6 +274,7 @@ func TestVmContainerFactory_Create(t *testing.T) { PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } economicsData, _ := economics.NewEconomicsData(argsNewEconomicsData) diff --git a/process/peer/process_test.go b/process/peer/process_test.go index a04c18dbfbb..4ac7376c175 100644 --- a/process/peer/process_test.go +++ b/process/peer/process_test.go @@ -22,6 +22,7 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/storage" + "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -96,6 +97,7 @@ func createMockArguments() peer.ArgValidatorStatisticsProcessor { PenalizedTooMuchGasEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } economicsData, _ := economics.NewEconomicsData(argsNewEconomicsData) diff --git a/process/smartContract/process_test.go b/process/smartContract/process_test.go index 03e142841f0..06070d7ef48 100644 --- a/process/smartContract/process_test.go +++ b/process/smartContract/process_test.go @@ -4051,6 +4051,7 @@ func createRealEconomicsDataArgs() *economics.ArgsNewEconomicsData { PenalizedTooMuchGasEnableEpoch: 0, GasPriceModifierEnableEpoch: 0, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } } From d1420f66bb307f5c5ba81926b9a13c7a90be544a Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 3 Jun 2022 14:24:31 +0300 Subject: [PATCH 050/335] common, epochStart, process, statusHandler: add guarded tx base gas cost and metrics --- common/constants.go | 3 + epochStart/mock/economicsHandlerStub.go | 266 ----------------------- genesis/process/disabled/feeHandler.go | 5 + integrationTests/mock/feeHandlerStub.go | 235 -------------------- node/mock/txFeeHandlerStub.go | 275 ------------------------ node/nodeRunner.go | 1 + process/economics/economicsData.go | 19 +- process/errors.go | 3 + process/interface.go | 1 + process/mock/feeHandlerStub.go | 235 -------------------- process/smartContract/vmInput.go | 4 +- statusHandler/statusMetricsProvider.go | 1 + 12 files changed, 31 insertions(+), 1017 deletions(-) delete mode 100644 epochStart/mock/economicsHandlerStub.go delete mode 100644 integrationTests/mock/feeHandlerStub.go delete mode 100644 node/mock/txFeeHandlerStub.go delete mode 100644 process/mock/feeHandlerStub.go diff --git a/common/constants.go b/common/constants.go index b017ceed454..3b9959e9f63 100644 --- a/common/constants.go +++ b/common/constants.go @@ -297,6 +297,9 @@ const MetricMinGasPrice = "erd_min_gas_price" // MetricMinGasLimit is the metric that specifies the minimum gas limit const MetricMinGasLimit = "erd_min_gas_limit" +// MetricExtraGasLimitGuardedTx specifies the extra gas limit required for guarded transactions +const MetricExtraGasLimitGuardedTx = "erd_extra_gas_limit_guarded_tx" + // MetricRewardsTopUpGradientPoint is the metric that specifies the rewards top up gradient point const MetricRewardsTopUpGradientPoint = "erd_rewards_top_up_gradient_point" diff --git a/epochStart/mock/economicsHandlerStub.go b/epochStart/mock/economicsHandlerStub.go deleted file mode 100644 index 1d7818218a6..00000000000 --- a/epochStart/mock/economicsHandlerStub.go +++ /dev/null @@ -1,266 +0,0 @@ -package mock - -import ( - "math/big" - - "github.com/ElrondNetwork/elrond-go-core/data" -) - -// EconomicsHandlerStub - -type EconomicsHandlerStub struct { - MaxGasLimitPerBlockCalled func() uint64 - MaxGasLimitPerMiniBlockCalled func() uint64 - MaxGasLimitPerBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerMiniBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerTxCalled func() uint64 - SetMinGasPriceCalled func(minasPrice uint64) - SetMinGasLimitCalled func(minGasLimit uint64) - ComputeGasLimitCalled func(tx data.TransactionWithFeeHandler) uint64 - ComputeMoveBalanceFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - ComputeTxFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - CheckValidityTxValuesCalled func(tx data.TransactionWithFeeHandler) error - DeveloperPercentageCalled func() float64 - MinGasPriceCalled func() uint64 - LeaderPercentageCalled func() float64 - ProtocolSustainabilityPercentageCalled func() float64 - ProtocolSustainabilityAddressCalled func() string - MinInflationRateCalled func() float64 - MaxInflationRateCalled func(year uint32) float64 - ComputeFeeForProcessingCalled func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int - GasPriceModifierCalled func() float64 - SplitTxGasInCategoriesCalled func(tx data.TransactionWithFeeHandler) (uint64, uint64) - GasPriceForProcessingCalled func(tx data.TransactionWithFeeHandler) uint64 - GasPriceForMoveCalled func(tx data.TransactionWithFeeHandler) uint64 - MinGasPriceForProcessingCalled func() uint64 - ComputeGasUsedAndFeeBasedOnRefundValueCalled func(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) - ComputeTxFeeBasedOnGasUsedCalled func(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int - RewardsTopUpGradientPointCalled func() *big.Int - RewardsTopUpFactorCalled func() float64 - ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) -} - -// ComputeGasLimitBasedOnBalance - -func (ehs *EconomicsHandlerStub) ComputeGasLimitBasedOnBalance(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) { - if ehs.ComputeGasLimitBasedOnBalanceCalled != nil { - return ehs.ComputeGasLimitBasedOnBalanceCalled(tx, balance) - } - return 0, nil -} - -// MinGasPrice - -func (ehs *EconomicsHandlerStub) MinGasPrice() uint64 { - if ehs.MinGasPriceCalled != nil { - return ehs.MinGasPriceCalled() - } - return 0 -} - -// MinGasLimit will return min gas limit -func (ehs *EconomicsHandlerStub) MinGasLimit() uint64 { - return 0 -} - -// GasPerDataByte - -func (ehs *EconomicsHandlerStub) GasPerDataByte() uint64 { - return 0 -} - -// DeveloperPercentage - -func (ehs *EconomicsHandlerStub) DeveloperPercentage() float64 { - return ehs.DeveloperPercentageCalled() -} - -// GenesisTotalSupply - -func (ehs *EconomicsHandlerStub) GenesisTotalSupply() *big.Int { - return big.NewInt(0) -} - -// MaxGasLimitPerBlock - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerBlock(uint32) uint64 { - if ehs.MaxGasLimitPerBlockCalled != nil { - return ehs.MaxGasLimitPerBlockCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlock - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerMiniBlock(uint32) uint64 { - if ehs.MaxGasLimitPerMiniBlockCalled != nil { - return ehs.MaxGasLimitPerMiniBlockCalled() - } - return 0 -} - -// MaxGasLimitPerBlockForSafeCrossShard - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerBlockForSafeCrossShard() uint64 { - if ehs.MaxGasLimitPerBlockForSafeCrossShardCalled != nil { - return ehs.MaxGasLimitPerBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlockForSafeCrossShard - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerMiniBlockForSafeCrossShard() uint64 { - if ehs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled != nil { - return ehs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerTx - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerTx() uint64 { - if ehs.MaxGasLimitPerTxCalled != nil { - return ehs.MaxGasLimitPerTxCalled() - } - return 0 -} - -// ComputeGasLimit - -func (ehs *EconomicsHandlerStub) ComputeGasLimit(tx data.TransactionWithFeeHandler) uint64 { - return ehs.ComputeGasLimitCalled(tx) -} - -// ComputeMoveBalanceFee - -func (ehs *EconomicsHandlerStub) ComputeMoveBalanceFee(tx data.TransactionWithFeeHandler) *big.Int { - return ehs.ComputeMoveBalanceFeeCalled(tx) -} - -// ComputeTxFee - -func (ehs *EconomicsHandlerStub) ComputeTxFee(tx data.TransactionWithFeeHandler) *big.Int { - return ehs.ComputeTxFeeCalled(tx) -} - -// CheckValidityTxValues - -func (ehs *EconomicsHandlerStub) CheckValidityTxValues(tx data.TransactionWithFeeHandler) error { - return ehs.CheckValidityTxValuesCalled(tx) -} - -// LeaderPercentage - -func (ehs *EconomicsHandlerStub) LeaderPercentage() float64 { - if ehs.LeaderPercentageCalled != nil { - return ehs.LeaderPercentageCalled() - } - - return 1 -} - -// ProtocolSustainabilityPercentage will return the protocol sustainability percentage value -func (ehs *EconomicsHandlerStub) ProtocolSustainabilityPercentage() float64 { - if ehs.ProtocolSustainabilityPercentageCalled != nil { - return ehs.ProtocolSustainabilityPercentageCalled() - } - - return 0.1 -} - -// ProtocolSustainabilityAddress will return the protocol sustainability address -func (ehs *EconomicsHandlerStub) ProtocolSustainabilityAddress() string { - if ehs.ProtocolSustainabilityAddressCalled != nil { - return ehs.ProtocolSustainabilityAddressCalled() - } - - return "1111" -} - -// MinInflationRate - -func (ehs *EconomicsHandlerStub) MinInflationRate() float64 { - if ehs.MinInflationRateCalled != nil { - return ehs.MinInflationRateCalled() - } - - return 1 -} - -// MaxInflationRate - -func (ehs *EconomicsHandlerStub) MaxInflationRate(year uint32) float64 { - if ehs.MaxInflationRateCalled != nil { - return ehs.MaxInflationRateCalled(year) - } - - return 1000000 -} - -// ComputeFeeForProcessing - -func (ehs *EconomicsHandlerStub) ComputeFeeForProcessing(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { - if ehs.ComputeFeeForProcessingCalled != nil { - return ehs.ComputeFeeForProcessingCalled(tx, gasToUse) - } - return big.NewInt(0) -} - -// GasPriceModifier - -func (ehs *EconomicsHandlerStub) GasPriceModifier() float64 { - if ehs.GasPriceModifierCalled != nil { - return ehs.GasPriceModifierCalled() - } - return 0 -} - -// SplitTxGasInCategories - -func (ehs *EconomicsHandlerStub) SplitTxGasInCategories(tx data.TransactionWithFeeHandler) (uint64, uint64) { - if ehs.SplitTxGasInCategoriesCalled != nil { - return ehs.SplitTxGasInCategoriesCalled(tx) - } - return 0, 0 -} - -// GasPriceForProcessing - -func (ehs *EconomicsHandlerStub) GasPriceForProcessing(tx data.TransactionWithFeeHandler) uint64 { - if ehs.GasPriceForProcessingCalled != nil { - return ehs.GasPriceForProcessingCalled(tx) - } - return 0 -} - -// GasPriceForMove - -func (ehs *EconomicsHandlerStub) GasPriceForMove(tx data.TransactionWithFeeHandler) uint64 { - if ehs.GasPriceForMoveCalled != nil { - return ehs.GasPriceForMoveCalled(tx) - } - return 0 -} - -// MinGasPriceForProcessing - -func (ehs *EconomicsHandlerStub) MinGasPriceForProcessing() uint64 { - if ehs.MinGasPriceForProcessingCalled != nil { - return ehs.MinGasPriceForProcessingCalled() - } - return 0 -} - -// ComputeGasUsedAndFeeBasedOnRefundValue - -func (ehs *EconomicsHandlerStub) ComputeGasUsedAndFeeBasedOnRefundValue(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) { - if ehs.ComputeGasUsedAndFeeBasedOnRefundValueCalled != nil { - return ehs.ComputeGasUsedAndFeeBasedOnRefundValueCalled(tx, refundValue) - } - return 0, big.NewInt(0) -} - -// ComputeTxFeeBasedOnGasUsed - -func (ehs *EconomicsHandlerStub) ComputeTxFeeBasedOnGasUsed(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int { - if ehs.ComputeTxFeeBasedOnGasUsedCalled != nil { - return ehs.ComputeTxFeeBasedOnGasUsedCalled(tx, gasUsed) - } - return big.NewInt(0) -} - -// RewardsTopUpGradientPoint - -func (ehs *EconomicsHandlerStub) RewardsTopUpGradientPoint() *big.Int { - if ehs.RewardsTopUpGradientPointCalled != nil { - return ehs.RewardsTopUpGradientPointCalled() - } - return big.NewInt(0) -} - -// RewardsTopUpFactor - -func (ehs *EconomicsHandlerStub) RewardsTopUpFactor() float64 { - if ehs.RewardsTopUpFactorCalled != nil { - return ehs.RewardsTopUpFactorCalled() - } - return 0 -} - -// IsInterfaceNil returns true if there is no value under the interface -func (ehs *EconomicsHandlerStub) IsInterfaceNil() bool { - return ehs == nil -} diff --git a/genesis/process/disabled/feeHandler.go b/genesis/process/disabled/feeHandler.go index ef87e86139e..15928c725e9 100644 --- a/genesis/process/disabled/feeHandler.go +++ b/genesis/process/disabled/feeHandler.go @@ -42,6 +42,11 @@ func (fh *FeeHandler) MinGasLimit() uint64 { return 0 } +// ExtraGasLimitGuardedTx returns 0 +func (fh *FeeHandler) ExtraGasLimitGuardedTx() uint64 { + return 0 +} + // MaxGasLimitPerBlock returns max uint64 func (fh *FeeHandler) MaxGasLimitPerBlock(uint32) uint64 { return math.MaxUint64 diff --git a/integrationTests/mock/feeHandlerStub.go b/integrationTests/mock/feeHandlerStub.go deleted file mode 100644 index 1ca8ecbea97..00000000000 --- a/integrationTests/mock/feeHandlerStub.go +++ /dev/null @@ -1,235 +0,0 @@ -package mock - -import ( - "math/big" - - "github.com/ElrondNetwork/elrond-go-core/data" -) - -// FeeHandlerStub - -type FeeHandlerStub struct { - SetMaxGasLimitPerBlockCalled func(maxGasLimitPerBlock uint64) - SetMinGasPriceCalled func(minGasPrice uint64) - SetMinGasLimitCalled func(minGasLimit uint64) - MaxGasLimitPerBlockCalled func() uint64 - MaxGasLimitPerMiniBlockCalled func() uint64 - MaxGasLimitPerBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerMiniBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerTxCalled func() uint64 - ComputeGasLimitCalled func(tx data.TransactionWithFeeHandler) uint64 - ComputeMoveBalanceFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - ComputeTxFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - CheckValidityTxValuesCalled func(tx data.TransactionWithFeeHandler) error - DeveloperPercentageCalled func() float64 - MinGasPriceCalled func() uint64 - GasPriceModifierCalled func() float64 - ComputeFeeForProcessingCalled func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int - GenesisTotalSupplyCalled func() *big.Int - SplitTxGasInCategoriesCalled func(tx data.TransactionWithFeeHandler) (uint64, uint64) - GasPriceForProcessingCalled func(tx data.TransactionWithFeeHandler) uint64 - GasPriceForMoveCalled func(tx data.TransactionWithFeeHandler) uint64 - MinGasPriceForProcessingCalled func() uint64 - ComputeGasUsedAndFeeBasedOnRefundValueCalled func(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) - ComputeTxFeeBasedOnGasUsedCalled func(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int - ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) -} - -// ComputeGasLimitBasedOnBalance - -func (fhs *FeeHandlerStub) ComputeGasLimitBasedOnBalance(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) { - if fhs.ComputeGasLimitBasedOnBalanceCalled != nil { - return fhs.ComputeGasLimitBasedOnBalanceCalled(tx, balance) - } - return 0, nil -} - -// ComputeFeeForProcessing - -func (fhs *FeeHandlerStub) ComputeFeeForProcessing(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { - if fhs.ComputeFeeForProcessingCalled != nil { - return fhs.ComputeFeeForProcessingCalled(tx, gasToUse) - } - return big.NewInt(0) -} - -// GasPriceModifier - -func (fhs *FeeHandlerStub) GasPriceModifier() float64 { - if fhs.GasPriceModifierCalled != nil { - return fhs.GasPriceModifierCalled() - } - return 1.0 -} - -// MinGasPrice - -func (fhs *FeeHandlerStub) MinGasPrice() uint64 { - if fhs.MinGasPriceCalled != nil { - return fhs.MinGasPriceCalled() - } - return 0 -} - -// MinGasLimit will return min gas limit -func (fhs *FeeHandlerStub) MinGasLimit() uint64 { - return 0 -} - -// DeveloperPercentage - -func (fhs *FeeHandlerStub) DeveloperPercentage() float64 { - if fhs.DeveloperPercentageCalled != nil { - return fhs.DeveloperPercentageCalled() - } - - return 0.0 -} - -// GasPerDataByte - -func (fhs *FeeHandlerStub) GasPerDataByte() uint64 { - return 0 -} - -// SetMaxGasLimitPerBlock - -func (fhs *FeeHandlerStub) SetMaxGasLimitPerBlock(maxGasLimitPerBlock uint64) { - fhs.SetMaxGasLimitPerBlockCalled(maxGasLimitPerBlock) -} - -// SetMinGasPrice - -func (fhs *FeeHandlerStub) SetMinGasPrice(minGasPrice uint64) { - fhs.SetMinGasPriceCalled(minGasPrice) -} - -// SetMinGasLimit - -func (fhs *FeeHandlerStub) SetMinGasLimit(minGasLimit uint64) { - fhs.SetMinGasLimitCalled(minGasLimit) -} - -// MaxGasLimitPerBlock - -func (fhs *FeeHandlerStub) MaxGasLimitPerBlock(uint32) uint64 { - if fhs.MaxGasLimitPerBlockCalled != nil { - return fhs.MaxGasLimitPerBlockCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlock - -func (fhs *FeeHandlerStub) MaxGasLimitPerMiniBlock(uint32) uint64 { - if fhs.MaxGasLimitPerMiniBlockCalled != nil { - return fhs.MaxGasLimitPerMiniBlockCalled() - } - return 0 -} - -// MaxGasLimitPerBlockForSafeCrossShard - -func (fhs *FeeHandlerStub) MaxGasLimitPerBlockForSafeCrossShard() uint64 { - if fhs.MaxGasLimitPerBlockForSafeCrossShardCalled != nil { - return fhs.MaxGasLimitPerBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlockForSafeCrossShard - -func (fhs *FeeHandlerStub) MaxGasLimitPerMiniBlockForSafeCrossShard() uint64 { - if fhs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled != nil { - return fhs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerTx - -func (fhs *FeeHandlerStub) MaxGasLimitPerTx() uint64 { - if fhs.MaxGasLimitPerTxCalled != nil { - return fhs.MaxGasLimitPerTxCalled() - } - return 0 -} - -// ComputeGasLimit - -func (fhs *FeeHandlerStub) ComputeGasLimit(tx data.TransactionWithFeeHandler) uint64 { - if fhs.ComputeGasLimitCalled != nil { - return fhs.ComputeGasLimitCalled(tx) - } - return 0 -} - -// ComputeMoveBalanceFee - -func (fhs *FeeHandlerStub) ComputeMoveBalanceFee(tx data.TransactionWithFeeHandler) *big.Int { - if fhs.ComputeMoveBalanceFeeCalled != nil { - return fhs.ComputeMoveBalanceFeeCalled(tx) - } - return big.NewInt(0) -} - -// ComputeTxFee - -func (fhs *FeeHandlerStub) ComputeTxFee(tx data.TransactionWithFeeHandler) *big.Int { - if fhs.ComputeTxFeeCalled != nil { - return fhs.ComputeTxFeeCalled(tx) - } - return big.NewInt(0) -} - -// GenesisTotalSupply - -func (fhs *FeeHandlerStub) GenesisTotalSupply() *big.Int { - if fhs.GenesisTotalSupplyCalled != nil { - return fhs.GenesisTotalSupplyCalled() - } - - return big.NewInt(0) -} - -// CheckValidityTxValues - -func (fhs *FeeHandlerStub) CheckValidityTxValues(tx data.TransactionWithFeeHandler) error { - if fhs.CheckValidityTxValuesCalled != nil { - return fhs.CheckValidityTxValuesCalled(tx) - } - return nil -} - -// SplitTxGasInCategories - -func (fhs *FeeHandlerStub) SplitTxGasInCategories(tx data.TransactionWithFeeHandler) (uint64, uint64) { - if fhs.SplitTxGasInCategoriesCalled != nil { - return fhs.SplitTxGasInCategoriesCalled(tx) - } - return 0, 0 -} - -// GasPriceForProcessing - -func (fhs *FeeHandlerStub) GasPriceForProcessing(tx data.TransactionWithFeeHandler) uint64 { - if fhs.GasPriceForProcessingCalled != nil { - return fhs.GasPriceForProcessingCalled(tx) - } - return 0 -} - -// GasPriceForMove - -func (fhs *FeeHandlerStub) GasPriceForMove(tx data.TransactionWithFeeHandler) uint64 { - if fhs.GasPriceForMoveCalled != nil { - return fhs.GasPriceForMoveCalled(tx) - } - return 0 -} - -// MinGasPriceForProcessing - -func (fhs *FeeHandlerStub) MinGasPriceForProcessing() uint64 { - if fhs.MinGasPriceForProcessingCalled != nil { - return fhs.MinGasPriceForProcessingCalled() - } - return 0 -} - -// ComputeGasUsedAndFeeBasedOnRefundValue - -func (fhs *FeeHandlerStub) ComputeGasUsedAndFeeBasedOnRefundValue(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) { - if fhs.ComputeGasUsedAndFeeBasedOnRefundValueCalled != nil { - return fhs.ComputeGasUsedAndFeeBasedOnRefundValueCalled(tx, refundValue) - } - return 0, big.NewInt(0) -} - -// ComputeTxFeeBasedOnGasUsed - -func (fhs *FeeHandlerStub) ComputeTxFeeBasedOnGasUsed(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int { - if fhs.ComputeTxFeeBasedOnGasUsedCalled != nil { - return fhs.ComputeTxFeeBasedOnGasUsedCalled(tx, gasUsed) - } - return big.NewInt(0) -} - -// IsInterfaceNil returns true if there is no value under the interface -func (fhs *FeeHandlerStub) IsInterfaceNil() bool { - return fhs == nil -} diff --git a/node/mock/txFeeHandlerStub.go b/node/mock/txFeeHandlerStub.go deleted file mode 100644 index 1d0ce8c3689..00000000000 --- a/node/mock/txFeeHandlerStub.go +++ /dev/null @@ -1,275 +0,0 @@ -package mock - -import ( - "math/big" - - "github.com/ElrondNetwork/elrond-go-core/data" -) - -// EconomicsHandlerStub - -type EconomicsHandlerStub struct { - MaxGasLimitPerBlockCalled func() uint64 - MaxGasLimitPerMiniBlockCalled func() uint64 - MaxGasLimitPerBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerMiniBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerTxCalled func() uint64 - SetMinGasPriceCalled func(minGasPrice uint64) - SetMinGasLimitCalled func(minGasLimit uint64) - ComputeGasLimitCalled func(tx data.TransactionWithFeeHandler) uint64 - ComputeMoveBalanceFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - ComputeTxFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - CheckValidityTxValuesCalled func(tx data.TransactionWithFeeHandler) error - DeveloperPercentageCalled func() float64 - MinGasPriceCalled func() uint64 - LeaderPercentageCalled func() float64 - ProtocolSustainabilityPercentageCalled func() float64 - ProtocolSustainabilityAddressCalled func() string - MinInflationRateCalled func() float64 - MaxInflationRateCalled func(year uint32) float64 - GasPriceModifierCalled func() float64 - ComputeFeeForProcessingCalled func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int - GenesisTotalSupplyCalled func() *big.Int - RewardsTopUpGradientPointCalled func() *big.Int - RewardsTopUpFactorCalled func() float64 - SplitTxGasInCategoriesCalled func(tx data.TransactionWithFeeHandler) (uint64, uint64) - GasPriceForProcessingCalled func(tx data.TransactionWithFeeHandler) uint64 - GasPriceForMoveCalled func(tx data.TransactionWithFeeHandler) uint64 - MinGasPriceForProcessingCalled func() uint64 - ComputeGasUsedAndFeeBasedOnRefundValueCalled func(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) - ComputeTxFeeBasedOnGasUsedCalled func(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int - ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) -} - -// ComputeGasLimitBasedOnBalance - -func (ehs *EconomicsHandlerStub) ComputeGasLimitBasedOnBalance(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) { - if ehs.ComputeGasLimitBasedOnBalanceCalled != nil { - return ehs.ComputeGasLimitBasedOnBalanceCalled(tx, balance) - } - return 0, nil -} - -// ComputeFeeForProcessing - -func (ehs *EconomicsHandlerStub) ComputeFeeForProcessing(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { - if ehs.ComputeFeeForProcessingCalled != nil { - return ehs.ComputeFeeForProcessingCalled(tx, gasToUse) - } - return big.NewInt(0) -} - -// GasPriceModifier - -func (ehs *EconomicsHandlerStub) GasPriceModifier() float64 { - if ehs.GasPriceModifierCalled != nil { - return ehs.GasPriceModifierCalled() - } - return 1.0 -} - -// MinGasPrice - -func (ehs *EconomicsHandlerStub) MinGasPrice() uint64 { - if ehs.MinGasPriceCalled != nil { - return ehs.MinGasPriceCalled() - } - return 0 -} - -// MinGasLimit will return min gas limit -func (ehs *EconomicsHandlerStub) MinGasLimit() uint64 { - return 0 -} - -// GasPerDataByte - -func (ehs *EconomicsHandlerStub) GasPerDataByte() uint64 { - return 0 -} - -// DeveloperPercentage - -func (ehs *EconomicsHandlerStub) DeveloperPercentage() float64 { - return ehs.DeveloperPercentageCalled() -} - -// MaxGasLimitPerBlock - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerBlock(uint32) uint64 { - if ehs.MaxGasLimitPerBlockCalled != nil { - return ehs.MaxGasLimitPerBlockCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlock - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerMiniBlock(uint32) uint64 { - if ehs.MaxGasLimitPerMiniBlockCalled != nil { - return ehs.MaxGasLimitPerMiniBlockCalled() - } - return 0 -} - -// MaxGasLimitPerBlockForSafeCrossShard - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerBlockForSafeCrossShard() uint64 { - if ehs.MaxGasLimitPerBlockForSafeCrossShardCalled != nil { - return ehs.MaxGasLimitPerBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlockForSafeCrossShard - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerMiniBlockForSafeCrossShard() uint64 { - if ehs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled != nil { - return ehs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerTx - -func (ehs *EconomicsHandlerStub) MaxGasLimitPerTx() uint64 { - if ehs.MaxGasLimitPerTxCalled != nil { - return ehs.MaxGasLimitPerTxCalled() - } - return 0 -} - -// ComputeGasLimit - -func (ehs *EconomicsHandlerStub) ComputeGasLimit(tx data.TransactionWithFeeHandler) uint64 { - return ehs.ComputeGasLimitCalled(tx) -} - -// ComputeMoveBalanceFee - -func (ehs *EconomicsHandlerStub) ComputeMoveBalanceFee(tx data.TransactionWithFeeHandler) *big.Int { - return ehs.ComputeMoveBalanceFeeCalled(tx) -} - -// ComputeTxFee - -func (ehs *EconomicsHandlerStub) ComputeTxFee(tx data.TransactionWithFeeHandler) *big.Int { - return ehs.ComputeTxFeeCalled(tx) -} - -// CheckValidityTxValues - -func (ehs *EconomicsHandlerStub) CheckValidityTxValues(tx data.TransactionWithFeeHandler) error { - if ehs.CheckValidityTxValuesCalled != nil { - return ehs.CheckValidityTxValuesCalled(tx) - } - - return nil -} - -// LeaderPercentage - -func (ehs *EconomicsHandlerStub) LeaderPercentage() float64 { - if ehs.LeaderPercentageCalled != nil { - return ehs.LeaderPercentageCalled() - } - - return 1 -} - -// ProtocolSustainabilityPercentage will return the protocol sustainability percentage value -func (ehs *EconomicsHandlerStub) ProtocolSustainabilityPercentage() float64 { - if ehs.ProtocolSustainabilityPercentageCalled != nil { - return ehs.ProtocolSustainabilityPercentageCalled() - } - - return 0.1 -} - -// ProtocolSustainabilityAddress will return the protocol sustainability address -func (ehs *EconomicsHandlerStub) ProtocolSustainabilityAddress() string { - if ehs.ProtocolSustainabilityAddressCalled != nil { - return ehs.ProtocolSustainabilityAddressCalled() - } - - return "1111" -} - -// MinInflationRate - -func (ehs *EconomicsHandlerStub) MinInflationRate() float64 { - if ehs.MinInflationRateCalled != nil { - return ehs.MinInflationRateCalled() - } - - return 1 -} - -// MaxInflationRate - -func (ehs *EconomicsHandlerStub) MaxInflationRate(year uint32) float64 { - if ehs.MaxInflationRateCalled != nil { - return ehs.MaxInflationRateCalled(year) - } - - return 1000000 -} - -// GenesisTotalSupply - -func (ehs *EconomicsHandlerStub) GenesisTotalSupply() *big.Int { - if ehs.GenesisTotalSupplyCalled != nil { - return ehs.GenesisTotalSupplyCalled() - } - - return big.NewInt(0) -} - -// RewardsTopUpGradientPoint - -func (ehs *EconomicsHandlerStub) RewardsTopUpGradientPoint() *big.Int { - if ehs.RewardsTopUpGradientPointCalled != nil { - return ehs.RewardsTopUpGradientPointCalled() - } - return big.NewInt(0) -} - -// RewardsTopUpFactor - -func (ehs *EconomicsHandlerStub) RewardsTopUpFactor() float64 { - if ehs.RewardsTopUpFactorCalled != nil { - return ehs.RewardsTopUpFactorCalled() - } - return 0 -} - -// SplitTxGasInCategories - -func (ehs *EconomicsHandlerStub) SplitTxGasInCategories(tx data.TransactionWithFeeHandler) (uint64, uint64) { - if ehs.SplitTxGasInCategoriesCalled != nil { - return ehs.SplitTxGasInCategoriesCalled(tx) - } - return 0, 0 -} - -// GasPriceForProcessing - -func (ehs *EconomicsHandlerStub) GasPriceForProcessing(tx data.TransactionWithFeeHandler) uint64 { - if ehs.GasPriceForProcessingCalled != nil { - return ehs.GasPriceForProcessingCalled(tx) - } - return 0 -} - -// GasPriceForMove - -func (ehs *EconomicsHandlerStub) GasPriceForMove(tx data.TransactionWithFeeHandler) uint64 { - if ehs.GasPriceForMoveCalled != nil { - return ehs.GasPriceForMoveCalled(tx) - } - return 0 -} - -// MinGasPriceForProcessing - -func (ehs *EconomicsHandlerStub) MinGasPriceForProcessing() uint64 { - if ehs.MinGasPriceForProcessingCalled != nil { - return ehs.MinGasPriceForProcessingCalled() - } - return 0 -} - -// ComputeGasUsedAndFeeBasedOnRefundValue - -func (ehs *EconomicsHandlerStub) ComputeGasUsedAndFeeBasedOnRefundValue(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) { - if ehs.ComputeGasUsedAndFeeBasedOnRefundValueCalled != nil { - return ehs.ComputeGasUsedAndFeeBasedOnRefundValueCalled(tx, refundValue) - } - return 0, big.NewInt(0) -} - -// ComputeTxFeeBasedOnGasUsed - -func (ehs *EconomicsHandlerStub) ComputeTxFeeBasedOnGasUsed(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int { - if ehs.ComputeTxFeeBasedOnGasUsedCalled != nil { - return ehs.ComputeTxFeeBasedOnGasUsedCalled(tx, gasUsed) - } - return big.NewInt(0) -} - -// IsInterfaceNil returns true if there is no value under the interface -func (ehs *EconomicsHandlerStub) IsInterfaceNil() bool { - return ehs == nil -} diff --git a/node/nodeRunner.go b/node/nodeRunner.go index eb72107a0fe..bb1cda5e934 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -589,6 +589,7 @@ func (nr *nodeRunner) createMetrics( metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricGasPerDataByte, coreComponents.EconomicsData().GasPerDataByte()) metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricMinGasPrice, coreComponents.EconomicsData().MinGasPrice()) metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricMinGasLimit, coreComponents.EconomicsData().MinGasLimit()) + metrics.SaveUint64Metric(coreComponents.StatusHandler(), common.MetricExtraGasLimitGuardedTx, coreComponents.EconomicsData().ExtraGasLimitGuardedTx()) metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricRewardsTopUpGradientPoint, coreComponents.EconomicsData().RewardsTopUpGradientPoint().String()) metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricTopUpFactor, fmt.Sprintf("%g", coreComponents.EconomicsData().RewardsTopUpFactor())) metrics.SaveStringMetric(coreComponents.StatusHandler(), common.MetricGasPriceModifier, fmt.Sprintf("%g", coreComponents.EconomicsData().GasPriceModifier())) diff --git a/process/economics/economicsData.go b/process/economics/economicsData.go index ad0fce13e34..9b38b342315 100644 --- a/process/economics/economicsData.go +++ b/process/economics/economicsData.go @@ -138,6 +138,7 @@ func NewEconomicsData(args ArgsNewEconomicsData) (*economicsData, error) { statusHandler: statusHandler.NewNilStatusHandler(), builtInFunctionsCostHandler: args.BuiltInFunctionsCostHandler, txVersionHandler: args.TxVersionChecker, + extraGasLimitGuardedTx: convertedData.extraGasLimitGuardedTx, } log.Debug("economicsData: enable epoch for penalized too much gas", "epoch", ed.penalizedTooMuchGasEnableEpoch) log.Debug("economicsData: enable epoch for gas price modifier", "epoch", ed.gasPriceModifierEnableEpoch) @@ -181,10 +182,16 @@ func convertValues(economics *config.EconomicsConfig) (*economicsData, error) { return nil, process.ErrInvalidGenesisTotalSupply } + extraGasLimitGuardedTx, err := strconv.ParseUint(economics.FeeSettings.ExtraGasLimitGuardedTx, conversionBase, bitConversionSize) + if err != nil { + return nil, process.ErrInvalidExtraGasLimitGuardedTx + } + return &economicsData{ - minGasPrice: minGasPrice, - gasPerDataByte: gasPerDataByte, - genesisTotalSupply: genesisTotalSupply, + minGasPrice: minGasPrice, + gasPerDataByte: gasPerDataByte, + genesisTotalSupply: genesisTotalSupply, + extraGasLimitGuardedTx: extraGasLimitGuardedTx, }, nil } @@ -390,6 +397,11 @@ func (ed *economicsData) MinGasLimit() uint64 { return ed.minGasLimit } +// ExtraGasLimitGuardedTx returns the extra gas limit required by the guarded transactions +func (ed *economicsData) ExtraGasLimitGuardedTx() uint64 { + return ed.extraGasLimitGuardedTx +} + // GasPerDataByte will return the gas required for a economicsData byte func (ed *economicsData) GasPerDataByte() uint64 { return ed.gasPerDataByte @@ -741,7 +753,6 @@ func (ed *economicsData) setGasLimitConfig(currentEpoch uint32) { "maxGasLimitPerMetaMiniBlock", ed.maxGasLimitPerMetaMiniBlock, "maxGasLimitPerTx", ed.maxGasLimitPerTx, "minGasLimit", ed.minGasLimit, - "extraGasLimitGuardedTx", ed.extraGasLimitGuardedTx, ) ed.statusHandler.SetUInt64Value(common.MetricMaxGasPerTransaction, ed.maxGasLimitPerTx) diff --git a/process/errors.go b/process/errors.go index ed0f2e6c361..4b13f64667c 100644 --- a/process/errors.go +++ b/process/errors.go @@ -525,6 +525,9 @@ var ErrMaxGasLimitUsedForDestMeTxsIsReached = errors.New("max gas limit used for // ErrInvalidMinimumGasPrice signals that an invalid gas price has been read from config file var ErrInvalidMinimumGasPrice = errors.New("invalid minimum gas price") +// ErrInvalidExtraGasLimitGuardedTx signals that an invalid gas limit has been provided in the config file +var ErrInvalidExtraGasLimitGuardedTx = errors.New("invalid extra gas limit for guarded transactions") + // ErrInvalidMinimumGasLimitForTx signals that an invalid minimum gas limit for transactions has been read from config file var ErrInvalidMinimumGasLimitForTx = errors.New("invalid minimum gas limit for transactions") diff --git a/process/interface.go b/process/interface.go index b1832161581..8c099758b4f 100644 --- a/process/interface.go +++ b/process/interface.go @@ -639,6 +639,7 @@ type feeHandler interface { MinGasPrice() uint64 GasPriceModifier() float64 MinGasLimit() uint64 + ExtraGasLimitGuardedTx() uint64 SplitTxGasInCategories(tx data.TransactionWithFeeHandler) (uint64, uint64) GasPriceForProcessing(tx data.TransactionWithFeeHandler) uint64 GasPriceForMove(tx data.TransactionWithFeeHandler) uint64 diff --git a/process/mock/feeHandlerStub.go b/process/mock/feeHandlerStub.go deleted file mode 100644 index 86a5c98bc09..00000000000 --- a/process/mock/feeHandlerStub.go +++ /dev/null @@ -1,235 +0,0 @@ -package mock - -import ( - "math/big" - - "github.com/ElrondNetwork/elrond-go-core/data" -) - -// FeeHandlerStub - -type FeeHandlerStub struct { - SetMaxGasLimitPerBlockCalled func(maxGasLimitPerBlock uint64) - SetMinGasPriceCalled func(minGasPrice uint64) - SetMinGasLimitCalled func(minGasLimit uint64) - MaxGasLimitPerBlockCalled func() uint64 - MaxGasLimitPerMiniBlockCalled func() uint64 - MaxGasLimitPerBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerMiniBlockForSafeCrossShardCalled func() uint64 - MaxGasLimitPerTxCalled func() uint64 - ComputeGasLimitCalled func(tx data.TransactionWithFeeHandler) uint64 - ComputeMoveBalanceFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - ComputeTxFeeCalled func(tx data.TransactionWithFeeHandler) *big.Int - CheckValidityTxValuesCalled func(tx data.TransactionWithFeeHandler) error - DeveloperPercentageCalled func() float64 - MinGasPriceCalled func() uint64 - GasPriceModifierCalled func() float64 - ComputeFeeForProcessingCalled func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int - GenesisTotalSupplyCalled func() *big.Int - SplitTxGasInCategoriesCalled func(tx data.TransactionWithFeeHandler) (uint64, uint64) - GasPriceForProcessingCalled func(tx data.TransactionWithFeeHandler) uint64 - GasPriceForMoveCalled func(tx data.TransactionWithFeeHandler) uint64 - MinGasPriceForProcessingCalled func() uint64 - ComputeGasUsedAndFeeBasedOnRefundValueCalled func(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) - ComputeTxFeeBasedOnGasUsedCalled func(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int - ComputeGasLimitBasedOnBalanceCalled func(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) -} - -// ComputeFeeForProcessing - -func (fhs *FeeHandlerStub) ComputeFeeForProcessing(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { - if fhs.ComputeFeeForProcessingCalled != nil { - return fhs.ComputeFeeForProcessingCalled(tx, gasToUse) - } - return big.NewInt(0) -} - -// ComputeGasLimitBasedOnBalance - -func (fhs *FeeHandlerStub) ComputeGasLimitBasedOnBalance(tx data.TransactionWithFeeHandler, balance *big.Int) (uint64, error) { - if fhs.ComputeGasLimitBasedOnBalanceCalled != nil { - return fhs.ComputeGasLimitBasedOnBalanceCalled(tx, balance) - } - return 0, nil -} - -// GasPriceModifier - -func (fhs *FeeHandlerStub) GasPriceModifier() float64 { - if fhs.GasPriceModifierCalled != nil { - return fhs.GasPriceModifierCalled() - } - return 1.0 -} - -// MinGasPrice - -func (fhs *FeeHandlerStub) MinGasPrice() uint64 { - if fhs.MinGasPriceCalled != nil { - return fhs.MinGasPriceCalled() - } - return 0 -} - -// MinGasLimit will return min gas limit -func (fhs *FeeHandlerStub) MinGasLimit() uint64 { - return 0 -} - -// DeveloperPercentage - -func (fhs *FeeHandlerStub) DeveloperPercentage() float64 { - if fhs.DeveloperPercentageCalled != nil { - return fhs.DeveloperPercentageCalled() - } - - return 0.0 -} - -// GasPerDataByte - -func (fhs *FeeHandlerStub) GasPerDataByte() uint64 { - return 0 -} - -// SetMaxGasLimitPerBlock - -func (fhs *FeeHandlerStub) SetMaxGasLimitPerBlock(maxGasLimitPerBlock uint64) { - fhs.SetMaxGasLimitPerBlockCalled(maxGasLimitPerBlock) -} - -// SetMinGasPrice - -func (fhs *FeeHandlerStub) SetMinGasPrice(minGasPrice uint64) { - fhs.SetMinGasPriceCalled(minGasPrice) -} - -// SetMinGasLimit - -func (fhs *FeeHandlerStub) SetMinGasLimit(minGasLimit uint64) { - fhs.SetMinGasLimitCalled(minGasLimit) -} - -// MaxGasLimitPerBlock - -func (fhs *FeeHandlerStub) MaxGasLimitPerBlock(uint32) uint64 { - if fhs.MaxGasLimitPerBlockCalled != nil { - return fhs.MaxGasLimitPerBlockCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlock - -func (fhs *FeeHandlerStub) MaxGasLimitPerMiniBlock(uint32) uint64 { - if fhs.MaxGasLimitPerMiniBlockCalled != nil { - return fhs.MaxGasLimitPerMiniBlockCalled() - } - return 0 -} - -// MaxGasLimitPerBlockForSafeCrossShard - -func (fhs *FeeHandlerStub) MaxGasLimitPerBlockForSafeCrossShard() uint64 { - if fhs.MaxGasLimitPerBlockForSafeCrossShardCalled != nil { - return fhs.MaxGasLimitPerBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerMiniBlockForSafeCrossShard - -func (fhs *FeeHandlerStub) MaxGasLimitPerMiniBlockForSafeCrossShard() uint64 { - if fhs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled != nil { - return fhs.MaxGasLimitPerMiniBlockForSafeCrossShardCalled() - } - return 0 -} - -// MaxGasLimitPerTx - -func (fhs *FeeHandlerStub) MaxGasLimitPerTx() uint64 { - if fhs.MaxGasLimitPerTxCalled != nil { - return fhs.MaxGasLimitPerTxCalled() - } - return 0 -} - -// ComputeGasLimit - -func (fhs *FeeHandlerStub) ComputeGasLimit(tx data.TransactionWithFeeHandler) uint64 { - if fhs.ComputeGasLimitCalled != nil { - return fhs.ComputeGasLimitCalled(tx) - } - return 0 -} - -// ComputeMoveBalanceFee - -func (fhs *FeeHandlerStub) ComputeMoveBalanceFee(tx data.TransactionWithFeeHandler) *big.Int { - if fhs.ComputeMoveBalanceFeeCalled != nil { - return fhs.ComputeMoveBalanceFeeCalled(tx) - } - return big.NewInt(0) -} - -// ComputeTxFee - -func (fhs *FeeHandlerStub) ComputeTxFee(tx data.TransactionWithFeeHandler) *big.Int { - if fhs.ComputeTxFeeCalled != nil { - return fhs.ComputeTxFeeCalled(tx) - } - return big.NewInt(0) -} - -// GenesisTotalSupply - -func (fhs *FeeHandlerStub) GenesisTotalSupply() *big.Int { - if fhs.GenesisTotalSupplyCalled != nil { - return fhs.GenesisTotalSupplyCalled() - } - - return big.NewInt(0) -} - -// CheckValidityTxValues - -func (fhs *FeeHandlerStub) CheckValidityTxValues(tx data.TransactionWithFeeHandler) error { - if fhs.CheckValidityTxValuesCalled != nil { - return fhs.CheckValidityTxValuesCalled(tx) - } - return nil -} - -// SplitTxGasInCategories - -func (fhs *FeeHandlerStub) SplitTxGasInCategories(tx data.TransactionWithFeeHandler) (uint64, uint64) { - if fhs.SplitTxGasInCategoriesCalled != nil { - return fhs.SplitTxGasInCategoriesCalled(tx) - } - return 0, 0 -} - -// GasPriceForProcessing - -func (fhs *FeeHandlerStub) GasPriceForProcessing(tx data.TransactionWithFeeHandler) uint64 { - if fhs.GasPriceForProcessingCalled != nil { - return fhs.GasPriceForProcessingCalled(tx) - } - return 0 -} - -// GasPriceForMove - -func (fhs *FeeHandlerStub) GasPriceForMove(tx data.TransactionWithFeeHandler) uint64 { - if fhs.GasPriceForMoveCalled != nil { - return fhs.GasPriceForMoveCalled(tx) - } - return 0 -} - -// MinGasPriceForProcessing - -func (fhs *FeeHandlerStub) MinGasPriceForProcessing() uint64 { - if fhs.MinGasPriceForProcessingCalled != nil { - return fhs.MinGasPriceForProcessingCalled() - } - return 0 -} - -// ComputeGasUsedAndFeeBasedOnRefundValue - -func (fhs *FeeHandlerStub) ComputeGasUsedAndFeeBasedOnRefundValue(tx data.TransactionWithFeeHandler, refundValue *big.Int) (uint64, *big.Int) { - if fhs.ComputeGasUsedAndFeeBasedOnRefundValueCalled != nil { - return fhs.ComputeGasUsedAndFeeBasedOnRefundValueCalled(tx, refundValue) - } - return 0, big.NewInt(0) -} - -// ComputeTxFeeBasedOnGasUsed - -func (fhs *FeeHandlerStub) ComputeTxFeeBasedOnGasUsed(tx data.TransactionWithFeeHandler, gasUsed uint64) *big.Int { - if fhs.ComputeTxFeeBasedOnGasUsedCalled != nil { - return fhs.ComputeTxFeeBasedOnGasUsedCalled(tx, gasUsed) - } - return big.NewInt(0) -} - -// IsInterfaceNil returns true if there is no value under the interface -func (fhs *FeeHandlerStub) IsInterfaceNil() bool { - return fhs == nil -} diff --git a/process/smartContract/vmInput.go b/process/smartContract/vmInput.go index dde7c8406ba..b4943b05b58 100644 --- a/process/smartContract/vmInput.go +++ b/process/smartContract/vmInput.go @@ -95,8 +95,8 @@ func (sc *scProcessor) createVMCallInput( vmCallInput.CurrentTxHash = txHash vmCallInput.GasLocked = gasLocked - gtx, isGuardedTx := tx.(data.GuardedTransactionHandler) - if isGuardedTx { + gtx, ok := tx.(data.GuardedTransactionHandler) + if ok { vmCallInput.TxGuardian = gtx.GetGuardianAddr() } diff --git a/statusHandler/statusMetricsProvider.go b/statusHandler/statusMetricsProvider.go index b4222c2edf7..259382ca686 100644 --- a/statusHandler/statusMetricsProvider.go +++ b/statusHandler/statusMetricsProvider.go @@ -209,6 +209,7 @@ func (sm *statusMetrics) ConfigMetrics() map[string]interface{} { configMetrics[common.MetricMetaConsensusGroupSize] = sm.uint64Metrics[common.MetricMetaConsensusGroupSize] configMetrics[common.MetricMinGasPrice] = sm.uint64Metrics[common.MetricMinGasPrice] configMetrics[common.MetricMinGasLimit] = sm.uint64Metrics[common.MetricMinGasLimit] + configMetrics[common.MetricExtraGasLimitGuardedTx] = sm.uint64Metrics[common.MetricExtraGasLimitGuardedTx] configMetrics[common.MetricMaxGasPerTransaction] = sm.uint64Metrics[common.MetricMaxGasPerTransaction] configMetrics[common.MetricRoundDuration] = sm.uint64Metrics[common.MetricRoundDuration] configMetrics[common.MetricStartTime] = sm.uint64Metrics[common.MetricStartTime] From 8de5c36ba65c0bd3566b3d9c802266b5168cb42f Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 3 Jun 2022 14:26:40 +0300 Subject: [PATCH 051/335] process, integrationTests: fix tests after removal duplicated mocks --- api/groups/networkGroup_test.go | 30 +++++++ integrationTests/testInitializer.go | 3 +- integrationTests/vm/testInitializer.go | 9 +- process/block/baseProcess_test.go | 3 +- .../postprocess/intermediateResults_test.go | 63 +++++++------- .../block/preprocess/transactionsV2_test.go | 5 +- process/block/shardblock_test.go | 19 +++-- process/coordinator/process_test.go | 85 ++++++++++--------- .../metaInterceptorsContainerFactory_test.go | 3 +- .../shardInterceptorsContainerFactory_test.go | 3 +- ...rmediateProcessorsContainerFactory_test.go | 17 ++-- .../preProcessorsContainerFactory_test.go | 39 ++++----- .../preProcessorsContainerFactory_test.go | 47 +++++----- .../interceptedMetaHeaderDataFactory_test.go | 3 +- process/smartContract/process_test.go | 22 ++--- process/track/baseBlockTrack_test.go | 7 +- .../transactionCostEstimator_test.go | 33 +++---- statusHandler/statusMetricsProvider_test.go | 3 +- .../economicsDataHandlerStub.go | 9 ++ .../economicsmocks/economicsHandlerMock.go | 5 ++ 20 files changed, 234 insertions(+), 174 deletions(-) diff --git a/api/groups/networkGroup_test.go b/api/groups/networkGroup_test.go index 9dd3e7233ac..73a07c6bfde 100644 --- a/api/groups/networkGroup_test.go +++ b/api/groups/networkGroup_test.go @@ -80,6 +80,36 @@ func TestNetworkConfigMetrics_ShouldWork(t *testing.T) { assert.True(t, keyAndValueFoundInResponse) } +func TestNetworkConfigMetrics_GasLimitGuardedTxShouldWork(t *testing.T) { + t.Parallel() + + statusMetricsProvider := statusHandler.NewStatusMetrics() + key := common.MetricExtraGasLimitGuardedTx + value := uint64(37) + statusMetricsProvider.SetUInt64Value(key, value) + + facade := mock.FacadeStub{} + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + return statusMetricsProvider + } + + networkGroup, err := groups.NewNetworkGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(networkGroup, "network", getNetworkRoutesConfig()) + + req, _ := http.NewRequest("GET", "/network/config", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + respBytes, _ := ioutil.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)) + assert.True(t, keyAndValueFoundInResponse) +} + func TestNetworkStatusMetrics_ShouldWork(t *testing.T) { t.Parallel() diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 4d8f06e6ed9..c5abf923660 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -60,6 +60,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/storageUnit" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/genesisMocks" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" @@ -1031,7 +1032,7 @@ func CreateSimpleTxProcessor(accnts state.AccountsAdapter) process.TransactionPr ScProcessor: &testscommon.SCProcessorMock{}, TxFeeHandler: &testscommon.UnsignedTxHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return tx.GetGasLimit() }, diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 7c425f3776b..15261273f95 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -55,6 +55,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/txcache" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/txDataBuilder" @@ -222,8 +223,8 @@ func (vmTestContext *VMTestContext) GetIntValueFromSCWithTransientVM(funcName st // GetVMOutputWithTransientVM - func (vmTestContext *VMTestContext) GetVMOutputWithTransientVM(funcName string, args ...[]byte) *vmcommon.VMOutput { scAddressBytes := vmTestContext.Contract.Address - feeHandler := &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + feeHandler := &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -1360,8 +1361,8 @@ func GetVmOutput(gasSchedule map[string]map[string]uint64, accnts state.Accounts _ = vmContainer.Close() }() - feeHandler := &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + feeHandler := &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } diff --git a/process/block/baseProcess_test.go b/process/block/baseProcess_test.go index e24103aa136..2b721986695 100644 --- a/process/block/baseProcess_test.go +++ b/process/block/baseProcess_test.go @@ -38,6 +38,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/mainFactoryMocks" @@ -418,7 +419,7 @@ func createMockTransactionCoordinatorArguments( FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 0, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index ff18b16d67f..c8f3aec3145 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -15,6 +15,7 @@ import ( "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/mock" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/stretchr/testify/assert" ) @@ -36,7 +37,7 @@ func TestNewIntermediateResultsProcessor_NilHashes(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -54,7 +55,7 @@ func TestNewIntermediateResultsProcessor_NilMarshalizer(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -72,7 +73,7 @@ func TestNewIntermediateResultsProcessor_NilShardCoordinator(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -90,7 +91,7 @@ func TestNewIntermediateResultsProcessor_NilPubkeyConverter(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -108,7 +109,7 @@ func TestNewIntermediateResultsProcessor_NilStorer(t *testing.T) { nil, block.TxBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -126,7 +127,7 @@ func TestNewIntermediateResultsProcessor_NilTxForCurrentBlockHandler(t *testing. &mock.ChainStorerMock{}, block.TxBlock, nil, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -162,7 +163,7 @@ func TestNewIntermediateResultsProcessor_Good(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -181,7 +182,7 @@ func TestIntermediateResultsProcessor_getShardIdsFromAddressesGood(t *testing.T) &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -206,7 +207,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactions(t *testing.T) &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -228,7 +229,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsWrongType(t *te &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -253,7 +254,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsNilSender(t *te &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -286,7 +287,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsNilReceiver(t * &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -326,7 +327,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsShardIdMismatch &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -360,7 +361,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsNegativeValueIn &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -400,7 +401,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsAddrGood(t *tes &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -434,7 +435,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsAddAndRevert(t &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -478,7 +479,7 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksNothingInCache(t * &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -504,7 +505,7 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksNotCrossShard(t *t &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -542,7 +543,7 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksCrossShard(t *test &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -605,7 +606,7 @@ func TestIntermediateResultsProcessor_GetNumOfCrossInterMbsAndTxsShouldWork(t *t &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) txs := make([]data.TransactionHandler, 0) @@ -640,7 +641,7 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksNilBody(t *testing.T) &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -664,7 +665,7 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldpassAsNotCr &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -693,7 +694,7 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyMissingMiniblock( &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -720,7 +721,7 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyMiniBlockMissmatc &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -770,11 +771,11 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldPass(t *tes &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return maxGasLimitPerBlock }, }, @@ -844,7 +845,7 @@ func TestIntermediateResultsProcessor_SaveCurrentIntermediateTxToStorageShouldSa }, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -889,7 +890,7 @@ func TestIntermediateResultsProcessor_CreateMarshalizedDataNothingToMarshal(t *t &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -921,7 +922,7 @@ func TestIntermediateResultsProcessor_CreateMarshalizedData(t *testing.T) { &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -989,7 +990,7 @@ func TestIntermediateResultsProcessor_GetAllCurrentUsedTxs(t *testing.T) { &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.NotNil(t, irp) @@ -1033,7 +1034,7 @@ func TestIntermediateResultsProcessor_SplitMiniBlocksIfNeededShouldWork(t *testi &mock.ChainStorerMock{}, block.SmartContractResultBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { return gasLimit }, diff --git a/process/block/preprocess/transactionsV2_test.go b/process/block/preprocess/transactionsV2_test.go index b7f55d34964..677dcf3d1d4 100644 --- a/process/block/preprocess/transactionsV2_test.go +++ b/process/block/preprocess/transactionsV2_test.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/storage/txcache" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -34,14 +35,14 @@ func createTransactionPreprocessor() *transactions { ShardCoordinator: mock.NewMultiShardsCoordinatorMock(3), Accounts: &stateMock.AccountsStub{}, OnRequestTransaction: requestTransaction, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { return MaxGasLimitPerBlock }, MaxGasLimitPerBlockForSafeCrossShardCalled: func() uint64 { return MaxGasLimitPerBlock }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, MaxGasLimitPerTxCalled: func() uint64 { diff --git a/process/block/shardblock_test.go b/process/block/shardblock_test.go index 0138ffe5c34..9172ac71fb0 100644 --- a/process/block/shardblock_test.go +++ b/process/block/shardblock_test.go @@ -34,6 +34,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -434,11 +435,11 @@ func TestShardProcessor_ProcessBlockWithInvalidTransactionShouldErr(t *testing.T &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, }, @@ -657,11 +658,11 @@ func TestShardProcessor_ProcessBlockWithErrOnProcessBlockTransactionsCallShouldR &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, }, @@ -2556,7 +2557,7 @@ func TestShardProcessor_MarshalizedDataToBroadcastShouldWork(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -2666,7 +2667,7 @@ func TestShardProcessor_MarshalizedDataMarshalWithoutSuccess(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -3039,11 +3040,11 @@ func TestShardProcessor_CreateMiniBlocksShouldWorkWithIntraShardTxs(t *testing.T &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, }, @@ -3243,7 +3244,7 @@ func TestShardProcessor_RestoreBlockIntoPoolsShouldWork(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, diff --git a/process/coordinator/process_test.go b/process/coordinator/process_test.go index 8d5a73dd559..78499583361 100644 --- a/process/coordinator/process_test.go +++ b/process/coordinator/process_test.go @@ -31,6 +31,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/storageUnit" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -43,12 +44,12 @@ const MaxGasLimitPerBlock = uint64(100000) var txHash = []byte("tx_hash1") -func FeeHandlerMock() *mock.FeeHandlerStub { - return &mock.FeeHandlerStub{ +func FeeHandlerMock() *economicsmocks.EconomicsHandlerStub { + return &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, MaxGasLimitPerMiniBlockCalled: func() uint64 { @@ -231,7 +232,7 @@ func createMockTransactionCoordinatorArguments() ArgTransactionCoordinator { FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 0, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, @@ -545,7 +546,7 @@ func createInterimProcessorContainer() process.IntermediateProcessorContainer { createMockPubkeyConverter(), initStore(), initDataPool([]byte("test_hash1")), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) container, _ := preFactory.Create() @@ -1315,8 +1316,8 @@ func TestTransactionCoordinator_CreateMbsAndProcessTransactionsFromMeMultipleMin argsTransactionCoordinator.MiniBlockPool = tdp.MiniBlocks() argsTransactionCoordinator.PreProcessors = createPreProcessorContainerWithDataPool( tdp, - &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { @@ -1378,8 +1379,8 @@ func TestTransactionCoordinator_CompactAndExpandMiniblocksShouldWork(t *testing. argsTransactionCoordinator.MiniBlockPool = tdp.MiniBlocks() argsTransactionCoordinator.PreProcessors = createPreProcessorContainerWithDataPool( tdp, - &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { @@ -2136,7 +2137,7 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsNilOrMiss(t *testi createMockPubkeyConverter(), &mock.ChainStorerMock{}, tdp, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) container, _ := preFactory.Create() @@ -2190,8 +2191,8 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsOk(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, tdp, - &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, }, @@ -2559,7 +2560,7 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldReturnWhenEpochIsNo FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 1, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, @@ -2597,11 +2598,11 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldErrMaxGasLimitPerMi FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return maxGasLimitPerBlock + 1 }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return maxGasLimitPerBlock }, MaxGasLimitPerMiniBlockCalled: func() uint64 { @@ -2663,11 +2664,11 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldErrMaxAccumulatedFe FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return maxGasLimitPerBlock }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return maxGasLimitPerBlock }, MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { @@ -2740,11 +2741,11 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldErrMaxDeveloperFees FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return maxGasLimitPerBlock }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return maxGasLimitPerBlock }, MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { @@ -2817,11 +2818,11 @@ func TestTransactionCoordinator_VerifyCreatedMiniBlocksShouldWork(t *testing.T) FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return maxGasLimitPerBlock }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return maxGasLimitPerBlock }, MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { @@ -2893,7 +2894,7 @@ func TestTransactionCoordinator_GetAllTransactionsShouldWork(t *testing.T) { FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 0, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, @@ -2966,8 +2967,8 @@ func TestTransactionCoordinator_VerifyGasLimitShouldErrMaxGasLimitPerMiniBlockIn FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return tx1GasLimit + tx2GasLimit + tx3GasLimit - 1 }, MaxGasLimitPerMiniBlockCalled: func() uint64 { @@ -3059,8 +3060,8 @@ func TestTransactionCoordinator_VerifyGasLimitShouldWork(t *testing.T) { FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return tx1GasLimit + tx2GasLimit + tx3GasLimit }, MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { @@ -3148,7 +3149,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 0, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, @@ -3190,7 +3191,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return tx.GetGasLimit() + 1 }, @@ -3247,7 +3248,7 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, @@ -3309,8 +3310,8 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return tx1GasLimit + tx2GasLimit + tx3GasLimit - 1 }, MaxGasLimitPerMiniBlockCalled: func() uint64 { @@ -3376,8 +3377,8 @@ func TestTransactionCoordinator_CheckGasProvidedByMiniBlockInReceiverShardShould FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return tx1GasLimit + tx2GasLimit + tx3GasLimit }, MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { @@ -3440,7 +3441,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMissingTransaction(t *testing FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 0, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, @@ -3495,7 +3496,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxAccumulatedFeesExceeded(t FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.1 }, @@ -3564,7 +3565,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxDeveloperFeesExceeded(t *t FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.1 }, @@ -3632,7 +3633,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxAccumulatedFeesExceededWhe FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.1 }, @@ -3715,7 +3716,7 @@ func TestTransactionCoordinator_VerifyFeesShouldErrMaxDeveloperFeesExceededWhenS FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.1 }, @@ -3798,7 +3799,7 @@ func TestTransactionCoordinator_VerifyFeesShouldWork(t *testing.T) { FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.1 }, @@ -3885,7 +3886,7 @@ func TestTransactionCoordinator_GetMaxAccumulatedAndDeveloperFeesShouldErr(t *te FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 0, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, @@ -3933,7 +3934,7 @@ func TestTransactionCoordinator_GetMaxAccumulatedAndDeveloperFeesShouldWork(t *t FeeHandler: &mock.FeeAccumulatorStub{}, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.1 }, @@ -4003,7 +4004,7 @@ func TestTransactionCoordinator_RevertIfNeededShouldWork(t *testing.T) { }, BlockSizeComputation: &testscommon.BlockSizeComputationStub{}, BalanceComputation: &testscommon.BalanceComputationStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, BlockGasAndFeesReCheckEnableEpoch: 0, TransactionsLogProcessor: &mock.TxLogsProcessorStub{}, diff --git a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go index b15c28332bf..e536f8c65e2 100644 --- a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go +++ b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -565,7 +566,7 @@ func getArgumentsMeta( DataPool: createMetaDataPools(), Accounts: &stateMock.AccountsStub{}, MaxTxNonceDeltaAllowed: maxTxNonceDeltaAllowed, - TxFeeHandler: &mock.FeeHandlerStub{}, + TxFeeHandler: &economicsmocks.EconomicsHandlerStub{}, BlockBlackList: &mock.BlackListHandlerStub{}, HeaderSigVerifier: &mock.HeaderSigVerifierStub{}, HeaderIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, diff --git a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go index a6188dd0ec3..9c0d042e319 100644 --- a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go +++ b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go @@ -15,6 +15,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" @@ -643,7 +644,7 @@ func getArgumentsShard( Store: createShardStore(), DataPool: createShardDataPools(), MaxTxNonceDeltaAllowed: maxTxNonceDeltaAllowed, - TxFeeHandler: &mock.FeeHandlerStub{}, + TxFeeHandler: &economicsmocks.EconomicsHandlerStub{}, BlockBlackList: &mock.BlackListHandlerStub{}, HeaderSigVerifier: &mock.HeaderSigVerifierStub{}, HeaderIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, diff --git a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go index e2f56942bb5..8d827ce7657 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go @@ -7,6 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/factory/metachain" "github.com/ElrondNetwork/elrond-go/process/mock" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/stretchr/testify/assert" ) @@ -25,7 +26,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilShardCoord(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -42,7 +43,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilMarshalizer(t *testing.T) createMockPubkeyConverter(), &mock.ChainStorerMock{}, dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -59,7 +60,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilHasher(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -76,7 +77,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilAdrConv(t *testing.T) { nil, &mock.ChainStorerMock{}, dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -93,7 +94,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilStorer(t *testing.T) { createMockPubkeyConverter(), nil, dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -110,7 +111,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilPoolsHolder(t *testing.T) createMockPubkeyConverter(), &mock.ChainStorerMock{}, nil, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -144,7 +145,7 @@ func TestNewIntermediateProcessorsContainerFactory(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, err) @@ -162,7 +163,7 @@ func TestIntermediateProcessorsContainerFactory_Create(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, err) diff --git a/process/factory/metachain/preProcessorsContainerFactory_test.go b/process/factory/metachain/preProcessorsContainerFactory_test.go index 31ebf1d2c3a..9f176200b0b 100644 --- a/process/factory/metachain/preProcessorsContainerFactory_test.go +++ b/process/factory/metachain/preProcessorsContainerFactory_test.go @@ -9,6 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -28,7 +29,7 @@ func TestNewPreProcessorsContainerFactory_NilShardCoordinator(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -59,7 +60,7 @@ func TestNewPreProcessorsContainerFactory_NilStore(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -90,7 +91,7 @@ func TestNewPreProcessorsContainerFactory_NilMarshalizer(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -121,7 +122,7 @@ func TestNewPreProcessorsContainerFactory_NilHasher(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -152,7 +153,7 @@ func TestNewPreProcessorsContainerFactory_NilDataPool(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -183,7 +184,7 @@ func TestNewPreProcessorsContainerFactory_NilAccounts(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -245,7 +246,7 @@ func TestNewPreProcessorsContainerFactory_NilTxProcessor(t *testing.T) { &testscommon.RequestHandlerStub{}, nil, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -276,7 +277,7 @@ func TestNewPreProcessorsContainerFactory_NilRequestHandler(t *testing.T) { nil, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -306,7 +307,7 @@ func TestNewPreProcessorsContainerFactory_NilGasHandler(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, nil, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -336,7 +337,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockTracker(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, nil, createMockPubkeyConverter(), @@ -366,7 +367,7 @@ func TestNewPreProcessorsContainerFactory_NilPubkeyConverter(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, nil, @@ -396,7 +397,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockSizeComputationHandler(t *test &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -426,7 +427,7 @@ func TestNewPreProcessorsContainerFactory_NilBalanceComputationHandler(t *testin &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -456,7 +457,7 @@ func TestNewPreProcessorsContainerFactory_NilEpochNotifier(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -486,7 +487,7 @@ func TestNewPreProcessorsContainerFactory_NilTxTypeHandler(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -516,7 +517,7 @@ func TestNewPreProcessorsContainerFactory_NilScheduledTxsExecutionHandler(t *tes &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -546,7 +547,7 @@ func TestNewPreProcessorsContainerFactory(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -583,7 +584,7 @@ func TestPreProcessorsContainerFactory_CreateErrTxPreproc(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), @@ -618,7 +619,7 @@ func TestPreProcessorsContainerFactory_Create(t *testing.T) { &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), diff --git a/process/factory/shard/preProcessorsContainerFactory_test.go b/process/factory/shard/preProcessorsContainerFactory_test.go index 6063db3e771..57dde05a645 100644 --- a/process/factory/shard/preProcessorsContainerFactory_test.go +++ b/process/factory/shard/preProcessorsContainerFactory_test.go @@ -8,6 +8,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -34,7 +35,7 @@ func TestNewPreProcessorsContainerFactory_NilShardCoordinator(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -67,7 +68,7 @@ func TestNewPreProcessorsContainerFactory_NilStore(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -100,7 +101,7 @@ func TestNewPreProcessorsContainerFactory_NilMarshalizer(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -133,7 +134,7 @@ func TestNewPreProcessorsContainerFactory_NilHasher(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -166,7 +167,7 @@ func TestNewPreProcessorsContainerFactory_NilDataPool(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -199,7 +200,7 @@ func TestNewPreProcessorsContainerFactory_NilAddrConv(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -232,7 +233,7 @@ func TestNewPreProcessorsContainerFactory_NilAccounts(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -265,7 +266,7 @@ func TestNewPreProcessorsContainerFactory_NilTxProcessor(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -298,7 +299,7 @@ func TestNewPreProcessorsContainerFactory_NilSCProcessor(t *testing.T) { nil, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -331,7 +332,7 @@ func TestNewPreProcessorsContainerFactory_NilSCR(t *testing.T) { &testscommon.SCProcessorMock{}, nil, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -364,7 +365,7 @@ func TestNewPreProcessorsContainerFactory_NilRewardTxProcessor(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, nil, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -397,7 +398,7 @@ func TestNewPreProcessorsContainerFactory_NilRequestHandler(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -463,7 +464,7 @@ func TestNewPreProcessorsContainerFactory_NilGasHandler(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, nil, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -496,7 +497,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockTracker(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, nil, &testscommon.BlockSizeComputationStub{}, @@ -529,7 +530,7 @@ func TestNewPreProcessorsContainerFactory_NilBlockSizeComputationHandler(t *test &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, nil, @@ -562,7 +563,7 @@ func TestNewPreProcessorsContainerFactory_NilBalanceComputationHandler(t *testin &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -595,7 +596,7 @@ func TestNewPreProcessorsContainerFactory_NilEpochNotifier(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -628,7 +629,7 @@ func TestNewPreProcessorsContainerFactory_NilTxTypeHandler(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -661,7 +662,7 @@ func TestNewPreProcessorsContainerFactory_NilScheduledTxsExecutionHandler(t *tes &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -694,7 +695,7 @@ func TestNewPreProcessorsContainerFactory(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -732,7 +733,7 @@ func TestPreProcessorsContainerFactory_CreateErrTxPreproc(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -776,7 +777,7 @@ func TestPreProcessorsContainerFactory_CreateErrScrPreproc(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, @@ -823,7 +824,7 @@ func TestPreProcessorsContainerFactory_Create(t *testing.T) { &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, diff --git a/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go b/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go index 799d19bda33..50846e5da5e 100644 --- a/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go +++ b/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go @@ -15,6 +15,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/stretchr/testify/assert" @@ -52,7 +53,7 @@ func createMockPubkeyConverter() core.PubkeyConverter { } func createMockFeeHandler() process.FeeHandler { - return &mock.FeeHandlerStub{} + return &economicsmocks.EconomicsHandlerStub{} } func createMockComponentHolders() (*mock.CoreComponentsMock, *mock.CryptoComponentsMock) { diff --git a/process/smartContract/process_test.go b/process/smartContract/process_test.go index 06070d7ef48..be7bdd4fd90 100644 --- a/process/smartContract/process_test.go +++ b/process/smartContract/process_test.go @@ -87,7 +87,7 @@ func createMockSmartContractProcessorArguments() ArgsNewSmartContractProcessor { BadTxForwarder: &mock.IntermediateTransactionHandlerMock{}, TxFeeHandler: &mock.FeeAccumulatorStub{}, TxLogsProcessor: &mock.TxLogsProcessorStub{}, - EconomicsFee: &mock.FeeHandlerStub{ + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.0 }, @@ -915,7 +915,7 @@ func TestScProcessor_DeploySmartContractEconomicsFeeValidateFails(t *testing.T) arguments.VmContainer = vm arguments.ArgsParser = argParser - arguments.EconomicsFee = &mock.FeeHandlerStub{ + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return expectedError }, @@ -1131,7 +1131,7 @@ func TestScProcessor_DeploySmartContractUpdateDeveloperRewardsFails(t *testing.T arguments.VmContainer = vm arguments.ArgsParser = argParser arguments.AccountsDB = accntState - economicsFee := &mock.FeeHandlerStub{ + economicsFee := &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.0 }, @@ -1874,7 +1874,7 @@ func TestScProcessor_InitializeVMInputFromTx_ShouldErrNotEnoughGas(t *testing.T) arguments := createMockSmartContractProcessorArguments() arguments.VmContainer = vm arguments.ArgsParser = argParser - arguments.EconomicsFee = &mock.FeeHandlerStub{ + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 1000 }, @@ -2315,7 +2315,7 @@ func TestScProcessor_ProcessSCPaymentWithNewFlags(t *testing.T) { txFee := big.NewInt(25) arguments := createMockSmartContractProcessorArguments() - arguments.EconomicsFee = &mock.FeeHandlerStub{ + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ DeveloperPercentageCalled: func() float64 { return 0.0 }, @@ -2432,7 +2432,7 @@ func TestScProcessor_RefundGasToSender(t *testing.T) { minGasPrice := uint64(10) arguments := createMockSmartContractProcessorArguments() - arguments.EconomicsFee = &mock.FeeHandlerStub{MinGasPriceCalled: func() uint64 { + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{MinGasPriceCalled: func() uint64 { return minGasPrice }} arguments.EnableEpochs.SCDeployEnableEpoch = 10 @@ -2472,7 +2472,7 @@ func TestScProcessor_DoNotRefundGasToSenderForAsyncCall(t *testing.T) { minGasPrice := uint64(10) arguments := createMockSmartContractProcessorArguments() - arguments.EconomicsFee = &mock.FeeHandlerStub{MinGasPriceCalled: func() uint64 { + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{MinGasPriceCalled: func() uint64 { return minGasPrice }} arguments.EnableEpochs.SCDeployEnableEpoch = 10 @@ -3533,7 +3533,7 @@ func TestSmartContractProcessor_computeTotalConsumedFeeAndDevRwd(t *testing.T) { shardCoordinator := &mock.CoordinatorStub{ComputeIdCalled: func(address []byte) uint32 { return 0 }} - feeHandler := &mock.FeeHandlerStub{ + feeHandler := &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, @@ -3747,7 +3747,7 @@ func TestScProcessor_CreateRefundForRelayerFromAnotherShard(t *testing.T) { return 0 }} arguments.ShardCoordinator = shardCoordinator - arguments.EconomicsFee = &mock.FeeHandlerStub{ComputeFeeForProcessingCalled: func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ComputeFeeForProcessingCalled: func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { return big.NewInt(100) }} sc, _ := NewSmartContractProcessor(arguments) @@ -3837,7 +3837,7 @@ func TestProcessIfErrorCheckBackwardsCompatibilityProcessTransactionFeeCalledSho return 0 }} arguments.ShardCoordinator = shardCoordinator - arguments.EconomicsFee = &mock.FeeHandlerStub{ + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeFeeForProcessingCalled: func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { return big.NewInt(100) }, @@ -3876,7 +3876,7 @@ func TestProcessIfErrorCheckBackwardsCompatibilityProcessTransactionFeeCalledSho return 0 }} arguments.ShardCoordinator = shardCoordinator - arguments.EconomicsFee = &mock.FeeHandlerStub{ + arguments.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeFeeForProcessingCalled: func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { return big.NewInt(100) }, diff --git a/process/track/baseBlockTrack_test.go b/process/track/baseBlockTrack_test.go index 024ba5697c3..90e05c2d41d 100644 --- a/process/track/baseBlockTrack_test.go +++ b/process/track/baseBlockTrack_test.go @@ -21,6 +21,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/storageUnit" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -109,7 +110,7 @@ func CreateShardTrackerMockArguments() track.ArgShardTracker { } headerValidator, _ := processBlock.NewHeaderValidator(argsHeaderValidator) whitelistHandler := &testscommon.WhiteListHandlerStub{} - feeHandler := &mock.FeeHandlerStub{ + feeHandler := &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerBlockForSafeCrossShardCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -147,7 +148,7 @@ func CreateMetaTrackerMockArguments() track.ArgMetaTracker { } headerValidator, _ := processBlock.NewHeaderValidator(argsHeaderValidator) whitelistHandler := &testscommon.WhiteListHandlerStub{} - feeHandler := &mock.FeeHandlerStub{ + feeHandler := &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerBlockForSafeCrossShardCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -183,7 +184,7 @@ func CreateBaseTrackerMockArguments() track.ArgBaseTracker { Marshalizer: &mock.MarshalizerMock{}, } headerValidator, _ := processBlock.NewHeaderValidator(argsHeaderValidator) - feeHandler := &mock.FeeHandlerStub{ + feeHandler := &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerBlockForSafeCrossShardCalled: func() uint64 { return maxGasLimitPerBlock }, diff --git a/process/transaction/transactionCostEstimator_test.go b/process/transaction/transactionCostEstimator_test.go index b4b5d31de9d..857ef6512ca 100644 --- a/process/transaction/transactionCostEstimator_test.go +++ b/process/transaction/transactionCostEstimator_test.go @@ -15,6 +15,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/txsimulator" txSimData "github.com/ElrondNetwork/elrond-go/process/txsimulator/data" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/require" @@ -23,7 +24,7 @@ import ( func TestTransactionCostEstimator_NilTxTypeHandler(t *testing.T) { t.Parallel() - tce, err := NewTransactionCostEstimator(nil, &mock.FeeHandlerStub{}, &mock.TransactionSimulatorStub{}, &stateMock.AccountsStub{}, &mock.ShardCoordinatorStub{}) + tce, err := NewTransactionCostEstimator(nil, &economicsmocks.EconomicsHandlerStub{}, &mock.TransactionSimulatorStub{}, &stateMock.AccountsStub{}, &mock.ShardCoordinatorStub{}) require.Nil(t, tce) require.Equal(t, process.ErrNilTxTypeHandler, err) @@ -41,7 +42,7 @@ func TestTransactionCostEstimator_NilFeeHandlerShouldErr(t *testing.T) { func TestTransactionCostEstimator_NilTransactionSimulatorShouldErr(t *testing.T) { t.Parallel() - tce, err := NewTransactionCostEstimator(&testscommon.TxTypeHandlerMock{}, &mock.FeeHandlerStub{}, nil, &stateMock.AccountsStub{}, &mock.ShardCoordinatorStub{}) + tce, err := NewTransactionCostEstimator(&testscommon.TxTypeHandlerMock{}, &economicsmocks.EconomicsHandlerStub{}, nil, &stateMock.AccountsStub{}, &mock.ShardCoordinatorStub{}) require.Nil(t, tce) require.Equal(t, txsimulator.ErrNilTxSimulatorProcessor, err) @@ -50,7 +51,7 @@ func TestTransactionCostEstimator_NilTransactionSimulatorShouldErr(t *testing.T) func TestTransactionCostEstimator_Ok(t *testing.T) { t.Parallel() - tce, err := NewTransactionCostEstimator(&testscommon.TxTypeHandlerMock{}, &mock.FeeHandlerStub{}, &mock.TransactionSimulatorStub{}, &stateMock.AccountsStub{}, &mock.ShardCoordinatorStub{}) + tce, err := NewTransactionCostEstimator(&testscommon.TxTypeHandlerMock{}, &economicsmocks.EconomicsHandlerStub{}, &mock.TransactionSimulatorStub{}, &stateMock.AccountsStub{}, &mock.ShardCoordinatorStub{}) require.Nil(t, err) require.False(t, check.IfNil(tce)) @@ -64,8 +65,8 @@ func TestComputeTransactionGasLimit_MoveBalance(t *testing.T) { ComputeTransactionTypeCalled: func(tx data.TransactionHandler) (process.TransactionType, process.TransactionType) { return process.MoveBalance, process.MoveBalance }, - }, &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + }, &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return math.MaxUint64 }, ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { @@ -96,8 +97,8 @@ func TestComputeTransactionGasLimit_MoveBalanceInvalidNonceShouldStillComputeCos ComputeTransactionTypeCalled: func(tx data.TransactionHandler) (process.TransactionType, process.TransactionType) { return process.MoveBalance, process.MoveBalance }, - }, &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + }, &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return math.MaxUint64 }, ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { @@ -125,8 +126,8 @@ func TestComputeTransactionGasLimit_BuiltInFunction(t *testing.T) { ComputeTransactionTypeCalled: func(tx data.TransactionHandler) (process.TransactionType, process.TransactionType) { return process.BuiltInFunctionCall, process.BuiltInFunctionCall }, - }, &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + }, &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return math.MaxUint64 }, }, @@ -157,8 +158,8 @@ func TestComputeTransactionGasLimit_BuiltInFunctionShouldErr(t *testing.T) { ComputeTransactionTypeCalled: func(tx data.TransactionHandler) (process.TransactionType, process.TransactionType) { return process.BuiltInFunctionCall, process.BuiltInFunctionCall }, - }, &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + }, &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return math.MaxUint64 }, }, @@ -183,8 +184,8 @@ func TestComputeTransactionGasLimit_NilVMOutput(t *testing.T) { ComputeTransactionTypeCalled: func(tx data.TransactionHandler) (process.TransactionType, process.TransactionType) { return process.BuiltInFunctionCall, process.BuiltInFunctionCall }, - }, &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + }, &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return math.MaxUint64 }, }, @@ -209,8 +210,8 @@ func TestComputeTransactionGasLimit_RetCodeNotOk(t *testing.T) { ComputeTransactionTypeCalled: func(tx data.TransactionHandler) (process.TransactionType, process.TransactionType) { return process.BuiltInFunctionCall, process.BuiltInFunctionCall }, - }, &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + }, &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return math.MaxUint64 }, }, @@ -243,7 +244,7 @@ func TestTransactionCostEstimator_RelayedTxShouldErr(t *testing.T) { return process.RelayedTx, process.RelayedTx }, }, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &mock.TransactionSimulatorStub{}, &stateMock.AccountsStub{}, &mock.ShardCoordinatorStub{}, ) diff --git a/statusHandler/statusMetricsProvider_test.go b/statusHandler/statusMetricsProvider_test.go index ff13928d315..136327a0ed8 100644 --- a/statusHandler/statusMetricsProvider_test.go +++ b/statusHandler/statusMetricsProvider_test.go @@ -179,6 +179,7 @@ func TestStatusMetrics_NetworkConfig(t *testing.T) { "erd_latest_tag_software_version": "version1.0", "erd_meta_consensus_group_size": uint64(25), "erd_min_gas_limit": uint64(50000), + "erd_extra_gas_limit_guarded_tx": uint64(50000), "erd_min_gas_price": uint64(1000), "erd_min_transaction_version": uint64(2), "erd_num_metachain_nodes": uint64(50), @@ -393,5 +394,5 @@ func TestStatusMetrics_ConcurrentOperations(t *testing.T) { wg.Wait() elapsedTime := time.Since(startTime) - require.True(t, elapsedTime < 10 * time.Second, "if the test isn't finished within 10 seconds, there might be a deadlock somewhere") + require.True(t, elapsedTime < 10*time.Second, "if the test isn't finished within 10 seconds, there might be a deadlock somewhere") } diff --git a/testscommon/economicsmocks/economicsDataHandlerStub.go b/testscommon/economicsmocks/economicsDataHandlerStub.go index 4277c3d702f..6f16a1e1eb6 100644 --- a/testscommon/economicsmocks/economicsDataHandlerStub.go +++ b/testscommon/economicsmocks/economicsDataHandlerStub.go @@ -27,6 +27,7 @@ type EconomicsHandlerStub struct { MaxInflationRateCalled func(year uint32) float64 GasPerDataByteCalled func() uint64 MinGasLimitCalled func() uint64 + ExtraGasLimitGuardedTxCalled func() uint64 GenesisTotalSupplyCalled func() *big.Int ComputeFeeForProcessingCalled func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int RewardsTopUpGradientPointCalled func() *big.Int @@ -112,6 +113,14 @@ func (e *EconomicsHandlerStub) MinGasLimit() uint64 { return 0 } +// ExtraGasLimitGuardedTx - +func (e *EconomicsHandlerStub) ExtraGasLimitGuardedTx() uint64 { + if e.ExtraGasLimitGuardedTxCalled != nil { + return e.ExtraGasLimitGuardedTxCalled() + } + return 0 +} + // GenesisTotalSupply - func (e *EconomicsHandlerStub) GenesisTotalSupply() *big.Int { if e.GenesisTotalSupplyCalled != nil { diff --git a/testscommon/economicsmocks/economicsHandlerMock.go b/testscommon/economicsmocks/economicsHandlerMock.go index 51218850562..c517d1a6f37 100644 --- a/testscommon/economicsmocks/economicsHandlerMock.go +++ b/testscommon/economicsmocks/economicsHandlerMock.go @@ -80,6 +80,11 @@ func (ehm *EconomicsHandlerMock) MinGasLimit() uint64 { return 0 } +// ExtraGasLimitGuardedTx - +func (ehm *EconomicsHandlerMock) ExtraGasLimitGuardedTx() uint64 { + return 0 +} + // GasPerDataByte - func (ehm *EconomicsHandlerMock) GasPerDataByte() uint64 { return 0 From 66323b953fc798dca8e85e566795e4fba115cf9b Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 3 Jun 2022 15:19:10 +0300 Subject: [PATCH 052/335] process, statusHandler: fix broken reference in unit tests --- .../vm/arwen/arwenvm/arwenVM_test.go | 5 ++- .../vm/mockVM/vmGet/vmGet_test.go | 5 ++- .../postprocess/oneMBPostProcessor_test.go | 23 +++++----- .../block/preprocess/gasComputation_test.go | 44 +++++++++---------- process/block/preprocess/transactions_test.go | 12 ++--- ...rmediateProcessorsContainerFactory_test.go | 17 +++---- process/smartContract/scQueryService_test.go | 37 ++++++++-------- .../interceptedTransaction_test.go | 35 ++++++++------- process/transaction/shardProcess_test.go | 33 +++++++------- statusHandler/statusMetricsProvider_test.go | 1 + 10 files changed, 110 insertions(+), 102 deletions(-) diff --git a/integrationTests/vm/arwen/arwenvm/arwenVM_test.go b/integrationTests/vm/arwen/arwenvm/arwenVM_test.go index 3942b4b0f6c..ecc9cd6900c 100644 --- a/integrationTests/vm/arwen/arwenvm/arwenVM_test.go +++ b/integrationTests/vm/arwen/arwenvm/arwenVM_test.go @@ -33,6 +33,7 @@ import ( processTransaction "github.com/ElrondNetwork/elrond-go/process/transaction" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/ElrondNetwork/elrond-vm-common/parsers" @@ -512,7 +513,7 @@ func TestExecuteTransactionAndTimeToProcessChange(t *testing.T) { ESDTTransferParser: esdtTransferParser, } txTypeHandler, _ := coordinator.NewTxTypeHandler(argsTxTypeHandler) - feeHandler := &mock.FeeHandlerStub{ + feeHandler := &economicsmocks.EconomicsHandlerStub{ ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return big.NewInt(10) }, @@ -534,7 +535,7 @@ func TestExecuteTransactionAndTimeToProcessChange(t *testing.T) { ScProcessor: &testscommon.SCProcessorMock{}, TxFeeHandler: &testscommon.UnsignedTxHandlerStub{}, TxTypeHandler: txTypeHandler, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, ReceiptForwarder: &mock.IntermediateTransactionHandlerMock{}, BadTxForwarder: &mock.IntermediateTransactionHandlerMock{}, ArgsParser: smartContract.NewArgumentParser(), diff --git a/integrationTests/vm/mockVM/vmGet/vmGet_test.go b/integrationTests/vm/mockVM/vmGet/vmGet_test.go index 4989bc905e9..f0ee48be9b4 100644 --- a/integrationTests/vm/mockVM/vmGet/vmGet_test.go +++ b/integrationTests/vm/mockVM/vmGet/vmGet_test.go @@ -19,6 +19,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/sync/disabled" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -34,8 +35,8 @@ func TestVmGetShouldReturnValue(t *testing.T) { }} argsNewSCQueryService := smartContract.ArgsNewSCQueryService{ VmContainer: vmContainer, - EconomicsFee: &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, }, diff --git a/process/block/postprocess/oneMBPostProcessor_test.go b/process/block/postprocess/oneMBPostProcessor_test.go index fd15250c3fe..c6b21bdafa4 100644 --- a/process/block/postprocess/oneMBPostProcessor_test.go +++ b/process/block/postprocess/oneMBPostProcessor_test.go @@ -12,6 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/mock" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/stretchr/testify/assert" ) @@ -26,7 +27,7 @@ func TestNewOneMBPostProcessor_NilHasher(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -43,7 +44,7 @@ func TestNewOneMBPostProcessor_NilMarshalizer(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -60,7 +61,7 @@ func TestNewOneMBPostProcessor_NilShardCoord(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -77,7 +78,7 @@ func TestNewOneMBPostProcessor_NilStorer(t *testing.T) { nil, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, irp) @@ -111,7 +112,7 @@ func TestNewOneMBPostProcessor_OK(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, err) @@ -128,7 +129,7 @@ func TestOneMBPostProcessor_CreateAllInterMiniBlocks(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) mbs := irp.CreateAllInterMiniBlocks() @@ -145,7 +146,7 @@ func TestOneMBPostProcessor_CreateAllInterMiniBlocksOneMinBlock(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) txs := make([]data.TransactionHandler, 0) @@ -169,7 +170,7 @@ func TestOneMBPostProcessor_VerifyNilBody(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) err := irp.VerifyInterMiniBlocks(&block.Body{}) @@ -186,7 +187,7 @@ func TestOneMBPostProcessor_VerifyTooManyBlock(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) txs := make([]data.TransactionHandler, 0) @@ -231,7 +232,7 @@ func TestOneMBPostProcessor_VerifyNilMiniBlocks(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) miniBlock := &block.MiniBlock{ @@ -255,7 +256,7 @@ func TestOneMBPostProcessor_VerifyOk(t *testing.T) { &mock.ChainStorerMock{}, block.TxBlock, dataRetriever.TransactionUnit, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) txs := make([]data.TransactionHandler, 0) diff --git a/process/block/preprocess/gasComputation_test.go b/process/block/preprocess/gasComputation_test.go index 47984b17abe..63028891970 100644 --- a/process/block/preprocess/gasComputation_test.go +++ b/process/block/preprocess/gasComputation_test.go @@ -10,8 +10,8 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/block/preprocess" - "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -35,7 +35,7 @@ func TestNewGasComputation_ShouldWork(t *testing.T) { t.Parallel() gc, err := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &epochNotifier.EpochNotifierStub{}, 0, @@ -49,7 +49,7 @@ func TestGasProvided_ShouldWork(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &epochNotifier.EpochNotifierStub{}, 0, @@ -79,7 +79,7 @@ func TestGasRefunded_ShouldWork(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &epochNotifier.EpochNotifierStub{}, 0, @@ -109,7 +109,7 @@ func TestGasPenalized_ShouldWork(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &epochNotifier.EpochNotifierStub{}, 0, @@ -139,7 +139,7 @@ func TestComputeGasProvidedByTx_ShouldErrWrongTypeAssertion(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &epochNotifier.EpochNotifierStub{}, 0, @@ -153,7 +153,7 @@ func TestComputeGasProvidedByTx_ShouldWorkWhenTxReceiverAddressIsNotASmartContra t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -174,7 +174,7 @@ func TestComputeGasProvidedByTx_ShouldWorkWhenTxReceiverAddressIsASmartContractI t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -198,7 +198,7 @@ func TestComputeGasProvidedByTx_ShouldWorkWhenTxReceiverAddressIsASmartContractC t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -222,7 +222,7 @@ func TestComputeGasProvidedByTx_ShouldReturnZeroIf0GasLimit(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -246,7 +246,7 @@ func TestComputeGasProvidedByTx_ShouldReturnGasLimitIfLessThanMoveBalance(t *tes t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -270,7 +270,7 @@ func TestComputeGasProvidedByTx_ShouldReturnGasLimitWhenRelayed(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, @@ -294,7 +294,7 @@ func TestComputeGasProvidedByTx_ShouldReturnGasLimitWhenRelayedV2(t *testing.T) t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, @@ -318,7 +318,7 @@ func TestComputeGasProvidedByMiniBlock_ShouldErrMissingTransaction(t *testing.T) t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -348,7 +348,7 @@ func TestComputeGasProvidedByMiniBlock_ShouldReturnZeroWhenOneTxIsMissing(t *tes t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -381,7 +381,7 @@ func TestComputeGasProvidedByMiniBlock_ShouldWork(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -422,7 +422,7 @@ func TestComputeGasProvidedByMiniBlock_ShouldWorkV1(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -463,7 +463,7 @@ func TestComputeGasProvidedByTx_ShouldWorkWhenTxReceiverAddressIsNotASmartContra t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -484,7 +484,7 @@ func TestComputeGasProvidedByTx_ShouldWorkWhenTxReceiverAddressIsASmartContractI t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -508,7 +508,7 @@ func TestComputeGasProvidedByTx_ShouldWorkWhenTxReceiverAddressIsASmartContractC t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{ + &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 6 }, @@ -532,7 +532,7 @@ func TestReset_ShouldWork(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &epochNotifier.EpochNotifierStub{}, 0, @@ -567,7 +567,7 @@ func TestRestoreGasSinceLastReset_ShouldWork(t *testing.T) { t.Parallel() gc, _ := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, &epochNotifier.EpochNotifierStub{}, 0, diff --git a/process/block/preprocess/transactions_test.go b/process/block/preprocess/transactions_test.go index 9dcf669e30a..cc1c3d3cab3 100644 --- a/process/block/preprocess/transactions_test.go +++ b/process/block/preprocess/transactions_test.go @@ -38,12 +38,12 @@ import ( const MaxGasLimitPerBlock = uint64(100000) -func feeHandlerMock() *mock.FeeHandlerStub { - return &mock.FeeHandlerStub{ +func feeHandlerMock() *economicsmocks.EconomicsHandlerStub { + return &economicsmocks.EconomicsHandlerStub{ ComputeGasLimitCalled: func(tx data.TransactionWithFeeHandler) uint64 { return 0 }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, MaxGasLimitPerMiniBlockCalled: func() uint64 { @@ -1270,8 +1270,8 @@ func TestTransactionsPreprocessor_ComputeGasProvidedShouldWork(t *testing.T) { txGasLimitInSender := maxGasLimit + 1 txGasLimitInReceiver := maxGasLimit args := createDefaultTransactionsProcessorArgs() - args.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return maxGasLimit }, } @@ -1314,7 +1314,7 @@ func TestTransactionsPreprocessor_SplitMiniBlocksIfNeededShouldWork(t *testing.T txGasLimit := uint64(100) args := createDefaultTransactionsProcessorArgs() - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { return gasLimitPerMiniBlock }, diff --git a/process/factory/shard/intermediateProcessorsContainerFactory_test.go b/process/factory/shard/intermediateProcessorsContainerFactory_test.go index 2b6f6621ee4..a15186f4b77 100644 --- a/process/factory/shard/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/shard/intermediateProcessorsContainerFactory_test.go @@ -10,6 +10,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/stretchr/testify/assert" ) @@ -61,7 +62,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilShardCoord(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dPool, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -79,7 +80,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilMarshalizer(t *testing.T) createMockPubkeyConverter(), &mock.ChainStorerMock{}, dPool, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -97,7 +98,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilHasher(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dPool, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -115,7 +116,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilAdrConv(t *testing.T) { nil, &mock.ChainStorerMock{}, dPool, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -133,7 +134,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilStorer(t *testing.T) { createMockPubkeyConverter(), nil, dPool, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -150,7 +151,7 @@ func TestNewIntermediateProcessorsContainerFactory_NilPoolsHolder(t *testing.T) createMockPubkeyConverter(), &mock.ChainStorerMock{}, nil, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, ipcf) @@ -186,7 +187,7 @@ func TestNewIntermediateProcessorsContainerFactory(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dPool, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, err) @@ -205,7 +206,7 @@ func TestIntermediateProcessorsContainerFactory_Create(t *testing.T) { createMockPubkeyConverter(), &mock.ChainStorerMock{}, dPool, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) assert.Nil(t, err) diff --git a/process/smartContract/scQueryService_test.go b/process/smartContract/scQueryService_test.go index 5fbfbad49fd..6479ccf99ee 100644 --- a/process/smartContract/scQueryService_test.go +++ b/process/smartContract/scQueryService_test.go @@ -17,6 +17,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,7 +28,7 @@ const DummyScAddress = "00000000000000000500fabd9501b7e5353de57a4e319857c2fb9908 func createMockArgumentsForSCQuery() ArgsNewSCQueryService { return ArgsNewSCQueryService{ VmContainer: &mock.VMContainerMock{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, BlockChainHook: &testscommon.BlockChainHookStub{}, BlockChain: &testscommon.ChainHandlerStub{}, ArwenChangeLocker: &sync.RWMutex{}, @@ -245,8 +246,8 @@ func TestExecuteQuery_ShouldReceiveQueryCorrectly(t *testing.T) { return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -287,8 +288,8 @@ func TestExecuteQuery_ReturnsCorrectly(t *testing.T) { return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -325,8 +326,8 @@ func TestExecuteQuery_WhenNotOkCodeShouldNotErr(t *testing.T) { return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -373,8 +374,8 @@ func TestExecuteQuery_ShouldCallRunScSequentially(t *testing.T) { return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -421,8 +422,8 @@ func TestSCQueryService_ExecuteQueryShouldNotIncludeCallerAddressAndValue(t *tes return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -463,8 +464,8 @@ func TestSCQueryService_ExecuteQueryShouldIncludeCallerAddressAndValue(t *testin return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -597,8 +598,8 @@ func TestSCQueryService_ComputeTxCostScCall(t *testing.T) { return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -634,8 +635,8 @@ func TestSCQueryService_ComputeScCallGasLimitRetCodeNotOK(t *testing.T) { return mockVM, nil }, } - argsNewSCQuery.EconomicsFee = &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + argsNewSCQuery.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return uint64(math.MaxUint64) }, } @@ -660,7 +661,7 @@ func TestNewSCQueryService_CloseShouldWork(t *testing.T) { return nil }, }, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, BlockChainHook: &testscommon.BlockChainHookStub{}, BlockChain: &testscommon.ChainHandlerStub{}, ArwenChangeLocker: &sync.RWMutex{}, diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index 0cd7f4a1c0b..fdf42dadf38 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -21,6 +21,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/smartContract" "github.com/ElrondNetwork/elrond-go/process/transaction" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -63,8 +64,8 @@ func createKeyGenMock() crypto.KeyGenerator { } } -func createFreeTxFeeHandler() *mock.FeeHandlerStub { - return &mock.FeeHandlerStub{ +func createFreeTxFeeHandler() *economicsmocks.EconomicsHandlerStub { + return &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return nil }, @@ -171,7 +172,7 @@ func TestNewInterceptedTransaction_NilBufferShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -196,7 +197,7 @@ func TestNewInterceptedTransaction_NilArgsParser(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, nil, []byte("chainID"), @@ -221,7 +222,7 @@ func TestNewInterceptedTransaction_NilVersionChecker(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -246,7 +247,7 @@ func TestNewInterceptedTransaction_NilMarshalizerShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -271,7 +272,7 @@ func TestNewInterceptedTransaction_NilSignMarshalizerShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -296,7 +297,7 @@ func TestNewInterceptedTransaction_NilHasherShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -321,7 +322,7 @@ func TestNewInterceptedTransaction_NilKeyGenShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -346,7 +347,7 @@ func TestNewInterceptedTransaction_NilSignerShouldErr(t *testing.T) { nil, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -371,7 +372,7 @@ func TestNewInterceptedTransaction_NilPubkeyConverterShouldErr(t *testing.T) { &mock.SignerMock{}, nil, mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -396,7 +397,7 @@ func TestNewInterceptedTransaction_NilCoordinatorShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), nil, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -446,7 +447,7 @@ func TestNewInterceptedTransaction_NilWhiteListerVerifiedTxsShouldErr(t *testing &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, nil, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -471,7 +472,7 @@ func TestNewInterceptedTransaction_InvalidChainIDShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, nil, @@ -496,7 +497,7 @@ func TestNewInterceptedTransaction_NilTxSignHasherShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -527,7 +528,7 @@ func TestNewInterceptedTransaction_UnmarshalingTxFailsShouldErr(t *testing.T) { &mock.SignerMock{}, createMockPubkeyConverter(), mock.NewOneShardCoordinatorMock(), - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, &mock.ArgumentParserMock{}, []byte("chainID"), @@ -792,7 +793,7 @@ func TestNewInterceptedTransaction_InsufficientFeeShouldErr(t *testing.T) { Version: minTxVersion, } errExpected := errors.New("insufficient fee") - feeHandler := &mock.FeeHandlerStub{ + feeHandler := &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return errExpected }, diff --git a/process/transaction/shardProcess_test.go b/process/transaction/shardProcess_test.go index 857c0fdc48e..0d333258e1c 100644 --- a/process/transaction/shardProcess_test.go +++ b/process/transaction/shardProcess_test.go @@ -21,6 +21,7 @@ import ( "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" @@ -41,8 +42,8 @@ func generateRandomByteSlice(size int) []byte { return buff } -func feeHandlerMock() *mock.FeeHandlerStub { - return &mock.FeeHandlerStub{ +func feeHandlerMock() *economicsmocks.EconomicsHandlerStub { + return &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return nil }, @@ -681,7 +682,7 @@ func TestTxProcessor_ProcessWithTxFeeHandlerCheckErrorShouldErr(t *testing.T) { args.Accounts = adb expectedError := errors.New("validatity check failed") - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return expectedError }} @@ -734,7 +735,7 @@ func TestTxProcessor_ProcessWithTxFeeHandlerInsufficientFeeShouldErr(t *testing. args := createArgsForTxProcessor() args.Accounts = adb - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeTxFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return big.NewInt(0).Add(acntSrc.Balance, big.NewInt(1)) }} @@ -766,7 +767,7 @@ func TestTxProcessor_ProcessWithInsufficientFundsShouldCreateReceiptErr(t *testi args := createArgsForTxProcessor() args.Accounts = adb - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return process.ErrInsufficientFunds }} @@ -799,7 +800,7 @@ func TestTxProcessor_ProcessWithUsernameMismatchCreateReceiptErr(t *testing.T) { args := createArgsForTxProcessor() args.Accounts = adb - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return process.ErrUserNameDoesNotMatchInCrossShardTx }} @@ -830,7 +831,7 @@ func TestTxProcessor_ProcessWithUsernameMismatchAndSCProcessErrorShouldError(t * args := createArgsForTxProcessor() args.Accounts = adb - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return process.ErrUserNameDoesNotMatchInCrossShardTx }} @@ -1024,7 +1025,7 @@ func TestTxProcessor_MoveBalanceWithFeesShouldWork(t *testing.T) { } txCost := big.NewInt(16) - feeHandler := &mock.FeeHandlerStub{ + feeHandler := &economicsmocks.EconomicsHandlerStub{ CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { return nil }, @@ -1318,7 +1319,7 @@ func TestTxProcessor_ProcessTxFeeIntraShard(t *testing.T) { negMoveBalanceFee := big.NewInt(0).Neg(moveBalanceFee) totalGiven := big.NewInt(100) args := createArgsForTxProcessor() - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return moveBalanceFee }, @@ -1353,7 +1354,7 @@ func TestTxProcessor_ProcessTxFeeCrossShardMoveBalance(t *testing.T) { negMoveBalanceFee := big.NewInt(0).Neg(moveBalanceFee) totalGiven := big.NewInt(100) args := createArgsForTxProcessor() - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return moveBalanceFee }, @@ -1412,7 +1413,7 @@ func TestTxProcessor_ProcessTxFeeCrossShardSCCall(t *testing.T) { moveBalanceFee := big.NewInt(50) args := createArgsForTxProcessor() - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return moveBalanceFee }, @@ -1451,7 +1452,7 @@ func TestTxProcessor_ProcessTxFeeMoveBalanceUserTx(t *testing.T) { processingFee := big.NewInt(5) negMoveBalanceFee := big.NewInt(0).Neg(moveBalanceFee) args := createArgsForTxProcessor() - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return moveBalanceFee }, @@ -1487,7 +1488,7 @@ func TestTxProcessor_ProcessTxFeeSCInvokeUserTx(t *testing.T) { negMoveBalanceFee := big.NewInt(0).Neg(moveBalanceFee) gasPerByte := uint64(1) args := createArgsForTxProcessor() - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return moveBalanceFee }, @@ -1551,7 +1552,7 @@ func TestTxProcessor_ProcessTransactionShouldReturnErrForInvalidMetaTx(t *testin args.Accounts = adb args.ScProcessor = scProcessorMock args.ShardCoordinator = shardC - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return big.NewInt(1) }, @@ -1599,7 +1600,7 @@ func TestTxProcessor_ProcessTransactionShouldTreatAsInvalidTxIfTxTypeIsWrong(t * args := createArgsForTxProcessor() args.Accounts = adb args.ShardCoordinator = shardC - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeTxFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { return big.NewInt(1) }, @@ -2641,7 +2642,7 @@ func TestTxProcessor_ConsumeMoveBalanceWithUserTx(t *testing.T) { t.Parallel() args := createArgsForTxProcessor() - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ ComputeFeeForProcessingCalled: func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int { return big.NewInt(1) }, diff --git a/statusHandler/statusMetricsProvider_test.go b/statusHandler/statusMetricsProvider_test.go index 136327a0ed8..86bcd559056 100644 --- a/statusHandler/statusMetricsProvider_test.go +++ b/statusHandler/statusMetricsProvider_test.go @@ -159,6 +159,7 @@ func TestStatusMetrics_NetworkConfig(t *testing.T) { sm.SetUInt64Value(common.MetricMetaConsensusGroupSize, 25) sm.SetUInt64Value(common.MetricMinGasPrice, 1000) sm.SetUInt64Value(common.MetricMinGasLimit, 50000) + sm.SetUInt64Value(common.MetricExtraGasLimitGuardedTx, 50000) sm.SetStringValue(common.MetricRewardsTopUpGradientPoint, "12345") sm.SetUInt64Value(common.MetricGasPerDataByte, 1500) sm.SetStringValue(common.MetricChainId, "local-id") From 7f127b26b92831fd74b34c0ad3f26567719fa7b2 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 7 Jun 2022 13:22:42 +0300 Subject: [PATCH 053/335] cmd, config, epochStart, process: add config for setguardian maximum gas price --- cmd/node/config/economics.toml | 1 + config/economicsConfig.go | 1 + config/tomlConfig_test.go | 3 +++ epochStart/metachain/systemSCs_test.go | 1 + factory/coreComponents_test.go | 1 + genesis/process/disabled/feeHandler.go | 5 +++++ integrationTests/testProcessorNode.go | 1 + integrationTests/vm/arwen/utils.go | 1 + integrationTests/vm/testInitializer.go | 1 + process/economics/economicsData.go | 12 ++++++++++++ process/economics/economicsData_test.go | 2 ++ process/errors.go | 3 +++ process/factory/metachain/vmContainerFactory_test.go | 1 + process/peer/process_test.go | 1 + process/smartContract/process_test.go | 1 + .../economicsmocks/economicsDataHandlerStub.go | 9 +++++++++ testscommon/economicsmocks/economicsHandlerMock.go | 5 +++++ 17 files changed, 49 insertions(+) diff --git a/cmd/node/config/economics.toml b/cmd/node/config/economics.toml index ee273c85407..d6eb69e467b 100644 --- a/cmd/node/config/economics.toml +++ b/cmd/node/config/economics.toml @@ -48,3 +48,4 @@ GasPerDataByte = "1500" DataLimitForBaseCalc = "10000" ExtraGasLimitGuardedTx = "50000" + MaxGasPriceSetGuardian = "2000000000" \ No newline at end of file diff --git a/config/economicsConfig.go b/config/economicsConfig.go index a2054d3b6af..cca01ab27dd 100644 --- a/config/economicsConfig.go +++ b/config/economicsConfig.go @@ -49,6 +49,7 @@ type FeeSettings struct { MinGasPrice string GasPriceModifier float64 ExtraGasLimitGuardedTx string + MaxGasPriceSetGuardian string } // EconomicsConfig will hold economics config diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 3e027dd8535..fc297f928d5 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -225,6 +225,7 @@ func TestTomlEconomicsParser(t *testing.T) { minGasPrice := "18446744073709551615" minGasLimit := "18446744073709551615" extraGasLimitGuardedTx := "50000" + maxGasPriceSetGuardian := "1234567" protocolSustainabilityAddress := "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp" denomination := 18 @@ -259,6 +260,7 @@ func TestTomlEconomicsParser(t *testing.T) { }, MinGasPrice: minGasPrice, ExtraGasLimitGuardedTx: extraGasLimitGuardedTx, + MaxGasPriceSetGuardian: maxGasPriceSetGuardian, }, } @@ -284,6 +286,7 @@ func TestTomlEconomicsParser(t *testing.T) { GasLimitSettings = [{EnableEpoch = 0, MaxGasLimitPerBlock = "` + maxGasLimitPerBlock + `", MaxGasLimitPerMiniBlock = "", MaxGasLimitPerMetaBlock = "", MaxGasLimitPerMetaMiniBlock = "", MaxGasLimitPerTx = "", MinGasLimit = "` + minGasLimit + `"}] MinGasPrice = "` + minGasPrice + `" ExtraGasLimitGuardedTx = "` + extraGasLimitGuardedTx + `" + MaxGasPriceSetGuardian = "` + maxGasPriceSetGuardian + `" ` cfg := EconomicsConfig{} diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index a6aea14a287..6ad3048dd63 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -1070,6 +1070,7 @@ func createEconomicsData() process.EconomicsDataHandler { GasPerDataByte: "1", GasPriceModifier: 1.0, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "100000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/factory/coreComponents_test.go b/factory/coreComponents_test.go index 2a75a6e1a3a..12fb2dbde9f 100644 --- a/factory/coreComponents_test.go +++ b/factory/coreComponents_test.go @@ -385,6 +385,7 @@ func createDummyEconomicsConfig() config.EconomicsConfig { GasPerDataByte: "1500", GasPriceModifier: 1, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "100000", }, } } diff --git a/genesis/process/disabled/feeHandler.go b/genesis/process/disabled/feeHandler.go index 15928c725e9..fda19f635d6 100644 --- a/genesis/process/disabled/feeHandler.go +++ b/genesis/process/disabled/feeHandler.go @@ -47,6 +47,11 @@ func (fh *FeeHandler) ExtraGasLimitGuardedTx() uint64 { return 0 } +// MaxGasPriceSetGuardian returns 0 +func (fh *FeeHandler) MaxGasPriceSetGuardian() uint64 { + return 0 +} + // MaxGasLimitPerBlock returns max uint64 func (fh *FeeHandler) MaxGasLimitPerBlock(uint32) uint64 { return math.MaxUint64 diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index bd5c943b433..6323931e5b3 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1075,6 +1075,7 @@ func (tpn *TestProcessorNode) createDefaultEconomicsConfig() *config.EconomicsCo GasPerDataByte: "1", GasPriceModifier: 0.01, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "100000", }, } } diff --git a/integrationTests/vm/arwen/utils.go b/integrationTests/vm/arwen/utils.go index d20edc29dd2..90f19b2062e 100644 --- a/integrationTests/vm/arwen/utils.go +++ b/integrationTests/vm/arwen/utils.go @@ -218,6 +218,7 @@ func (context *TestContext) initFeeHandlers() { GasPerDataByte: "1", GasPriceModifier: 1.0, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "40000000000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 15261273f95..9d7f5aff51a 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -394,6 +394,7 @@ func createEconomicsData(penalizedTooMuchGasEnableEpoch uint32) (process.Economi GasPerDataByte: "1", GasPriceModifier: 1.0, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "100000", }, }, PenalizedTooMuchGasEnableEpoch: penalizedTooMuchGasEnableEpoch, diff --git a/process/economics/economicsData.go b/process/economics/economicsData.go index 9b38b342315..f0008b2f5f1 100644 --- a/process/economics/economicsData.go +++ b/process/economics/economicsData.go @@ -54,6 +54,7 @@ type economicsData struct { gasPerDataByte uint64 minGasPrice uint64 extraGasLimitGuardedTx uint64 + maxGasPriceSetGuardian uint64 gasPriceModifier float64 genesisTotalSupply *big.Int minInflation float64 @@ -187,11 +188,17 @@ func convertValues(economics *config.EconomicsConfig) (*economicsData, error) { return nil, process.ErrInvalidExtraGasLimitGuardedTx } + maxGasPriceSetGuardian, err := strconv.ParseUint(economics.FeeSettings.MaxGasPriceSetGuardian, conversionBase, bitConversionSize) + if err != nil { + return nil, process.ErrInvalidMaxGasPriceSetGuardian + } + return &economicsData{ minGasPrice: minGasPrice, gasPerDataByte: gasPerDataByte, genesisTotalSupply: genesisTotalSupply, extraGasLimitGuardedTx: extraGasLimitGuardedTx, + maxGasPriceSetGuardian: maxGasPriceSetGuardian, }, nil } @@ -402,6 +409,11 @@ func (ed *economicsData) ExtraGasLimitGuardedTx() uint64 { return ed.extraGasLimitGuardedTx } +// MaxGasPriceSetGuardian returns the maximum gas price for set guardian transactions +func (ed *economicsData) MaxGasPriceSetGuardian() uint64 { + return ed.maxGasPriceSetGuardian +} + // GasPerDataByte will return the gas required for a economicsData byte func (ed *economicsData) GasPerDataByte() uint64 { return ed.gasPerDataByte diff --git a/process/economics/economicsData_test.go b/process/economics/economicsData_test.go index ec8962aa605..ec6b7ac0d81 100644 --- a/process/economics/economicsData_test.go +++ b/process/economics/economicsData_test.go @@ -67,6 +67,7 @@ func feeSettingsDummy(gasModifier float64) config.FeeSettings { GasPerDataByte: "1", GasPriceModifier: gasModifier, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "200000", } } @@ -86,6 +87,7 @@ func feeSettingsReal() config.FeeSettings { GasPerDataByte: "1500", GasPriceModifier: 0.01, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "200000", } } diff --git a/process/errors.go b/process/errors.go index 4b13f64667c..9f79dd86bf6 100644 --- a/process/errors.go +++ b/process/errors.go @@ -528,6 +528,9 @@ var ErrInvalidMinimumGasPrice = errors.New("invalid minimum gas price") // ErrInvalidExtraGasLimitGuardedTx signals that an invalid gas limit has been provided in the config file var ErrInvalidExtraGasLimitGuardedTx = errors.New("invalid extra gas limit for guarded transactions") +// ErrInvalidMaxGasPriceSetGuardian signals that an invalid gas maximum gas price has been provided in the config file +var ErrInvalidMaxGasPriceSetGuardian = errors.New("invalid maximum gas price for set guardian") + // ErrInvalidMinimumGasLimitForTx signals that an invalid minimum gas limit for transactions has been read from config file var ErrInvalidMinimumGasLimitForTx = errors.New("invalid minimum gas limit for transactions") diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index e6b54aa2630..3614d0c7585 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -269,6 +269,7 @@ func TestVmContainerFactory_Create(t *testing.T) { GasPerDataByte: "1", GasPriceModifier: 1.0, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "100000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/process/peer/process_test.go b/process/peer/process_test.go index 4ac7376c175..09c2ae8f005 100644 --- a/process/peer/process_test.go +++ b/process/peer/process_test.go @@ -92,6 +92,7 @@ func createMockArguments() peer.ArgValidatorStatisticsProcessor { GasPerDataByte: "1", GasPriceModifier: 1.0, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "100000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/process/smartContract/process_test.go b/process/smartContract/process_test.go index be7bdd4fd90..87e9b2afc4f 100644 --- a/process/smartContract/process_test.go +++ b/process/smartContract/process_test.go @@ -4045,6 +4045,7 @@ func createRealEconomicsDataArgs() *economics.ArgsNewEconomicsData { MinGasPrice: "1000000000", GasPriceModifier: 0.01, ExtraGasLimitGuardedTx: "50000", + MaxGasPriceSetGuardian: "100000", }, }, EpochNotifier: &epochNotifier.EpochNotifierStub{}, diff --git a/testscommon/economicsmocks/economicsDataHandlerStub.go b/testscommon/economicsmocks/economicsDataHandlerStub.go index 6f16a1e1eb6..1645f77a4a2 100644 --- a/testscommon/economicsmocks/economicsDataHandlerStub.go +++ b/testscommon/economicsmocks/economicsDataHandlerStub.go @@ -28,6 +28,7 @@ type EconomicsHandlerStub struct { GasPerDataByteCalled func() uint64 MinGasLimitCalled func() uint64 ExtraGasLimitGuardedTxCalled func() uint64 + MaxGasPriceSetGuardianCalled func() uint64 GenesisTotalSupplyCalled func() *big.Int ComputeFeeForProcessingCalled func(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int RewardsTopUpGradientPointCalled func() *big.Int @@ -121,6 +122,14 @@ func (e *EconomicsHandlerStub) ExtraGasLimitGuardedTx() uint64 { return 0 } +// MaxGasPriceSetGuardian - +func (e *EconomicsHandlerStub) MaxGasPriceSetGuardian() uint64 { + if e.MaxGasPriceSetGuardianCalled != nil { + return e.MaxGasPriceSetGuardianCalled() + } + return 0 +} + // GenesisTotalSupply - func (e *EconomicsHandlerStub) GenesisTotalSupply() *big.Int { if e.GenesisTotalSupplyCalled != nil { diff --git a/testscommon/economicsmocks/economicsHandlerMock.go b/testscommon/economicsmocks/economicsHandlerMock.go index c517d1a6f37..581c3fcc1de 100644 --- a/testscommon/economicsmocks/economicsHandlerMock.go +++ b/testscommon/economicsmocks/economicsHandlerMock.go @@ -85,6 +85,11 @@ func (ehm *EconomicsHandlerMock) ExtraGasLimitGuardedTx() uint64 { return 0 } +// MaxGasPriceSetGuardian - +func (ehm *EconomicsHandlerMock) MaxGasPriceSetGuardian() uint64{ + return 0 +} + // GasPerDataByte - func (ehm *EconomicsHandlerMock) GasPerDataByte() uint64 { return 0 From 4b103fb4c09f4f81876b6649a8857484f6b87250 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 7 Jun 2022 15:36:12 +0300 Subject: [PATCH 054/335] process: add max gas limit for not guarded setGuardian transactions --- cmd/node/config/economics.toml | 2 +- integrationTests/vm/testInitializer.go | 2 +- process/common.go | 9 ++++++- process/dataValidators/txValidator.go | 8 ++----- process/errors.go | 3 +++ process/interface.go | 1 + process/transaction/interceptedTransaction.go | 24 +++++++++++++++++++ 7 files changed, 40 insertions(+), 9 deletions(-) diff --git a/cmd/node/config/economics.toml b/cmd/node/config/economics.toml index d6eb69e467b..b31b63089d6 100644 --- a/cmd/node/config/economics.toml +++ b/cmd/node/config/economics.toml @@ -48,4 +48,4 @@ GasPerDataByte = "1500" DataLimitForBaseCalc = "10000" ExtraGasLimitGuardedTx = "50000" - MaxGasPriceSetGuardian = "2000000000" \ No newline at end of file + MaxGasPriceSetGuardian = "2000000000" diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 9d7f5aff51a..0c774277794 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -394,7 +394,7 @@ func createEconomicsData(penalizedTooMuchGasEnableEpoch uint32) (process.Economi GasPerDataByte: "1", GasPriceModifier: 1.0, ExtraGasLimitGuardedTx: "50000", - MaxGasPriceSetGuardian: "100000", + MaxGasPriceSetGuardian: "40000000000", }, }, PenalizedTooMuchGasEnableEpoch: penalizedTooMuchGasEnableEpoch, diff --git a/process/common.go b/process/common.go index 97b7790fb69..aebebe9a440 100644 --- a/process/common.go +++ b/process/common.go @@ -4,12 +4,13 @@ import ( "bytes" "encoding/hex" "fmt" - "github.com/ElrondNetwork/elrond-go-core/data/scheduled" "math" "math/big" "sort" "time" + "github.com/ElrondNetwork/elrond-go-core/data/scheduled" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" @@ -813,3 +814,9 @@ func GetMiniBlockHeaderWithHash(header data.HeaderHandler, miniBlockHash []byte) } return nil } + +// IsBuiltinFuncCallWithParam checks if the given transaction data represents a builtin function call with parameters +func IsBuiltinFuncCallWithParam(txData []byte, function string) bool { + expectedTxDataPrefix := []byte(function + "@") + return bytes.HasPrefix(txData, expectedTxDataPrefix) +} diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index e37c41a13ca..90ee33e80ea 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -1,7 +1,6 @@ package dataValidators import ( - "bytes" "fmt" "github.com/ElrondNetwork/elrond-go-core/core" @@ -165,7 +164,7 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac // Setting a guardian is allowed with regular transactions on a frozen account // but in this case is set with the default epochs delay func checkOperationAllowedToBypassGuardian(txData []byte) error { - if isBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { + if process.IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { return nil } @@ -245,10 +244,7 @@ func getTxData(interceptedTx process.InterceptedTransactionHandler) ([]byte, err return tx.GetData(), nil } -func isBuiltinFuncCallWithParam(txData []byte, function string) bool { - expectedTxDataPrefix := []byte(function + "@") - return bytes.HasPrefix(txData, expectedTxDataPrefix) -} + // CheckTxWhiteList will check if the cross shard transactions are whitelisted and could be added in pools func (txv *txValidator) CheckTxWhiteList(data process.InterceptedData) error { diff --git a/process/errors.go b/process/errors.go index 9f79dd86bf6..24e6bf00156 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1109,3 +1109,6 @@ var ErrTransactionAndAccountGuardianMismatch = errors.New("mismatch between tran // ErrInvalidSetGuardianEpochsDelay signals an invalid configuration for the epochs delay var ErrInvalidSetGuardianEpochsDelay = errors.New("incorrect setting for set guardian epochs delay") + +// ErrGasPriceTooHigh signals a too high gas price +var ErrGasPriceTooHigh = errors.New("gas price is too high for the transaction") diff --git a/process/interface.go b/process/interface.go index 8c099758b4f..4ed71355b2c 100644 --- a/process/interface.go +++ b/process/interface.go @@ -637,6 +637,7 @@ type feeHandler interface { CheckValidityTxValues(tx data.TransactionWithFeeHandler) error ComputeFeeForProcessing(tx data.TransactionWithFeeHandler, gasToUse uint64) *big.Int MinGasPrice() uint64 + MaxGasPriceSetGuardian() uint64 GasPriceModifier() float64 MinGasLimit() uint64 ExtraGasLimitGuardedTx() uint64 diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index f3610164ee8..84ff6ae420b 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -323,9 +323,33 @@ func (inTx *InterceptedTransaction) integrity(tx *transaction.Transaction) error return process.ErrInvalidSndAddr } + err = inTx.checkMaxGasPrice() + if err != nil { + return err + } + return inTx.feeHandler.CheckValidityTxValues(tx) } +func (inTx *InterceptedTransaction) checkMaxGasPrice() error { + tx := inTx.tx + // no need to check max gas for guarded transactions as they are co-signed + if inTx.txVersionChecker.IsGuardedTransaction(tx) { + return nil + } + + txData := tx.GetData() + if !process.IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { + return nil + } + + if tx.GetGasPrice() > inTx.feeHandler.MaxGasPriceSetGuardian() { + return process.ErrGasPriceTooHigh + } + + return nil +} + // verifySig checks if the tx is correctly signed func (inTx *InterceptedTransaction) verifySig(tx *transaction.Transaction) error { buffCopiedTx, err := tx.GetDataForSigning(inTx.pubkeyConv, inTx.signMarshalizer) From 3408b6d8883c24b8ff2f3f5a0122733b77357ed0 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 20 Jun 2022 11:06:58 +0300 Subject: [PATCH 055/335] process: fix unit tests --- process/dataValidators/export_test.go | 5 ----- process/dataValidators/txValidator_test.go | 6 +++--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/process/dataValidators/export_test.go b/process/dataValidators/export_test.go index 5a735cb18de..3ddb09f2fdf 100644 --- a/process/dataValidators/export_test.go +++ b/process/dataValidators/export_test.go @@ -39,8 +39,3 @@ func CheckOperationAllowedToBypassGuardian(txData []byte) error { func GetTxData(interceptedTx process.InterceptedTransactionHandler) ([]byte, error) { return getTxData(interceptedTx) } - -// IsBuiltInFuncCallWithParam - -func IsBuiltInFuncCallWithParam(txData []byte, function string) bool { - return isBuiltinFuncCallWithParam(txData, function) -} diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 741561a9bd2..e6210976da2 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -790,13 +790,13 @@ func Test_isBuiltinFuncCallWithParam(t *testing.T) { txDataNonTargetFunc := []byte(nonTargetFunction + suffix) t.Run("no function", func(t *testing.T) { - require.False(t, dataValidators.IsBuiltInFuncCallWithParam(txDataNoFunction, targetFunction)) + require.False(t, process.IsBuiltinFuncCallWithParam(txDataNoFunction, targetFunction)) }) t.Run("non target function", func(t *testing.T) { - require.False(t, dataValidators.IsBuiltInFuncCallWithParam(txDataNonTargetFunc, targetFunction)) + require.False(t, process.IsBuiltinFuncCallWithParam(txDataNonTargetFunc, targetFunction)) }) t.Run("target function", func(t *testing.T) { - require.True(t, dataValidators.IsBuiltInFuncCallWithParam(txDataWithFunc, targetFunction)) + require.True(t, process.IsBuiltinFuncCallWithParam(txDataWithFunc, targetFunction)) }) } From 78f0ba91a70c6a441c94174deac2a825b786b6e3 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 20 Jun 2022 12:43:37 +0300 Subject: [PATCH 056/335] config, cmd, process: move extra gas limit for guarded txs to gasConfig --- cmd/node/config/economics.toml | 7 +++--- config/economicsConfig.go | 10 ++++---- config/tomlConfig_test.go | 11 ++++----- epochStart/metachain/systemSCs_test.go | 8 +++---- factory/coreComponents_test.go | 2 +- integrationTests/testProcessorNode.go | 8 +++---- integrationTests/vm/arwen/utils.go | 8 +++---- integrationTests/vm/testInitializer.go | 2 +- process/economics/economicsData.go | 24 +++++++++---------- process/economics/economicsData_test.go | 20 +++++++++------- process/economics/export_test.go | 1 + .../metachain/vmContainerFactory_test.go | 2 +- process/peer/process_test.go | 8 +++---- process/smartContract/process_test.go | 8 +++---- 14 files changed, 60 insertions(+), 59 deletions(-) diff --git a/cmd/node/config/economics.toml b/cmd/node/config/economics.toml index ee273c85407..d7e82c31e53 100644 --- a/cmd/node/config/economics.toml +++ b/cmd/node/config/economics.toml @@ -39,12 +39,11 @@ [FeeSettings] GasLimitSettings = [ - {EnableEpoch = 0, MaxGasLimitPerBlock = "1500000000", MaxGasLimitPerMiniBlock = "1500000000", MaxGasLimitPerMetaBlock = "15000000000", MaxGasLimitPerMetaMiniBlock = "15000000000", MaxGasLimitPerTx = "1500000000", MinGasLimit = "50000"}, - {EnableEpoch = 1, MaxGasLimitPerBlock = "1500000000", MaxGasLimitPerMiniBlock = "600000000", MaxGasLimitPerMetaBlock = "15000000000", MaxGasLimitPerMetaMiniBlock = "600000000", MaxGasLimitPerTx = "600000000", MinGasLimit = "50000"}, - {EnableEpoch = 2, MaxGasLimitPerBlock = "1500000000", MaxGasLimitPerMiniBlock = "250000000", MaxGasLimitPerMetaBlock = "15000000000", MaxGasLimitPerMetaMiniBlock = "250000000", MaxGasLimitPerTx = "600000000", MinGasLimit = "50000"}, + {EnableEpoch = 0, MaxGasLimitPerBlock = "1500000000", MaxGasLimitPerMiniBlock = "1500000000", MaxGasLimitPerMetaBlock = "15000000000", MaxGasLimitPerMetaMiniBlock = "15000000000", MaxGasLimitPerTx = "1500000000", MinGasLimit = "50000", ExtraGasLimitGuardedTx = "50000"}, + {EnableEpoch = 1, MaxGasLimitPerBlock = "1500000000", MaxGasLimitPerMiniBlock = "600000000", MaxGasLimitPerMetaBlock = "15000000000", MaxGasLimitPerMetaMiniBlock = "600000000", MaxGasLimitPerTx = "600000000", MinGasLimit = "50000", ExtraGasLimitGuardedTx = "50000"}, + {EnableEpoch = 2, MaxGasLimitPerBlock = "1500000000", MaxGasLimitPerMiniBlock = "250000000", MaxGasLimitPerMetaBlock = "15000000000", MaxGasLimitPerMetaMiniBlock = "250000000", MaxGasLimitPerTx = "600000000", MinGasLimit = "50000", ExtraGasLimitGuardedTx = "50000"}, ] MinGasPrice = "1000000000" #will yield min tx fee of 0.00005 eGLD GasPriceModifier = 0.01 GasPerDataByte = "1500" DataLimitForBaseCalc = "10000" - ExtraGasLimitGuardedTx = "50000" diff --git a/config/economicsConfig.go b/config/economicsConfig.go index a2054d3b6af..acad4fc2558 100644 --- a/config/economicsConfig.go +++ b/config/economicsConfig.go @@ -40,15 +40,15 @@ type GasLimitSetting struct { MaxGasLimitPerMetaMiniBlock string MaxGasLimitPerTx string MinGasLimit string + ExtraGasLimitGuardedTx string } // FeeSettings will hold economics fee settings type FeeSettings struct { - GasLimitSettings []GasLimitSetting - GasPerDataByte string - MinGasPrice string - GasPriceModifier float64 - ExtraGasLimitGuardedTx string + GasLimitSettings []GasLimitSetting + GasPerDataByte string + MinGasPrice string + GasPriceModifier float64 } // EconomicsConfig will hold economics config diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 3e027dd8535..3823c327aed 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -253,12 +253,12 @@ func TestTomlEconomicsParser(t *testing.T) { FeeSettings: FeeSettings{ GasLimitSettings: []GasLimitSetting{ { - MaxGasLimitPerBlock: maxGasLimitPerBlock, - MinGasLimit: minGasLimit, + MaxGasLimitPerBlock: maxGasLimitPerBlock, + MinGasLimit: minGasLimit, + ExtraGasLimitGuardedTx: extraGasLimitGuardedTx, }, }, - MinGasPrice: minGasPrice, - ExtraGasLimitGuardedTx: extraGasLimitGuardedTx, + MinGasPrice: minGasPrice, }, } @@ -281,9 +281,8 @@ func TestTomlEconomicsParser(t *testing.T) { ProtocolSustainabilityAddress = "` + protocolSustainabilityAddress + `" [FeeSettings] - GasLimitSettings = [{EnableEpoch = 0, MaxGasLimitPerBlock = "` + maxGasLimitPerBlock + `", MaxGasLimitPerMiniBlock = "", MaxGasLimitPerMetaBlock = "", MaxGasLimitPerMetaMiniBlock = "", MaxGasLimitPerTx = "", MinGasLimit = "` + minGasLimit + `"}] + GasLimitSettings = [{EnableEpoch = 0, MaxGasLimitPerBlock = "` + maxGasLimitPerBlock + `", MaxGasLimitPerMiniBlock = "", MaxGasLimitPerMetaBlock = "", MaxGasLimitPerMetaMiniBlock = "", MaxGasLimitPerTx = "", MinGasLimit = "` + minGasLimit + `", ExtraGasLimitGuardedTx = "` + extraGasLimitGuardedTx + `"}] MinGasPrice = "` + minGasPrice + `" - ExtraGasLimitGuardedTx = "` + extraGasLimitGuardedTx + `" ` cfg := EconomicsConfig{} diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index a6aea14a287..9af158e43c9 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -1064,12 +1064,12 @@ func createEconomicsData() process.EconomicsDataHandler { MaxGasLimitPerMetaMiniBlock: maxGasLimitPerBlock, MaxGasLimitPerTx: maxGasLimitPerBlock, MinGasLimit: minGasLimit, + ExtraGasLimitGuardedTx: "50000", }, }, - MinGasPrice: minGasPrice, - GasPerDataByte: "1", - GasPriceModifier: 1.0, - ExtraGasLimitGuardedTx: "50000", + MinGasPrice: minGasPrice, + GasPerDataByte: "1", + GasPriceModifier: 1.0, }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/factory/coreComponents_test.go b/factory/coreComponents_test.go index 2a75a6e1a3a..ffd47e9d94f 100644 --- a/factory/coreComponents_test.go +++ b/factory/coreComponents_test.go @@ -379,12 +379,12 @@ func createDummyEconomicsConfig() config.EconomicsConfig { MaxGasLimitPerMetaMiniBlock: "15000000000", MaxGasLimitPerTx: "1500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, }, MinGasPrice: "1000000000", GasPerDataByte: "1500", GasPriceModifier: 1, - ExtraGasLimitGuardedTx: "50000", }, } } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index bd5c943b433..bf103e34eef 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1069,12 +1069,12 @@ func (tpn *TestProcessorNode) createDefaultEconomicsConfig() *config.EconomicsCo MaxGasLimitPerMetaMiniBlock: maxGasLimitPerBlock, MaxGasLimitPerTx: maxGasLimitPerBlock, MinGasLimit: minGasLimit, + ExtraGasLimitGuardedTx: "50000", }, }, - MinGasPrice: minGasPrice, - GasPerDataByte: "1", - GasPriceModifier: 0.01, - ExtraGasLimitGuardedTx: "50000", + MinGasPrice: minGasPrice, + GasPerDataByte: "1", + GasPriceModifier: 0.01, }, } } diff --git a/integrationTests/vm/arwen/utils.go b/integrationTests/vm/arwen/utils.go index d20edc29dd2..5cdc7fc7ca1 100644 --- a/integrationTests/vm/arwen/utils.go +++ b/integrationTests/vm/arwen/utils.go @@ -212,12 +212,12 @@ func (context *TestContext) initFeeHandlers() { MaxGasLimitPerMetaMiniBlock: maxGasLimitPerBlock, MaxGasLimitPerTx: maxGasLimitPerBlock, MinGasLimit: minGasLimit, + ExtraGasLimitGuardedTx: "50000", }, }, - MinGasPrice: minGasPrice, - GasPerDataByte: "1", - GasPriceModifier: 1.0, - ExtraGasLimitGuardedTx: "50000", + MinGasPrice: minGasPrice, + GasPerDataByte: "1", + GasPriceModifier: 1.0, }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 15261273f95..df6b9a68b0e 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -388,12 +388,12 @@ func createEconomicsData(penalizedTooMuchGasEnableEpoch uint32) (process.Economi MaxGasLimitPerMetaMiniBlock: maxGasLimitPerBlock, MaxGasLimitPerTx: maxGasLimitPerBlock, MinGasLimit: minGasLimit, + ExtraGasLimitGuardedTx: "50000", }, }, MinGasPrice: minGasPrice, GasPerDataByte: "1", GasPriceModifier: 1.0, - ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: penalizedTooMuchGasEnableEpoch, diff --git a/process/economics/economicsData.go b/process/economics/economicsData.go index 9b38b342315..963b5d66d5e 100644 --- a/process/economics/economicsData.go +++ b/process/economics/economicsData.go @@ -35,6 +35,7 @@ type gasConfig struct { maxGasLimitPerMetaMiniBlock uint64 maxGasLimitPerTx uint64 minGasLimit uint64 + extraGasLimitGuardedTx uint64 } // economicsData will store information about economics @@ -53,7 +54,6 @@ type economicsData struct { mutGasLimitSettings sync.RWMutex gasPerDataByte uint64 minGasPrice uint64 - extraGasLimitGuardedTx uint64 gasPriceModifier float64 genesisTotalSupply *big.Int minInflation float64 @@ -138,7 +138,6 @@ func NewEconomicsData(args ArgsNewEconomicsData) (*economicsData, error) { statusHandler: statusHandler.NewNilStatusHandler(), builtInFunctionsCostHandler: args.BuiltInFunctionsCostHandler, txVersionHandler: args.TxVersionChecker, - extraGasLimitGuardedTx: convertedData.extraGasLimitGuardedTx, } log.Debug("economicsData: enable epoch for penalized too much gas", "epoch", ed.penalizedTooMuchGasEnableEpoch) log.Debug("economicsData: enable epoch for gas price modifier", "epoch", ed.gasPriceModifierEnableEpoch) @@ -182,16 +181,10 @@ func convertValues(economics *config.EconomicsConfig) (*economicsData, error) { return nil, process.ErrInvalidGenesisTotalSupply } - extraGasLimitGuardedTx, err := strconv.ParseUint(economics.FeeSettings.ExtraGasLimitGuardedTx, conversionBase, bitConversionSize) - if err != nil { - return nil, process.ErrInvalidExtraGasLimitGuardedTx - } - return &economicsData{ - minGasPrice: minGasPrice, - gasPerDataByte: gasPerDataByte, - genesisTotalSupply: genesisTotalSupply, - extraGasLimitGuardedTx: extraGasLimitGuardedTx, + minGasPrice: minGasPrice, + gasPerDataByte: gasPerDataByte, + genesisTotalSupply: genesisTotalSupply, }, nil } @@ -204,7 +197,7 @@ func checkValues(economics *config.EconomicsConfig) error { return process.ErrEmptyEpochRewardsConfig } - err := checkRewarsSettings(economics.RewardsSettings) + err := checkRewardsSettings(economics.RewardsSettings) if err != nil { return err } @@ -223,7 +216,7 @@ func checkValues(economics *config.EconomicsConfig) error { return err } -func checkRewarsSettings(rewardsSettings config.RewardsSettings) error { +func checkRewardsSettings(rewardsSettings config.RewardsSettings) error { for _, rewardsConfig := range rewardsSettings.RewardsConfigByEpoch { if isPercentageInvalid(rewardsConfig.LeaderPercentage) || isPercentageInvalid(rewardsConfig.DeveloperPercentage) || @@ -301,6 +294,11 @@ func checkAndParseGasLimitSettings(gasLimitSetting config.GasLimitSetting) (*gas return nil, fmt.Errorf("%w for epoch %d", process.ErrInvalidMaxGasLimitPerTx, gasLimitSetting.EnableEpoch) } + gc.extraGasLimitGuardedTx, err = strconv.ParseUint(gasLimitSetting.ExtraGasLimitGuardedTx, conversionBase, bitConversionSize) + if err != nil { + return nil, fmt.Errorf("%w for epoch %d", process.ErrInvalidExtraGasLimitGuardedTx, gasLimitSetting.EnableEpoch) + } + if gc.maxGasLimitPerBlock < gc.minGasLimit { return nil, fmt.Errorf("%w: maxGasLimitPerBlock = %d minGasLimit = %d in epoch %d", process.ErrInvalidMaxGasLimitPerBlock, gc.maxGasLimitPerBlock, gc.minGasLimit, gasLimitSetting.EnableEpoch) } diff --git a/process/economics/economicsData_test.go b/process/economics/economicsData_test.go index ec8962aa605..c865f7cec69 100644 --- a/process/economics/economicsData_test.go +++ b/process/economics/economicsData_test.go @@ -61,12 +61,12 @@ func feeSettingsDummy(gasModifier float64) config.FeeSettings { MaxGasLimitPerMetaMiniBlock: "1000000", MaxGasLimitPerTx: "100000", MinGasLimit: "500", + ExtraGasLimitGuardedTx: "50000", }, }, - MinGasPrice: "18446744073709551615", - GasPerDataByte: "1", - GasPriceModifier: gasModifier, - ExtraGasLimitGuardedTx: "50000", + MinGasPrice: "18446744073709551615", + GasPerDataByte: "1", + GasPriceModifier: gasModifier, } } @@ -80,12 +80,12 @@ func feeSettingsReal() config.FeeSettings { MaxGasLimitPerMetaMiniBlock: "15000000000", MaxGasLimitPerTx: "1500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, }, - MinGasPrice: "1000000000", - GasPerDataByte: "1500", - GasPriceModifier: 0.01, - ExtraGasLimitGuardedTx: "50000", + MinGasPrice: "1000000000", + GasPerDataByte: "1500", + GasPriceModifier: 0.01, } } @@ -495,6 +495,7 @@ func TestEconomicsData_ConfirmedGasLimitSettingsChangeOrderedConfigs(t *testing. MaxGasLimitPerMetaMiniBlock: "15000000000", MaxGasLimitPerTx: "1500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, { EnableEpoch: 2, @@ -504,6 +505,7 @@ func TestEconomicsData_ConfirmedGasLimitSettingsChangeOrderedConfigs(t *testing. MaxGasLimitPerMetaMiniBlock: "5000000000", MaxGasLimitPerTx: "500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, } @@ -583,6 +585,7 @@ func TestEconomicsData_ConfirmedGasLimitSettingsChangeUnOrderedConfigs(t *testin MaxGasLimitPerMetaMiniBlock: "5000000000", MaxGasLimitPerTx: "500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, { EnableEpoch: 0, @@ -592,6 +595,7 @@ func TestEconomicsData_ConfirmedGasLimitSettingsChangeUnOrderedConfigs(t *testin MaxGasLimitPerMetaMiniBlock: "15000000000", MaxGasLimitPerTx: "1500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, } diff --git a/process/economics/export_test.go b/process/economics/export_test.go index 395c0a7f236..e661f4ff7ed 100644 --- a/process/economics/export_test.go +++ b/process/economics/export_test.go @@ -38,6 +38,7 @@ func (ed *economicsData) GetGasLimitSetting() *config.GasLimitSetting { gasLimitSetting.MaxGasLimitPerMetaMiniBlock = strconv.FormatUint(ed.maxGasLimitPerMetaMiniBlock, 10) gasLimitSetting.MaxGasLimitPerTx = strconv.FormatUint(ed.maxGasLimitPerTx, 10) gasLimitSetting.MinGasLimit = strconv.FormatUint(ed.minGasLimit, 10) + gasLimitSetting.ExtraGasLimitGuardedTx = strconv.FormatUint(ed.extraGasLimitGuardedTx, 10) return gasLimitSetting } diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index e6b54aa2630..db3730cb4e2 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -263,12 +263,12 @@ func TestVmContainerFactory_Create(t *testing.T) { MaxGasLimitPerMetaMiniBlock: "10000000000", MaxGasLimitPerTx: "10000000000", MinGasLimit: "10", + ExtraGasLimitGuardedTx: "50000", }, }, MinGasPrice: "10", GasPerDataByte: "1", GasPriceModifier: 1.0, - ExtraGasLimitGuardedTx: "50000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/process/peer/process_test.go b/process/peer/process_test.go index 4ac7376c175..dd12858240b 100644 --- a/process/peer/process_test.go +++ b/process/peer/process_test.go @@ -86,12 +86,12 @@ func createMockArguments() peer.ArgValidatorStatisticsProcessor { MaxGasLimitPerMetaMiniBlock: "10000000", MaxGasLimitPerTx: "10000000", MinGasLimit: "10", + ExtraGasLimitGuardedTx: "50000", }, }, - MinGasPrice: "10", - GasPerDataByte: "1", - GasPriceModifier: 1.0, - ExtraGasLimitGuardedTx: "50000", + MinGasPrice: "10", + GasPerDataByte: "1", + GasPriceModifier: 1.0, }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/process/smartContract/process_test.go b/process/smartContract/process_test.go index be7bdd4fd90..ab69be09a60 100644 --- a/process/smartContract/process_test.go +++ b/process/smartContract/process_test.go @@ -4039,12 +4039,12 @@ func createRealEconomicsDataArgs() *economics.ArgsNewEconomicsData { MaxGasLimitPerMetaMiniBlock: "15000000000", MaxGasLimitPerTx: "1500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, }, - GasPerDataByte: "1500", - MinGasPrice: "1000000000", - GasPriceModifier: 0.01, - ExtraGasLimitGuardedTx: "50000", + GasPerDataByte: "1500", + MinGasPrice: "1000000000", + GasPriceModifier: 0.01, }, }, EpochNotifier: &epochNotifier.EpochNotifierStub{}, From 538bb3c00ee414291942d602f8412b7fc18c8069 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 20 Jun 2022 12:51:59 +0300 Subject: [PATCH 057/335] cmd: remove empty line in config --- cmd/node/config/config.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index 10558f32cd8..3e08c548efe 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -70,7 +70,6 @@ # it is a good idea to increase the maximum number of opened files allowed by the operating system FullArchiveNumActivePersisters = 10 - [MiniBlocksStorage] [MiniBlocksStorage.Cache] Name = "MiniBlocksStorage" From 3d6e4f61109aa9462378d52a68154931986e34dc Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 20 Jun 2022 17:54:06 +0300 Subject: [PATCH 058/335] cmd: add comment for SetGuardianEpochsDelay constraints --- cmd/node/config/config.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index 10558f32cd8..3a565887884 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -29,7 +29,8 @@ MaxConsecutiveRoundsOfRatingDecrease = 600 # SetGuardianEpochsDelay represents the delay in epochs between the execution time of the SetGuardian transaction and - # the activation of the configured guardian + # the activation of the configured guardian. + # Make sure that this is greater than the unbonding period! SetGuardianEpochsDelay = 20 [Versions] From 9441eecbe33d6a81caf0b8ea4fd40c452e51b24c Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 21 Jun 2022 18:59:51 +0300 Subject: [PATCH 059/335] process: add limitation for replacing pending guardian --- integrationTests/testInitializer.go | 2 +- integrationTests/testProcessorNode.go | 4 +- process/dataValidators/txValidator.go | 19 +++-- process/errors.go | 6 ++ process/guardedtx/guardedTxVerifier.go | 12 ++-- process/guardedtx/guardedTxVerifier_test.go | 6 +- .../disabled/disabledGuardedAccount.go | 11 +++ process/guardian/guardedAccount.go | 71 ++++++++++++++++--- process/interface.go | 5 ++ process/transaction/metaProcess_test.go | 2 +- process/transaction/shardProcess_test.go | 2 +- .../guardianAccountHandlerStub.go | 23 +++++- .../guardianMocks/guardianCheckerStub.go | 24 ------- .../guardianMocks/guardianSigVerifierStub.go | 10 +++ 14 files changed, 142 insertions(+), 55 deletions(-) delete mode 100644 testscommon/guardianMocks/guardianCheckerStub.go diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index c5abf923660..2e2c48b4442 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -1052,7 +1052,7 @@ func CreateSimpleTxProcessor(accnts state.AccountsAdapter) process.TransactionPr ScrForwarder: &mock.IntermediateTransactionHandlerMock{}, EpochNotifier: forking.NewGenericEpochNotifier(), TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, } txProcessor, _ := txProc.NewTxProcessor(argsNewTxProcessor) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index c47801bdf8e..345eddcd061 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1547,7 +1547,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u EpochNotifier: tpn.EpochNotifier, RelayedTxEnableEpoch: tpn.EnableEpochs.RelayedTransactionsEnableEpoch, PenalizedTooMuchGasEnableEpoch: tpn.EnableEpochs.PenalizedTooMuchGasEnableEpoch, - GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } tpn.TxProcessor, _ = transaction.NewTxProcessor(argsNewTxProcessor) @@ -1792,7 +1792,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors() { ESDTEnableEpoch: 0, EpochNotifier: tpn.EpochNotifier, BuiltInFunctionOnMetachainEnableEpoch: tpn.EnableEpochs.BuiltInFunctionOnMetaEnableEpoch, - GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } tpn.TxProcessor, _ = transaction.NewMetaTxProcessor(argsNewMetaTxProc) diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 90ee33e80ea..d22365c829d 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -7,7 +7,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/process/guardedtx" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" @@ -21,7 +20,7 @@ type txValidator struct { shardCoordinator sharding.Coordinator whiteListHandler process.WhiteListHandler pubKeyConverter core.PubkeyConverter - guardianSigVerifier guardedtx.GuardianSigVerifier + guardianSigVerifier process.GuardianSigVerifier txVersionChecker process.TxVersionCheckerHandler maxNonceDeltaAllowed int } @@ -32,7 +31,7 @@ func NewTxValidator( shardCoordinator sharding.Coordinator, whiteListHandler process.WhiteListHandler, pubKeyConverter core.PubkeyConverter, - guardianSigVerifier guardedtx.GuardianSigVerifier, + guardianSigVerifier process.GuardianSigVerifier, txVersionChecker process.TxVersionCheckerHandler, maxNonceDeltaAllowed int, ) (*txValidator, error) { @@ -156,15 +155,25 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac if err != nil { return err } + + // block non guarded setGuardian Txs if there is a pending guardian + hasPendingGuardian := txv.guardianSigVerifier.HasPendingGuardian(account) + if isSetGuardianCall(txData) && hasPendingGuardian { + return process.ErrCannotReplaceFrozenAccountPendingGuardian + } } return nil } +func isSetGuardianCall(txData []byte) bool { + return process.IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) +} + // Setting a guardian is allowed with regular transactions on a frozen account // but in this case is set with the default epochs delay func checkOperationAllowedToBypassGuardian(txData []byte) error { - if process.IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { + if isSetGuardianCall(txData) { return nil } @@ -244,8 +253,6 @@ func getTxData(interceptedTx process.InterceptedTransactionHandler) ([]byte, err return tx.GetData(), nil } - - // CheckTxWhiteList will check if the cross shard transactions are whitelisted and could be added in pools func (txv *txValidator) CheckTxWhiteList(data process.InterceptedData) error { interceptedTx, ok := data.(process.InterceptedTransactionHandler) diff --git a/process/errors.go b/process/errors.go index 24e6bf00156..c9b9b524bf5 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1098,6 +1098,9 @@ var ErrAccountHasNoGuardianSet = errors.New("account has no guardian set") // ErrAccountHasNoActiveGuardian signals that the account has no active guardian var ErrAccountHasNoActiveGuardian = errors.New("account has no active guardian") +// ErrAccountHasNoPendingGuardian signals that the account has no pending guardian +var ErrAccountHasNoPendingGuardian = errors.New("account has no pending guardian") + // ErrNilGuardedAccountHandler signals that a nil guarded account handler was provided var ErrNilGuardedAccountHandler = errors.New("nil guarded account handler") @@ -1110,5 +1113,8 @@ var ErrTransactionAndAccountGuardianMismatch = errors.New("mismatch between tran // ErrInvalidSetGuardianEpochsDelay signals an invalid configuration for the epochs delay var ErrInvalidSetGuardianEpochsDelay = errors.New("incorrect setting for set guardian epochs delay") +// ErrCannotReplaceFrozenAccountPendingGuardian signals that a pending guardian on a frozen account cannot be replaced +var ErrCannotReplaceFrozenAccountPendingGuardian = errors.New("cannot replace pending guardian on frozen account") + // ErrGasPriceTooHigh signals a too high gas price var ErrGasPriceTooHigh = errors.New("gas price is too high for the transaction") diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index 795d192b5ae..0d535de628c 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -6,15 +6,10 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) -// GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions -type GuardianSigVerifier interface { - VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error - IsInterfaceNil() bool -} - // GuardedTxSigVerifierArgs holds the argument to instantiate a guarded tx signature verifier type GuardedTxSigVerifierArgs struct { SigVerifier crypto.SingleSigner @@ -98,6 +93,11 @@ func (gtx *guardedTxSigVerifier) GetGuardianPublicKey(account vmcommon.UserAccou return gtx.keyGen.PublicKeyFromByteArray(guardianPubKeyBytes) } +// HasPendingGuardian true if the given account has a pending guardian set +func (gtx *guardedTxSigVerifier) HasPendingGuardian(uah state.UserAccountHandler) bool { + return gtx.guardianChecker.HasPendingGuardian(uah) +} + // IsInterfaceNil returns nil if the receiver is nil func (gtx *guardedTxSigVerifier) IsInterfaceNil() bool { return gtx == nil diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 3afee85936d..f8fb67b961f 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -28,7 +28,7 @@ import ( func TestNewGuardedTxSigVerifier(t *testing.T) { args := GuardedTxSigVerifierArgs{ SigVerifier: &cryptoMocks.SingleSignerStub{}, - GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, PubKeyConverter: &testscommon.PubkeyConverterMock{}, Marshaller: &testscommon.MarshalizerMock{}, KeyGen: &cryptoMocks.KeyGenStub{}, @@ -77,7 +77,7 @@ func TestNewGuardedTxSigVerifier(t *testing.T) { } func TestGuardedTxSigVerifier_IsInterfaceNil(t *testing.T) { - var gsv GuardianSigVerifier + var gsv process.GuardianSigVerifier require.True(t, check.IfNil(gsv)) var gsvNilPtr *guardedTxSigVerifier @@ -98,7 +98,7 @@ func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { signer := &singlesig.Ed25519Signer{} acc := &vmcommonMocks.UserAccountStub{} - guardianChecker := &guardianMocks.GuardianCheckerStub{ + guardianChecker := &guardianMocks.GuardedAccountHandlerStub{ GetActiveGuardianCalled: func(handler vmcommon.UserAccountHandler) ([]byte, error) { return pubKeyGuardianBytes, nil }, diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go index 90ae584e85f..ec83ee35d3c 100644 --- a/process/guardian/disabled/disabledGuardedAccount.go +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -1,6 +1,7 @@ package disabled import ( + "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -16,6 +17,16 @@ func (dga *disabledGuardedAccount) GetActiveGuardian(_ vmcommon.UserAccountHandl return nil, nil } +// HasActiveGuardian returns false as this is a disabled implementation +func (dga *disabledGuardedAccount) HasActiveGuardian(_ state.UserAccountHandler) bool { + return false +} + +// HasPendingGuardian returns false as this is a disabled implementation +func (dga *disabledGuardedAccount) HasPendingGuardian(_ state.UserAccountHandler) bool { + return false +} + // SetGuardian returns nil as this is a disabled implementation func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte, _ []byte) error { return nil diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 475c8b50ab2..af75093c186 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -53,18 +53,10 @@ func NewGuardedAccount( // GetActiveGuardian returns the active guardian func (agc *guardedAccount) GetActiveGuardian(uah vmcommon.UserAccountHandler) ([]byte, error) { - stateUserAccount, ok := uah.(state.UserAccountHandler) - if !ok { - return nil, process.ErrWrongTypeAssertion - } - - configuredGuardians, err := agc.getConfiguredGuardians(stateUserAccount) + configuredGuardians, err := agc.getVmUserAccountConfiguredGuardian(uah) if err != nil { return nil, err } - if len(configuredGuardians.Slice) == 0 { - return nil, process.ErrAccountHasNoGuardianSet - } guardian, err := agc.getActiveGuardian(configuredGuardians) if err != nil { @@ -74,6 +66,33 @@ func (agc *guardedAccount) GetActiveGuardian(uah vmcommon.UserAccountHandler) ([ return guardian.Address, nil } +// HasActiveGuardian returns true if the account has an active guardian configured, false otherwise +func (agc *guardedAccount) HasActiveGuardian(uah state.UserAccountHandler) bool { + configuredGuardians, err := agc.getConfiguredGuardians(uah) + if err != nil { + return false + } + _, err = agc.getActiveGuardian(configuredGuardians) + if err != nil { + return false + } + return true +} + +// HasPendingGuardian return true if the account has a pending guardian, false otherwise +func (agc *guardedAccount) HasPendingGuardian(uah state.UserAccountHandler) bool { + configuredGuardians, err := agc.getConfiguredGuardians(uah) + if err != nil { + return false + } + + _, err = agc.getPendingGuardian(configuredGuardians) + if err != nil { + return false + } + return true +} + // SetGuardian sets a guardian for an account func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error { stateUserAccount, ok := uah.(state.UserAccountHandler) @@ -93,6 +112,23 @@ func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardian return agc.setAccountGuardian(stateUserAccount, guardian) } +func (agc *guardedAccount) getVmUserAccountConfiguredGuardian(uah vmcommon.UserAccountHandler) (*guardians.Guardians, error) { + stateUserAccount, ok := uah.(state.UserAccountHandler) + if !ok { + return nil, process.ErrWrongTypeAssertion + } + + configuredGuardians, err := agc.getConfiguredGuardians(stateUserAccount) + if err != nil { + return nil, err + } + if len(configuredGuardians.Slice) == 0 { + return nil, process.ErrAccountHasNoGuardianSet + } + + return configuredGuardians, nil +} + func (agc *guardedAccount) setAccountGuardian(uah state.UserAccountHandler, guardian *guardians.Guardian) error { configuredGuardians, err := agc.getConfiguredGuardians(uah) if err != nil { @@ -229,6 +265,23 @@ func (agc *guardedAccount) getActiveGuardian(gs *guardians.Guardians) (*guardian return selectedGuardian, nil } +func (agc *guardedAccount) getPendingGuardian(gs *guardians.Guardians) (*guardians.Guardian, error) { + agc.mutEpoch.RLock() + defer agc.mutEpoch.RUnlock() + + for _, guardian := range gs.Slice { + if guardian == nil { + continue + } + if guardian.ActivationEpoch < agc.currentEpoch { + continue + } + return guardian, nil + } + + return nil, process.ErrAccountHasNoPendingGuardian +} + // EpochConfirmed is the registered callback function for the epoch change notifier func (agc *guardedAccount) EpochConfirmed(epoch uint32, _ uint64) { agc.mutEpoch.Lock() diff --git a/process/interface.go b/process/interface.go index 4ed71355b2c..f0b4b787ba4 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1209,18 +1209,23 @@ type ShardedPool interface { // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx InterceptedTransactionHandler) error + HasPendingGuardian(uah state.UserAccountHandler) bool IsInterfaceNil() bool } // GuardianChecker can check an account guardian type GuardianChecker interface { GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) + HasActiveGuardian(uah state.UserAccountHandler) bool + HasPendingGuardian(uah state.UserAccountHandler) bool IsInterfaceNil() bool } // GuardedAccountHandler allows setting and getting the configured account guardian type GuardedAccountHandler interface { GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) + HasActiveGuardian(uah state.UserAccountHandler) bool + HasPendingGuardian(uah state.UserAccountHandler) bool SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error IsInterfaceNil() bool } diff --git a/process/transaction/metaProcess_test.go b/process/transaction/metaProcess_test.go index f5a9b5602bb..4945c4797d0 100644 --- a/process/transaction/metaProcess_test.go +++ b/process/transaction/metaProcess_test.go @@ -35,7 +35,7 @@ func createMockNewMetaTxArgs() txproc.ArgsNewMetaTxProcessor { EconomicsFee: createFreeTxFeeHandler(), ESDTEnableEpoch: 0, EpochNotifier: &epochNotifier.EpochNotifierStub{}, - GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return args diff --git a/process/transaction/shardProcess_test.go b/process/transaction/shardProcess_test.go index 0d333258e1c..971c0564260 100644 --- a/process/transaction/shardProcess_test.go +++ b/process/transaction/shardProcess_test.go @@ -90,7 +90,7 @@ func createArgsForTxProcessor() txproc.ArgsNewTxProcessor { ArgsParser: &mock.ArgumentParserMock{}, ScrForwarder: &mock.IntermediateTransactionHandlerMock{}, EpochNotifier: &epochNotifier.EpochNotifierStub{}, - GuardianChecker: &guardianMocks.GuardianCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return args diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go index fccea8182ba..bdc572aa102 100644 --- a/testscommon/guardianMocks/guardianAccountHandlerStub.go +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -1,13 +1,16 @@ package guardianMocks import ( + "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // GuardedAccountHandlerStub - type GuardedAccountHandlerStub struct { - GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) - SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error + GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) + SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error + HasPendingGuardianCalled func(uah state.UserAccountHandler) bool + HasActiveGuardianCalled func(uah state.UserAccountHandler) bool } // GetActiveGuardian - @@ -18,6 +21,22 @@ func (gahs *GuardedAccountHandlerStub) GetActiveGuardian(handler vmcommon.UserAc return nil, nil } +// HasActiveGuardian - +func (gahs *GuardedAccountHandlerStub) HasActiveGuardian(uah state.UserAccountHandler) bool { + if gahs.HasActiveGuardianCalled != nil { + return gahs.HasActiveGuardianCalled(uah) + } + return false +} + +// HasPendingGuardian - +func (gahs *GuardedAccountHandlerStub) HasPendingGuardian(uah state.UserAccountHandler) bool { + if gahs.HasPendingGuardianCalled != nil { + return gahs.HasPendingGuardianCalled(uah) + } + return false +} + // SetGuardian - func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error { if gahs.SetGuardianCalled != nil { diff --git a/testscommon/guardianMocks/guardianCheckerStub.go b/testscommon/guardianMocks/guardianCheckerStub.go deleted file mode 100644 index 130bfb981bc..00000000000 --- a/testscommon/guardianMocks/guardianCheckerStub.go +++ /dev/null @@ -1,24 +0,0 @@ -package guardianMocks - -import ( - vmcommon "github.com/ElrondNetwork/elrond-vm-common" -) - -// GuardianCheckerStub - -type GuardianCheckerStub struct { - GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) -} - -// GetActiveGuardian - -func (gcs *GuardianCheckerStub) GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) { - if gcs.GetActiveGuardianCalled != nil { - return gcs.GetActiveGuardianCalled(handler) - } - - return nil, nil -} - -// IsInterfaceNil - -func (gcs *GuardianCheckerStub) IsInterfaceNil() bool { - return gcs == nil -} diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go index 492440e64a8..173d92944dc 100644 --- a/testscommon/guardianMocks/guardianSigVerifierStub.go +++ b/testscommon/guardianMocks/guardianSigVerifierStub.go @@ -2,12 +2,14 @@ package guardianMocks import ( "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // GuardianSigVerifierStub - type GuardianSigVerifierStub struct { VerifyGuardianSignatureCalled func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error + HasPendingGuardianCalled func(uah state.UserAccountHandler) bool } // VerifyGuardianSignature - @@ -18,6 +20,14 @@ func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account vmcommon.Us return nil } +// HasPendingGuardian returns true if the given account has a pending guardian +func (gsvs *GuardianSigVerifierStub) HasPendingGuardian(uah state.UserAccountHandler) bool { + if gsvs.HasPendingGuardianCalled != nil { + return gsvs.HasPendingGuardianCalled(uah) + } + return false +} + // IsInterfaceNil - func (gsvs *GuardianSigVerifierStub) IsInterfaceNil() bool { return gsvs == nil From 71d3c08d423e2511854174275e07c21b21945439 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 22 Jun 2022 10:27:40 +0300 Subject: [PATCH 060/335] integrationTests: normalize max setGuardian gas price --- integrationTests/testProcessorNode.go | 2 +- integrationTests/vm/arwen/utils.go | 2 +- integrationTests/vm/testInitializer.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 345eddcd061..33f51c4bf18 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1075,7 +1075,7 @@ func (tpn *TestProcessorNode) createDefaultEconomicsConfig() *config.EconomicsCo MinGasPrice: minGasPrice, GasPerDataByte: "1", GasPriceModifier: 0.01, - MaxGasPriceSetGuardian: "100000", + MaxGasPriceSetGuardian: "2000000000", }, } } diff --git a/integrationTests/vm/arwen/utils.go b/integrationTests/vm/arwen/utils.go index 51095bee8b6..9f2fc85fcae 100644 --- a/integrationTests/vm/arwen/utils.go +++ b/integrationTests/vm/arwen/utils.go @@ -218,7 +218,7 @@ func (context *TestContext) initFeeHandlers() { MinGasPrice: minGasPrice, GasPerDataByte: "1", GasPriceModifier: 1.0, - MaxGasPriceSetGuardian: "40000000000", + MaxGasPriceSetGuardian: "2000000000", }, }, PenalizedTooMuchGasEnableEpoch: 0, diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 8d692a7e099..3a43c103559 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -394,7 +394,7 @@ func createEconomicsData(penalizedTooMuchGasEnableEpoch uint32) (process.Economi MinGasPrice: minGasPrice, GasPerDataByte: "1", GasPriceModifier: 1.0, - MaxGasPriceSetGuardian: "40000000000", + MaxGasPriceSetGuardian: "2000000000", }, }, PenalizedTooMuchGasEnableEpoch: penalizedTooMuchGasEnableEpoch, From 5c4faa1eb59768c69d0c512a869b9f917f76fc89 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 22 Jun 2022 10:32:13 +0300 Subject: [PATCH 061/335] process: move unit test to right file --- process/common_test.go | 20 ++++++++++++++++++++ process/dataValidators/txValidator_test.go | 19 ------------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/process/common_test.go b/process/common_test.go index 175a60a152d..1af6de787f7 100644 --- a/process/common_test.go +++ b/process/common_test.go @@ -18,6 +18,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" storageStubs "github.com/ElrondNetwork/elrond-go/testscommon/storage" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestGetShardHeaderShouldErrNilCacher(t *testing.T) { @@ -1961,3 +1962,22 @@ func TestGetMiniBlockHeaderWithHash(t *testing.T) { assert.Equal(t, expectedMbh, mbh) }) } + +func Test_IsBuiltinFuncCallWithParam(t *testing.T) { + txDataNoFunction := []byte("dummy data") + targetFunction := "function" + nonTargetFunction := "differentFunction" + suffix := "@dummy@params" + txDataWithFunc := []byte(targetFunction + suffix) + txDataNonTargetFunc := []byte(nonTargetFunction + suffix) + + t.Run("no function", func(t *testing.T) { + require.False(t, process.IsBuiltinFuncCallWithParam(txDataNoFunction, targetFunction)) + }) + t.Run("non target function", func(t *testing.T) { + require.False(t, process.IsBuiltinFuncCallWithParam(txDataNonTargetFunc, targetFunction)) + }) + t.Run("target function", func(t *testing.T) { + require.True(t, process.IsBuiltinFuncCallWithParam(txDataWithFunc, targetFunction)) + }) +} diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index e6210976da2..208171ccf47 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -781,25 +781,6 @@ func Test_getTxData(t *testing.T) { }) } -func Test_isBuiltinFuncCallWithParam(t *testing.T) { - txDataNoFunction := []byte("dummy data") - targetFunction := "function" - nonTargetFunction := "differentFunction" - suffix := "@dummy@params" - txDataWithFunc := []byte(targetFunction + suffix) - txDataNonTargetFunc := []byte(nonTargetFunction + suffix) - - t.Run("no function", func(t *testing.T) { - require.False(t, process.IsBuiltinFuncCallWithParam(txDataNoFunction, targetFunction)) - }) - t.Run("non target function", func(t *testing.T) { - require.False(t, process.IsBuiltinFuncCallWithParam(txDataNonTargetFunc, targetFunction)) - }) - t.Run("target function", func(t *testing.T) { - require.True(t, process.IsBuiltinFuncCallWithParam(txDataWithFunc, targetFunction)) - }) -} - //------- IsInterfaceNil func TestTxValidator_IsInterfaceNil(t *testing.T) { From 9b198d711d0aafd6369f3023faebcd34866ce208 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 22 Jun 2022 10:58:53 +0300 Subject: [PATCH 062/335] process: move function and create unit test --- process/common.go | 5 +++ process/common_test.go | 22 ++++++++++++ process/dataValidators/txValidator.go | 8 ++--- process/dataValidators/txValidator_test.go | 39 +++++++++++++++++++++- 4 files changed, 67 insertions(+), 7 deletions(-) diff --git a/process/common.go b/process/common.go index aebebe9a440..72ee5cdaf2b 100644 --- a/process/common.go +++ b/process/common.go @@ -820,3 +820,8 @@ func IsBuiltinFuncCallWithParam(txData []byte, function string) bool { expectedTxDataPrefix := []byte(function + "@") return bytes.HasPrefix(txData, expectedTxDataPrefix) } + +// IsSetGuardianCall checks if the given transaction data represents the set guardian builtin function call +func IsSetGuardianCall(txData []byte) bool { + return IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) +} \ No newline at end of file diff --git a/process/common_test.go b/process/common_test.go index 1af6de787f7..db57b532c4f 100644 --- a/process/common_test.go +++ b/process/common_test.go @@ -1981,3 +1981,25 @@ func Test_IsBuiltinFuncCallWithParam(t *testing.T) { require.True(t, process.IsBuiltinFuncCallWithParam(txDataWithFunc, targetFunction)) }) } + +func Test_IsSetGuardianCall(t *testing.T) { + t.Parallel() + + setGuardianTxData := []byte("SetGuardian@xxxxxxxx") + t.Run("should return false for tx with other builtin function call or random data", func(t *testing.T) { + require.False(t, process.IsSetGuardianCall([]byte(core.BuiltInFunctionClaimDeveloperRewards+"@..."))) + require.False(t, process.IsSetGuardianCall([]byte("some random data"))) + }) + t.Run("should return false for tx with setGuardian without params (no builtin function call)", func(t *testing.T) { + require.False(t, process.IsSetGuardianCall([]byte("SetGuardian"))) + }) + t.Run("should return true for setGuardian call with invalid num of params", func(t *testing.T) { + require.True(t, process.IsSetGuardianCall([]byte("SetGuardian@xxx@xxx@xxx"))) + }) + t.Run("should return true for setGuardian call with empty param", func(t *testing.T) { + require.True(t, process.IsSetGuardianCall([]byte("SetGuardian@"))) + }) + t.Run("should return true for setGuardian call", func(t *testing.T) { + require.True(t, process.IsSetGuardianCall(setGuardianTxData)) + }) +} diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index d22365c829d..9710e301349 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -158,7 +158,7 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac // block non guarded setGuardian Txs if there is a pending guardian hasPendingGuardian := txv.guardianSigVerifier.HasPendingGuardian(account) - if isSetGuardianCall(txData) && hasPendingGuardian { + if process.IsSetGuardianCall(txData) && hasPendingGuardian { return process.ErrCannotReplaceFrozenAccountPendingGuardian } } @@ -166,14 +166,10 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac return nil } -func isSetGuardianCall(txData []byte) bool { - return process.IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) -} - // Setting a guardian is allowed with regular transactions on a frozen account // but in this case is set with the default epochs delay func checkOperationAllowedToBypassGuardian(txData []byte) error { - if isSetGuardianCall(txData) { + if process.IsSetGuardianCall(txData) { return nil } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 208171ccf47..f2b06eb8ed1 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -520,7 +520,7 @@ func TestTxValidator_checkPermission(t *testing.T) { err = txV.CheckPermission(inTx, acc) require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) }) - t.Run("frozen account with no guarded tx and bypass permission should allow", func(t *testing.T) { + t.Run("frozen account with no guarded tx and bypass permission should allow if no pending guardian", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { return &transaction.Transaction{ @@ -538,6 +538,9 @@ func TestTxValidator_checkPermission(t *testing.T) { VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { return errors.New("error") }, + HasPendingGuardianCalled: func(uah state.UserAccountHandler) bool { + return false + }, }, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { @@ -551,6 +554,40 @@ func TestTxValidator_checkPermission(t *testing.T) { err = txV.CheckPermission(inTx, acc) require.Nil(t, err) }) + t.Run("frozen account with no guarded tx and bypass permission with pending guardian should block", func(t *testing.T) { + inTx := getDefaultInterceptedTx() + inTx.TransactionCalled = func() data.TransactionHandler { + return &transaction.Transaction{ + Data: []byte("SetGuardian@..."), + } + } + + acc := createDummyFrozenAccount() + txV, err := dataValidators.NewTxValidator( + adb, + shardCoordinator, + &testscommon.WhiteListHandlerStub{}, + mock.NewPubkeyConverterMock(32), + &guardianMocks.GuardianSigVerifierStub{ + VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { + return errors.New("error") + }, + HasPendingGuardianCalled: func(uah state.UserAccountHandler) bool { + return true + }, + }, + &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return false + }, + }, + maxNonceDeltaAllowed, + ) + require.Nil(t, err) + + err = txV.CheckPermission(inTx, acc) + require.Equal(t, process.ErrCannotReplaceFrozenAccountPendingGuardian, err) + }) t.Run("frozen account with guarded Tx should allow", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { From 3b7fddbc4e3e2ee7e3b9e66e1916f5b6535a9dc6 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 22 Jun 2022 11:48:07 +0300 Subject: [PATCH 063/335] process: unit tests and fixes --- process/common.go | 5 +- process/economics/economicsData.go | 1 + process/economics/economicsData_test.go | 13 ++ process/guardedtx/guardedTxVerifier_test.go | 35 +++ process/guardian/guardedAccount.go | 8 + process/guardian/guardedAccount_test.go | 237 ++++++++++++++++++-- testscommon/state/userAccountStub.go | 2 +- 7 files changed, 273 insertions(+), 28 deletions(-) diff --git a/process/common.go b/process/common.go index 72ee5cdaf2b..0d7c4fbccdb 100644 --- a/process/common.go +++ b/process/common.go @@ -9,12 +9,11 @@ import ( "sort" "time" - "github.com/ElrondNetwork/elrond-go-core/data/scheduled" - "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/block" + "github.com/ElrondNetwork/elrond-go-core/data/scheduled" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" @@ -824,4 +823,4 @@ func IsBuiltinFuncCallWithParam(txData []byte, function string) bool { // IsSetGuardianCall checks if the given transaction data represents the set guardian builtin function call func IsSetGuardianCall(txData []byte) bool { return IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) -} \ No newline at end of file +} diff --git a/process/economics/economicsData.go b/process/economics/economicsData.go index 49f418a6934..bfd468f7e35 100644 --- a/process/economics/economicsData.go +++ b/process/economics/economicsData.go @@ -130,6 +130,7 @@ func NewEconomicsData(args ArgsNewEconomicsData) (*economicsData, error) { topUpGradientPoint: topUpGradientPoint, gasLimitSettings: gasLimitSettings, minGasPrice: convertedData.minGasPrice, + maxGasPriceSetGuardian: convertedData.maxGasPriceSetGuardian, gasPerDataByte: convertedData.gasPerDataByte, minInflation: args.Economics.GlobalSettings.MinimumInflation, genesisTotalSupply: convertedData.genesisTotalSupply, diff --git a/process/economics/economicsData_test.go b/process/economics/economicsData_test.go index 41acd86806b..f32e5128ff5 100644 --- a/process/economics/economicsData_test.go +++ b/process/economics/economicsData_test.go @@ -1118,3 +1118,16 @@ func TestEconomicsData_ComputeGasLimitBasedOnBalance(t *testing.T) { require.Nil(t, err) require.Equal(t, uint64(11894070000), gasLimit) } + +func TestEconomicsData_MaxGasPriceSetGuardian(t *testing.T) { + t.Parallel() + + args := createArgsForEconomicsDataRealFees(&mock.BuiltInCostHandlerStub{}) + maxGasPriceSetGuardianString := "2000000" + expectedMaxGasPriceSetGuardian, err := strconv.ParseUint(maxGasPriceSetGuardianString, 10, 64) + require.Nil(t, err) + args.Economics.FeeSettings.MaxGasPriceSetGuardian = maxGasPriceSetGuardianString + economicData, _ := economics.NewEconomicsData(args) + + require.Equal(t, expectedMaxGasPriceSetGuardian, economicData.MaxGasPriceSetGuardian()) +} diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index f8fb67b961f..db4463e4836 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -16,10 +16,12 @@ import ( "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/interceptedTxMocks" + stateMocks "github.com/ElrondNetwork/elrond-go/testscommon/state" "github.com/ElrondNetwork/elrond-go/testscommon/vmcommonMocks" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/require" @@ -220,3 +222,36 @@ func signAndGuardTx( return signature, guardianSignature } + +func TestGuardedTxSigVerifier_HasPendingGuardian(t *testing.T) { + + acc := &stateMocks.UserAccountStub{} + args := GuardedTxSigVerifierArgs{ + SigVerifier: &cryptoMocks.SingleSignerStub{}, + PubKeyConverter: &testscommon.PubkeyConverterMock{}, + Marshaller: &testscommon.MarshalizerMock{}, + KeyGen: &cryptoMocks.KeyGenStub{}, + } + t.Run("no pending guardian", func(t *testing.T) { + guardianChecker := &guardianMocks.GuardedAccountHandlerStub{ + HasPendingGuardianCalled: func(handler state.UserAccountHandler) bool { + return false + }, + } + arg := args + arg.GuardianChecker = guardianChecker + gtxSigVerifier, _ := NewGuardedTxSigVerifier(arg) + require.False(t, gtxSigVerifier.HasPendingGuardian(acc)) + }) + t.Run("with pending guardian", func(t *testing.T) { + guardianChecker := &guardianMocks.GuardedAccountHandlerStub{ + HasPendingGuardianCalled: func(handler state.UserAccountHandler) bool { + return true + }, + } + arg := args + arg.GuardianChecker = guardianChecker + gtxSigVerifier, _ := NewGuardedTxSigVerifier(arg) + require.True(t, gtxSigVerifier.HasPendingGuardian(acc)) + }) +} diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index af75093c186..165827379f7 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -68,6 +68,10 @@ func (agc *guardedAccount) GetActiveGuardian(uah vmcommon.UserAccountHandler) ([ // HasActiveGuardian returns true if the account has an active guardian configured, false otherwise func (agc *guardedAccount) HasActiveGuardian(uah state.UserAccountHandler) bool { + if check.IfNil(uah) { + return false + } + configuredGuardians, err := agc.getConfiguredGuardians(uah) if err != nil { return false @@ -81,6 +85,10 @@ func (agc *guardedAccount) HasActiveGuardian(uah state.UserAccountHandler) bool // HasPendingGuardian return true if the account has a pending guardian, false otherwise func (agc *guardedAccount) HasPendingGuardian(uah state.UserAccountHandler) bool { + if check.IfNil(uah) { + return false + } + configuredGuardians, err := agc.getConfiguredGuardians(uah) if err != nil { return false diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 113a661d00e..e6ac59c9e24 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -9,14 +9,14 @@ import ( "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" - "github.com/ElrondNetwork/elrond-go/testscommon/state" + stateMocks "github.com/ElrondNetwork/elrond-go/testscommon/state" "github.com/ElrondNetwork/elrond-go/testscommon/trie" "github.com/ElrondNetwork/elrond-go/testscommon/vmcommonMocks" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/require" ) -func TestNewAccountGuardianChecker(t *testing.T) { +func TestNewGuardedAccount(t *testing.T) { marshaller := &testscommon.MarshalizerMock{} en := &epochNotifier.EpochNotifierStub{} ga, err := NewGuardedAccount(marshaller, en, 10) @@ -104,7 +104,7 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { t.Parallel() expectedErr := errors.New("expected error") - acc := &state.UserAccountStub{ + acc := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return nil, expectedErr }, @@ -117,7 +117,7 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { t.Run("key found but no guardians, should return empty", func(t *testing.T) { t.Parallel() - acc := &state.UserAccountStub{ + acc := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return nil, nil }, @@ -138,7 +138,7 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { return expectedErr }, } - acc := &state.UserAccountStub{ + acc := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return []byte("wrongly marshalled guardians"), nil }, @@ -154,7 +154,7 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { g1 := &guardians.Guardian{Address: []byte("addr1"), ActivationEpoch: 9} expectedConfiguredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} - acc := &state.UserAccountStub{ + acc := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(expectedConfiguredGuardians) }, @@ -269,7 +269,6 @@ func TestGuardedAccount_updateGuardians(t *testing.T) { require.Nil(t, err) require.Equal(t, expectedUpdatedGuardians, updatedGuardians) }) - // todo: if todo in guarded account is implemented, this will need to be changed t.Run("updating the existing same pending guardian while there is an active one should leave the active guardian unchanged but update the pending", func(t *testing.T) { existingGuardian := &guardians.Guardian{ Address: []byte("guardian address"), @@ -295,7 +294,7 @@ func TestGuardedAccount_setAccountGuardian(t *testing.T) { t.Run("getConfiguredGuardians with err", func(t *testing.T) { expectedErr := errors.New("expected error") - ua := &state.UserAccountStub{ + ua := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return nil, expectedErr }, @@ -310,7 +309,7 @@ func TestGuardedAccount_setAccountGuardian(t *testing.T) { ActivationEpoch: 11, } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} - ua := &state.UserAccountStub{ + ua := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -329,7 +328,7 @@ func TestGuardedAccount_setAccountGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} expectedValue := []byte(nil) - ua := &state.UserAccountStub{ + ua := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { expectedValue, _ = ga.marshaller.Marshal(configuredGuardians) return expectedValue, nil @@ -361,7 +360,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { t.Run("getConfiguredGuardians with err", func(t *testing.T) { expectedErr := errors.New("expected error") - ua := &state.UserAccountStub{ + ua := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return nil, expectedErr }, @@ -373,7 +372,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { t.Run("getActiveGuardianErr with err (no active guardian) should error", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} - ua := &state.UserAccountStub{ + ua := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -390,7 +389,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} - ua := &state.UserAccountStub{ + ua := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -412,7 +411,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} expectedValue, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}}) - ua := &state.UserAccountStub{ + ua := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -443,7 +442,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { }) t.Run("getConfiguredGuardians with err should propagate the err", func(t *testing.T) { expectedErr := errors.New("expected error") - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return nil, expectedErr }, @@ -454,7 +453,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { }) t.Run("no guardian should return err", func(t *testing.T) { configuredGuardians := &guardians.Guardians{} - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -470,7 +469,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { ActivationEpoch: currentEpoch + 1, } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -486,7 +485,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { ActivationEpoch: currentEpoch - 1, } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -507,7 +506,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -528,7 +527,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -559,7 +558,7 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { }) t.Run("transaction signed by current active guardian but instantSetGuardian returns error", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -575,7 +574,7 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { } expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}}) - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -600,7 +599,7 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { } expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{g1, newGuardian}}) - uah := &state.UserAccountStub{ + uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { return ga.marshaller.Marshal(configuredGuardians) }, @@ -619,6 +618,196 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { }) } +func TestGuardedAccount_HasActiveGuardian(t *testing.T) { + currentEpoch := uint32(10) + ga := createGuardedAccountWithEpoch(currentEpoch) + + t.Run("nil account type should return false", func(t *testing.T) { + var uah *stateMocks.UserAccountStub + require.False(t, ga.HasActiveGuardian(uah)) + }) + t.Run("getConfiguredGuardians with err should return false", func(t *testing.T) { + expectedErr := errors.New("expected error") + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } + require.False(t, ga.HasActiveGuardian(uah)) + }) + t.Run("no guardian should return false", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.False(t, ga.HasActiveGuardian(uah)) + }) + t.Run("one pending guardian should return false", func(t *testing.T) { + pendingGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch + 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.False(t, ga.HasActiveGuardian(uah)) + }) + t.Run("one active guardian should return true", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.True(t, ga.HasActiveGuardian(uah)) + }) + t.Run("one active guardian and one pending new guardian should return true", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + pendingGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch + 1, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.True(t, ga.HasActiveGuardian(uah)) + }) + t.Run("one active guardian and one disabled (old) guardian should return true", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + oldGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch - 5, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.True(t, ga.HasActiveGuardian(uah)) + }) +} + +func TestGuardedAccount_HasPendingGuardian(t *testing.T) { + currentEpoch := uint32(10) + ga := createGuardedAccountWithEpoch(currentEpoch) + + t.Run("nil account type should return false", func(t *testing.T) { + var uah *stateMocks.UserAccountStub + require.False(t, ga.HasPendingGuardian(uah)) + }) + t.Run("getConfiguredGuardians with err should return false", func(t *testing.T) { + expectedErr := errors.New("expected error") + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } + require.False(t, ga.HasPendingGuardian(uah)) + }) + t.Run("no guardian should return false", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.False(t, ga.HasPendingGuardian(uah)) + }) + t.Run("one pending guardian should return true", func(t *testing.T) { + pendingGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch + 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.True(t, ga.HasPendingGuardian(uah)) + }) + t.Run("one active guardian should return false", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.False(t, ga.HasPendingGuardian(uah)) + }) + t.Run("one active guardian and one pending new guardian should return true", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + pendingGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch + 1, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.True(t, ga.HasPendingGuardian(uah)) + }) + t.Run("one active guardian and one disabled (old) guardian should return false", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + oldGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch - 5, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} + uah := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + + require.False(t, ga.HasPendingGuardian(uah)) + }) +} + func TestGuardedAccount_EpochConfirmed(t *testing.T) { ga := createGuardedAccountWithEpoch(0) ga.EpochConfirmed(1, 0) @@ -628,7 +817,7 @@ func TestGuardedAccount_EpochConfirmed(t *testing.T) { require.Equal(t, uint32(111), ga.currentEpoch) } -func TestAccountGuardianChecker_IsInterfaceNil(t *testing.T) { +func TestGuardedAccount_IsInterfaceNil(t *testing.T) { var gah process.GuardedAccountHandler require.True(t, check.IfNil(gah)) diff --git a/testscommon/state/userAccountStub.go b/testscommon/state/userAccountStub.go index f94eb5e08cb..c008917fedb 100644 --- a/testscommon/state/userAccountStub.go +++ b/testscommon/state/userAccountStub.go @@ -167,7 +167,7 @@ func (u *UserAccountStub) IsFrozen() bool { // IsInterfaceNil - func (u *UserAccountStub) IsInterfaceNil() bool { - return false + return u == nil } // AccountDataHandler - From 4b30bf649f58cd2bbccd2bbab1155a60e8c7042b Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 22 Jun 2022 12:17:33 +0300 Subject: [PATCH 064/335] process: add nil check and unit test getPendingGuardian --- process/guardian/guardedAccount.go | 4 ++ process/guardian/guardedAccount_test.go | 66 +++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 165827379f7..1c5f3a57c84 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -274,6 +274,10 @@ func (agc *guardedAccount) getActiveGuardian(gs *guardians.Guardians) (*guardian } func (agc *guardedAccount) getPendingGuardian(gs *guardians.Guardians) (*guardians.Guardian, error) { + if gs == nil { + return nil, process.ErrAccountHasNoPendingGuardian + } + agc.mutEpoch.RLock() defer agc.mutEpoch.RUnlock() diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index e6ac59c9e24..eef7c8efb5a 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -539,6 +539,72 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { }) } +func TestGuardedAccount_getPendingGuardian(t *testing.T){ + currentEpoch := uint32(10) + ga := createGuardedAccountWithEpoch(currentEpoch) + + t.Run("nil guardians/empty guardians should err", func(t *testing.T) { + pendingGuardian, err := ga.getPendingGuardian(nil) + require.Nil(t, pendingGuardian) + require.Equal(t, process.ErrAccountHasNoPendingGuardian, err) + + configuredGuardians := &guardians.Guardians{} + pendingGuardian, err = ga.getPendingGuardian(configuredGuardians) + require.Nil(t, pendingGuardian) + require.Equal(t, process.ErrAccountHasNoPendingGuardian, err) + }) + t.Run("one pending guardian should return it", func(t *testing.T) { + pendingGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch + 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} + pGuardian, err := ga.getPendingGuardian(configuredGuardians) + require.Nil(t, err) + require.Equal(t, pendingGuardian, pGuardian) + }) + t.Run("one active guardian should err", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} + guardian, err := ga.getPendingGuardian(configuredGuardians) + require.Nil(t,guardian) + require.Equal(t, process.ErrAccountHasNoPendingGuardian, err) + }) + t.Run("one active guardian and one pending new guardian", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + pendingGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch + 1, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} + guardian, err := ga.getPendingGuardian(configuredGuardians) + require.Equal(t, pendingGuardian, guardian) + require.Nil(t, err) + }) + t.Run("one active guardian and one disabled (old) guardian should err", func(t *testing.T) { + activeGuardian := &guardians.Guardian{ + Address: []byte("guardian address"), + ActivationEpoch: currentEpoch - 1, + } + oldGuardian := &guardians.Guardian{ + Address: []byte("pending guardian address"), + ActivationEpoch: currentEpoch - 5, + } + + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} + guardian, err := ga.getPendingGuardian(configuredGuardians) + require.Nil(t, guardian) + require.Equal(t, process.ErrAccountHasNoPendingGuardian, err) + }) +} + func TestGuardedAccount_SetGuardian(t *testing.T) { currentEpoch := uint32(10) ga := createGuardedAccountWithEpoch(currentEpoch) From c1c5ec26ebb6e7a47e275eaa3bae143939097b4f Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 22 Jun 2022 13:29:15 +0300 Subject: [PATCH 065/335] process: setGuardian max gas price unit tests --- process/transaction/export_test.go | 4 + process/transaction/interceptedTransaction.go | 2 +- .../interceptedTransaction_test.go | 172 ++++++++++++++++-- process/transaction/metaProcess_test.go | 12 +- process/transaction/shardProcess_test.go | 12 +- 5 files changed, 173 insertions(+), 29 deletions(-) diff --git a/process/transaction/export_test.go b/process/transaction/export_test.go index b56ebdb4500..9dfb9df24a6 100644 --- a/process/transaction/export_test.go +++ b/process/transaction/export_test.go @@ -86,3 +86,7 @@ func (txProc *txProcessor) ExecuteFailedRelayedTransaction( func (txProc *metaTxProcessor) SetValueFlagMetaBuiltIn(set bool) { txProc.flagBuiltInFunction.SetValue(set) } + +func (inTx *InterceptedTransaction) CheckMaxGasPrice() error { + return inTx.checkMaxGasPrice() +} diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index 84ff6ae420b..c0a3477b39f 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -339,7 +339,7 @@ func (inTx *InterceptedTransaction) checkMaxGasPrice() error { } txData := tx.GetData() - if !process.IsBuiltinFuncCallWithParam(txData, core.BuiltInFunctionSetGuardian) { + if !process.IsSetGuardianCall(txData) { return nil } diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index fdf42dadf38..4bd09bbc678 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -37,7 +37,7 @@ var recvAddress = []byte("23456789012345678901234567890123") var sigBad = []byte("bad-signature") var sigOk = []byte("signature") -func createMockPubkeyConverter() *mock.PubkeyConverterMock { +func createMockPubKeyConverter() *mock.PubkeyConverterMock { return mock.NewPubkeyConverterMock(32) } @@ -72,6 +72,49 @@ func createFreeTxFeeHandler() *economicsmocks.EconomicsHandlerStub { } } +func createInterceptedTxWithTxFeeHandlerAndVersionChecker(tx *dataTransaction.Transaction, txFeeHandler process.FeeHandler, txVerChecker *testscommon.TxVersionCheckerStub) (*transaction.InterceptedTransaction, error) { + marshaller := &testscommon.MarshalizerMock{} + txBuff, err := marshaller.Marshal(tx) + if err != nil { + return nil, err + } + + shardCoordinator := mock.NewMultipleShardsCoordinatorMock() + shardCoordinator.CurrentShard = 6 + shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { + if bytes.Equal(address, senderAddress) { + return senderShard + } + if bytes.Equal(address, recvAddress) { + return recvShard + } + + return shardCoordinator.CurrentShard + } + + return transaction.NewInterceptedTransaction( + txBuff, + marshaller, + marshaller, + &hashingMocks.HasherMock{}, + createKeyGenMock(), + createDummySigner(), + &mock.PubkeyConverterStub{ + LenCalled: func() int { + return 32 + }, + }, + shardCoordinator, + txFeeHandler, + &testscommon.WhiteListHandlerStub{}, + &mock.ArgumentParserMock{}, + []byte("T"), + false, + &hashingMocks.HasherMock{}, + txVerChecker, + ) +} + func createInterceptedTxFromPlainTx(tx *dataTransaction.Transaction, txFeeHandler process.FeeHandler, chainID []byte, minTxVersion uint32) (*transaction.InterceptedTransaction, error) { marshalizer := &mock.MarshalizerMock{} txBuff, err := marshalizer.Marshal(tx) @@ -170,7 +213,7 @@ func TestNewInterceptedTransaction_NilBufferShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -195,7 +238,7 @@ func TestNewInterceptedTransaction_NilArgsParser(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -220,7 +263,7 @@ func TestNewInterceptedTransaction_NilVersionChecker(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -245,7 +288,7 @@ func TestNewInterceptedTransaction_NilMarshalizerShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -270,7 +313,7 @@ func TestNewInterceptedTransaction_NilSignMarshalizerShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -295,7 +338,7 @@ func TestNewInterceptedTransaction_NilHasherShouldErr(t *testing.T) { nil, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -320,7 +363,7 @@ func TestNewInterceptedTransaction_NilKeyGenShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, nil, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -345,7 +388,7 @@ func TestNewInterceptedTransaction_NilSignerShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, nil, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -395,7 +438,7 @@ func TestNewInterceptedTransaction_NilCoordinatorShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), nil, &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -420,7 +463,7 @@ func TestNewInterceptedTransaction_NilFeeHandlerShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), nil, &testscommon.WhiteListHandlerStub{}, @@ -445,7 +488,7 @@ func TestNewInterceptedTransaction_NilWhiteListerVerifiedTxsShouldErr(t *testing &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, nil, @@ -470,7 +513,7 @@ func TestNewInterceptedTransaction_InvalidChainIDShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -495,7 +538,7 @@ func TestNewInterceptedTransaction_NilTxSignHasherShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -526,7 +569,7 @@ func TestNewInterceptedTransaction_UnmarshalingTxFailsShouldErr(t *testing.T) { &hashingMocks.HasherMock{}, &mock.SingleSignKeyGenMock{}, &mock.SignerMock{}, - createMockPubkeyConverter(), + createMockPubKeyConverter(), mock.NewOneShardCoordinatorMock(), &economicsmocks.EconomicsHandlerStub{}, &testscommon.WhiteListHandlerStub{}, @@ -1011,7 +1054,7 @@ func TestInterceptedTransaction_CheckValiditySignedWithHashButNotEnabled(t *test assert.Equal(t, process.ErrTransactionSignedWithHashIsNotEnabled, err) } -func TestInterceptedTransaction_CheckValiditySignedWithHashShoudWork(t *testing.T) { +func TestInterceptedTransaction_CheckValiditySignedWithHashShouldWork(t *testing.T) { t.Parallel() minTxVersion := uint32(1) @@ -1632,3 +1675,100 @@ func TestInterceptedTransaction_String(t *testing.T) { assert.Equal(t, expectedFormat, txin.String()) } + +func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { + maxAllowedGasPriceSetGuardian := uint64(2000000) + feeHandler := &economicsmocks.EconomicsHandlerStub{ + MaxGasPriceSetGuardianCalled: func() uint64 { + return maxAllowedGasPriceSetGuardian + }, + } + setGuardianBuiltinCallData := []byte("SetGuardian@xxxx") + tx1 := &dataTransaction.Transaction{ + GasPrice: maxAllowedGasPriceSetGuardian / 2, + Data: setGuardianBuiltinCallData, + } + tx2 := &dataTransaction.Transaction{ + GasPrice: maxAllowedGasPriceSetGuardian * 2, + Data: setGuardianBuiltinCallData, + } + + t.Run("guardedTx returns always OK no matter the gas price", func(t *testing.T) { + txVersionChecker := &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *dataTransaction.Transaction) bool { + return true + }, + } + inTx1, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(tx1, feeHandler, txVersionChecker) + require.Nil(t, err) + inTx2, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(tx2, feeHandler, txVersionChecker) + require.Nil(t, err) + + errMaxGasPrice := inTx1.CheckMaxGasPrice() + require.Nil(t, errMaxGasPrice) + + errMaxGasPrice = inTx2.CheckMaxGasPrice() + require.Nil(t, errMaxGasPrice) + }) + t.Run("not guarded Tx, not setGuardian always OK, ", func(t *testing.T) { + tx1 := *tx1 + tx1.Data = []byte("dummy") + tx2 := *tx2 + tx2.Data = []byte("dummy") + + txVersionChecker := &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *dataTransaction.Transaction) bool { + return false + }, + } + + inTx1, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx1, feeHandler, txVersionChecker) + require.Nil(t, err) + inTx2, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx2, feeHandler, txVersionChecker) + require.Nil(t, err) + + errMaxGasPrice := inTx1.CheckMaxGasPrice() + require.Nil(t, errMaxGasPrice) + + errMaxGasPrice = inTx2.CheckMaxGasPrice() + require.Nil(t, errMaxGasPrice) + }) + t.Run("not guarded Tx with setGuardian call and price lower than max or equal OK", func(t *testing.T) { + tx1 := *tx1 + tx1.GasPrice = maxAllowedGasPriceSetGuardian + tx2 := *tx2 + tx2.GasPrice = maxAllowedGasPriceSetGuardian / 2 + + txVersionChecker := &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *dataTransaction.Transaction) bool { + return false + }, + } + + inTx1, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx1, feeHandler, txVersionChecker) + require.Nil(t, err) + inTx2, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx2, feeHandler, txVersionChecker) + require.Nil(t, err) + + errMaxGasPrice := inTx1.CheckMaxGasPrice() + require.Nil(t, errMaxGasPrice) + + errMaxGasPrice = inTx2.CheckMaxGasPrice() + require.Nil(t, errMaxGasPrice) + }) + t.Run("not guarded Tx with setGuardian call and price higher than max err", func(t *testing.T) { + tx1 := *tx1 + tx1.GasPrice = maxAllowedGasPriceSetGuardian * 2 + txVersionChecker := &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *dataTransaction.Transaction) bool { + return false + }, + } + + inTx1, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx1, feeHandler, txVersionChecker) + require.Nil(t, err) + + errMaxGasPrice := inTx1.CheckMaxGasPrice() + require.Equal(t, process.ErrGasPriceTooHigh, errMaxGasPrice) + }) +} diff --git a/process/transaction/metaProcess_test.go b/process/transaction/metaProcess_test.go index 4945c4797d0..41ebdf5dce4 100644 --- a/process/transaction/metaProcess_test.go +++ b/process/transaction/metaProcess_test.go @@ -28,7 +28,7 @@ func createMockNewMetaTxArgs() txproc.ArgsNewMetaTxProcessor { Hasher: &hashingMocks.HasherMock{}, Marshalizer: &mock.MarshalizerMock{}, Accounts: &stateMock.AccountsStub{}, - PubkeyConv: createMockPubkeyConverter(), + PubkeyConv: createMockPubKeyConverter(), ShardCoordinator: mock.NewOneShardCoordinatorMock(), ScProcessor: &testscommon.SCProcessorMock{}, TxTypeHandler: &testscommon.TxTypeHandlerMock{}, @@ -220,7 +220,7 @@ func TestMetaTxProcessor_ProcessTransactionScTxShouldWork(t *testing.T) { tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) tx.GasPrice = 1 tx.GasLimit = 1 @@ -271,7 +271,7 @@ func TestMetaTxProcessor_ProcessTransactionScTxShouldReturnErrWhenExecutionFails tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) acntSrc, err := state.NewUserAccount(tx.SndAddr) @@ -321,7 +321,7 @@ func TestMetaTxProcessor_ProcessTransactionScTxShouldNotBeCalledWhenAdrDstIsNotI tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { @@ -359,7 +359,7 @@ func TestMetaTxProcessor_ProcessTransactionScTxShouldNotBeCalledWhenAdrDstIsNotI esdtTransferParser, _ := parsers.NewESDTTransferParser(&mock.MarshalizerMock{}) argsTxTypeHandler := coordinator.ArgNewTxTypeHandler{ - PubkeyConverter: createMockPubkeyConverter(), + PubkeyConverter: createMockPubKeyConverter(), ShardCoordinator: shardCoordinator, BuiltInFunctions: builtInFunctions.NewBuiltInFunctionContainer(), ArgumentParser: parsers.NewCallArgsParser(), @@ -389,7 +389,7 @@ func TestMetaTxProcessor_ProcessTransactionBuiltInCallTxShouldWork(t *testing.T) tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) tx.GasPrice = 1 tx.GasLimit = 1 diff --git a/process/transaction/shardProcess_test.go b/process/transaction/shardProcess_test.go index 971c0564260..3110125e08c 100644 --- a/process/transaction/shardProcess_test.go +++ b/process/transaction/shardProcess_test.go @@ -77,7 +77,7 @@ func createArgsForTxProcessor() txproc.ArgsNewTxProcessor { args := txproc.ArgsNewTxProcessor{ Accounts: &stateMock.AccountsStub{}, Hasher: &hashingMocks.HasherMock{}, - PubkeyConv: createMockPubkeyConverter(), + PubkeyConv: createMockPubKeyConverter(), Marshalizer: &mock.MarshalizerMock{}, SignMarshalizer: &mock.MarshalizerMock{}, ShardCoordinator: mock.NewOneShardCoordinatorMock(), @@ -1054,7 +1054,7 @@ func TestTxProcessor_ProcessTransactionScDeployTxShouldWork(t *testing.T) { tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) tx.GasPrice = 1 tx.GasLimit = 1 @@ -1105,7 +1105,7 @@ func TestTxProcessor_ProcessTransactionBuiltInFunctionCallShouldWork(t *testing. tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) tx.GasPrice = 1 tx.GasLimit = 1 @@ -1156,7 +1156,7 @@ func TestTxProcessor_ProcessTransactionScTxShouldWork(t *testing.T) { tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) tx.GasPrice = 1 tx.GasLimit = 1 @@ -1208,7 +1208,7 @@ func TestTxProcessor_ProcessTransactionScTxShouldReturnErrWhenExecutionFails(t * tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) acntSrc, err := state.NewUserAccount(tx.SndAddr) @@ -1257,7 +1257,7 @@ func TestTxProcessor_ProcessTransactionScTxShouldNotBeCalledWhenAdrDstIsNotInNod tx := transaction.Transaction{} tx.Nonce = 0 tx.SndAddr = []byte("SRC") - tx.RcvAddr = generateRandomByteSlice(createMockPubkeyConverter().Len()) + tx.RcvAddr = generateRandomByteSlice(createMockPubKeyConverter().Len()) tx.Value = big.NewInt(45) shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { From e33509dcd4d116354ca88ac5bbb8468a2a2d1305 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 22 Jun 2022 16:53:10 +0300 Subject: [PATCH 066/335] process: fixes after review --- process/dataValidators/txValidator.go | 2 +- process/errors.go | 2 +- process/guardedtx/guardedTxVerifier_test.go | 1 + process/guardian/guardedAccount_test.go | 12 ++++++++---- process/transaction/interceptedTransaction_test.go | 4 +++- testscommon/guardianMocks/guardianSigVerifierStub.go | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 9710e301349..cd0ac4e9e9e 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -158,7 +158,7 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac // block non guarded setGuardian Txs if there is a pending guardian hasPendingGuardian := txv.guardianSigVerifier.HasPendingGuardian(account) - if process.IsSetGuardianCall(txData) && hasPendingGuardian { + if process.IsSetGuardianCall(txData) && hasPendingGuardian { return process.ErrCannotReplaceFrozenAccountPendingGuardian } } diff --git a/process/errors.go b/process/errors.go index c9b9b524bf5..4b86e1b315d 100644 --- a/process/errors.go +++ b/process/errors.go @@ -528,7 +528,7 @@ var ErrInvalidMinimumGasPrice = errors.New("invalid minimum gas price") // ErrInvalidExtraGasLimitGuardedTx signals that an invalid gas limit has been provided in the config file var ErrInvalidExtraGasLimitGuardedTx = errors.New("invalid extra gas limit for guarded transactions") -// ErrInvalidMaxGasPriceSetGuardian signals that an invalid gas maximum gas price has been provided in the config file +// ErrInvalidMaxGasPriceSetGuardian signals that an invalid maximum gas price has been provided in the config file var ErrInvalidMaxGasPriceSetGuardian = errors.New("invalid maximum gas price for set guardian") // ErrInvalidMinimumGasLimitForTx signals that an invalid minimum gas limit for transactions has been read from config file diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index db4463e4836..08270b3a1a5 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -224,6 +224,7 @@ func signAndGuardTx( } func TestGuardedTxSigVerifier_HasPendingGuardian(t *testing.T) { + t.Parallel() acc := &stateMocks.UserAccountStub{} args := GuardedTxSigVerifierArgs{ diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index eef7c8efb5a..005721b8f8c 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -522,7 +522,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { ActivationEpoch: currentEpoch - 1, } oldGuardian := &guardians.Guardian{ - Address: []byte("pending guardian address"), + Address: []byte("old guardian address"), ActivationEpoch: currentEpoch - 5, } @@ -594,7 +594,7 @@ func TestGuardedAccount_getPendingGuardian(t *testing.T){ ActivationEpoch: currentEpoch - 1, } oldGuardian := &guardians.Guardian{ - Address: []byte("pending guardian address"), + Address: []byte("old guardian address"), ActivationEpoch: currentEpoch - 5, } @@ -685,6 +685,8 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { } func TestGuardedAccount_HasActiveGuardian(t *testing.T) { + t.Parallel() + currentEpoch := uint32(10) ga := createGuardedAccountWithEpoch(currentEpoch) @@ -764,7 +766,7 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { ActivationEpoch: currentEpoch - 1, } oldGuardian := &guardians.Guardian{ - Address: []byte("pending guardian address"), + Address: []byte("old guardian address"), ActivationEpoch: currentEpoch - 5, } @@ -780,6 +782,8 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { } func TestGuardedAccount_HasPendingGuardian(t *testing.T) { + t.Parallel() + currentEpoch := uint32(10) ga := createGuardedAccountWithEpoch(currentEpoch) @@ -859,7 +863,7 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { ActivationEpoch: currentEpoch - 1, } oldGuardian := &guardians.Guardian{ - Address: []byte("pending guardian address"), + Address: []byte("old guardian address"), ActivationEpoch: currentEpoch - 5, } diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index 4bd09bbc678..f923fb25978 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -1677,6 +1677,8 @@ func TestInterceptedTransaction_String(t *testing.T) { } func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { + t.Parallel() + maxAllowedGasPriceSetGuardian := uint64(2000000) feeHandler := &economicsmocks.EconomicsHandlerStub{ MaxGasPriceSetGuardianCalled: func() uint64 { @@ -1710,7 +1712,7 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { errMaxGasPrice = inTx2.CheckMaxGasPrice() require.Nil(t, errMaxGasPrice) }) - t.Run("not guarded Tx, not setGuardian always OK, ", func(t *testing.T) { + t.Run("not guarded Tx, not setGuardian always OK", func(t *testing.T) { tx1 := *tx1 tx1.Data = []byte("dummy") tx2 := *tx2 diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go index 173d92944dc..5c62de8f22b 100644 --- a/testscommon/guardianMocks/guardianSigVerifierStub.go +++ b/testscommon/guardianMocks/guardianSigVerifierStub.go @@ -20,7 +20,7 @@ func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account vmcommon.Us return nil } -// HasPendingGuardian returns true if the given account has a pending guardian +// HasPendingGuardian - func (gsvs *GuardianSigVerifierStub) HasPendingGuardian(uah state.UserAccountHandler) bool { if gsvs.HasPendingGuardianCalled != nil { return gsvs.HasPendingGuardianCalled(uah) From c175fe6f060a8b7a0992677bda25f1161c492ae7 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 24 Jun 2022 18:09:21 +0300 Subject: [PATCH 067/335] process: add method for guardedAccount to clean pending/old if there is an active --- .../disabled/disabledGuardedAccount.go | 3 + process/guardian/guardedAccount.go | 17 +++ process/guardian/guardedAccount_test.go | 128 +++++++++++++++++- process/interface.go | 1 + .../guardianAccountHandlerStub.go | 16 ++- 5 files changed, 159 insertions(+), 6 deletions(-) diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go index ec83ee35d3c..b177e146ece 100644 --- a/process/guardian/disabled/disabledGuardedAccount.go +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -32,6 +32,9 @@ func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ return nil } +// CleanOtherThanActive does nothing as this is a disabled implementation +func (dga *disabledGuardedAccount) CleanOtherThanActive(_ vmcommon.UserAccountHandler) {} + // IsInterfaceNil returns true if there is no value under the interface func (dga *disabledGuardedAccount) IsInterfaceNil() bool { return dga == nil diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 1c5f3a57c84..592b0298613 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -66,6 +66,23 @@ func (agc *guardedAccount) GetActiveGuardian(uah vmcommon.UserAccountHandler) ([ return guardian.Address, nil } +// CleanOtherThanActive cleans the pending guardian or old/disabled guardian, if any +func (agc *guardedAccount) CleanOtherThanActive(uah vmcommon.UserAccountHandler) { + configuredGuardians, err := agc.getVmUserAccountConfiguredGuardian(uah) + if err != nil { + return + } + + activeGuardian, err := agc.getActiveGuardian(configuredGuardians) + if err != nil { + return + } + + configuredGuardians.Slice = []*guardians.Guardian{activeGuardian} + + _ = agc.saveAccountGuardians(uah, configuredGuardians) +} + // HasActiveGuardian returns true if the account has an active guardian configured, false otherwise func (agc *guardedAccount) HasActiveGuardian(uah state.UserAccountHandler) bool { if check.IfNil(uah) { diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 005721b8f8c..0d09be89292 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -539,7 +539,7 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { }) } -func TestGuardedAccount_getPendingGuardian(t *testing.T){ +func TestGuardedAccount_getPendingGuardian(t *testing.T) { currentEpoch := uint32(10) ga := createGuardedAccountWithEpoch(currentEpoch) @@ -570,7 +570,7 @@ func TestGuardedAccount_getPendingGuardian(t *testing.T){ } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} guardian, err := ga.getPendingGuardian(configuredGuardians) - require.Nil(t,guardian) + require.Nil(t, guardian) require.Equal(t, process.ErrAccountHasNoPendingGuardian, err) }) t.Run("one active guardian and one pending new guardian", func(t *testing.T) { @@ -878,6 +878,130 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { }) } +func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { + currentEpoch := uint32(10) + g0 := &guardians.Guardian{ + Address: []byte("old guardian"), + ActivationEpoch: currentEpoch - 4, + } + g1 := &guardians.Guardian{ + Address: []byte("active guardian"), + ActivationEpoch: currentEpoch - 2, + } + g2 := &guardians.Guardian{ + Address: []byte("pending guardian"), + ActivationEpoch: currentEpoch + 2, + } + + + t.Run("no configured guardians does not change the guardians", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} + ga := createGuardedAccountWithEpoch(currentEpoch) + + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Fail(t, "should not save anything") + return nil + }, + } + }, + } + + ga.CleanOtherThanActive(acc) + }) + t.Run("one pending guardian does not change the guardians", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g2}} + ga := createGuardedAccountWithEpoch(currentEpoch) + + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Fail(t, "should not save anything") + return nil + }, + } + }, + } + + ga.CleanOtherThanActive(acc) + }) + t.Run("one active guardian should set again the active", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + ga := createGuardedAccountWithEpoch(currentEpoch) + + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Equal(t, guardianKey, key) + expectedMarshalledGuardians, _ := ga.marshaller.Marshal(configuredGuardians) + require.Equal(t, expectedMarshalledGuardians, value) + return nil + }, + } + }, + } + + ga.CleanOtherThanActive(acc) + }) + t.Run("one active and one pending should set again the active (effect is cleaning the pending)", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1, g2}} + ga := createGuardedAccountWithEpoch(currentEpoch) + + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Equal(t, guardianKey, key) + expectedMarshalledGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{g1}}) + require.Equal(t, expectedMarshalledGuardians, value) + return nil + }, + } + }, + } + + ga.CleanOtherThanActive(acc) + }) + t.Run("one active and one disabled should set again the active (effect is cleaning the disabled)", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g0, g1}} + ga := createGuardedAccountWithEpoch(currentEpoch) + + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + require.Equal(t, guardianKey, key) + expectedMarshalledGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{g1}}) + require.Equal(t, expectedMarshalledGuardians, value) + return nil + }, + } + }, + } + + ga.CleanOtherThanActive(acc) + }) +} + func TestGuardedAccount_EpochConfirmed(t *testing.T) { ga := createGuardedAccountWithEpoch(0) ga.EpochConfirmed(1, 0) diff --git a/process/interface.go b/process/interface.go index f0b4b787ba4..1f94b9c9730 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1227,6 +1227,7 @@ type GuardedAccountHandler interface { HasActiveGuardian(uah state.UserAccountHandler) bool HasPendingGuardian(uah state.UserAccountHandler) bool SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error + CleanOtherThanActive(uah vmcommon.UserAccountHandler) IsInterfaceNil() bool } diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go index bdc572aa102..2d96453eb1c 100644 --- a/testscommon/guardianMocks/guardianAccountHandlerStub.go +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -7,10 +7,11 @@ import ( // GuardedAccountHandlerStub - type GuardedAccountHandlerStub struct { - GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) - SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error - HasPendingGuardianCalled func(uah state.UserAccountHandler) bool - HasActiveGuardianCalled func(uah state.UserAccountHandler) bool + GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) + SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error + HasPendingGuardianCalled func(uah state.UserAccountHandler) bool + HasActiveGuardianCalled func(uah state.UserAccountHandler) bool + CleanOtherThanActiveCalled func(uah vmcommon.UserAccountHandler) } // GetActiveGuardian - @@ -45,6 +46,13 @@ func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandl return nil } +// CleanOtherThanActive - +func (gahs *GuardedAccountHandlerStub) CleanOtherThanActive(uah vmcommon.UserAccountHandler) { + if gahs.CleanOtherThanActiveCalled != nil { + gahs.CleanOtherThanActiveCalled(uah) + } +} + // IsInterfaceNil - func (gahs *GuardedAccountHandlerStub) IsInterfaceNil() bool { return gahs == nil From d7246ea469267f7b9d6579485db6be997e5568b7 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 24 Jun 2022 18:22:25 +0300 Subject: [PATCH 068/335] gomod: reference correct vmcommon --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8e4f6edf471..2caf330bde0 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.6 - github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220523152821-4a1f295414c2 + github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220624151918-f1dfae5757bc github.com/ElrondNetwork/notifier-go v1.0.3 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta diff --git a/go.sum b/go.sum index 180c345c10b..60b959a1d36 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,8 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.6/go.mod h1:cBfgx0ST/CJx8jrxJSC5a github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220216133549-5b9bf359281c/go.mod h1:XQoxE2MmrhVpyBMghK3fWvnRAw/iirc0KPtbKAOEPBM= -github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220523152821-4a1f295414c2 h1:Ocemk7ZBNqysUHCpcfTSo8jCmmLq4vKDjmDIwRMJSM4= -github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220523152821-4a1f295414c2/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220624151918-f1dfae5757bc h1:EInnyrqAWPgs0PfPx3I2z9rgthjc/Z9Qo5qrPKrbHAs= +github.com/ElrondNetwork/elrond-vm-common v1.3.3-0.20220624151918-f1dfae5757bc/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= github.com/ElrondNetwork/notifier-go v1.0.3 h1:LhecyXqKuc/Q4NtIOlb9rw4hfMSj6usmxvYQWvb7Pn4= github.com/ElrondNetwork/notifier-go v1.0.3/go.mod h1:GOv7j2o90e/GVmmBddWwyfJZ/JW4V4pvyXIpukd6FfY= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= From 7770fe260a51a5b541c5df93ccd80e207340c7e5 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 27 Jun 2022 13:33:35 +0300 Subject: [PATCH 069/335] process: fixes after review --- process/guardian/guardedAccount.go | 6 +++--- process/guardian/guardedAccount_test.go | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 592b0298613..2d28d41b390 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -75,11 +75,11 @@ func (agc *guardedAccount) CleanOtherThanActive(uah vmcommon.UserAccountHandler) activeGuardian, err := agc.getActiveGuardian(configuredGuardians) if err != nil { - return + configuredGuardians.Slice = []*guardians.Guardian{} + } else { + configuredGuardians.Slice = []*guardians.Guardian{activeGuardian} } - configuredGuardians.Slice = []*guardians.Guardian{activeGuardian} - _ = agc.saveAccountGuardians(uah, configuredGuardians) } diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 0d09be89292..b2cb1312331 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -879,6 +879,8 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { } func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { + t.Parallel() + currentEpoch := uint32(10) g0 := &guardians.Guardian{ Address: []byte("old guardian"), @@ -893,7 +895,6 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { ActivationEpoch: currentEpoch + 2, } - t.Run("no configured guardians does not change the guardians", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} ga := createGuardedAccountWithEpoch(currentEpoch) @@ -914,9 +915,11 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { ga.CleanOtherThanActive(acc) }) - t.Run("one pending guardian does not change the guardians", func(t *testing.T) { + t.Run("one pending guardian should clean the pending", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g2}} ga := createGuardedAccountWithEpoch(currentEpoch) + expectedConfig := &guardians.Guardians{Slice: []*guardians.Guardian{}} + expectedValue, _ := ga.marshaller.Marshal(expectedConfig) acc := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { @@ -925,7 +928,8 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ SaveKeyValueCalled: func(key []byte, value []byte) error { - require.Fail(t, "should not save anything") + require.Equal(t, guardianKey, key) + require.Equal(t, value, expectedValue) return nil }, } From 0f3c680e8166c49a1676a7028ca441c3c36ce65a Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 12 Aug 2022 15:18:05 +0300 Subject: [PATCH 070/335] process, cmd: don't return error if no guardian set, adapt freeze account config --- cmd/node/config/config.toml | 2 +- cmd/node/config/enableEpochs.toml | 2 +- process/guardian/guardedAccount.go | 5 +---- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index 2093531f50c..cc052894997 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -34,7 +34,7 @@ # SetGuardianEpochsDelay represents the delay in epochs between the execution time of the SetGuardian transaction and # the activation of the configured guardian. # Make sure that this is greater than the unbonding period! - SetGuardianEpochsDelay = 20 + SetGuardianEpochsDelay = 2 # for mainnet should be 20, 2 is just for testing [Versions] DefaultVersion = "default" diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 8844fbac69b..094706c9c23 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -209,7 +209,7 @@ CheckExecuteOnReadOnlyEnableEpoch = 4 # FreezeAccountFeatureEnableEpoch represents the epoch when the freeze account feature is enabled in the protocol - FreezeAccountFeatureEnableEpoch = 10 + FreezeAccountFeatureEnableEpoch = 1 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 2d28d41b390..3bb95cf4762 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -244,10 +244,7 @@ func (agc *guardedAccount) saveAccountGuardians(account vmcommon.UserAccountHand func (agc *guardedAccount) getConfiguredGuardians(uah state.UserAccountHandler) (*guardians.Guardians, error) { guardiansMarshalled, err := uah.RetrieveValueFromDataTrieTracker(guardianKey) - if err != nil { - return nil, err - } - if len(guardiansMarshalled) == 0 { + if err != nil || len(guardiansMarshalled) == 0 { return &guardians.Guardians{Slice: make([]*guardians.Guardian, 0)}, nil } From b0385406cfec5d9238c7a4462f8f5c2109b19dae Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 18 Aug 2022 16:07:49 +0300 Subject: [PATCH 071/335] use json marshaller for guardian tx signature verification instead of gogo proto --- factory/bootstrapComponents.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factory/bootstrapComponents.go b/factory/bootstrapComponents.go index 746c0bb3f07..1495f1c436e 100644 --- a/factory/bootstrapComponents.go +++ b/factory/bootstrapComponents.go @@ -275,7 +275,7 @@ func (bcf *bootstrapComponentsFactory) newGuardianSigVerifier(guardedAccountHand SigVerifier: bcf.cryptoComponents.TxSingleSigner(), GuardianChecker: guardedAccountHandler, PubKeyConverter: bcf.coreComponents.AddressPubKeyConverter(), - Marshaller: bcf.coreComponents.InternalMarshalizer(), + Marshaller: bcf.coreComponents.TxMarshalizer(), KeyGen: bcf.cryptoComponents.TxSignKeyGen(), } From 37907be038e7c1f38e0afc69b4f05a130d03b046 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 18 Aug 2022 18:52:41 +0300 Subject: [PATCH 072/335] cmd, process: extract common functionality and fix unit tests --- process/guardedtx/guardedTxVerifier.go | 7 +++- process/guardedtx/guardedTxVerifier_test.go | 22 +++++++---- process/guardian/guardedAccount_test.go | 39 +++++-------------- process/interface.go | 6 +++ process/mock/interceptedTxHandlerStub.go | 21 +++++++--- process/transaction/interceptedTransaction.go | 22 +++++++++-- .../interceptedTxMocks/interceptedTxStub.go | 21 +++++++--- 7 files changed, 84 insertions(+), 54 deletions(-) diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index 0d535de628c..0ed66fce3f4 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -71,7 +71,12 @@ func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAc return process.ErrWrongTypeAssertion } - msgForSigVerification, err := guardedTxHandler.GetDataForSigning(gtx.encoder, gtx.marshaller) + inSignedTx, ok := inTx.(process.InterceptedSignedTransactionHandler) + if !ok { + return process.ErrWrongTypeAssertion + } + + msgForSigVerification, err := inSignedTx.GetTxMessageForSignatureVerification() if err != nil { return err } diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 08270b3a1a5..50e51ae305b 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -189,6 +189,10 @@ func createSignedInterceptedTx( TransactionCalled: func() data.TransactionHandler { return &txCopy }, + GetTxMessageForSignatureVerificationCalled: func() ([]byte, error) { + ftx := GetFrontEndTransaction(tx, converter) + return marshaller.Marshal(ftx) + }, } } @@ -200,11 +204,20 @@ func signAndGuardTx( converter core.PubkeyConverter, marshaller data.Marshaller, ) ([]byte, []byte) { + ftx := GetFrontEndTransaction(tx, converter) + buff, _ := marshaller.Marshal(ftx) + signature, _ := signer.Sign(sk, buff) + guardianSignature, _ := signer.Sign(skGuardian, buff) + + return signature, guardianSignature +} + +func GetFrontEndTransaction(tx *txStruct.Transaction, converter core.PubkeyConverter) *txStruct.FrontendTransaction { ftx := &txStruct.FrontendTransaction{ Nonce: tx.Nonce, Value: tx.Value.String(), Receiver: converter.Encode(tx.RcvAddr), - Sender: converter.Encode(tx.RcvAddr), + Sender: converter.Encode(tx.SndAddr), SenderUsername: nil, ReceiverUsername: nil, GasPrice: tx.GasPrice, @@ -215,12 +228,7 @@ func signAndGuardTx( Version: tx.Version, GuardianSignature: "", } - - buff, _ := marshaller.Marshal(ftx) - signature, _ := signer.Sign(sk, buff) - guardianSignature, _ := signer.Sign(skGuardian, buff) - - return signature, guardianSignature + return ftx } func TestGuardedTxSigVerifier_HasPendingGuardian(t *testing.T) { diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index b2cb1312331..2d1b7d158ba 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -100,7 +100,7 @@ func TestGuardedAccount_getActiveGuardian(t *testing.T) { func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { ga := createGuardedAccountWithEpoch(10) - t.Run("guardians key not found should err", func(t *testing.T) { + t.Run("guardians key not found should return empty", func(t *testing.T) { t.Parallel() expectedErr := errors.New("expected error") @@ -111,8 +111,9 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { } configuredGuardians, err := ga.getConfiguredGuardians(acc) - require.Nil(t, configuredGuardians) - require.Equal(t, expectedErr, err) + require.Nil(t, err) + require.NotNil(t, configuredGuardians) + require.True(t, len(configuredGuardians.Slice) == 0) }) t.Run("key found but no guardians, should return empty", func(t *testing.T) { t.Parallel() @@ -292,17 +293,6 @@ func TestGuardedAccount_setAccountGuardian(t *testing.T) { ActivationEpoch: 20, } - t.Run("getConfiguredGuardians with err", func(t *testing.T) { - expectedErr := errors.New("expected error") - ua := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr - }, - } - - err := ga.setAccountGuardian(ua, newGuardian) - require.Equal(t, expectedErr, err) - }) t.Run("if updateGuardians returns err, the err should be propagated", func(t *testing.T) { existingGuardian := &guardians.Guardian{ Address: []byte("guardian address"), @@ -358,17 +348,6 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { } txGuardianAddress := []byte("guardian address") - t.Run("getConfiguredGuardians with err", func(t *testing.T) { - expectedErr := errors.New("expected error") - ua := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr - }, - } - - err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) - require.Equal(t, expectedErr, err) - }) t.Run("getActiveGuardianErr with err (no active guardian) should error", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} @@ -440,16 +419,16 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { require.Nil(t, activeGuardian) require.Equal(t, process.ErrWrongTypeAssertion, err) }) - t.Run("getConfiguredGuardians with err should propagate the err", func(t *testing.T) { - expectedErr := errors.New("expected error") + t.Run("getConfiguredGuardians with err should err - no active", func(t *testing.T) { + dataTrieErr := errors.New("expected error") uah := &stateMocks.UserAccountStub{ RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr + return nil, dataTrieErr }, } activeGuardian, err := ga.GetActiveGuardian(uah) require.Nil(t, activeGuardian) - require.Equal(t, expectedErr, err) + require.Equal(t, process.ErrAccountHasNoGuardianSet, err) }) t.Run("no guardian should return err", func(t *testing.T) { configuredGuardians := &guardians.Guardians{} @@ -882,7 +861,7 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { t.Parallel() currentEpoch := uint32(10) - g0 := &guardians.Guardian{ + g0 := &guardians.Guardian{ Address: []byte("old guardian"), ActivationEpoch: currentEpoch - 4, } diff --git a/process/interface.go b/process/interface.go index ebd604b3dfa..68b8aed8775 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1213,6 +1213,12 @@ type ShardedPool interface { AddData(key []byte, data interface{}, sizeInBytes int, cacheID string) } +// InterceptedSignedTransactionHandler provides additional handling for signed transactions +type InterceptedSignedTransactionHandler interface { + InterceptedTransactionHandler + GetTxMessageForSignatureVerification() ([]byte, error) +} + // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx InterceptedTransactionHandler) error diff --git a/process/mock/interceptedTxHandlerStub.go b/process/mock/interceptedTxHandlerStub.go index a4d528cbc39..140821db595 100644 --- a/process/mock/interceptedTxHandlerStub.go +++ b/process/mock/interceptedTxHandlerStub.go @@ -8,12 +8,13 @@ import ( // InterceptedTxHandlerStub - type InterceptedTxHandlerStub struct { - SenderShardIdCalled func() uint32 - ReceiverShardIdCalled func() uint32 - NonceCalled func() uint64 - SenderAddressCalled func() []byte - FeeCalled func() *big.Int - TransactionCalled func() data.TransactionHandler + SenderShardIdCalled func() uint32 + ReceiverShardIdCalled func() uint32 + NonceCalled func() uint64 + SenderAddressCalled func() []byte + FeeCalled func() *big.Int + TransactionCalled func() data.TransactionHandler + GetTxMessageForSignatureVerificationCalled func() ([]byte, error) } // SenderShardId - @@ -63,3 +64,11 @@ func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { } return nil } + +// GetTxMessageForSignatureVerification - +func (iths *InterceptedTxHandlerStub) GetTxMessageForSignatureVerification() ([]byte, error) { + if iths.GetTxMessageForSignatureVerificationCalled != nil { + return iths.GetTxMessageForSignatureVerificationCalled() + } + return nil, nil +} diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index c0a3477b39f..cb706e96a32 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -352,7 +352,7 @@ func (inTx *InterceptedTransaction) checkMaxGasPrice() error { // verifySig checks if the tx is correctly signed func (inTx *InterceptedTransaction) verifySig(tx *transaction.Transaction) error { - buffCopiedTx, err := tx.GetDataForSigning(inTx.pubkeyConv, inTx.signMarshalizer) + txMessageForSigVerification, err := inTx.getTxMessageForGivenTx(tx) if err != nil { return err } @@ -362,17 +362,31 @@ func (inTx *InterceptedTransaction) verifySig(tx *transaction.Transaction) error return err } + return inTx.singleSigner.Verify(senderPubKey, txMessageForSigVerification, tx.Signature) +} + +func (inTx *InterceptedTransaction) getTxMessageForGivenTx(tx *transaction.Transaction) ([]byte, error) { + buffCopiedTx, err := tx.GetDataForSigning(inTx.pubkeyConv, inTx.signMarshalizer) + if err != nil { + return nil, err + } + if !inTx.txVersionChecker.IsSignedWithHash(tx) { - return inTx.singleSigner.Verify(senderPubKey, buffCopiedTx, tx.Signature) + return buffCopiedTx, nil } if !inTx.enableSignedTxWithHash { - return process.ErrTransactionSignedWithHashIsNotEnabled + return nil, process.ErrTransactionSignedWithHashIsNotEnabled } txHash := inTx.txSignHasher.Compute(string(buffCopiedTx)) - return inTx.singleSigner.Verify(senderPubKey, txHash, tx.Signature) + return txHash, nil +} + +// GetTxMessageForSignatureVerification returns the transaction data that the signature needs to be verified on +func (inTx *InterceptedTransaction) GetTxMessageForSignatureVerification() ([]byte, error) { + return inTx.getTxMessageForGivenTx(inTx.tx) } // ReceiverShardId returns the receiver shard id diff --git a/testscommon/interceptedTxMocks/interceptedTxStub.go b/testscommon/interceptedTxMocks/interceptedTxStub.go index 3ae689033fa..ce455dee825 100644 --- a/testscommon/interceptedTxMocks/interceptedTxStub.go +++ b/testscommon/interceptedTxMocks/interceptedTxStub.go @@ -8,12 +8,13 @@ import ( // InterceptedTxHandlerStub - type InterceptedTxHandlerStub struct { - SenderShardIdCalled func() uint32 - ReceiverShardIdCalled func() uint32 - NonceCalled func() uint64 - SenderAddressCalled func() []byte - FeeCalled func() *big.Int - TransactionCalled func() data.TransactionHandler + SenderShardIdCalled func() uint32 + ReceiverShardIdCalled func() uint32 + NonceCalled func() uint64 + SenderAddressCalled func() []byte + FeeCalled func() *big.Int + TransactionCalled func() data.TransactionHandler + GetTxMessageForSignatureVerificationCalled func() ([]byte, error) } // SenderShardId - @@ -63,3 +64,11 @@ func (iths *InterceptedTxHandlerStub) Transaction() data.TransactionHandler { } return nil } + +// GetTxMessageForSignatureVerification - +func (iths *InterceptedTxHandlerStub) GetTxMessageForSignatureVerification() ([]byte, error) { + if iths.GetTxMessageForSignatureVerificationCalled != nil { + return iths.GetTxMessageForSignatureVerificationCalled() + } + return nil, nil +} From 0ea06e33a3f894fd9e927f6cd47eb8cf2003063a Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 19 Aug 2022 17:10:47 +0300 Subject: [PATCH 073/335] add error wrapper and unit test, changed config flag --- cmd/node/config/config.toml | 2 +- cmd/node/config/enableEpochs.toml | 2 +- process/guardedtx/guardedTxVerifier.go | 4 +- process/guardedtx/guardedTxVerifier_test.go | 16 +++++ .../InterceptedUnsignedTxHandlerStub.go | 65 +++++++++++++++++++ 5 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go diff --git a/cmd/node/config/config.toml b/cmd/node/config/config.toml index cc052894997..8b38cc7a478 100644 --- a/cmd/node/config/config.toml +++ b/cmd/node/config/config.toml @@ -34,7 +34,7 @@ # SetGuardianEpochsDelay represents the delay in epochs between the execution time of the SetGuardian transaction and # the activation of the configured guardian. # Make sure that this is greater than the unbonding period! - SetGuardianEpochsDelay = 2 # for mainnet should be 20, 2 is just for testing + SetGuardianEpochsDelay = 2 # TODO: for mainnet should be 20, 2 is just for testing [Versions] DefaultVersion = "default" diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 094706c9c23..9845b18ab78 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -209,7 +209,7 @@ CheckExecuteOnReadOnlyEnableEpoch = 4 # FreezeAccountFeatureEnableEpoch represents the epoch when the freeze account feature is enabled in the protocol - FreezeAccountFeatureEnableEpoch = 1 + FreezeAccountFeatureEnableEpoch = 2 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index 0ed66fce3f4..e0b15d06c4f 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -1,6 +1,8 @@ package guardedtx import ( + "fmt" + "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" @@ -73,7 +75,7 @@ func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAc inSignedTx, ok := inTx.(process.InterceptedSignedTransactionHandler) if !ok { - return process.ErrWrongTypeAssertion + return fmt.Errorf("%w to InterceptedSignedTransactionHandler", process.ErrWrongTypeAssertion) } msgForSigVerification, err := inSignedTx.GetTxMessageForSignatureVerification() diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 50e51ae305b..c12828d2525 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -2,6 +2,7 @@ package guardedtx import ( "math/big" + "strings" "testing" "github.com/ElrondNetwork/elrond-go-core/core" @@ -143,6 +144,21 @@ func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx) require.Nil(t, err) }) + t.Run("wrong type assertion intercepted signed tx", func(t *testing.T) { + inTxChanged := &interceptedTxMocks.InterceptedUnsignedTxHandlerStub{ + TransactionCalled: func() data.TransactionHandler { + txCopy := *tx + return &txCopy + }, + } + + gtxSigVerifier, err := NewGuardedTxSigVerifier(args) + require.Nil(t, err) + + err = gtxSigVerifier.VerifyGuardianSignature(acc, inTxChanged) + require.NotNil(t, err) + require.True(t, strings.Contains(err.Error(), "InterceptedSignedTransactionHandler")) + }) t.Run("invalid guardian signature", func(t *testing.T) { gtxSigVerifier, err := NewGuardedTxSigVerifier(args) require.Nil(t, err) diff --git a/testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go b/testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go new file mode 100644 index 00000000000..d17f35c1741 --- /dev/null +++ b/testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go @@ -0,0 +1,65 @@ +package interceptedTxMocks + +import ( + "math/big" + + "github.com/ElrondNetwork/elrond-go-core/data" +) + +// InterceptedUnsignedTxHandlerStub - +type InterceptedUnsignedTxHandlerStub struct { + SenderShardIdCalled func() uint32 + ReceiverShardIdCalled func() uint32 + NonceCalled func() uint64 + SenderAddressCalled func() []byte + FeeCalled func() *big.Int + TransactionCalled func() data.TransactionHandler +} + +// SenderShardId - +func (iths *InterceptedUnsignedTxHandlerStub) SenderShardId() uint32 { + if iths.SenderShardIdCalled != nil { + return iths.SenderShardIdCalled() + } + return 0 +} + +// ReceiverShardId - +func (iths *InterceptedUnsignedTxHandlerStub) ReceiverShardId() uint32 { + if iths.ReceiverShardIdCalled != nil { + return iths.ReceiverShardIdCalled() + } + return 0 +} + +// Nonce - +func (iths *InterceptedUnsignedTxHandlerStub) Nonce() uint64 { + if iths.NonceCalled != nil { + return iths.NonceCalled() + } + return 0 +} + +// SenderAddress - +func (iths *InterceptedUnsignedTxHandlerStub) SenderAddress() []byte { + if iths.SenderAddressCalled != nil { + return iths.SenderAddressCalled() + } + return nil +} + +// Fee - +func (iths *InterceptedUnsignedTxHandlerStub) Fee() *big.Int { + if iths.FeeCalled != nil { + return iths.FeeCalled() + } + return nil +} + +// Transaction - +func (iths *InterceptedUnsignedTxHandlerStub) Transaction() data.TransactionHandler { + if iths.TransactionCalled != nil { + return iths.TransactionCalled() + } + return nil +} From c51d7d06bf67b95694d43569a9910fea757c4a16 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 22 Aug 2022 14:57:10 +0300 Subject: [PATCH 074/335] update workflows --- .github/workflows/build_and_test.yml | 8 ++++---- .github/workflows/code-coverage.yml | 8 ++++---- .github/workflows/create_release.yml | 10 +++++----- .github/workflows/deploy-docker.yml | 2 +- .github/workflows/deployment.yml | 8 ++++---- .github/workflows/golangci-lint.yml | 6 ++++-- 6 files changed, 22 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index f10ab1e41e0..29b8533cf2d 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -15,14 +15,14 @@ jobs: runs-on: ${{ matrix.runs-on }} name: Build steps: - - name: Set up Go 1.x - uses: actions/setup-go@v2 + - name: Set up Go 1.17.6 + uses: actions/setup-go@v3 with: - go-version: ^1.15.2 + go-version: 1.17.6 id: go - name: Check out code into the Go module directory - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies run: | diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index db12153a29b..b35848ee4f1 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -17,14 +17,14 @@ jobs: runs-on: ${{ matrix.runs-on }} name: Build steps: - - name: Set up Go 1.x - uses: actions/setup-go@v2 + - name: Set up Go 1.17.6 + uses: actions/setup-go@v3 with: - go-version: ^1.15.2 + go-version: 1.17.6 id: go - name: Check out code into the Go module directory - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get dependencies run: | diff --git a/.github/workflows/create_release.yml b/.github/workflows/create_release.yml index e5fd6e6c373..c082f740df1 100644 --- a/.github/workflows/create_release.yml +++ b/.github/workflows/create_release.yml @@ -20,14 +20,14 @@ jobs: runs-on: ${{ matrix.runs-on }} name: Build steps: - - name: Set up Go 1.x - uses: actions/setup-go@v2 + - name: Set up Go 1.17.6 + uses: actions/setup-go@v3 with: - go-version: ^1.15.2 + go-version: 1.17.6 id: go - name: Check out code into the Go module directory - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: "0" @@ -87,7 +87,7 @@ jobs: stat ${GITHUB_WORKSPACE}/${ARCHIVE} - name: Save artifacts - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: ${{ env.ARCHIVE }} path: ${{ github.workspace }}/${{ env.ARCHIVE }} diff --git a/.github/workflows/deploy-docker.yml b/.github/workflows/deploy-docker.yml index 086b658a06c..3d93dae29ff 100644 --- a/.github/workflows/deploy-docker.yml +++ b/.github/workflows/deploy-docker.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Check out code into the Go module directory - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Get the version id: get_version diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml index 03c9ac0a73f..37046ea7c85 100644 --- a/.github/workflows/deployment.yml +++ b/.github/workflows/deployment.yml @@ -38,7 +38,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: fetch-depth: 0 @@ -49,7 +49,7 @@ jobs: # https://github.com/actions/checkout#Checkout-multiple-repos-side-by-side # https://github.com/actions/checkout - name: Checkout deployment config repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: elrondnetwork/elrond-k8s-testnet token: ${{ secrets.PAT }} # `GitHub_PAT` is a secret that contains your PAT @@ -57,7 +57,7 @@ jobs: ref: master - name: Checkout deployment config repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: elrondnetwork/elrond-proxy-go token: ${{ secrets.PAT }} @@ -65,7 +65,7 @@ jobs: ref: master - name: Checkout deployment config repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: repository: elrondnetwork/elrond-txgen-go token: ${{ secrets.PAT }} diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 826346b5ec6..6ee8db463ab 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -11,9 +11,11 @@ jobs: name: golangci linter runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + with: + go-version: 1.17.6 - name: golangci-lint - uses: golangci/golangci-lint-action@v2 + uses: golangci/golangci-lint-action@v3 with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. version: v1.45.2 From c43c3586e5e7afe4252d2c47a0c59f0b42a2bceb Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 25 Aug 2022 14:22:50 +0300 Subject: [PATCH 075/335] node, process, factory, api: fixes after merge --- api/groups/transactionGroup.go | 3 +++ factory/apiResolverFactory.go | 1 + factory/processComponents.go | 16 +++++++------- go.mod | 10 ++++----- go.sum | 22 +++++++++---------- node/external/timemachine/fee/args.go | 4 ++++ node/external/timemachine/fee/feeComputer.go | 4 ++++ .../timemachine/fee/feeComputer_test.go | 3 +++ node/external/timemachine/fee/memory_test.go | 1 + node/mock/txFeeHandlerStub.go | 0 .../postprocess/intermediateResults_test.go | 2 +- .../metaInterceptorsContainerFactory.go | 2 +- .../shardInterceptorsContainerFactory.go | 2 +- .../preProcessorsContainerFactory_test.go | 2 +- .../preProcessorsContainerFactory_test.go | 2 +- process/interceptors/processor/interface.go | 1 + .../smartContract/builtInFunctions/factory.go | 2 +- testscommon/economicsConfig.go | 8 ++++--- 18 files changed, 52 insertions(+), 33 deletions(-) delete mode 100644 node/mock/txFeeHandlerStub.go diff --git a/api/groups/transactionGroup.go b/api/groups/transactionGroup.go index 03a31ecf55e..fde42d85c5f 100644 --- a/api/groups/transactionGroup.go +++ b/api/groups/transactionGroup.go @@ -234,6 +234,7 @@ func (tg *transactionGroup) simulateTransaction(c *gin.Context) { Guardian: gtx.GuardianAddr, GuardianSigHex: gtx.GuardianSignature, } + start := time.Now() tx, txHash, err := tg.getFacade().CreateTransaction(txArgs) logging.LogAPIActionDurationIfNeeded(start, "API call: CreateTransaction") @@ -323,6 +324,7 @@ func (tg *transactionGroup) sendTransaction(c *gin.Context) { Guardian: gtx.GuardianAddr, GuardianSigHex: gtx.GuardianSignature, } + start := time.Now() tx, txHash, err := tg.getFacade().CreateTransaction(txArgs) logging.LogAPIActionDurationIfNeeded(start, "API call: CreateTransaction") if err != nil { @@ -549,6 +551,7 @@ func (tg *transactionGroup) computeTransactionGasLimit(c *gin.Context) { Guardian: gtx.GuardianAddr, GuardianSigHex: gtx.GuardianSignature, } + start := time.Now() tx, _, err := tg.getFacade().CreateTransaction(txArgs) logging.LogAPIActionDurationIfNeeded(start, "API call: CreateTransaction") if err != nil { diff --git a/factory/apiResolverFactory.go b/factory/apiResolverFactory.go index cb611172d96..8ab3869ffcd 100644 --- a/factory/apiResolverFactory.go +++ b/factory/apiResolverFactory.go @@ -208,6 +208,7 @@ func CreateApiResolver(args *ApiResolverArgs) (facade.ApiResolver, error) { EconomicsConfig: *args.Configs.EconomicsConfig, PenalizedTooMuchGasEnableEpoch: args.Configs.EpochConfig.EnableEpochs.PenalizedTooMuchGasEnableEpoch, GasPriceModifierEnableEpoch: args.Configs.EpochConfig.EnableEpochs.GasPriceModifierEnableEpoch, + TxVersionChecker: args.CoreComponents.TxVersionChecker(), }) if err != nil { return nil, err diff --git a/factory/processComponents.go b/factory/processComponents.go index 41e5af9489d..53380098646 100644 --- a/factory/processComponents.go +++ b/factory/processComponents.go @@ -1331,15 +1331,15 @@ func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( WhiteListerVerifiedTxs: pcf.whiteListerVerifiedTxs, AntifloodHandler: pcf.network.InputAntiFloodHandler(), ArgumentsParser: smartContract.NewArgumentParser(), - PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(),SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, - EnableEpochs: pcf.epochConfig.EnableEpochs, + PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, + EnableEpochs: pcf.epochConfig.EnableEpochs, RequestHandler: requestHandler, PeerSignatureHandler: pcf.crypto.PeerSignatureHandler(), - SignaturesHandler: pcf.network.NetworkMessenger(), + SignaturesHandler: pcf.network.NetworkMessenger(), HeartbeatExpiryTimespanInSec: pcf.config.HeartbeatV2.HeartbeatExpiryTimespanInSec, PeerShardMapper: peerShardMapper, HardforkTrigger: hardforkTrigger, - GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), + GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), } interceptorContainerFactory, err := interceptorscontainer.NewShardInterceptorsContainerFactory(shardInterceptorsContainerFactoryArgs) @@ -1381,7 +1381,7 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( AntifloodHandler: pcf.network.InputAntiFloodHandler(), ArgumentsParser: smartContract.NewArgumentParser(), SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, - EnableEpochs: pcf.epochConfig.EnableEpochs, + EnableEpochs: pcf.epochConfig.EnableEpochs, PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), RequestHandler: requestHandler, PeerSignatureHandler: pcf.crypto.PeerSignatureHandler(), @@ -1389,7 +1389,7 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( HeartbeatExpiryTimespanInSec: pcf.config.HeartbeatV2.HeartbeatExpiryTimespanInSec, PeerShardMapper: peerShardMapper, HardforkTrigger: hardforkTrigger, - GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), + GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), } interceptorContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorsContainerFactoryArgs) @@ -1482,7 +1482,7 @@ func (pcf *processComponentsFactory) createExportFactoryHandler( OutputAntifloodHandler: pcf.network.OutputAntiFloodHandler(), RoundHandler: pcf.coreData.RoundHandler(), InterceptorDebugConfig: pcf.config.Debug.InterceptorResolver, - EnableSignTxWithHashEpoch: pcf.epochConfig.EnableEpochs.TransactionSignedWithTxHashEnableEpoch, + EnableEpochs: pcf.epochConfig.EnableEpochs, MaxHardCapForMissingNodes: pcf.config.TrieSync.MaxHardCapForMissingNodes, NumConcurrentTrieSyncers: pcf.config.TrieSync.NumConcurrentTrieSyncers, TrieSyncerVersion: pcf.config.TrieSync.TrieSyncerVersion, @@ -1631,7 +1631,7 @@ func checkProcessComponentsArgs(args ProcessComponentsFactoryArgs) error { if check.IfNil(args.StatusComponents) { return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilStatusComponentsHolder) } - if check.IfNil(args.BootstrapComponents.GuardianSigVerifier()){ + if check.IfNil(args.BootstrapComponents.GuardianSigVerifier()) { return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilGuardianSigVerifier) } diff --git a/go.mod b/go.mod index d0dfb8904c2..50e59b9bedc 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,10 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.38 - github.com/ElrondNetwork/elrond-go-core v1.1.19 + github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 - github.com/ElrondNetwork/elrond-vm-common v1.3.14 + github.com/ElrondNetwork/elrond-vm-common v1.3.15-0.20220823131107-727e254268b6 github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta @@ -50,8 +50,8 @@ require ( replace github.com/gogo/protobuf => github.com/ElrondNetwork/protobuf v1.3.2 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.41 => github.com/ElrondNetwork/arwen-wasm-vm v1.2.41 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_2 v1.2.41 => github.com/ElrondNetwork/arwen-wasm-vm v1.2.42-0.20220825092831-7d45c37a8a73 -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.41 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.41 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_3 v1.3.41 => github.com/ElrondNetwork/arwen-wasm-vm v1.3.42-0.20220825091352-272f48a2c23c -replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.58 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.58 +replace github.com/ElrondNetwork/arwen-wasm-vm/v1_4 v1.4.58 => github.com/ElrondNetwork/arwen-wasm-vm v1.4.59-0.20220825090722-70fbc73c9021 diff --git a/go.sum b/go.sum index b3e063f0c6d..809491452b8 100644 --- a/go.sum +++ b/go.sum @@ -43,12 +43,12 @@ github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOv github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ElrondNetwork/arwen-wasm-vm v1.2.41 h1:6Tf6nA4MG28fqiedCGhB+rbRz8SqbhKm7mnlFHx3ajQ= -github.com/ElrondNetwork/arwen-wasm-vm v1.2.41/go.mod h1:P0I84sh+9eo1CPdkTjFNqF6SuUqHDMVEWl3DYqMJSLg= -github.com/ElrondNetwork/arwen-wasm-vm v1.3.41 h1:Xqivm7PreGk6ElJQY6uLWYvZRnGDbvbzi5lkZSYPjRA= -github.com/ElrondNetwork/arwen-wasm-vm v1.3.41/go.mod h1:1VJtk8hhN/BilXCGB3Ed6ubTN4S0/LoFp/+taJ0oUa0= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.58 h1:+pQizb+wCRzJq6lV5ODR+fynXDniuvoNSSEXtHA8z1s= -github.com/ElrondNetwork/arwen-wasm-vm v1.4.58/go.mod h1:HmTo5ZznSOlujBp8Nd9f7n47F+bsUQzyh4mCJlvUHhA= +github.com/ElrondNetwork/arwen-wasm-vm v1.2.42-0.20220825092831-7d45c37a8a73 h1:sVs86nFfte0daobQsNKXs91a6b1FhJtRX6XFjZLnY2o= +github.com/ElrondNetwork/arwen-wasm-vm v1.2.42-0.20220825092831-7d45c37a8a73/go.mod h1:UpxJebuBDGgUsOUSYIWpADpIXYorK96V8ED2thDWQZw= +github.com/ElrondNetwork/arwen-wasm-vm v1.3.42-0.20220825091352-272f48a2c23c h1:RYdK5X7kGcaZkjrvCOkXf6IxMJxqZ2gS91dhrnPDDfI= +github.com/ElrondNetwork/arwen-wasm-vm v1.3.42-0.20220825091352-272f48a2c23c/go.mod h1:PwphcZEzeUgIIUuUc1rqrUpjsVr1h8DK3nKgZUnEt+w= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.59-0.20220825090722-70fbc73c9021 h1:1Wc/S76+L/m7RWwnIUzY7sVtIXOuQOy/nExvO3bLHFM= +github.com/ElrondNetwork/arwen-wasm-vm v1.4.59-0.20220825090722-70fbc73c9021/go.mod h1:Olg3snw+9RNS4FDP3gOKYyqoQPcgrjux+rvYjBFg4bo= github.com/ElrondNetwork/big-int-util v0.1.0 h1:vTMoJ5azhVmr7jhpSD3JUjQdkdyXoEPVkOvhdw1RjV4= github.com/ElrondNetwork/big-int-util v0.1.0/go.mod h1:96viBvoTXLjZOhEvE0D+QnAwg1IJLPAK6GVHMbC7Aw4= github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04gd61sNYo04Zf0= @@ -59,10 +59,10 @@ github.com/ElrondNetwork/elastic-indexer-go v1.2.38 h1:jnS8b3dAXidZptPCpmFBEWMZm github.com/ElrondNetwork/elastic-indexer-go v1.2.38/go.mod h1:w+J48ssy1kxOawG2lwiOUR4JYPA092g8Zjk88kRVDNA= github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= -github.com/ElrondNetwork/elrond-go-core v1.1.13/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.16-0.20220414130405-e3cc29bc7711/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.19 h1:1wRYaG/eb7vtPIYqULwhj9ANPfmPM6yX40OYgI5h2nk= -github.com/ElrondNetwork/elrond-go-core v1.1.19/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b h1:OUxvUPQNftjoz8HEfl1Zr3cvTbgRMQtFosfKnrXUNNU= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= @@ -73,8 +73,8 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.7/go.mod h1:cBfgx0ST/CJx8jrxJSC5a github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.7/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/elrond-vm-common v1.3.14 h1:iubHO4wMovZNpFn033AnfCCXqpxcdzZv+RZLioo/o04= -github.com/ElrondNetwork/elrond-vm-common v1.3.14/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= +github.com/ElrondNetwork/elrond-vm-common v1.3.15-0.20220823131107-727e254268b6 h1:AbFcZLyeWlPBCMgWwBKvsDGj2/kU5+/QFCwDrs0Ker8= +github.com/ElrondNetwork/elrond-vm-common v1.3.15-0.20220823131107-727e254268b6/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTwgtAkAwtzsB0HVfSP58I= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= diff --git a/node/external/timemachine/fee/args.go b/node/external/timemachine/fee/args.go index 34faa1af450..950c5fca5ab 100644 --- a/node/external/timemachine/fee/args.go +++ b/node/external/timemachine/fee/args.go @@ -13,12 +13,16 @@ type ArgsNewFeeComputer struct { EconomicsConfig config.EconomicsConfig PenalizedTooMuchGasEnableEpoch uint32 GasPriceModifierEnableEpoch uint32 + TxVersionChecker process.TxVersionCheckerHandler } func (args *ArgsNewFeeComputer) check() error { if check.IfNil(args.BuiltInFunctionsCostHandler) { return process.ErrNilBuiltInFunctionsCostHandler } + if check.IfNil(args.TxVersionChecker) { + return process.ErrNilTransactionVersionChecker + } return nil } diff --git a/node/external/timemachine/fee/feeComputer.go b/node/external/timemachine/fee/feeComputer.go index 92630da3d66..be4383e2cef 100644 --- a/node/external/timemachine/fee/feeComputer.go +++ b/node/external/timemachine/fee/feeComputer.go @@ -8,12 +8,14 @@ import ( logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/node/external/timemachine" + "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/economics" ) var log = logger.GetOrCreate("node/external/timemachine/fee") type feeComputer struct { + txVersionChecker process.TxVersionCheckerHandler builtInFunctionsCostHandler economics.BuiltInFunctionsCostHandler economicsConfig config.EconomicsConfig penalizedTooMuchGasEnableEpoch uint32 @@ -36,6 +38,7 @@ func NewFeeComputer(args ArgsNewFeeComputer) (*feeComputer, error) { gasPriceModifierEnableEpoch: args.GasPriceModifierEnableEpoch, // TODO: use a LRU cache instead economicsInstances: make(map[uint32]economicsDataWithComputeFee), + txVersionChecker: args.TxVersionChecker, } // Create some economics data instance (but do not save them) in order to validate the arguments: @@ -103,6 +106,7 @@ func (computer *feeComputer) createEconomicsInstance(epoch uint32) (economicsDat GasPriceModifierEnableEpoch: computer.gasPriceModifierEnableEpoch, BuiltInFunctionsCostHandler: computer.builtInFunctionsCostHandler, EpochNotifier: &timemachine.DisabledEpochNotifier{}, + TxVersionChecker: computer.txVersionChecker, } economicsData, err := economics.NewEconomicsData(args) diff --git a/node/external/timemachine/fee/feeComputer_test.go b/node/external/timemachine/fee/feeComputer_test.go index cbf2b9cbaf5..090ba29b562 100644 --- a/node/external/timemachine/fee/feeComputer_test.go +++ b/node/external/timemachine/fee/feeComputer_test.go @@ -16,6 +16,7 @@ func TestNewFeeComputer(t *testing.T) { arguments := ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: nil, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } computer, err := NewFeeComputer(arguments) @@ -27,6 +28,7 @@ func TestNewFeeComputer(t *testing.T) { arguments := ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } computer, err := NewFeeComputer(arguments) @@ -41,6 +43,7 @@ func TestFeeComputer_ComputeTransactionFeeShouldWorkForDifferentEpochs(t *testin EconomicsConfig: testscommon.GetEconomicsConfig(), PenalizedTooMuchGasEnableEpoch: 124, GasPriceModifierEnableEpoch: 180, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } contract, _ := hex.DecodeString("000000000000000000010000000000000000000000000000000000000000abba") diff --git a/node/external/timemachine/fee/memory_test.go b/node/external/timemachine/fee/memory_test.go index e41c34f33df..77f050244f5 100644 --- a/node/external/timemachine/fee/memory_test.go +++ b/node/external/timemachine/fee/memory_test.go @@ -21,6 +21,7 @@ func TestFeeComputer_MemoryFootprint(t *testing.T) { computer, _ := NewFeeComputer(ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, }) tx := &transaction.Transaction{ diff --git a/node/mock/txFeeHandlerStub.go b/node/mock/txFeeHandlerStub.go deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index c557a06b79f..75da5f997f5 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -1092,7 +1092,7 @@ func TestIntermediateResultsProcessor_addIntermediateTxToResultsForBlock(t *test &mock.ChainStorerMock{}, block.TxBlock, &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, ) key := []byte("key") diff --git a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go index e702401c676..8164f2e9c74 100644 --- a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go @@ -39,9 +39,9 @@ func NewMetaInterceptorsContainerFactory( args.WhiteListerVerifiedTxs, args.PreferredPeersHolder, args.RequestHandler, + args.GuardianSigVerifier, args.PeerShardMapper, args.HardforkTrigger, - args.GuardianSigVerifier, ) if err != nil { return nil, err diff --git a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go index 29a89eb87f6..5956e0ad8a7 100644 --- a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go @@ -37,9 +37,9 @@ func NewShardInterceptorsContainerFactory( args.WhiteListerVerifiedTxs, args.PreferredPeersHolder, args.RequestHandler, + args.GuardianSigVerifier, args.PeerShardMapper, args.HardforkTrigger, - args.GuardianSigVerifier, ) if err != nil { return nil, err diff --git a/process/factory/metachain/preProcessorsContainerFactory_test.go b/process/factory/metachain/preProcessorsContainerFactory_test.go index 14e97740710..51bd427290b 100644 --- a/process/factory/metachain/preProcessorsContainerFactory_test.go +++ b/process/factory/metachain/preProcessorsContainerFactory_test.go @@ -564,7 +564,7 @@ func TestNewPreProcessorsContainerFactory_NilProcessedMiniBlocksTracker(t *testi &testscommon.RequestHandlerStub{}, &testscommon.TxProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, createMockPubkeyConverter(), diff --git a/process/factory/shard/preProcessorsContainerFactory_test.go b/process/factory/shard/preProcessorsContainerFactory_test.go index 17110bba472..425c936f27b 100644 --- a/process/factory/shard/preProcessorsContainerFactory_test.go +++ b/process/factory/shard/preProcessorsContainerFactory_test.go @@ -715,7 +715,7 @@ func TestNewPreProcessorsContainerFactory_NilProcessedMiniBlocksTracker(t *testi &testscommon.SCProcessorMock{}, &testscommon.SmartContractResultsProcessorMock{}, &testscommon.RewardTxProcessorMock{}, - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.GasHandlerStub{}, &mock.BlockTrackerMock{}, &testscommon.BlockSizeComputationStub{}, diff --git a/process/interceptors/processor/interface.go b/process/interceptors/processor/interface.go index 6106cb93ec6..def73b2dfb9 100644 --- a/process/interceptors/processor/interface.go +++ b/process/interceptors/processor/interface.go @@ -1,3 +1,4 @@ +package processor type interceptedDataSizeHandler interface { SizeInBytes() int diff --git a/process/smartContract/builtInFunctions/factory.go b/process/smartContract/builtInFunctions/factory.go index 5d04cce7bd6..36d89933536 100644 --- a/process/smartContract/builtInFunctions/factory.go +++ b/process/smartContract/builtInFunctions/factory.go @@ -54,7 +54,7 @@ func CreateBuiltInFunctionsFactory(args ArgsCreateBuiltInFunctionContainer) (vmc return nil, process.ErrNilEpochNotifier } if check.IfNil(args.GuardedAccountHandler) { - return nil, nil, nil, process.ErrNilGuardedAccountHandler + return nil, process.ErrNilGuardedAccountHandler } vmcommonAccounts, ok := args.Accounts.(vmcommon.AccountsAdapter) diff --git a/testscommon/economicsConfig.go b/testscommon/economicsConfig.go index 8ac244701c9..178d4a3d99b 100644 --- a/testscommon/economicsConfig.go +++ b/testscommon/economicsConfig.go @@ -38,11 +38,13 @@ func GetEconomicsConfig() config.EconomicsConfig { MaxGasLimitPerMetaMiniBlock: "1500000000", MaxGasLimitPerTx: "600000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, }, - MinGasPrice: "1000000000", - GasPerDataByte: "1500", - GasPriceModifier: 0.01, + MinGasPrice: "1000000000", + GasPerDataByte: "1500", + GasPriceModifier: 0.01, + MaxGasPriceSetGuardian: "2000000000", }, } } From f7b42f123c285af8f20f009dd9e3fd8570615f7e Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 26 Aug 2022 15:40:21 +0300 Subject: [PATCH 076/335] add guardian data REST api --- api/errors/errors.go | 3 ++ api/groups/addressGroup.go | 30 ++++++++++++++++ api/mock/facadeStub.go | 25 ++++++++----- api/shared/interface.go | 1 + cmd/node/config/api.toml | 3 ++ facade/initial/initialNodeFacade.go | 5 +++ facade/interface.go | 3 ++ facade/mock/nodeStub.go | 12 +++++-- facade/nodeFacade.go | 5 +++ go.mod | 2 +- go.sum | 3 +- integrationTests/interface.go | 1 + node/node.go | 36 +++++++++++++++++++ .../disabled/disabledGuardedAccount.go | 6 ++++ process/guardian/guardedAccount.go | 13 +++++++ process/interface.go | 2 ++ .../guardianAccountHandlerStub.go | 20 ++++++++--- 17 files changed, 153 insertions(+), 17 deletions(-) diff --git a/api/errors/errors.go b/api/errors/errors.go index 9ccab97592c..4549519b55c 100644 --- a/api/errors/errors.go +++ b/api/errors/errors.go @@ -31,6 +31,9 @@ var ErrGetESDTTokens = errors.New("get esdt tokens for account error") // ErrGetESDTBalance signals an error in getting esdt balance for given address var ErrGetESDTBalance = errors.New("get esdt balance for account error") +// ErrGetGuardianData signals an error in getting the guardian data for given address +var ErrGetGuardianData = errors.New("get guardian data for account error") + // ErrGetRolesForAccount signals an error in getting esdt tokens and roles for a given address var ErrGetRolesForAccount = errors.New("get roles for account error") diff --git a/api/groups/addressGroup.go b/api/groups/addressGroup.go index 48ade5f63ed..59c52327b8b 100644 --- a/api/groups/addressGroup.go +++ b/api/groups/addressGroup.go @@ -28,6 +28,7 @@ const ( getESDTsRolesPath = "/:address/esdts/roles" getRegisteredNFTsPath = "/:address/registered-nfts" getESDTNFTDataPath = "/:address/nft/:tokenIdentifier/nonce/:nonce" + getGuardianData = "/:address/guardian-data" urlParamOnFinalBlock = "onFinalBlock" urlParamOnStartOfEpoch = "onStartOfEpoch" urlParamBlockNonce = "blockNonce" @@ -48,6 +49,7 @@ type addressFacadeHandler interface { GetESDTsWithRole(address string, role string, options api.AccountQueryOptions) ([]string, api.BlockInfo, error) GetAllESDTTokens(address string, options api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) GetKeyValuePairs(address string, options api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) + GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) IsInterfaceNil() bool } @@ -143,6 +145,11 @@ func NewAddressGroup(facade addressFacadeHandler) (*addressGroup, error) { Method: http.MethodGet, Handler: ag.getESDTsRoles, }, + { + Path: getGuardianData, + Method: http.MethodGet, + Handler: ag.getGuardianData, + }, } ag.endpoints = endpoints @@ -248,6 +255,29 @@ func (ag *addressGroup) getValueForKey(c *gin.Context) { shared.RespondWithSuccess(c, gin.H{"value": value, "blockInfo": blockInfo}) } +// getGuardianData returns the guardian data and frozen state for a given account +func (ag *addressGroup) getGuardianData(c *gin.Context) { + addr := c.Param("address") + if addr == "" { + shared.RespondWithValidationError(c, errors.ErrGetGuardianData, errors.ErrEmptyAddress) + return + } + + options, err := extractAccountQueryOptions(c) + if err != nil { + shared.RespondWithValidationError(c, errors.ErrGetGuardianData, err) + return + } + + guardianData, blockInfo, err := ag.getFacade().GetGuardianData(addr, options) + if err != nil { + shared.RespondWithInternalError(c, errors.ErrGetGuardianData, err) + return + } + + shared.RespondWithSuccess(c, gin.H{"guardianData": guardianData, "blockInfo": blockInfo}) +} + // addressGroup returns all the key-value pairs for the given address func (ag *addressGroup) getKeyValuePairs(c *gin.Context) { addr := c.Param("address") diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index 916177161f4..21c15c3288e 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -20,14 +20,14 @@ import ( // FacadeStub is the mock implementation of a node router handler type FacadeStub struct { - ShouldErrorStart bool - ShouldErrorStop bool - GetHeartbeatsHandler func() ([]data.PubKeyHeartbeat, error) - GetBalanceCalled func(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo, error) - GetAccountCalled func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo,error) - GenerateTransactionHandler func(sender string, receiver string, value *big.Int, code string) (*transaction.Transaction, error) - GetTransactionHandler func(hash string, withResults bool) (*transaction.ApiTransactionResult, error) - CreateTransactionHandler func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) + ShouldErrorStart bool + ShouldErrorStop bool + GetHeartbeatsHandler func() ([]data.PubKeyHeartbeat, error) + GetBalanceCalled func(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo, error) + GetAccountCalled func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) + GenerateTransactionHandler func(sender string, receiver string, value *big.Int, code string) (*transaction.Transaction, error) + GetTransactionHandler func(hash string, withResults bool) (*transaction.ApiTransactionResult, error) + CreateTransactionHandler func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransactionHandler func(tx *transaction.Transaction) error ValidateTransactionForSimulationHandler func(tx *transaction.Transaction, bypassSignature bool) error SendBulkTransactionsHandler func(txs []*transaction.Transaction) (uint64, error) @@ -38,6 +38,7 @@ type FacadeStub struct { NodeConfigCalled func() map[string]interface{} GetQueryHandlerCalled func(name string) (debug.QueryHandler, error) GetValueForKeyCalled func(address string, key string, options api.AccountQueryOptions) (string, api.BlockInfo, error) + GetGuardianDataCalled func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) GetPeerInfoCalled func(pid string) ([]core.QueryP2PPeerInfo, error) GetThrottlerForEndpointCalled func(endpoint string) (core.Throttler, bool) GetUsernameCalled func(address string, options api.AccountQueryOptions) (string, api.BlockInfo, error) @@ -183,6 +184,14 @@ func (f *FacadeStub) GetKeyValuePairs(address string, options api.AccountQueryOp return nil, api.BlockInfo{}, nil } +// GetGuardianData - +func (f *FacadeStub) GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + if f.GetGuardianDataCalled != nil { + return f.GetGuardianDataCalled(address, options) + } + return api.GuardianData{}, api.BlockInfo{}, nil +} + // GetESDTData - func (f *FacadeStub) GetESDTData(address string, key string, nonce uint64, options api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { if f.GetESDTDataCalled != nil { diff --git a/api/shared/interface.go b/api/shared/interface.go index 03b1d678659..8c6d52f69f1 100644 --- a/api/shared/interface.go +++ b/api/shared/interface.go @@ -70,6 +70,7 @@ type FacadeHandler interface { GetESDTsWithRole(address string, role string, options api.AccountQueryOptions) ([]string, api.BlockInfo, error) GetAllESDTTokens(address string, options api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) GetKeyValuePairs(address string, options api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) + GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) GetBlockByHash(hash string, options api.BlockQueryOptions) (*api.Block, error) GetBlockByNonce(nonce uint64, options api.BlockQueryOptions) (*api.Block, error) GetBlockByRound(round uint64, options api.BlockQueryOptions) (*api.Block, error) diff --git a/cmd/node/config/api.toml b/cmd/node/config/api.toml index 63760ca7f1e..83ff8c45859 100644 --- a/cmd/node/config/api.toml +++ b/cmd/node/config/api.toml @@ -49,6 +49,9 @@ # /address/:address/key/:key will return the value of a key for a given account { Name = "/:address/key/:key", Open = true }, + # /:address/guardian-data will return the guardian data for the given account + { Name = "/:address/guardian-data", Open = true}, + # /address/:address/esdt will return the list of esdt tokens for a given account { Name = "/:address/esdt", Open = true }, diff --git a/facade/initial/initialNodeFacade.go b/facade/initial/initialNodeFacade.go index 255cc69ebb4..458ff194989 100644 --- a/facade/initial/initialNodeFacade.go +++ b/facade/initial/initialNodeFacade.go @@ -288,6 +288,11 @@ func (inf *initialNodeFacade) GetKeyValuePairs(_ string, _ api.AccountQueryOptio return nil, api.BlockInfo{}, errNodeStarting } +// GetGuardianData returns error +func (inf *initialNodeFacade) GetGuardianData(_ string, _ api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + return api.GuardianData{}, api.BlockInfo{}, errNodeStarting +} + // GetDirectStakedList returns empty slice func (inf *initialNodeFacade) GetDirectStakedList() ([]*api.DirectStakedValue, error) { return nil, errNodeStarting diff --git a/facade/interface.go b/facade/interface.go index 811ed2f2f56..88eb85175f0 100644 --- a/facade/interface.go +++ b/facade/interface.go @@ -29,6 +29,9 @@ type NodeHandler interface { // GetValueForKey returns the value of a key from a given account GetValueForKey(address string, key string, options api.AccountQueryOptions) (string, api.BlockInfo, error) + // GetGuardianData returns the guardian data for given account + GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) + // GetKeyValuePairs returns the key-value pairs under a given address GetKeyValuePairs(address string, options api.AccountQueryOptions, ctx context.Context) (map[string]string, api.BlockInfo, error) diff --git a/facade/mock/nodeStub.go b/facade/mock/nodeStub.go index e80ac279f83..336bc3ba5ad 100644 --- a/facade/mock/nodeStub.go +++ b/facade/mock/nodeStub.go @@ -18,9 +18,8 @@ import ( // NodeStub - type NodeStub struct { - ConnectToAddressesHandler func([]string) error - GetBalanceCalled func(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo,error) + GetBalanceCalled func(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo, error) GenerateTransactionHandler func(sender string, receiver string, amount string, code string) (*transaction.Transaction, error) CreateTransactionHandler func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransactionHandler func(tx *transaction.Transaction) error @@ -37,6 +36,7 @@ type NodeStub struct { IsSelfTriggerCalled func() bool GetQueryHandlerCalled func(name string) (debug.QueryHandler, error) GetValueForKeyCalled func(address string, key string, options api.AccountQueryOptions) (string, api.BlockInfo, error) + GetGuardianDataCalled func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) GetPeerInfoCalled func(pid string) ([]core.QueryP2PPeerInfo, error) GetUsernameCalled func(address string, options api.AccountQueryOptions) (string, api.BlockInfo, error) GetESDTDataCalled func(address string, key string, nonce uint64, options api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) @@ -105,6 +105,14 @@ func (ns *NodeStub) GetValueForKey(address string, key string, options api.Accou return "", api.BlockInfo{}, nil } +// GetGuardianData - +func (ns *NodeStub) GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + if ns.GetGuardianDataCalled != nil { + return ns.GetGuardianDataCalled(address, options) + } + return api.GuardianData{}, api.BlockInfo{}, nil +} + // EncodeAddressPubkey - func (ns *NodeStub) EncodeAddressPubkey(pk []byte) (string, error) { return hex.EncodeToString(pk), nil diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index 6e0c2fedccc..d67c898c314 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -218,6 +218,11 @@ func (nf *nodeFacade) GetKeyValuePairs(address string, options apiData.AccountQu return nf.node.GetKeyValuePairs(address, options, ctx) } +// GetGuardianData returns the guardian data for the provided address +func (nf *nodeFacade) GetGuardianData(address string, options apiData.AccountQueryOptions) (apiData.GuardianData, apiData.BlockInfo, error) { + return nf.node.GetGuardianData(address, options) +} + // GetAllESDTTokens returns all the esdt tokens for a given address func (nf *nodeFacade) GetAllESDTTokens(address string, options apiData.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, apiData.BlockInfo, error) { ctx, cancel := nf.getContextForApiTrieRangeOperations() diff --git a/go.mod b/go.mod index 50e59b9bedc..bba47e1462a 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.38 - github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b + github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220826090131-09d9dba97612 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 github.com/ElrondNetwork/elrond-vm-common v1.3.15-0.20220823131107-727e254268b6 diff --git a/go.sum b/go.sum index 809491452b8..17adc60395b 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,9 @@ github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6y github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.16-0.20220414130405-e3cc29bc7711/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b h1:OUxvUPQNftjoz8HEfl1Zr3cvTbgRMQtFosfKnrXUNNU= github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220826090131-09d9dba97612 h1:FlYipmdMSFZr0asbAJOHwcXrNBpQ07jrSXevUK4pUCU= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220826090131-09d9dba97612/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= diff --git a/integrationTests/interface.go b/integrationTests/interface.go index 638c1557284..506e4a407da 100644 --- a/integrationTests/interface.go +++ b/integrationTests/interface.go @@ -67,6 +67,7 @@ type Facade interface { GetAllESDTTokens(address string, options api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) GetESDTsRoles(address string, options api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) GetKeyValuePairs(address string, options api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) + GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) GetBlockByHash(hash string, options api.BlockQueryOptions) (*dataApi.Block, error) GetBlockByNonce(nonce uint64, options api.BlockQueryOptions) (*dataApi.Block, error) GetBlockByRound(round uint64, options api.BlockQueryOptions) (*dataApi.Block, error) diff --git a/node/node.go b/node/node.go index 9675e4b9ae2..7203289f1b9 100644 --- a/node/node.go +++ b/node/node.go @@ -17,6 +17,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/api" "github.com/ElrondNetwork/elrond-go-core/data/endProcess" "github.com/ElrondNetwork/elrond-go-core/data/esdt" + "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go-core/data/transaction" disabledSig "github.com/ElrondNetwork/elrond-go-crypto/signing/disabled/singlesig" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -318,6 +319,41 @@ func (n *Node) GetValueForKey(address string, key string, options api.AccountQue return hex.EncodeToString(valueBytes), blockInfo, nil } +// GetGuardianData returns the guardian data for given account +func (n *Node) GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) + if err != nil { + return api.GuardianData{}, api.BlockInfo{}, err + } + + var active, pending *guardians.Guardian + gah := n.bootstrapComponents.GuardedAccountHandler() + active, pending, err = gah.GetConfiguredGuardians(userAccount) + if err != nil { + return api.GuardianData{}, api.BlockInfo{}, err + } + + var activeGuardian, pendingGuardian *api.Guardian + if active != nil { + activeGuardian = &api.Guardian{ + Address: n.coreComponents.AddressPubKeyConverter().Encode(active.Address), + Epoch: active.ActivationEpoch, + } + } + if pending != nil { + pendingGuardian = &api.Guardian{ + Address: n.coreComponents.AddressPubKeyConverter().Encode(pending.Address), + Epoch: pending.ActivationEpoch, + } + } + + return api.GuardianData{ + ActiveGuardian: activeGuardian, + PendingGuardian: pendingGuardian, + Frozen: userAccount.IsFrozen(), + }, blockInfo, nil +} + // GetESDTData returns the esdt balance and properties from a given account func (n *Node) GetESDTData(address, tokenID string, nonce uint64, options api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go index b177e146ece..1bfb65db1c5 100644 --- a/process/guardian/disabled/disabledGuardedAccount.go +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -1,6 +1,7 @@ package disabled import ( + "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -35,6 +36,11 @@ func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ // CleanOtherThanActive does nothing as this is a disabled implementation func (dga *disabledGuardedAccount) CleanOtherThanActive(_ vmcommon.UserAccountHandler) {} +// GetConfiguredGuardians returns nil, nil, nil as this is a disabled component +func (dga *disabledGuardedAccount) GetConfiguredGuardians(_ state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return nil, nil, nil +} + // IsInterfaceNil returns true if there is no value under the interface func (dga *disabledGuardedAccount) IsInterfaceNil() bool { return dga == nil diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 3bb95cf4762..35ce6e3c52d 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -287,6 +287,19 @@ func (agc *guardedAccount) getActiveGuardian(gs *guardians.Guardians) (*guardian return selectedGuardian, nil } +// GetConfiguredGuardians returns the configured guardians for an account +func (agc *guardedAccount) GetConfiguredGuardians(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + configuredGuardians, err := agc.getConfiguredGuardians(uah) + if err != nil { + return nil, nil, err + } + + active, _ = agc.getActiveGuardian(configuredGuardians) + pending, _ = agc.getPendingGuardian(configuredGuardians) + + return +} + func (agc *guardedAccount) getPendingGuardian(gs *guardians.Guardians) (*guardians.Guardian, error) { if gs == nil { return nil, process.ErrAccountHasNoPendingGuardian diff --git a/process/interface.go b/process/interface.go index 40dc9ac83eb..e4432ca8c49 100644 --- a/process/interface.go +++ b/process/interface.go @@ -10,6 +10,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/data/endProcess" "github.com/ElrondNetwork/elrond-go-core/data/esdt" + "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go-core/data/rewardTx" "github.com/ElrondNetwork/elrond-go-core/data/scheduled" "github.com/ElrondNetwork/elrond-go-core/data/smartContractResult" @@ -1255,6 +1256,7 @@ type GuardedAccountHandler interface { HasPendingGuardian(uah state.UserAccountHandler) bool SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error CleanOtherThanActive(uah vmcommon.UserAccountHandler) + GetConfiguredGuardians(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) IsInterfaceNil() bool } diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go index 2d96453eb1c..bf0f600dbe7 100644 --- a/testscommon/guardianMocks/guardianAccountHandlerStub.go +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -1,17 +1,19 @@ package guardianMocks import ( + "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // GuardedAccountHandlerStub - type GuardedAccountHandlerStub struct { - GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) - SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error - HasPendingGuardianCalled func(uah state.UserAccountHandler) bool - HasActiveGuardianCalled func(uah state.UserAccountHandler) bool - CleanOtherThanActiveCalled func(uah vmcommon.UserAccountHandler) + GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) + SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error + HasPendingGuardianCalled func(uah state.UserAccountHandler) bool + HasActiveGuardianCalled func(uah state.UserAccountHandler) bool + CleanOtherThanActiveCalled func(uah vmcommon.UserAccountHandler) + GetConfiguredGuardiansCalled func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) } // GetActiveGuardian - @@ -53,6 +55,14 @@ func (gahs *GuardedAccountHandlerStub) CleanOtherThanActive(uah vmcommon.UserAcc } } +// GetConfiguredGuardians - +func (gahs *GuardedAccountHandlerStub) GetConfiguredGuardians(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + if gahs.GetConfiguredGuardiansCalled != nil { + return gahs.GetConfiguredGuardiansCalled(uah) + } + return nil, nil, nil +} + // IsInterfaceNil - func (gahs *GuardedAccountHandlerStub) IsInterfaceNil() bool { return gahs == nil From ba6437ae01cfa43e0d0c005612ac0949b57bdc69 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 26 Aug 2022 16:03:34 +0300 Subject: [PATCH 077/335] add unit tests --- api/groups/addressGroup_test.go | 91 ++++++++++++++++++++++++ facade/initial/initialNodeFacade_test.go | 4 ++ facade/nodeFacade_test.go | 43 +++++++++++ 3 files changed, 138 insertions(+) diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index b26854b02d0..ff6dbe50fde 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -93,6 +93,16 @@ type esdtTokenResponse struct { Code string `json:"code"` } +type guardianDataResponseData struct { + GuardianData api.GuardianData `json:"guardianData"` +} + +type guardianDataResponse struct { + Data guardianDataResponseData `json:"data"` + Error string `json:"error"` + Code string `json:"code"` +} + type esdtNFTResponse struct { Data esdtNFTResponseData `json:"data"` Error string `json:"error"` @@ -900,6 +910,86 @@ func TestGetKeyValuePairs_ShouldWork(t *testing.T) { assert.Equal(t, pairs, response.Data.Pairs) } +func TestGetGuardianData(t *testing.T) { + t.Parallel() + + testAddress := "address" + t.Run("with empty address should err", func(t *testing.T) { + facade := mock.FacadeStub{} + addrGroup, err := groups.NewAddressGroup(&facade) + require.Nil(t, err) + + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + + emptyAddress := "" + req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/guardian-data", emptyAddress), nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusBadRequest, resp.Code) + assert.NotEmpty(t, response) + assert.True(t, strings.Contains(response.Error, + fmt.Sprintf("%s: %s", apiErrors.ErrGetGuardianData.Error(), apiErrors.ErrEmptyAddress.Error()), + )) + }) + t.Run("with node fail should err", func(t *testing.T) { + expectedErr := errors.New("expected error") + facade := mock.FacadeStub{ + GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + return api.GuardianData{}, api.BlockInfo{}, expectedErr + }, + } + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + + req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/guardian-data", testAddress), nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := &shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + + }) + t.Run("OK", func(t *testing.T) { + expectedGuardianData := api.GuardianData{ + ActiveGuardian: &api.Guardian{ + Address: "guardian1", + Epoch: 0, + }, + PendingGuardian: &api.Guardian{ + Address: "guardian2", + Epoch: 10, + }, + Frozen: true, + } + facade := mock.FacadeStub{ + GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + return expectedGuardianData, api.BlockInfo{}, nil + }, + } + + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + + req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/guardian-data", testAddress), nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := guardianDataResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedGuardianData, response.Data.GuardianData) + }) +} + func TestGetESDTsRoles_WithEmptyAddressShouldReturnError(t *testing.T) { t.Parallel() facade := mock.FacadeStub{} @@ -1032,6 +1122,7 @@ func getAddressRoutesConfig() config.ApiRoutesConfig { "address": { Routes: []config.RouteConfig{ {Name: "/:address", Open: true}, + {Name: "/:address/guardian-data", Open: true}, {Name: "/:address/balance", Open: true}, {Name: "/:address/username", Open: true}, {Name: "/:address/keys", Open: true}, diff --git a/facade/initial/initialNodeFacade_test.go b/facade/initial/initialNodeFacade_test.go index 71f3ed73ec4..7d1ed8c6b05 100644 --- a/facade/initial/initialNodeFacade_test.go +++ b/facade/initial/initialNodeFacade_test.go @@ -207,5 +207,9 @@ func TestDisabledNodeFacade_AllMethodsShouldNotPanic(t *testing.T) { assert.Equal(t, uint64(0), nonce) assert.Equal(t, errNodeStarting, err) + guardianData, _, err := inf.GetGuardianData("", api.AccountQueryOptions{}) + assert.Equal(t, api.GuardianData{}, guardianData) + assert.Equal(t, errNodeStarting, err) + assert.False(t, check.IfNil(inf)) } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 95cf9e59fa9..4a0e58a2bed 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "math/big" + "strings" "sync/atomic" "testing" "time" @@ -676,6 +677,48 @@ func TestNodeFacade_GetKeyValuePairs(t *testing.T) { assert.Equal(t, expectedPairs, res) } +func TestNodeFacade_GetGuardianData(t *testing.T) { + t.Parallel() + arg := createMockArguments() + + emptyGuardianData := api.GuardianData{} + testAddress := "test address" + expectedErr := errors.New("expected error") + + expectedGuardianData := api.GuardianData{ + ActiveGuardian: &api.Guardian{ + Address: "guardian1", + Epoch: 0, + }, + PendingGuardian: &api.Guardian{ + Address: "guardian2", + Epoch: 10, + }, + Frozen: true, + } + arg.Node = &mock.NodeStub{ + GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + if strings.Compare(testAddress, address) == 0 { + return expectedGuardianData, api.BlockInfo{}, nil + } + return emptyGuardianData, api.BlockInfo{}, expectedErr + }, + } + + t.Run("with error", func(t *testing.T) { + nf, _ := NewNodeFacade(arg) + res, _, err := nf.GetGuardianData("", api.AccountQueryOptions{}) + assert.Equal(t, expectedErr, err) + assert.Equal(t, emptyGuardianData, res) + }) + t.Run("ok", func(t *testing.T) { + nf, _ := NewNodeFacade(arg) + res, _, err := nf.GetGuardianData(testAddress, api.AccountQueryOptions{}) + assert.NoError(t, err) + assert.Equal(t, expectedGuardianData, res) + }) +} + func TestNodeFacade_GetAllESDTTokens(t *testing.T) { t.Parallel() From 3a184c99fc3fa2938faca487449142cbee4935ff Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 26 Aug 2022 18:15:13 +0300 Subject: [PATCH 078/335] add unit tests --- node/export_test.go | 7 ++ node/node.go | 24 +++-- node/node_test.go | 111 ++++++++++++++++++++++++ process/guardian/guardedAccount_test.go | 93 ++++++++++++++++++++ 4 files changed, 228 insertions(+), 7 deletions(-) diff --git a/node/export_test.go b/node/export_test.go index b2fde2a0733..34f70311935 100644 --- a/node/export_test.go +++ b/node/export_test.go @@ -6,6 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/state" ) // GetClosableComponentName - @@ -47,3 +48,9 @@ func ExtractApiBlockInfoIfErrAccountNotFoundAtBlock(err error) (api.BlockInfo, b func (n *Node) SetTxGuardianData(guardian string, guardianSigHex string, tx *transaction.Transaction) error { return n.setTxGuardianData(guardian, guardianSigHex, tx) } + +func (n *Node) GetPendingAndActiveGuardians( + userAccount state.UserAccountHandler, +) (activeGuardian *api.Guardian, pendingGuardian *api.Guardian, err error) { + return n.getPendingAndActiveGuardians(userAccount) +} diff --git a/node/node.go b/node/node.go index 7203289f1b9..355819b7014 100644 --- a/node/node.go +++ b/node/node.go @@ -326,14 +326,28 @@ func (n *Node) GetGuardianData(address string, options api.AccountQueryOptions) return api.GuardianData{}, api.BlockInfo{}, err } + activeGuardian, pendingGuardian, err := n.getPendingAndActiveGuardians(userAccount) + if err != nil { + return api.GuardianData{}, api.BlockInfo{}, err + } + + return api.GuardianData{ + ActiveGuardian: activeGuardian, + PendingGuardian: pendingGuardian, + Frozen: userAccount.IsFrozen(), + }, blockInfo, nil +} + +func (n *Node) getPendingAndActiveGuardians( + userAccount state.UserAccountHandler, +) (activeGuardian *api.Guardian, pendingGuardian *api.Guardian, err error) { var active, pending *guardians.Guardian gah := n.bootstrapComponents.GuardedAccountHandler() active, pending, err = gah.GetConfiguredGuardians(userAccount) if err != nil { - return api.GuardianData{}, api.BlockInfo{}, err + return nil, nil, err } - var activeGuardian, pendingGuardian *api.Guardian if active != nil { activeGuardian = &api.Guardian{ Address: n.coreComponents.AddressPubKeyConverter().Encode(active.Address), @@ -347,11 +361,7 @@ func (n *Node) GetGuardianData(address string, options api.AccountQueryOptions) } } - return api.GuardianData{ - ActiveGuardian: activeGuardian, - PendingGuardian: pendingGuardian, - Frozen: userAccount.IsFrozen(), - }, blockInfo, nil + return } // GetESDTData returns the esdt balance and properties from a given account diff --git a/node/node_test.go b/node/node_test.go index d79ce3a495a..e62e9610d1a 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -24,6 +24,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/api" "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/data/esdt" + "github.com/ElrondNetwork/elrond-go-core/data/guardians" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/hashing/sha256" @@ -2213,6 +2214,7 @@ func TestCreateTransaction_AddressPubKeyConverterDecode(t *testing.T) { assert.Nil(t, tx) assert.Nil(t, txHash) + assert.NotNil(t, err) assert.True(t, strings.Contains(err.Error(), "receiver address")) }) @@ -2244,6 +2246,7 @@ func TestCreateTransaction_AddressPubKeyConverterDecode(t *testing.T) { assert.Nil(t, tx) assert.Nil(t, txHash) + assert.NotNil(t, err) assert.True(t, strings.Contains(err.Error(), "sender address")) }) } @@ -4048,6 +4051,114 @@ func TestNode_setTxGuardianData(t *testing.T) { }) } +func TestNode_getPendingAndActiveGuardians(t *testing.T) { + coreComponents := getDefaultCoreComponents() + bootstrapComponents := getDefaultBootstrapComponents() + expectedErr := errors.New("expected err") + g1PubKey := bytes.Repeat([]byte{1}, 32) + g2PubKey := bytes.Repeat([]byte{2}, 32) + g1 := &guardians.Guardian{ + Address: g1PubKey, + ActivationEpoch: 10, + } + g2 := &guardians.Guardian{ + Address: g2PubKey, + ActivationEpoch: 1, + } + + expectedG1 := &api.Guardian{ + Address: coreComponents.AddrPubKeyConv.Encode(g1.Address), + Epoch: g1.ActivationEpoch, + } + expectedG2 := &api.Guardian{ + Address: coreComponents.AddrPubKeyConv.Encode(g2.Address), + Epoch: g2.ActivationEpoch, + } + + t.Run("get configured guardians with error should propagate error", func(t *testing.T) { + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return nil, nil, expectedErr + }, + } + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + + activeGuardian, pendingGuardian, err := n.GetPendingAndActiveGuardians(&stateMock.UserAccountStub{}) + require.Nil(t, activeGuardian) + require.Nil(t, pendingGuardian) + require.Equal(t, expectedErr, err) + }) + t.Run("no pending and no active but no error", func(t *testing.T) { + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return nil, nil, nil + }, + } + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + activeGuardian, pendingGuardian, err := n.GetPendingAndActiveGuardians(&stateMock.UserAccountStub{}) + require.Nil(t, activeGuardian) + require.Nil(t, pendingGuardian) + require.Nil(t, err) + }) + t.Run("one active", func(t *testing.T) { + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return g1, nil, nil + }, + } + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + activeGuardian, pendingGuardian, err := n.GetPendingAndActiveGuardians(&stateMock.UserAccountStub{}) + require.NotNil(t, activeGuardian) + + require.Equal(t, expectedG1, activeGuardian) + require.Nil(t, pendingGuardian) + require.Nil(t, err) + }) + t.Run("one pending", func(t *testing.T) { + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return nil, g1, nil + }, + } + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + activeGuardian, pendingGuardian, err := n.GetPendingAndActiveGuardians(&stateMock.UserAccountStub{}) + require.NotNil(t, pendingGuardian) + require.Equal(t, expectedG1, pendingGuardian) + require.Nil(t, activeGuardian) + require.Nil(t, err) + }) + t.Run("one active one pending", func(t *testing.T) { + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return g1, g2, nil + }, + } + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + + activeGuardian, pendingGuardian, err := n.GetPendingAndActiveGuardians(&stateMock.UserAccountStub{}) + require.NotNil(t, activeGuardian) + require.NotNil(t, pendingGuardian) + require.Equal(t, expectedG2, pendingGuardian) + require.Equal(t, expectedG1, activeGuardian) + require.Nil(t, err) + }) +} + func getDefaultCoreComponents() *nodeMockFactory.CoreComponentsMock { return &nodeMockFactory.CoreComponentsMock{ IntMarsh: &testscommon.MarshalizerMock{}, diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 2d1b7d158ba..28f6e1d6018 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -985,6 +985,99 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { }) } +func TestGuardedAccount_GetConfiguredGuardians(t *testing.T) { + currentEpoch := uint32(10) + g0 := &guardians.Guardian{ + Address: []byte("old guardian"), + ActivationEpoch: currentEpoch - 4, + } + g1 := &guardians.Guardian{ + Address: []byte("active guardian"), + ActivationEpoch: currentEpoch - 2, + } + g2 := &guardians.Guardian{ + Address: []byte("pending guardian"), + ActivationEpoch: currentEpoch + 2, + } + ga := createGuardedAccountWithEpoch(currentEpoch) + + t.Run("unmarshall error", func(t *testing.T) { + t.Parallel() + + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return []byte("wrong data"), nil + }, + } + active, pending, err := ga.GetConfiguredGuardians(acc) + require.Nil(t, active) + require.Nil(t, pending) + require.NotNil(t, err) + }) + t.Run("empty configured guardians", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return nil, expectedErr + }, + } + active, pending, err := ga.GetConfiguredGuardians(acc) + require.Nil(t, active) + require.Nil(t, pending) + require.Nil(t, err) + }) + t.Run("one pending guardian", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g2}} + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + active, pending, err := ga.GetConfiguredGuardians(acc) + require.Nil(t, active) + require.Equal(t, g2, pending) + require.Nil(t, err) + }) + t.Run("one active guardian", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + active, pending, err := ga.GetConfiguredGuardians(acc) + require.Equal(t, g1, active) + require.Nil(t, pending) + require.Nil(t, err) + }) + t.Run("one active and one pending", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1, g2}} + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + active, pending, err := ga.GetConfiguredGuardians(acc) + require.Equal(t, g1, active) + require.Equal(t, g2, pending) + require.Nil(t, err) + }) + t.Run("one old and one active", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g0, g1}} + acc := &stateMocks.UserAccountStub{ + RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + return ga.marshaller.Marshal(configuredGuardians) + }, + } + active, pending, err := ga.GetConfiguredGuardians(acc) + require.Equal(t, g1, active) + require.Nil(t, pending) + require.Nil(t, err) + }) +} + func TestGuardedAccount_EpochConfirmed(t *testing.T) { ga := createGuardedAccountWithEpoch(0) ga.EpochConfirmed(1, 0) From 34251f250b87f5d51f452b487d6bd7418f80bd83 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 30 Aug 2022 11:55:13 +0300 Subject: [PATCH 079/335] node: add unit tests --- node/node_test.go | 194 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) diff --git a/node/node_test.go b/node/node_test.go index e62e9610d1a..900c8f93dc0 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4051,6 +4051,200 @@ func TestNode_setTxGuardianData(t *testing.T) { }) } +func TestNode_GetGuardianData(t *testing.T) { + userAddressBytes := bytes.Repeat([]byte{3}, 32) + acc, _ := state.NewUserAccount(userAddressBytes) + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return acc, nil, nil + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + coreComponents := getDefaultCoreComponents() + dataComponents := getDefaultDataComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + coreComponents.AddrPubKeyConv = createMockPubkeyConverter() + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + userAddress := coreComponents.AddressPubKeyConverter().Encode(userAddressBytes) + g1 := &guardians.Guardian{ + Address: bytes.Repeat([]byte{1}, 32), + ActivationEpoch: 0, + } + g2 := &guardians.Guardian{ + Address: bytes.Repeat([]byte{2}, 32), + ActivationEpoch: 1, + } + apiG1 := &api.Guardian{ + Address: coreComponents.AddressPubKeyConverter().Encode(g1.Address), + Epoch: g1.ActivationEpoch, + } + apiG2 := &api.Guardian{ + Address: coreComponents.AddressPubKeyConverter().Encode(g2.Address), + Epoch: g2.ActivationEpoch, + } + t.Run("error on loadUserAccountHandlerByAddress", func(t *testing.T) { + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return acc, nil, nil + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + guardianData, blockInfo, err := n.GetGuardianData("address", api.AccountQueryOptions{}) + require.Equal(t, api.GuardianData{}, guardianData) + require.Equal(t, api.BlockInfo{}, blockInfo) + require.NotNil(t, err) + require.True(t, strings.Contains(err.Error(), "invalid address")) + }) + t.Run("getPendingAndActiveGuardians with error", func(t *testing.T) { + expectedError := errors.New("expected error") + bootstrapComponents := getDefaultBootstrapComponents() + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return nil, nil, expectedError + }, + } + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) + require.Equal(t, api.GuardianData{}, guardianData) + require.Equal(t, api.BlockInfo{}, blockInfo) + require.Equal(t, expectedError, err) + }) + t.Run("one active", func(t *testing.T) { + bootstrapComponents := getDefaultBootstrapComponents() + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return g1, nil, nil + }, + } + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) + require.Equal(t, api.GuardianData{ + ActiveGuardian: apiG1, + PendingGuardian: nil, + Frozen: false, + }, guardianData) + require.Equal(t, api.BlockInfo{}, blockInfo) + require.Nil(t, err) + }) + t.Run("one pending", func(t *testing.T) { + bootstrapComponents := getDefaultBootstrapComponents() + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return nil, g1, nil + }, + } + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) + require.Equal(t, api.GuardianData{ + ActiveGuardian: nil, + PendingGuardian: apiG1, + Frozen: false, + }, guardianData) + require.Equal(t, api.BlockInfo{}, blockInfo) + require.Nil(t, err) + }) + t.Run("one active and one pending", func(t *testing.T) { + bootstrapComponents := getDefaultBootstrapComponents() + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return g1, g2, nil + }, + } + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) + require.Equal(t, api.GuardianData{ + ActiveGuardian: apiG1, + PendingGuardian: apiG2, + Frozen: false, + }, guardianData) + require.Equal(t, api.BlockInfo{}, blockInfo) + require.Nil(t, err) + }) + t.Run("one active and one pending and account frozen", func(t *testing.T) { + acc, _ := state.NewUserAccount(userAddressBytes) + acc.CodeMetadata = (&vmcommon.CodeMetadata{Frozen: true}).ToBytes() + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return acc, nil, nil + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + bootstrapComponents := getDefaultBootstrapComponents() + bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ + GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + return g1, g2, nil + }, + } + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) + require.Equal(t, api.GuardianData{ + ActiveGuardian: apiG1, + PendingGuardian: apiG2, + Frozen: true, + }, guardianData) + require.Equal(t, api.BlockInfo{}, blockInfo) + require.Nil(t, err) + }) +} + func TestNode_getPendingAndActiveGuardians(t *testing.T) { coreComponents := getDefaultCoreComponents() bootstrapComponents := getDefaultBootstrapComponents() From 585a23aac3d482a0acea2f9575f0a00cddc3bc1e Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 30 Aug 2022 12:24:46 +0300 Subject: [PATCH 080/335] simplify string compare --- api/groups/addressGroup_test.go | 2 +- facade/nodeFacade_test.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index ff6dbe50fde..e66a5c49e45 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -956,7 +956,7 @@ func TestGetGuardianData(t *testing.T) { assert.True(t, strings.Contains(response.Error, expectedErr.Error())) }) - t.Run("OK", func(t *testing.T) { + t.Run("should work", func(t *testing.T) { expectedGuardianData := api.GuardianData{ ActiveGuardian: &api.Guardian{ Address: "guardian1", diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 4a0e58a2bed..ec80f60a562 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "math/big" - "strings" "sync/atomic" "testing" "time" @@ -698,7 +697,7 @@ func TestNodeFacade_GetGuardianData(t *testing.T) { } arg.Node = &mock.NodeStub{ GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { - if strings.Compare(testAddress, address) == 0 { + if testAddress == address { return expectedGuardianData, api.BlockInfo{}, nil } return emptyGuardianData, api.BlockInfo{}, expectedErr From 60bcc01df6f7ad7a1f0cc3bebd6fdae2e58e64bd Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 30 Aug 2022 18:19:44 +0300 Subject: [PATCH 081/335] update gomod gosum --- go.mod | 2 +- go.sum | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 669ad536a81..62d2c12cce6 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220826090131-09d9dba97612 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 - github.com/ElrondNetwork/elrond-vm-common v1.3.15-0.20220823131107-727e254268b6 + github.com/ElrondNetwork/elrond-vm-common v1.3.16-0.20220830135147-b69441f225cb github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 github.com/beevik/ntp v0.3.0 github.com/btcsuite/btcd v0.22.0-beta diff --git a/go.sum b/go.sum index 17adc60395b..45d12a3b932 100644 --- a/go.sum +++ b/go.sum @@ -55,8 +55,8 @@ github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04 github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6 h1:+LNKItUc+Pb7WuTbil3VuiLMmdQ1AY7lBJM476PtVNE= github.com/ElrondNetwork/covalent-indexer-go v1.0.6/go.mod h1:j3h2g96vqhJAuj3aEX2PWhomae2/o7YfXGEfweNXEeQ= -github.com/ElrondNetwork/elastic-indexer-go v1.2.38 h1:jnS8b3dAXidZptPCpmFBEWMZmJTkfaQyqBP+0Qzxap4= -github.com/ElrondNetwork/elastic-indexer-go v1.2.38/go.mod h1:w+J48ssy1kxOawG2lwiOUR4JYPA092g8Zjk88kRVDNA= +github.com/ElrondNetwork/elastic-indexer-go v1.2.39 h1:NnhTF6yVnzAQNC7JibeGvR3anUSiA1I5UbWU9sn/U5E= +github.com/ElrondNetwork/elastic-indexer-go v1.2.39/go.mod h1:w+J48ssy1kxOawG2lwiOUR4JYPA092g8Zjk88kRVDNA= github.com/ElrondNetwork/elrond-go-core v1.0.0/go.mod h1:FQMem7fFF4+8pQ6lVsBZq6yO+smD0nV23P4bJpmPjTo= github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoCDXzGmUrRVusMomhK/Y3g= github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= @@ -74,8 +74,9 @@ github.com/ElrondNetwork/elrond-go-logger v1.0.7/go.mod h1:cBfgx0ST/CJx8jrxJSC5a github.com/ElrondNetwork/elrond-vm-common v1.1.0/go.mod h1:w3i6f8uiuRkE68Ie/gebRcLgTuHqvruJSYrFyZWuLrE= github.com/ElrondNetwork/elrond-vm-common v1.2.9/go.mod h1:B/Y8WiqHyDd7xsjNYsaYbVMp1jQgQ+z4jTJkFvj/EWI= github.com/ElrondNetwork/elrond-vm-common v1.3.7/go.mod h1:seROQuR7RJCoCS7mgRXVAlvjztltY1c+UroAgWr/USE= -github.com/ElrondNetwork/elrond-vm-common v1.3.15-0.20220823131107-727e254268b6 h1:AbFcZLyeWlPBCMgWwBKvsDGj2/kU5+/QFCwDrs0Ker8= github.com/ElrondNetwork/elrond-vm-common v1.3.15-0.20220823131107-727e254268b6/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= +github.com/ElrondNetwork/elrond-vm-common v1.3.16-0.20220830135147-b69441f225cb h1:M6VetGiwatB1qIH2Jfs0NxhKnRk0l/kgJNgKENxRQDA= +github.com/ElrondNetwork/elrond-vm-common v1.3.16-0.20220830135147-b69441f225cb/go.mod h1:MytqqfkrTb1CLIMRVY6ayAwLe6P8Rleey0tSvSQcljA= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1 h1:Nu/uwYQg/QbfoQ0uD6GahYTwgtAkAwtzsB0HVfSP58I= github.com/ElrondNetwork/go-libp2p-pubsub v0.6.1-rc1/go.mod h1:pJfaShe+i5aWZx8NhSkQjvOYQYLoqPztmFUlKjToOzM= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= From e137d1739263a1bae27b02e0a304403378067c63 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 31 Aug 2022 10:58:00 +0300 Subject: [PATCH 082/335] process: fix linter issues --- process/guardedtx/guardedTxVerifier_test.go | 10 +++++----- process/guardian/guardedAccount.go | 12 ++++-------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index c12828d2525..3a26a9fc3b7 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -38,35 +38,35 @@ func TestNewGuardedTxSigVerifier(t *testing.T) { } t.Run("nil guardian sig verifier ", func(t *testing.T) { - changedArgs := *&args + changedArgs := args changedArgs.SigVerifier = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilSingleSigner, err) require.True(t, check.IfNil(gtxSigVerifier)) }) t.Run("nil guardian checker", func(t *testing.T) { - changedArgs := *&args + changedArgs := args changedArgs.GuardianChecker = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilGuardianChecker, err) require.True(t, check.IfNil(gtxSigVerifier)) }) t.Run("nil public key converter", func(t *testing.T) { - changedArgs := *&args + changedArgs := args changedArgs.PubKeyConverter = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilPubkeyConverter, err) require.True(t, check.IfNil(gtxSigVerifier)) }) t.Run("nil marshaller", func(t *testing.T) { - changedArgs := *&args + changedArgs := args changedArgs.Marshaller = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilMarshalizer, err) require.True(t, check.IfNil(gtxSigVerifier)) }) t.Run("nil keyGen", func(t *testing.T) { - changedArgs := *&args + changedArgs := args changedArgs.KeyGen = nil gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) require.Equal(t, process.ErrNilKeyGen, err) diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 35ce6e3c52d..799ee2a0fca 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -94,10 +94,8 @@ func (agc *guardedAccount) HasActiveGuardian(uah state.UserAccountHandler) bool return false } _, err = agc.getActiveGuardian(configuredGuardians) - if err != nil { - return false - } - return true + + return err == nil } // HasPendingGuardian return true if the account has a pending guardian, false otherwise @@ -112,10 +110,8 @@ func (agc *guardedAccount) HasPendingGuardian(uah state.UserAccountHandler) bool } _, err = agc.getPendingGuardian(configuredGuardians) - if err != nil { - return false - } - return true + + return err == nil } // SetGuardian sets a guardian for an account From e0f39db6f2b85e0894f6850f6b896e461d4fbe7e Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 31 Aug 2022 11:22:27 +0300 Subject: [PATCH 083/335] process: remove unused field --- process/transaction/interceptedTransaction.go | 1 - 1 file changed, 1 deletion(-) diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index cb706e96a32..b52482a3c52 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -42,7 +42,6 @@ type InterceptedTransaction struct { sndShard uint32 isForCurrentShard bool enableSignedTxWithHash bool - guardianPubKey []byte } // NewInterceptedTransaction returns a new instance of InterceptedTransaction From 58fa0d3b876cc6fa260ad0f5ed9de5667a4edb31 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 31 Aug 2022 16:57:18 +0300 Subject: [PATCH 084/335] process: fix get pending guardian --- process/guardian/guardedAccount.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 799ee2a0fca..2cc0e2dcb75 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -308,7 +308,7 @@ func (agc *guardedAccount) getPendingGuardian(gs *guardians.Guardians) (*guardia if guardian == nil { continue } - if guardian.ActivationEpoch < agc.currentEpoch { + if guardian.ActivationEpoch <= agc.currentEpoch { continue } return guardian, nil From cab64480224dcf85cfaef462be1b461f6365cd89 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 31 Aug 2022 17:53:38 +0300 Subject: [PATCH 085/335] api, node, facade: update api guardian fieldname --- api/groups/addressGroup_test.go | 4 ++-- facade/nodeFacade_test.go | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- node/node.go | 8 ++++---- node/node_test.go | 8 ++++---- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index e66a5c49e45..e665d17f5c2 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -960,11 +960,11 @@ func TestGetGuardianData(t *testing.T) { expectedGuardianData := api.GuardianData{ ActiveGuardian: &api.Guardian{ Address: "guardian1", - Epoch: 0, + ActivationEpoch: 0, }, PendingGuardian: &api.Guardian{ Address: "guardian2", - Epoch: 10, + ActivationEpoch: 10, }, Frozen: true, } diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index ec80f60a562..706b734a10e 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -687,11 +687,11 @@ func TestNodeFacade_GetGuardianData(t *testing.T) { expectedGuardianData := api.GuardianData{ ActiveGuardian: &api.Guardian{ Address: "guardian1", - Epoch: 0, + ActivationEpoch: 0, }, PendingGuardian: &api.Guardian{ Address: "guardian2", - Epoch: 10, + ActivationEpoch: 10, }, Frozen: true, } diff --git a/go.mod b/go.mod index 62d2c12cce6..535c4f5a6c5 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.39 - github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220826090131-09d9dba97612 + github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220831143637-7057edfa2d4e github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 github.com/ElrondNetwork/elrond-vm-common v1.3.16-0.20220830135147-b69441f225cb diff --git a/go.sum b/go.sum index 45d12a3b932..6dc7a7e82a6 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.16-0.20220414130405-e3cc29bc7711/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220826090131-09d9dba97612 h1:FlYipmdMSFZr0asbAJOHwcXrNBpQ07jrSXevUK4pUCU= -github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220826090131-09d9dba97612/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220831143637-7057edfa2d4e h1:IlLgEcn7LK5rzHJNxU/NY5rl4dJk3ACH8gVlivGYP8M= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220831143637-7057edfa2d4e/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= diff --git a/node/node.go b/node/node.go index 355819b7014..16da264de21 100644 --- a/node/node.go +++ b/node/node.go @@ -350,14 +350,14 @@ func (n *Node) getPendingAndActiveGuardians( if active != nil { activeGuardian = &api.Guardian{ - Address: n.coreComponents.AddressPubKeyConverter().Encode(active.Address), - Epoch: active.ActivationEpoch, + Address: n.coreComponents.AddressPubKeyConverter().Encode(active.Address), + ActivationEpoch: active.ActivationEpoch, } } if pending != nil { pendingGuardian = &api.Guardian{ - Address: n.coreComponents.AddressPubKeyConverter().Encode(pending.Address), - Epoch: pending.ActivationEpoch, + Address: n.coreComponents.AddressPubKeyConverter().Encode(pending.Address), + ActivationEpoch: pending.ActivationEpoch, } } diff --git a/node/node_test.go b/node/node_test.go index 900c8f93dc0..478c20a2452 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4086,11 +4086,11 @@ func TestNode_GetGuardianData(t *testing.T) { } apiG1 := &api.Guardian{ Address: coreComponents.AddressPubKeyConverter().Encode(g1.Address), - Epoch: g1.ActivationEpoch, + ActivationEpoch: g1.ActivationEpoch, } apiG2 := &api.Guardian{ Address: coreComponents.AddressPubKeyConverter().Encode(g2.Address), - Epoch: g2.ActivationEpoch, + ActivationEpoch: g2.ActivationEpoch, } t.Run("error on loadUserAccountHandlerByAddress", func(t *testing.T) { accDB := &stateMock.AccountsStub{ @@ -4262,11 +4262,11 @@ func TestNode_getPendingAndActiveGuardians(t *testing.T) { expectedG1 := &api.Guardian{ Address: coreComponents.AddrPubKeyConv.Encode(g1.Address), - Epoch: g1.ActivationEpoch, + ActivationEpoch: g1.ActivationEpoch, } expectedG2 := &api.Guardian{ Address: coreComponents.AddrPubKeyConv.Encode(g2.Address), - Epoch: g2.ActivationEpoch, + ActivationEpoch: g2.ActivationEpoch, } t.Run("get configured guardians with error should propagate error", func(t *testing.T) { From f31e0d62aadf7c511f6ae92a6472df8fdb21c910 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 1 Sep 2022 11:29:16 +0300 Subject: [PATCH 086/335] update elrond-go-core version --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 535c4f5a6c5..48e795f0062 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.39 - github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220831143637-7057edfa2d4e + github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107 github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 github.com/ElrondNetwork/elrond-vm-common v1.3.16-0.20220830135147-b69441f225cb From 925f26245a35d50e85a91e4f90a96171f1205740 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 1 Sep 2022 11:33:46 +0300 Subject: [PATCH 087/335] update gosum --- go.sum | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index 6dc7a7e82a6..60329e07217 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.16-0.20220414130405-e3cc29bc7711/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220831143637-7057edfa2d4e h1:IlLgEcn7LK5rzHJNxU/NY5rl4dJk3ACH8gVlivGYP8M= -github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220831143637-7057edfa2d4e/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107 h1:ix56Y1zvTenyEEJ5ujUrPbZrC7w3UxB6oTDTFXC8Ydo= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= From 9ef906f6f4d25abe7398e1d70fc519056e3edec1 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Fri, 2 Sep 2022 09:07:31 +0300 Subject: [PATCH 088/335] refactor GetDataForSigning for transaction --- examples/construction_test.go | 4 +++- go.mod | 2 +- go.sum | 4 ++-- .../multiShard/relayedTx/common.go | 6 +++--- .../transaction/txRouting/txRouting_test.go | 4 ++-- .../multiShard/txScenarios/common.go | 2 +- .../interceptedBulkTx_test.go | 4 ++-- .../interceptedResolvedTx_test.go | 2 +- integrationTests/testInitializer.go | 8 ++++---- integrationTests/testNetwork.go | 2 +- node/nodeTesting.go | 6 +++--- process/transaction/interceptedTransaction.go | 20 +++++++------------ 12 files changed, 30 insertions(+), 34 deletions(-) diff --git a/examples/construction_test.go b/examples/construction_test.go index e334036a05f..ffa5cd78d58 100644 --- a/examples/construction_test.go +++ b/examples/construction_test.go @@ -12,6 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing/blake2b" + "github.com/ElrondNetwork/elrond-go-core/hashing/keccak" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" @@ -22,6 +23,7 @@ import ( var ( addressEncoder, _ = pubkeyConverter.NewBech32PubkeyConverter(32, &mock.LoggerMock{}) signingMarshalizer = &marshal.JsonMarshalizer{} + txSignHasher = keccak.NewKeccak() signer = &singlesig.Ed25519Signer{} signingCryptoSuite = ed25519.NewEd25519() contentMarshalizer = &marshal.GogoProtoMarshalizer{} @@ -189,7 +191,7 @@ func computeTransactionSignature(t *testing.T, senderSeedHex string, tx *transac privateKey, err := keyGenerator.PrivateKeyFromByteArray(senderSeed) require.Nil(t, err) - dataToSign, err := tx.GetDataForSigning(addressEncoder, signingMarshalizer) + dataToSign, err := tx.GetDataForSigning(addressEncoder, signingMarshalizer, txSignHasher) require.Nil(t, err) signature, err := signer.Sign(privateKey, dataToSign) diff --git a/go.mod b/go.mod index 48e795f0062..9e21df72c3c 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.39 - github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107 + github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902054231-105aeac7cd6c github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 github.com/ElrondNetwork/elrond-vm-common v1.3.16-0.20220830135147-b69441f225cb diff --git a/go.sum b/go.sum index 60329e07217..da153bf0175 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,8 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.16-0.20220414130405-e3cc29bc7711/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= -github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107 h1:ix56Y1zvTenyEEJ5ujUrPbZrC7w3UxB6oTDTFXC8Ydo= -github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902054231-105aeac7cd6c h1:pP3TSR2LY4PTPgT13rmt4n/T9Rr2Nlte7bcphG3AWn4= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902054231-105aeac7cd6c/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= diff --git a/integrationTests/multiShard/relayedTx/common.go b/integrationTests/multiShard/relayedTx/common.go index e750c9d6f61..97f2a8a5c9f 100644 --- a/integrationTests/multiShard/relayedTx/common.go +++ b/integrationTests/multiShard/relayedTx/common.go @@ -115,7 +115,7 @@ func createUserTx( ChainID: integrationTests.ChainID, Version: integrationTests.MinTransactionVersion, } - txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer, integrationTests.TestTxSignHasher) tx.Signature, _ = player.SingleSigner.Sign(player.SkTxSign, txBuff) player.Nonce++ return tx @@ -142,7 +142,7 @@ func createRelayedTx( gasLimit := economicsFee.ComputeGasLimit(tx) tx.GasLimit = userTx.GasLimit + gasLimit - txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer, integrationTests.TestTxSignHasher) tx.Signature, _ = relayer.SingleSigner.Sign(relayer.SkTxSign, txBuff) relayer.Nonce++ txFee := economicsFee.ComputeTxFee(tx) @@ -179,7 +179,7 @@ func createRelayedTxV2( gasLimit := economicsFee.ComputeGasLimit(tx) tx.GasLimit = gasLimitForUserTx + gasLimit - txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer, integrationTests.TestTxSignHasher) tx.Signature, _ = relayer.SingleSigner.Sign(relayer.SkTxSign, txBuff) relayer.Nonce++ txFee := economicsFee.ComputeTxFee(tx) diff --git a/integrationTests/multiShard/transaction/txRouting/txRouting_test.go b/integrationTests/multiShard/transaction/txRouting/txRouting_test.go index fdbe87b4ffa..09228ddfc2e 100644 --- a/integrationTests/multiShard/transaction/txRouting/txRouting_test.go +++ b/integrationTests/multiShard/transaction/txRouting/txRouting_test.go @@ -1,6 +1,7 @@ package txRouting import ( + "crypto" "encoding/hex" "fmt" "math/big" @@ -9,7 +10,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/transaction" - "github.com/ElrondNetwork/elrond-go-crypto" ed25519SingleSig "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/stretchr/testify/assert" @@ -148,7 +148,7 @@ func generateTx(sender crypto.PrivateKey, receiver crypto.PublicKey, nonce uint6 Signature: nil, Version: integrationTests.MinTransactionVersion, } - marshalizedTxBeforeSigning, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer) + marshalizedTxBeforeSigning, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer, integrationTests.TestTxSignHasher) signer := ed25519SingleSig.Ed25519Signer{} signature, _ := signer.Sign(sender, marshalizedTxBeforeSigning) diff --git a/integrationTests/multiShard/txScenarios/common.go b/integrationTests/multiShard/txScenarios/common.go index 4990d1f936d..87833bac5fe 100644 --- a/integrationTests/multiShard/txScenarios/common.go +++ b/integrationTests/multiShard/txScenarios/common.go @@ -109,7 +109,7 @@ func createUserTx( ChainID: integrationTests.ChainID, Version: integrationTests.MinTransactionVersion, } - txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer, integrationTests.TestTxSignHasher) tx.Signature, _ = player.SingleSigner.Sign(player.SkTxSign, txBuff) player.Nonce++ return tx diff --git a/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go b/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go index ec24baaa944..357095fa8c7 100644 --- a/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go +++ b/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go @@ -1,6 +1,7 @@ package interceptedBulkTx import ( + "crypto" "encoding/base64" "errors" "fmt" @@ -11,7 +12,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/transaction" - "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/ElrondNetwork/elrond-go/process" "github.com/stretchr/testify/assert" @@ -140,7 +140,7 @@ func TestNode_SendTransactionFromAnUnmintedAccountShouldReturnErrorAtApiLevel(t Version: integrationTests.MinTransactionVersion, } - txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer, integrationTests.TestTxSignHasher) tx.Signature, _ = node.OwnAccount.SingleSigner.Sign(node.OwnAccount.SkTxSign, txBuff) err := node.Node.ValidateTransaction(tx) diff --git a/integrationTests/singleShard/transaction/interceptedResolvedTx/interceptedResolvedTx_test.go b/integrationTests/singleShard/transaction/interceptedResolvedTx/interceptedResolvedTx_test.go index ff40c1cf7ea..7ae3d33a895 100644 --- a/integrationTests/singleShard/transaction/interceptedResolvedTx/interceptedResolvedTx_test.go +++ b/integrationTests/singleShard/transaction/interceptedResolvedTx/interceptedResolvedTx_test.go @@ -64,7 +64,7 @@ func TestNode_RequestInterceptTransactionWithMessengerAndWhitelist(t *testing.T) Version: integrationTests.MinTransactionVersion, } - txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(integrationTests.TestAddressPubkeyConverter, integrationTests.TestTxSignMarshalizer, integrationTests.TestTxSignHasher) signer := &ed25519SingleSig.Ed25519Signer{} tx.Signature, _ = signer.Sign(nRequester.OwnAccount.SkTxSign, txBuff) signedTxBuff, _ := integrationTests.TestMarshalizer.Marshal(&tx) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index c11935af4f9..4edd3100dff 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -1641,7 +1641,7 @@ func CreateAndSendTransaction( Version: MinTransactionVersion, } - txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer, TestTxSignHasher) tx.Signature, _ = node.OwnAccount.SingleSigner.Sign(node.OwnAccount.SkTxSign, txBuff) senderShardID := node.ShardCoordinator.ComputeId(node.OwnAccount.Address) @@ -1688,7 +1688,7 @@ func CreateAndSendTransactionWithGasLimit( Version: version, } - txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer, TestTxSignHasher) tx.Signature, _ = node.OwnAccount.SingleSigner.Sign(node.OwnAccount.SkTxSign, txBuff) _, _ = node.SendTransaction(tx) @@ -1729,7 +1729,7 @@ func GenerateTransferTx( ChainID: chainID, Version: version, } - txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer, TestTxSignHasher) signer := &ed25519SingleSig.Ed25519Signer{} tx.Signature, _ = signer.Sign(senderPrivateKey, txBuff) @@ -1752,7 +1752,7 @@ func generateTx( ChainID: ChainID, Version: MinTransactionVersion, } - txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer) + txBuff, _ := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer, TestTxSignHasher) tx.Signature, _ = signer.Sign(skSign, txBuff) return tx diff --git a/integrationTests/testNetwork.go b/integrationTests/testNetwork.go index 251944aa7b9..0ba8c52b70f 100644 --- a/integrationTests/testNetwork.go +++ b/integrationTests/testNetwork.go @@ -308,7 +308,7 @@ func (net *TestNetwork) CreateTx( // SignTx signs a transaction with the provided `signer` wallet. func (net *TestNetwork) SignTx(signer *TestWalletAccount, tx *transaction.Transaction) { - txBuff, err := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer) + txBuff, err := tx.GetDataForSigning(TestAddressPubkeyConverter, TestTxSignMarshalizer, TestTxSignHasher) net.handleOrBypassError(err) signature, err := signer.SingleSigner.Sign(signer.SkTxSign, txBuff) diff --git a/node/nodeTesting.go b/node/nodeTesting.go index 209d1dd169e..b4bf7369e99 100644 --- a/node/nodeTesting.go +++ b/node/nodeTesting.go @@ -11,7 +11,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/partitioning" "github.com/ElrondNetwork/elrond-go-core/data/batch" "github.com/ElrondNetwork/elrond-go-core/data/transaction" - "github.com/ElrondNetwork/elrond-go-crypto" + crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/process/factory" "github.com/ElrondNetwork/elrond-go/process/txsSender" @@ -227,12 +227,12 @@ func (n *Node) generateAndSignSingleTx( Version: minTxVersion, } - marshalizedTx, err := tx.GetDataForSigning(n.coreComponents.AddressPubKeyConverter(), n.coreComponents.TxMarshalizer()) + txSigningData, err := tx.GetDataForSigning(n.coreComponents.AddressPubKeyConverter(), n.coreComponents.TxMarshalizer(), n.coreComponents.TxSignHasher()) if err != nil { return nil, nil, errors.New("could not marshal transaction") } - sig, err := n.cryptoComponents.TxSingleSigner().Sign(sk, marshalizedTx) + sig, err := n.cryptoComponents.TxSingleSigner().Sign(sk, txSigningData) if err != nil { return nil, nil, errors.New("could not sign the transaction") } diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index b52482a3c52..2beab56ff7b 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -12,7 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go-crypto" + crypto "github.com/ElrondNetwork/elrond-go-crypto" logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" @@ -365,22 +365,16 @@ func (inTx *InterceptedTransaction) verifySig(tx *transaction.Transaction) error } func (inTx *InterceptedTransaction) getTxMessageForGivenTx(tx *transaction.Transaction) ([]byte, error) { - buffCopiedTx, err := tx.GetDataForSigning(inTx.pubkeyConv, inTx.signMarshalizer) - if err != nil { - return nil, err - } - - if !inTx.txVersionChecker.IsSignedWithHash(tx) { - return buffCopiedTx, nil - } - - if !inTx.enableSignedTxWithHash { + if inTx.txVersionChecker.IsSignedWithHash(tx) && !inTx.enableSignedTxWithHash { return nil, process.ErrTransactionSignedWithHashIsNotEnabled } - txHash := inTx.txSignHasher.Compute(string(buffCopiedTx)) + txSigningData, err := tx.GetDataForSigning(inTx.pubkeyConv, inTx.signMarshalizer, inTx.txSignHasher) + if err != nil { + return nil, err + } - return txHash, nil + return txSigningData, nil } // GetTxMessageForSignatureVerification returns the transaction data that the signature needs to be verified on From 32301754ea810f742d4d1b8253fd8e1022b6ff38 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Fri, 2 Sep 2022 09:18:53 +0300 Subject: [PATCH 089/335] fix crypto imports --- .../multiShard/transaction/txRouting/txRouting_test.go | 2 +- .../transaction/interceptedBulkTx/interceptedBulkTx_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrationTests/multiShard/transaction/txRouting/txRouting_test.go b/integrationTests/multiShard/transaction/txRouting/txRouting_test.go index 09228ddfc2e..5ecc5d44a35 100644 --- a/integrationTests/multiShard/transaction/txRouting/txRouting_test.go +++ b/integrationTests/multiShard/transaction/txRouting/txRouting_test.go @@ -1,7 +1,6 @@ package txRouting import ( - "crypto" "encoding/hex" "fmt" "math/big" @@ -10,6 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/transaction" + crypto "github.com/ElrondNetwork/elrond-go-crypto" ed25519SingleSig "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/stretchr/testify/assert" diff --git a/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go b/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go index 357095fa8c7..2d79e39c2ac 100644 --- a/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go +++ b/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go @@ -1,7 +1,6 @@ package interceptedBulkTx import ( - "crypto" "encoding/base64" "errors" "fmt" @@ -12,6 +11,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/transaction" + crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/ElrondNetwork/elrond-go/process" "github.com/stretchr/testify/assert" From 689892e0cd213a7c0f9c3a330b5c346d857786ff Mon Sep 17 00:00:00 2001 From: ssd04 Date: Fri, 2 Sep 2022 10:34:51 +0300 Subject: [PATCH 090/335] update core reference: fix guarded handler transation - added hasher field --- go.mod | 2 +- go.sum | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 9e21df72c3c..4be342bfd8d 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/ElrondNetwork/concurrent-map v0.1.3 github.com/ElrondNetwork/covalent-indexer-go v1.0.6 github.com/ElrondNetwork/elastic-indexer-go v1.2.39 - github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902054231-105aeac7cd6c + github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902073302-7ec2dddbca2c github.com/ElrondNetwork/elrond-go-crypto v1.0.1 github.com/ElrondNetwork/elrond-go-logger v1.0.7 github.com/ElrondNetwork/elrond-vm-common v1.3.16-0.20220830135147-b69441f225cb diff --git a/go.sum b/go.sum index da153bf0175..9d05b2f6f81 100644 --- a/go.sum +++ b/go.sum @@ -62,8 +62,12 @@ github.com/ElrondNetwork/elrond-go-core v1.1.7/go.mod h1:O9FkkTT2H9kxCzfn40TbhoC github.com/ElrondNetwork/elrond-go-core v1.1.15-0.20220517131228-41edc685421f/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.16-0.20220414130405-e3cc29bc7711/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220825075514-8e8d8ff0312b/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107 h1:ix56Y1zvTenyEEJ5ujUrPbZrC7w3UxB6oTDTFXC8Ydo= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220901061429-fc1143a4a107/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902054231-105aeac7cd6c h1:pP3TSR2LY4PTPgT13rmt4n/T9Rr2Nlte7bcphG3AWn4= github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902054231-105aeac7cd6c/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902073302-7ec2dddbca2c h1:cZJVhs2QB95ZpkWSRBI5DCds5a4Bn+4itZf2tZDzB8E= +github.com/ElrondNetwork/elrond-go-core v1.1.20-0.20220902073302-7ec2dddbca2c/go.mod h1:Yz8JK5sGBctw7+gU8j2mZHbzQ09Ek4XHJ4Uinq1N6nM= github.com/ElrondNetwork/elrond-go-crypto v1.0.0/go.mod h1:DGiR7/j1xv729Xg8SsjYaUzWXL5svMd44REXjWS/gAc= github.com/ElrondNetwork/elrond-go-crypto v1.0.1 h1:xJUUshIZQ7h+rG7Art/9QHVyaPRV1wEjrxXYBdpmRlM= github.com/ElrondNetwork/elrond-go-crypto v1.0.1/go.mod h1:uunsvweBrrhVojL8uiQSaTPsl3YIQ9iBqtYGM6xs4s0= From 478592f7ac43d80c2f633613e1da810be945f751 Mon Sep 17 00:00:00 2001 From: ssd04 Date: Fri, 9 Sep 2022 13:44:13 +0300 Subject: [PATCH 091/335] gas scheduleV6: added freeze account and guardian fields --- cmd/node/config/gasSchedules/gasScheduleV6.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/node/config/gasSchedules/gasScheduleV6.toml b/cmd/node/config/gasSchedules/gasScheduleV6.toml index e3d78bb7308..8bb4caca5fe 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV6.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV6.toml @@ -15,6 +15,8 @@ ESDTNFTAddUri = 50000 ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 + SetGuardian = 250000 + FreezeAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 From 2ebe98fc138c124516cc7cc903401fbddd9faa2f Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 2 Dec 2022 14:02:58 +0200 Subject: [PATCH 092/335] update gomod after merges --- go.mod | 10 +++++----- go.sum | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 91396bdb2b3..9d62e48e2d4 100644 --- a/go.mod +++ b/go.mod @@ -4,15 +4,15 @@ go 1.17 require ( github.com/ElrondNetwork/elastic-indexer-go v1.3.3 - github.com/ElrondNetwork/elrond-go-core v1.1.26 + github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221128163152-4b8ad7af81f6 github.com/ElrondNetwork/elrond-go-crypto v1.2.2 github.com/ElrondNetwork/elrond-go-logger v1.0.10 github.com/ElrondNetwork/elrond-go-p2p v1.0.5 github.com/ElrondNetwork/elrond-go-storage v1.0.4 - github.com/ElrondNetwork/elrond-vm-common v1.3.27 - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.47 - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.47 - github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.66 + github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221129104037-fa2c7a8d2b30 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221129104732-5b44c1047940 + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221129105202-b9c1eb97eb0f + github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221129130511-5325130db086 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index 3e5fa02db64..39ca049f4a1 100644 --- a/go.sum +++ b/go.sum @@ -48,8 +48,9 @@ github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04 github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= github.com/ElrondNetwork/elastic-indexer-go v1.3.3 h1:RgJ043yt92PUWMbSAQHRrC+GiyNnFdwdM/kseHlpLoo= github.com/ElrondNetwork/elastic-indexer-go v1.3.3/go.mod h1:E3VO5712GkGSGYnOTJ+0wxW74JXgjV6XCRPlcHiTTK0= -github.com/ElrondNetwork/elrond-go-core v1.1.26 h1:5syiJMlkWlH7HHnuiOafJJzeI+oUfYqL8mXREqrFerY= github.com/ElrondNetwork/elrond-go-core v1.1.26/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= +github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221128163152-4b8ad7af81f6 h1:CVd3T+JFBoKNibSZvVarlf9xlHzDC8j2XBD+wth6dAk= +github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221128163152-4b8ad7af81f6/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= github.com/ElrondNetwork/elrond-go-crypto v1.2.2 h1:Q59dZUeyibuskq5vjgk3ng/87ifOcd9YZMTnlYJAuIU= github.com/ElrondNetwork/elrond-go-crypto v1.2.2/go.mod h1:MyQPKUKti7Axnx/eihhL0F2jLTalvSV/Ytv1mIxvYyM= github.com/ElrondNetwork/elrond-go-logger v1.0.10 h1:2xQOWZErcHW5sl9qSRO+7mGNw+QhFhqiUlLLtOgvuuk= @@ -59,16 +60,17 @@ github.com/ElrondNetwork/elrond-go-p2p v1.0.5/go.mod h1:yCdKTQWNHNKrrQAK5xx1uQT0 github.com/ElrondNetwork/elrond-go-storage v1.0.2/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34= github.com/ElrondNetwork/elrond-go-storage v1.0.4 h1:esyXbHQvlR6m4HGeC86Nq0xAJ74+QG9EnUgfG+wQDYQ= github.com/ElrondNetwork/elrond-go-storage v1.0.4/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34= -github.com/ElrondNetwork/elrond-vm-common v1.3.27 h1:8LYa2ZCPYUXeb7USIWPHUnQnELtSyDKxmSr4QBiAYJg= github.com/ElrondNetwork/elrond-vm-common v1.3.27/go.mod h1:3GKLv9hUFYEVxoBgtaCmaZo9HMNfKN9mM/O/xX83Rbw= +github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221129104037-fa2c7a8d2b30 h1:mvjKr242mZK/X9/+S6cmFML8lsyG2voxL7bDpGLYj48= +github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221129104037-fa2c7a8d2b30/go.mod h1:o9lFg2B6ZAMrYZcbdqhb/LOQWxKGzoNBKc0ArMwiLD8= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.47 h1:UxMYROy2ylOqXwMvGREs0UHHf4/wJfNY6E21SxHa8JA= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.47/go.mod h1:DulHGlo7LYDUsfMBvewEjPQEpqt90/c+EFeMhUsPSPk= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.47 h1:20bXseK7yJGpGhzVfXZ4+r4hafxOz+vs6m4dARpIQeI= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.47/go.mod h1:TRyWLAzHClyK3aQbQFkBz3FPC7tzksOsjvkAWqt8pE0= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.66 h1:p5yTv9aRkggCURVrd4Whv4BQ93TAiYoUN5zIVm7Mof8= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.66/go.mod h1:aB8zHFK9n5tEy3M0GF8Pc8rJooqy34yTe2d/EH0I1K4= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221129104732-5b44c1047940 h1:ETc0zYNSVUDmZ91+HesC2ljr1Sp+bz7tf1Mf5HwJEtM= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221129104732-5b44c1047940/go.mod h1:gWZjAgqUcI6XXV76fMLyspYJUgiXCsmZMAHwUsu3Vn4= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221129105202-b9c1eb97eb0f h1:hpXxDt09WE+rNHWS1/JbQIZrkLy7galsxJHBdeLVhTU= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221129105202-b9c1eb97eb0f/go.mod h1:6xyi6knkzWjypN3rD6Hd8sYuBTE/3QInjC0+9fm53Ec= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221129130511-5325130db086 h1:wEntMY5Wn1tVZBtk/YamjIye+7Zww4BBlYd2b+J0TyA= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221129130511-5325130db086/go.mod h1:sXz+Ljb1KnVZaVH+FQqKDarubE+392TWZHcS0GCM4F8= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= @@ -198,7 +200,6 @@ github.com/gin-contrib/pprof v1.4.0 h1:XxiBSf5jWZ5i16lNOPbMTVdgHBdhfGRD5PZ1LWazz github.com/gin-contrib/pprof v1.4.0/go.mod h1:RrehPJasUVBPK6yTUwOl8/NP6i0vbUgmxtis+Z5KE90= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.8.0/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/gizak/termui/v3 v3.1.0 h1:ZZmVDgwHl7gR7elfKf1xc4IudXZ5qqfDh4wExk4Iajc= From d506f71432e5d7f6241a81c93d5b16293269df89 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 2 Dec 2022 14:11:24 +0200 Subject: [PATCH 093/335] fixes unit tests after merge --- .../factory/metachain/preProcessorsContainerFactory_test.go | 2 +- testscommon/components/configs.go | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/process/factory/metachain/preProcessorsContainerFactory_test.go b/process/factory/metachain/preProcessorsContainerFactory_test.go index 954a0571d03..a71f0047624 100644 --- a/process/factory/metachain/preProcessorsContainerFactory_test.go +++ b/process/factory/metachain/preProcessorsContainerFactory_test.go @@ -9,7 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" - "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks"" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" storageStubs "github.com/ElrondNetwork/elrond-go/testscommon/storage" diff --git a/testscommon/components/configs.go b/testscommon/components/configs.go index 7da20a44545..ce01705abc0 100644 --- a/testscommon/components/configs.go +++ b/testscommon/components/configs.go @@ -168,6 +168,7 @@ func GetGeneralConfig() config.Config { ChainID: "undefined", MinTransactionVersion: 1, GenesisMaxNumberOfShards: 3, + SetGuardianEpochsDelay: 20, }, Marshalizer: config.MarshalizerConfig{ Type: TestMarshalizer, @@ -260,11 +261,13 @@ func CreateDummyEconomicsConfig() config.EconomicsConfig { MaxGasLimitPerMetaMiniBlock: "15000000000", MaxGasLimitPerTx: "1500000000", MinGasLimit: "50000", + ExtraGasLimitGuardedTx: "50000", }, }, MinGasPrice: "1000000000", GasPerDataByte: "1500", GasPriceModifier: 1, + MaxGasPriceSetGuardian: "100000", }, } } From 605833ff31f97afb08463e573177cb2237dbca1b Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 2 Dec 2022 15:33:31 +0200 Subject: [PATCH 094/335] fixes after merge - adapt to enableEpochHandler --- common/enablers/enableEpochsHandler.go | 1 + common/enablers/epochFlags.go | 21 ++ common/interface.go | 3 + config/epochConfig.go | 1 + factory/api/apiResolverFactory.go | 4 +- factory/bootstrap/bootstrapComponents.go | 1 + .../bootstrap/bootstrapComponentsHandler.go | 1 + integrationTests/testInitializer.go | 5 +- .../testProcessorNodeWithMultisigner.go | 1 - integrationTests/testSyncNode.go | 1 - .../block/preprocess/gasComputation_test.go | 2 +- process/block/shardblock_test.go | 3 + process/factory/interceptorscontainer/args.go | 1 - process/guardian/guardedAccount.go | 2 +- process/guardian/guardedAccount_test.go | 196 ++++++++++-------- .../factory/argInterceptedDataFactory.go | 1 - process/transaction/metaProcess_test.go | 5 +- process/transaction/shardProcess.go | 5 +- sharding/mock/enableEpochsHandlerMock.go | 15 ++ testscommon/enableEpochsHandlerStub.go | 19 ++ .../bootstrapComponentsStub.go | 1 + update/factory/fullSyncInterceptors.go | 1 - 22 files changed, 191 insertions(+), 99 deletions(-) diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index 76be5268e5d..34d6b571a59 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -113,6 +113,7 @@ func (handler *enableEpochsHandler) EpochConfirmed(epoch uint32, _ uint64) { handler.setFlagValue(epoch >= handler.enableEpochsConfig.RefactorPeersMiniBlocksEnableEpoch, handler.refactorPeersMiniBlocksFlag, "refactorPeersMiniBlocksFlag") handler.setFlagValue(epoch >= handler.enableEpochsConfig.FixAsyncCallBackArgsListEnableEpoch, handler.fixAsyncCallBackArgsList, "fixAsyncCallBackArgsList") handler.setFlagValue(epoch >= handler.enableEpochsConfig.FixOldTokenLiquidityEnableEpoch, handler.fixOldTokenLiquidity, "fixOldTokenLiquidity") + handler.setFlagValue(epoch >= handler.enableEpochsConfig.RuntimeMemStoreLimitEnableEpoch, handler.runtimeMemStoreLimitFlag, "runtimeMemStoreLimitFlag") } func (handler *enableEpochsHandler) setFlagValue(value bool, flag *atomic.Flag, flagName string) { diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index d70fc3e2b60..357c5e06ab9 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -83,6 +83,9 @@ type epochFlagsHolder struct { refactorPeersMiniBlocksFlag *atomic.Flag fixAsyncCallBackArgsList *atomic.Flag fixOldTokenLiquidity *atomic.Flag + runtimeMemStoreLimitFlag *atomic.Flag + freezeAccountFlag *atomic.Flag + setGuardianFlag *atomic.Flag } func newEpochFlagsHolder() *epochFlagsHolder { @@ -167,6 +170,9 @@ func newEpochFlagsHolder() *epochFlagsHolder { refactorPeersMiniBlocksFlag: &atomic.Flag{}, fixAsyncCallBackArgsList: &atomic.Flag{}, fixOldTokenLiquidity: &atomic.Flag{}, + runtimeMemStoreLimitFlag: &atomic.Flag{}, + freezeAccountFlag: &atomic.Flag{}, + setGuardianFlag: &atomic.Flag{}, } } @@ -622,3 +628,18 @@ func (holder *epochFlagsHolder) IsFixAsyncCallBackArgsListFlagEnabled() bool { func (holder *epochFlagsHolder) IsFixOldTokenLiquidityEnabled() bool { return holder.fixOldTokenLiquidity.IsSet() } + +// IsRuntimeMemStoreLimitEnabled returns true if runtimeMemStoreLimitFlag is enabled +func (holder *epochFlagsHolder) IsRuntimeMemStoreLimitEnabled() bool { + return holder.runtimeMemStoreLimitFlag.IsSet() +} + +// IsFreezeAccountEnabled returns true if freezeAccountFlag is enabled +func (holder *epochFlagsHolder) IsFreezeAccountEnabled() bool { + return holder.freezeAccountFlag.IsSet() +} + +// IsSetGuardianEnabled returns true if setGuardianFlag is enabled +func (holder *epochFlagsHolder) IsSetGuardianEnabled() bool { + return holder.setGuardianFlag.IsSet() +} diff --git a/common/interface.go b/common/interface.go index 4eb32a828e3..d49d69e35a5 100644 --- a/common/interface.go +++ b/common/interface.go @@ -332,6 +332,9 @@ type EnableEpochsHandler interface { IsRefactorPeersMiniBlocksFlagEnabled() bool IsFixAsyncCallBackArgsListFlagEnabled() bool IsFixOldTokenLiquidityEnabled() bool + IsRuntimeMemStoreLimitEnabled() bool + IsFreezeAccountEnabled() bool + IsSetGuardianEnabled() bool IsInterfaceNil() bool } diff --git a/config/epochConfig.go b/config/epochConfig.go index fd68c24fb70..3e551dbadae 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -86,6 +86,7 @@ type EnableEpochs struct { ESDTMetadataContinuousCleanupEnableEpoch uint32 FixAsyncCallBackArgsListEnableEpoch uint32 FixOldTokenLiquidityEnableEpoch uint32 + RuntimeMemStoreLimitEnableEpoch uint32 SetSenderInEeiOutputTransferEnableEpoch uint32 RefactorPeersMiniBlocksEnableEpoch uint32 BLSMultiSignerEnableEpoch []MultiSignerConfig diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index ee55a320a0e..8578b6896e2 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -130,8 +130,8 @@ func CreateApiResolver(args *ApiResolverArgs) (facade.ApiResolver, error) { args.StateComponents.AccountsAdapterAPI(), args.BootstrapComponents.ShardCoordinator(), args.CoreComponents.EpochNotifier(), - args.BootstrapComponents.GuardedAccountHandler(), args.CoreComponents.EnableEpochsHandler(), + args.BootstrapComponents.GuardedAccountHandler(), convertedAddresses, args.Configs.GeneralConfig.BuiltInFunctions.MaxNumAddressesInTransferRole, ) @@ -342,8 +342,8 @@ func createScQueryElement( args.stateComponents.AccountsAdapterAPI(), args.processComponents.ShardCoordinator(), args.coreComponents.EpochNotifier(), - args.guardedAccountHandler, args.coreComponents.EnableEpochsHandler(), + args.guardedAccountHandler, convertedAddresses, args.generalConfig.BuiltInFunctions.MaxNumAddressesInTransferRole, ) diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 72869c6376a..6830e7e4736 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -14,6 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" "github.com/ElrondNetwork/elrond-go/factory/block" + "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/guardedtx" "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/headerCheck" diff --git a/factory/bootstrap/bootstrapComponentsHandler.go b/factory/bootstrap/bootstrapComponentsHandler.go index 2a116f34f56..efd1b1d3261 100644 --- a/factory/bootstrap/bootstrapComponentsHandler.go +++ b/factory/bootstrap/bootstrapComponentsHandler.go @@ -7,6 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/process" ) var _ factory.ComponentHandler = (*managedBootstrapComponents)(nil) diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 8f8e65d2950..d17b65ea8f6 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -57,7 +57,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" - "github.com/ElrondNetwork/elrond-go/testscommon/genesisMocks" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" testStorage "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -992,8 +991,8 @@ func CreateSimpleTxProcessor(accnts state.AccountsAdapter) process.TransactionPr ArgsParser: smartContract.NewArgumentParser(), ScrForwarder: &mock.IntermediateTransactionHandlerMock{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{}, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, } txProcessor, _ := txProc.NewTxProcessor(argsNewTxProcessor) diff --git a/integrationTests/testProcessorNodeWithMultisigner.go b/integrationTests/testProcessorNodeWithMultisigner.go index 99816b1119c..162687db599 100644 --- a/integrationTests/testProcessorNodeWithMultisigner.go +++ b/integrationTests/testProcessorNodeWithMultisigner.go @@ -30,7 +30,6 @@ import ( "github.com/ElrondNetwork/elrond-go/storage/storageunit" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" vic "github.com/ElrondNetwork/elrond-go/testscommon/validatorInfoCacher" diff --git a/integrationTests/testSyncNode.go b/integrationTests/testSyncNode.go index ed1074252f5..b08e3d3d739 100644 --- a/integrationTests/testSyncNode.go +++ b/integrationTests/testSyncNode.go @@ -14,7 +14,6 @@ import ( "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/dblookupext" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/factory" "github.com/ElrondNetwork/elrond-go/testscommon/outport" statusHandlerMock "github.com/ElrondNetwork/elrond-go/testscommon/statusHandler" diff --git a/process/block/preprocess/gasComputation_test.go b/process/block/preprocess/gasComputation_test.go index f414a2bfb1c..034e565f927 100644 --- a/process/block/preprocess/gasComputation_test.go +++ b/process/block/preprocess/gasComputation_test.go @@ -40,7 +40,7 @@ func TestNewGasComputation_NilEnableEpochsHandlerShouldErr(t *testing.T) { t.Parallel() gc, err := preprocess.NewGasComputation( - &mock.FeeHandlerStub{}, + &economicsmocks.EconomicsHandlerStub{}, &testscommon.TxTypeHandlerMock{}, nil, ) diff --git a/process/block/shardblock_test.go b/process/block/shardblock_test.go index e377566e062..2638e6b3da4 100644 --- a/process/block/shardblock_test.go +++ b/process/block/shardblock_test.go @@ -17,12 +17,14 @@ import ( atomicCore "github.com/ElrondNetwork/elrond-go-core/core/atomic" "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/block" + outportcore "github.com/ElrondNetwork/elrond-go-core/data/outport" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/dataRetriever/blockchain" + processOutport "github.com/ElrondNetwork/elrond-go/outport/process" "github.com/ElrondNetwork/elrond-go/process" blproc "github.com/ElrondNetwork/elrond-go/process/block" "github.com/ElrondNetwork/elrond-go/process/block/processedMb" @@ -33,6 +35,7 @@ import ( "github.com/ElrondNetwork/elrond-go/storage" "github.com/ElrondNetwork/elrond-go/testscommon" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/outport" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" diff --git a/process/factory/interceptorscontainer/args.go b/process/factory/interceptorscontainer/args.go index 99891281d26..40800309184 100644 --- a/process/factory/interceptorscontainer/args.go +++ b/process/factory/interceptorscontainer/args.go @@ -1,7 +1,6 @@ package interceptorscontainer import ( - "github.com/ElrondNetwork/elrond-go/config" crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/heartbeat" diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 2cc0e2dcb75..2b606afb724 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -239,7 +239,7 @@ func (agc *guardedAccount) saveAccountGuardians(account vmcommon.UserAccountHand } func (agc *guardedAccount) getConfiguredGuardians(uah state.UserAccountHandler) (*guardians.Guardians, error) { - guardiansMarshalled, err := uah.RetrieveValueFromDataTrieTracker(guardianKey) + guardiansMarshalled, _, err := uah.RetrieveValue(guardianKey) if err != nil || len(guardiansMarshalled) == 0 { return &guardians.Guardians{Slice: make([]*guardians.Guardian, 0)}, nil } diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 28f6e1d6018..0ffd67e2eae 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -105,8 +105,8 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { expectedErr := errors.New("expected error") acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return nil, 0, expectedErr }, } @@ -119,8 +119,8 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { t.Parallel() acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, nil + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return nil, 0, nil }, } @@ -140,8 +140,8 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { }, } acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return []byte("wrongly marshalled guardians"), nil + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return []byte("wrongly marshalled guardians"), 0, nil }, } @@ -156,8 +156,9 @@ func TestGuardedAccount_getConfiguredGuardians(t *testing.T) { expectedConfiguredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(expectedConfiguredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(expectedConfiguredGuardians) + return val, 0, err }, } @@ -300,8 +301,9 @@ func TestGuardedAccount_setAccountGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{existingGuardian}} ua := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -319,9 +321,9 @@ func TestGuardedAccount_setAccountGuardian(t *testing.T) { expectedValue := []byte(nil) ua := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { expectedValue, _ = ga.marshaller.Marshal(configuredGuardians) - return expectedValue, nil + return expectedValue, 0, nil }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -352,8 +354,9 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} ua := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -369,8 +372,9 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} ua := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -391,8 +395,9 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { expectedValue, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}}) ua := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -422,8 +427,8 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { t.Run("getConfiguredGuardians with err should err - no active", func(t *testing.T) { dataTrieErr := errors.New("expected error") uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, dataTrieErr + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return nil, 0, dataTrieErr }, } activeGuardian, err := ga.GetActiveGuardian(uah) @@ -433,8 +438,9 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { t.Run("no guardian should return err", func(t *testing.T) { configuredGuardians := &guardians.Guardians{} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -449,8 +455,9 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -465,8 +472,9 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -486,8 +494,9 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -507,8 +516,9 @@ func TestGuardedAccount_GetActiveGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -604,8 +614,9 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { t.Run("transaction signed by current active guardian but instantSetGuardian returns error", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } err := ga.SetGuardian(uah, newGuardianAddress, g2.Address) @@ -620,8 +631,9 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}}) uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -645,8 +657,9 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{g1, newGuardian}}) uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -676,8 +689,8 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { t.Run("getConfiguredGuardians with err should return false", func(t *testing.T) { expectedErr := errors.New("expected error") uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return nil, 0, expectedErr }, } require.False(t, ga.HasActiveGuardian(uah)) @@ -685,8 +698,9 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { t.Run("no guardian should return false", func(t *testing.T) { configuredGuardians := &guardians.Guardians{} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -699,8 +713,9 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -713,8 +728,9 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -732,8 +748,9 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -751,8 +768,9 @@ func TestGuardedAccount_HasActiveGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -773,8 +791,8 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { t.Run("getConfiguredGuardians with err should return false", func(t *testing.T) { expectedErr := errors.New("expected error") uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return nil, 0, expectedErr }, } require.False(t, ga.HasPendingGuardian(uah)) @@ -782,8 +800,9 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { t.Run("no guardian should return false", func(t *testing.T) { configuredGuardians := &guardians.Guardians{} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -796,8 +815,9 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{pendingGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -810,8 +830,9 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -829,8 +850,9 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, pendingGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -848,8 +870,9 @@ func TestGuardedAccount_HasPendingGuardian(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian, oldGuardian}} uah := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } @@ -879,8 +902,9 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { ga := createGuardedAccountWithEpoch(currentEpoch) acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -901,8 +925,9 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { expectedValue, _ := ga.marshaller.Marshal(expectedConfig) acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -922,8 +947,9 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { ga := createGuardedAccountWithEpoch(currentEpoch) acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -944,8 +970,9 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { ga := createGuardedAccountWithEpoch(currentEpoch) acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -966,8 +993,9 @@ func TestGuardedAccount_CleanOtherThanActive(t *testing.T) { ga := createGuardedAccountWithEpoch(currentEpoch) acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { return &trie.DataTrieTrackerStub{ @@ -1005,8 +1033,8 @@ func TestGuardedAccount_GetConfiguredGuardians(t *testing.T) { t.Parallel() acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return []byte("wrong data"), nil + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return []byte("wrong data"), 0, nil }, } active, pending, err := ga.GetConfiguredGuardians(acc) @@ -1019,8 +1047,8 @@ func TestGuardedAccount_GetConfiguredGuardians(t *testing.T) { expectedErr := errors.New("expected error") acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return nil, expectedErr + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + return nil, 0, expectedErr }, } active, pending, err := ga.GetConfiguredGuardians(acc) @@ -1031,8 +1059,9 @@ func TestGuardedAccount_GetConfiguredGuardians(t *testing.T) { t.Run("one pending guardian", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g2}} acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } active, pending, err := ga.GetConfiguredGuardians(acc) @@ -1043,8 +1072,9 @@ func TestGuardedAccount_GetConfiguredGuardians(t *testing.T) { t.Run("one active guardian", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } active, pending, err := ga.GetConfiguredGuardians(acc) @@ -1055,8 +1085,9 @@ func TestGuardedAccount_GetConfiguredGuardians(t *testing.T) { t.Run("one active and one pending", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1, g2}} acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } active, pending, err := ga.GetConfiguredGuardians(acc) @@ -1067,8 +1098,9 @@ func TestGuardedAccount_GetConfiguredGuardians(t *testing.T) { t.Run("one old and one active", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g0, g1}} acc := &stateMocks.UserAccountStub{ - RetrieveValueFromDataTrieTrackerCalled: func(key []byte) ([]byte, error) { - return ga.marshaller.Marshal(configuredGuardians) + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err }, } active, pending, err := ga.GetConfiguredGuardians(acc) diff --git a/process/interceptors/factory/argInterceptedDataFactory.go b/process/interceptors/factory/argInterceptedDataFactory.go index 22f9d72067c..73a95b38bd0 100644 --- a/process/interceptors/factory/argInterceptedDataFactory.go +++ b/process/interceptors/factory/argInterceptedDataFactory.go @@ -7,7 +7,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/marshal" crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" - "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" diff --git a/process/transaction/metaProcess_test.go b/process/transaction/metaProcess_test.go index eb4d0cee64e..1decff8aada 100644 --- a/process/transaction/metaProcess_test.go +++ b/process/transaction/metaProcess_test.go @@ -13,7 +13,6 @@ import ( txproc "github.com/ElrondNetwork/elrond-go/process/transaction" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" - "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -34,8 +33,8 @@ func createMockNewMetaTxArgs() txproc.ArgsNewMetaTxProcessor { TxTypeHandler: &testscommon.TxTypeHandlerMock{}, EconomicsFee: createFreeTxFeeHandler(), EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{}, - GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } return args } diff --git a/process/transaction/shardProcess.go b/process/transaction/shardProcess.go index d798eab75cc..20e2a37fff9 100644 --- a/process/transaction/shardProcess.go +++ b/process/transaction/shardProcess.go @@ -15,6 +15,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/vm" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" + logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" @@ -130,8 +131,8 @@ func NewTxProcessor(args ArgsNewTxProcessor) (*txProcessor, error) { marshalizer: args.Marshalizer, scProcessor: args.ScProcessor, enableEpochsHandler: args.EnableEpochsHandler, - txVersionChecker: args.TxVersionChecker, - guardianChecker: args.GuardianChecker, + txVersionChecker: args.TxVersionChecker, + guardianChecker: args.GuardianChecker, } txProc := &txProcessor{ diff --git a/sharding/mock/enableEpochsHandlerMock.go b/sharding/mock/enableEpochsHandlerMock.go index ff3378185d7..b884231c340 100644 --- a/sharding/mock/enableEpochsHandlerMock.go +++ b/sharding/mock/enableEpochsHandlerMock.go @@ -541,6 +541,21 @@ func (mock *EnableEpochsHandlerMock) IsFixOldTokenLiquidityEnabled() bool { return false } +// IsRuntimeMemStoreLimitEnabled returns false +func (mock *EnableEpochsHandlerMock) IsRuntimeMemStoreLimitEnabled() bool { + return false +} + +// IsFreezeAccountEnabled returns false +func (mock *EnableEpochsHandlerMock) IsFreezeAccountEnabled() bool { + return false +} + +// IsSetGuardianEnabled returns false +func (mock *EnableEpochsHandlerMock) IsSetGuardianEnabled() bool { + return false +} + // IsInterfaceNil returns true if there is no value under the interface func (mock *EnableEpochsHandlerMock) IsInterfaceNil() bool { return mock == nil diff --git a/testscommon/enableEpochsHandlerStub.go b/testscommon/enableEpochsHandlerStub.go index f98ff7c2f1e..ef86911e64e 100644 --- a/testscommon/enableEpochsHandlerStub.go +++ b/testscommon/enableEpochsHandlerStub.go @@ -112,6 +112,17 @@ type EnableEpochsHandlerStub struct { IsRefactorPeersMiniBlocksFlagEnabledField bool IsFixAsyncCallBackArgsListFlagEnabledField bool IsFixOldTokenLiquidityEnabledField bool + IsFreezeAccountEnabledField bool +} + +// IsRuntimeMemStoreLimitEnabled - +func (stub *EnableEpochsHandlerStub) IsRuntimeMemStoreLimitEnabled() bool { + panic("implement me") +} + +// IsSetGuardianEnabled - +func (stub *EnableEpochsHandlerStub) IsSetGuardianEnabled() bool { + panic("implement me") } // ResetPenalizedTooMuchGasFlag - @@ -969,6 +980,14 @@ func (stub *EnableEpochsHandlerStub) IsFixOldTokenLiquidityEnabled() bool { return stub.IsFixOldTokenLiquidityEnabledField } +// IsFreezeAccountEnabled - +func (stub *EnableEpochsHandlerStub) IsFreezeAccountEnabled() bool { + stub.RLock() + defer stub.RUnlock() + + return stub.IsFreezeAccountEnabledField +} + // IsInterfaceNil - func (stub *EnableEpochsHandlerStub) IsInterfaceNil() bool { return stub == nil diff --git a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go index 2751fb160cb..a5dcf30f461 100644 --- a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go +++ b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go @@ -4,6 +4,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" nodeFactory "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/factory" + "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" ) diff --git a/update/factory/fullSyncInterceptors.go b/update/factory/fullSyncInterceptors.go index 7ca6a0f6a8a..8190fb2ac85 100644 --- a/update/factory/fullSyncInterceptors.go +++ b/update/factory/fullSyncInterceptors.go @@ -6,7 +6,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/throttler" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go/common" - "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/dataValidators" From cae442c5912d163ad7c68855b2b6c80ea87ea56d Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 5 Dec 2022 14:16:06 +0200 Subject: [PATCH 095/335] outport, process, testscommon: more fixes after merge - useraccount --- .../alteredAccountsProvider_test.go | 2 +- .../hooks/blockChainHook_test.go | 4 +- testscommon/state/accountAdapterStub.go | 242 ++++++++++++++++++ 3 files changed, 245 insertions(+), 3 deletions(-) create mode 100644 testscommon/state/accountAdapterStub.go diff --git a/outport/process/alteredaccounts/alteredAccountsProvider_test.go b/outport/process/alteredaccounts/alteredAccountsProvider_test.go index 8f3868283bf..68e4ce8a27c 100644 --- a/outport/process/alteredaccounts/alteredAccountsProvider_test.go +++ b/outport/process/alteredaccounts/alteredAccountsProvider_test.go @@ -387,7 +387,7 @@ func testExtractAlteredAccountsFromPoolShouldReturnErrorWhenCastingToVmCommonUse } args.AccountsDB = &state.AccountsStub{ LoadAccountCalled: func(_ []byte) (vmcommon.AccountHandler, error) { - return &state.UserAccountStub{}, nil + return &state.StateUserAccountHandlerStub{}, nil }, } aap, _ := NewAlteredAccountsProvider(args) diff --git a/process/smartContract/hooks/blockChainHook_test.go b/process/smartContract/hooks/blockChainHook_test.go index 73c89235ccc..b9229bc9385 100644 --- a/process/smartContract/hooks/blockChainHook_test.go +++ b/process/smartContract/hooks/blockChainHook_test.go @@ -1266,7 +1266,7 @@ func TestBlockChainHookImpl_ProcessBuiltInFunction(t *testing.T) { args.Accounts = &stateMock.AccountsStub{ GetExistingAccountCalled: func(addressContainer []byte) (vmcommon.AccountHandler, error) { require.Equal(t, addrSender, addressContainer) - return &stateMock.UserAccountStub{}, nil + return &stateMock.StateUserAccountHandlerStub{}, nil }, } bh, _ := hooks.NewBlockChainHookImpl(args) @@ -1313,7 +1313,7 @@ func TestBlockChainHookImpl_ProcessBuiltInFunction(t *testing.T) { LoadAccountCalled: func(addressContainer []byte) (vmcommon.AccountHandler, error) { require.Equal(t, addrReceiver, addressContainer) - return &stateMock.AccountWrapMock{}, nil + return &stateMock.StateUserAccountHandlerStub{}, nil }, } diff --git a/testscommon/state/accountAdapterStub.go b/testscommon/state/accountAdapterStub.go new file mode 100644 index 00000000000..582329d5410 --- /dev/null +++ b/testscommon/state/accountAdapterStub.go @@ -0,0 +1,242 @@ +package state + +import ( + "math/big" + + "github.com/ElrondNetwork/elrond-go/common" +) + +// StateUserAccountHandlerStub - +type StateUserAccountHandlerStub struct { + AddressBytesCalled func() []byte + IncreaseNonceCalled func(nonce uint64) + GetNonceCalled func() uint64 + SetCodeCalled func(code []byte) + SetCodeMetadataCalled func(codeMetadata []byte) + GetCodeMetadataCalled func() []byte + SetCodeHashCalled func([]byte) + GetCodeHashCalled func() []byte + SetRootHashCalled func([]byte) + GetRootHashCalled func() []byte + SetDataTrieCalled func(trie common.Trie) + DataTrieCalled func() common.DataTrieHandler + RetrieveValueCalled func(key []byte) ([]byte, uint32, error) + SaveKeyValueCalled func(key []byte, value []byte) error + AddToBalanceCalled func(value *big.Int) error + SubFromBalanceCalled func(value *big.Int) error + GetBalanceCalled func() *big.Int + ClaimDeveloperRewardsCalled func([]byte) (*big.Int, error) + AddToDeveloperRewardCalled func(*big.Int) + GetDeveloperRewardCalled func() *big.Int + ChangeOwnerAddressCalled func([]byte, []byte) error + SetOwnerAddressCalled func([]byte) + GetOwnerAddressCalled func() []byte + SetUserNameCalled func(userName []byte) + GetUserNameCalled func() []byte + IsFrozenCalled func() bool +} + +// AddressBytes - +func (aas *StateUserAccountHandlerStub) AddressBytes() []byte { + if aas.AddressBytesCalled != nil { + return aas.AddressBytesCalled() + } + + return nil +} + +// IncreaseNonce - +func (aas *StateUserAccountHandlerStub) IncreaseNonce(nonce uint64) { + if aas.IncreaseNonceCalled != nil { + aas.IncreaseNonceCalled(nonce) + } +} + +// GetNonce - +func (aas *StateUserAccountHandlerStub) GetNonce() uint64 { + if aas.GetNonceCalled != nil { + return aas.GetNonceCalled() + } + return 0 +} + +// SetCode - +func (aas *StateUserAccountHandlerStub) SetCode(code []byte) { + if aas.SetCodeCalled != nil { + aas.SetCodeCalled(code) + } +} + +// SetCodeMetadata - +func (aas *StateUserAccountHandlerStub) SetCodeMetadata(codeMetadata []byte) { + if aas.SetCodeMetadataCalled != nil { + aas.SetCodeMetadataCalled(codeMetadata) + } +} + +// GetCodeMetadata - +func (aas *StateUserAccountHandlerStub) GetCodeMetadata() []byte { + if aas.GetCodeMetadataCalled != nil { + return aas.GetCodeMetadataCalled() + } + return nil +} + +// SetCodeHash - +func (aas *StateUserAccountHandlerStub) SetCodeHash(codeHash []byte) { + if aas.SetCodeHashCalled != nil { + aas.SetCodeHashCalled(codeHash) + } +} + +// GetCodeHash - +func (aas *StateUserAccountHandlerStub) GetCodeHash() []byte { + if aas.GetCodeHashCalled != nil { + return aas.GetCodeHashCalled() + } + return nil +} + +// SetRootHash - +func (aas *StateUserAccountHandlerStub) SetRootHash(rootHash []byte) { + if aas.SetRootHashCalled != nil { + aas.SetRootHashCalled(rootHash) + } +} + +// GetRootHash - +func (aas *StateUserAccountHandlerStub) GetRootHash() []byte { + if aas.GetRootHashCalled != nil { + return aas.GetRootHashCalled() + } + return nil +} + +// SetDataTrie - +func (aas *StateUserAccountHandlerStub) SetDataTrie(trie common.Trie) { + if aas.SetDataTrieCalled != nil { + aas.SetDataTrieCalled(trie) + } +} + +// DataTrie - +func (aas *StateUserAccountHandlerStub) DataTrie() common.DataTrieHandler { + if aas.DataTrieCalled != nil { + return aas.DataTrieCalled() + } + return nil +} + +// RetrieveValue - +func (aas *StateUserAccountHandlerStub) RetrieveValue(key []byte) ([]byte, uint32, error) { + if aas.RetrieveValueCalled != nil { + return aas.RetrieveValueCalled(key) + } + return nil, 0, nil +} + +// SaveKeyValue - +func (aas *StateUserAccountHandlerStub) SaveKeyValue(key []byte, value []byte) error { + if aas.SaveKeyValueCalled != nil { + return aas.SaveKeyValueCalled(key, value) + } + return nil +} + +// AddToBalance - +func (aas *StateUserAccountHandlerStub) AddToBalance(value *big.Int) error { + if aas.AddToBalanceCalled != nil { + return aas.AddToBalanceCalled(value) + } + return nil +} + +// SubFromBalance - +func (aas *StateUserAccountHandlerStub) SubFromBalance(value *big.Int) error { + if aas.SubFromBalanceCalled != nil { + return aas.SubFromBalanceCalled(value) + } + return nil +} + +// GetBalance - +func (aas *StateUserAccountHandlerStub) GetBalance() *big.Int { + if aas.GetBalanceCalled != nil { + return aas.GetBalanceCalled() + } + return nil +} + +// ClaimDeveloperRewards - +func (aas *StateUserAccountHandlerStub) ClaimDeveloperRewards(senderAddr []byte) (*big.Int, error) { + if aas.ClaimDeveloperRewardsCalled != nil { + return aas.ClaimDeveloperRewardsCalled(senderAddr) + } + return nil, nil +} + +//AddToDeveloperReward - +func (aas *StateUserAccountHandlerStub) AddToDeveloperReward(val *big.Int) { + if aas.AddToDeveloperRewardCalled != nil { + aas.AddToDeveloperRewardCalled(val) + } +} + +//GetDeveloperReward - +func (aas *StateUserAccountHandlerStub) GetDeveloperReward() *big.Int { + if aas.GetDeveloperRewardCalled != nil { + return aas.GetDeveloperRewardCalled() + } + return nil +} + +// ChangeOwnerAddress - +func (aas *StateUserAccountHandlerStub) ChangeOwnerAddress(senderAddr []byte, newOwnerAddr []byte) error { + if aas.ChangeOwnerAddressCalled != nil { + return aas.ChangeOwnerAddressCalled(senderAddr, newOwnerAddr) + } + return nil +} + +// SetOwnerAddress - +func (aas *StateUserAccountHandlerStub) SetOwnerAddress(address []byte) { + if aas.SetOwnerAddressCalled != nil { + aas.SetOwnerAddressCalled(address) + } +} + +// GetOwnerAddress - +func (aas *StateUserAccountHandlerStub) GetOwnerAddress() []byte { + if aas.GetOwnerAddressCalled != nil { + return aas.GetOwnerAddressCalled() + } + return nil +} + +// SetUserName - +func (aas *StateUserAccountHandlerStub) SetUserName(userName []byte) { + if aas.SetUserNameCalled != nil { + aas.SetUserNameCalled(userName) + } +} + +// GetUserName - +func (aas *StateUserAccountHandlerStub) GetUserName() []byte { + if aas.GetUserNameCalled != nil { + return aas.GetUserNameCalled() + } + return nil +} + +//IsFrozen - +func (aas *StateUserAccountHandlerStub) IsFrozen() bool { + if aas.IsFrozenCalled != nil { + return aas.IsFrozenCalled() + } + return false +} + +// IsInterfaceNil - +func (aas *StateUserAccountHandlerStub) IsInterfaceNil() bool { + return aas == nil +} From 40dbc3a1850efc259650458ee037d41086cdeb91 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 5 Dec 2022 15:08:46 +0200 Subject: [PATCH 096/335] fix integration tests after merge --- factory/core/coreComponents.go | 2 +- integrationTests/vm/txsFee/scCalls_test.go | 1 + testscommon/components/default.go | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/factory/core/coreComponents.go b/factory/core/coreComponents.go index ce7e6f73a10..ee5550502e8 100644 --- a/factory/core/coreComponents.go +++ b/factory/core/coreComponents.go @@ -269,7 +269,7 @@ func (ccf *coreComponentsFactory) Create() (*coreComponents, error) { EpochNotifier: epochNotifier, EnableEpochsHandler: enableEpochsHandler, BuiltInFunctionsCostHandler: builtInCostHandler, - TxVersionChecker: txVersionChecker, + TxVersionChecker: txVersionChecker, } economicsData, err := economics.NewEconomicsData(argsNewEconomicsData) if err != nil { diff --git a/integrationTests/vm/txsFee/scCalls_test.go b/integrationTests/vm/txsFee/scCalls_test.go index 2a11e61e0d4..9a2cab21a90 100644 --- a/integrationTests/vm/txsFee/scCalls_test.go +++ b/integrationTests/vm/txsFee/scCalls_test.go @@ -395,6 +395,7 @@ func prepareTestContextForEpoch460(tb testing.TB) (*vm.VMTestContext, []byte) { FixOldTokenLiquidityEnableEpoch: unreachableEpoch, SetSenderInEeiOutputTransferEnableEpoch: unreachableEpoch, RefactorPeersMiniBlocksEnableEpoch: unreachableEpoch, + RuntimeMemStoreLimitEnableEpoch: unreachableEpoch, }) require.Nil(tb, err) diff --git a/testscommon/components/default.go b/testscommon/components/default.go index 18ffb4e509b..bc9d8be35cd 100644 --- a/testscommon/components/default.go +++ b/testscommon/components/default.go @@ -11,6 +11,7 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" + epochNotifierMock "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" @@ -47,6 +48,7 @@ func GetDefaultCoreComponents() *mock.CoreComponentsMock { NodesConfig: &testscommon.NodesSetupStub{}, StartTime: time.Time{}, NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, + EpochChangeNotifier: &epochNotifierMock.EpochNotifierStub{}, } } From f6b0fd1f401229aa5eb0dbb164a4cb69c88fe235 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 5 Dec 2022 15:27:30 +0200 Subject: [PATCH 097/335] remove panics in stub --- testscommon/enableEpochsHandlerStub.go | 28 +++++++++++++++++--------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/testscommon/enableEpochsHandlerStub.go b/testscommon/enableEpochsHandlerStub.go index ef86911e64e..167b67aaded 100644 --- a/testscommon/enableEpochsHandlerStub.go +++ b/testscommon/enableEpochsHandlerStub.go @@ -112,17 +112,9 @@ type EnableEpochsHandlerStub struct { IsRefactorPeersMiniBlocksFlagEnabledField bool IsFixAsyncCallBackArgsListFlagEnabledField bool IsFixOldTokenLiquidityEnabledField bool + IsRuntimeMemStoreLimitEnabledField bool IsFreezeAccountEnabledField bool -} - -// IsRuntimeMemStoreLimitEnabled - -func (stub *EnableEpochsHandlerStub) IsRuntimeMemStoreLimitEnabled() bool { - panic("implement me") -} - -// IsSetGuardianEnabled - -func (stub *EnableEpochsHandlerStub) IsSetGuardianEnabled() bool { - panic("implement me") + IsSetGuardianEnabledField bool } // ResetPenalizedTooMuchGasFlag - @@ -988,6 +980,22 @@ func (stub *EnableEpochsHandlerStub) IsFreezeAccountEnabled() bool { return stub.IsFreezeAccountEnabledField } +// IsRuntimeMemStoreLimitEnabled - +func (stub *EnableEpochsHandlerStub) IsRuntimeMemStoreLimitEnabled() bool { + stub.RLock() + defer stub.RUnlock() + + return stub.IsRuntimeMemStoreLimitEnabledField +} + +// IsSetGuardianEnabled - +func (stub *EnableEpochsHandlerStub) IsSetGuardianEnabled() bool { + stub.RLock() + defer stub.RUnlock() + + return stub.IsSetGuardianEnabledField +} + // IsInterfaceNil - func (stub *EnableEpochsHandlerStub) IsInterfaceNil() bool { return stub == nil From a6794c185e0f4d4c074d3702bc38795a9b44ad44 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 6 Dec 2022 14:45:27 +0200 Subject: [PATCH 098/335] remove unused error --- consensus/signing/errors.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/consensus/signing/errors.go b/consensus/signing/errors.go index 01af6e1773b..5a6febf1e77 100644 --- a/consensus/signing/errors.go +++ b/consensus/signing/errors.go @@ -8,9 +8,6 @@ var ErrInvalidSignature = errors.New("invalid signature was provided") // ErrNilElement is raised when searching for a specific element but found nil var ErrNilElement = errors.New("element is nil") -// ErrIndexNotSelected is raised when a not selected index is used for multi-signing -var ErrIndexNotSelected = errors.New("index is not selected") - // ErrNilBitmap is raised when a nil bitmap is used var ErrNilBitmap = errors.New("bitmap is nil") From d632c10fe03e0e04e82ca4d4410e19a99b0e92b2 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 7 Dec 2022 14:20:53 +0200 Subject: [PATCH 099/335] rename freeze account builtin function & update dep versions --- api/groups/addressGroup.go | 2 +- api/groups/addressGroup_test.go | 10 +++---- cmd/node/config/enableEpochs.toml | 4 +-- .../config/gasSchedules/gasScheduleV1.toml | 3 +- .../config/gasSchedules/gasScheduleV2.toml | 3 +- .../config/gasSchedules/gasScheduleV3.toml | 3 +- .../config/gasSchedules/gasScheduleV4.toml | 3 +- .../config/gasSchedules/gasScheduleV5.toml | 3 +- .../config/gasSchedules/gasScheduleV6.toml | 3 +- .../config/gasSchedules/gasScheduleV7.toml | 3 ++ common/constants.go | 4 +-- common/enablers/epochFlags.go | 10 +++---- common/interface.go | 2 +- config/epochConfig.go | 2 +- config/tomlConfig_test.go | 6 ++-- facade/nodeFacade_test.go | 10 +++---- genesis/mock/userAccountMock.go | 4 +-- genesis/process/shardGenesisBlockCreator.go | 8 ++--- go.mod | 10 +++---- go.sum | 20 ++++++------- .../arwen/arwenvm/deployment/deploy_test.go | 8 ++--- node/node.go | 2 +- node/node_test.go | 28 ++++++++--------- process/dataValidators/txValidator.go | 6 ++-- process/dataValidators/txValidator_test.go | 30 +++++++++---------- process/errors.go | 4 +-- .../builtInFunctions/factory_test.go | 4 +-- process/smartContract/hooks/blockChainHook.go | 2 +- process/transaction/baseProcess.go | 6 ++-- sharding/mock/enableEpochsHandlerMock.go | 4 +-- state/interface.go | 2 +- state/userAccount.go | 6 ++-- testscommon/enableEpochsHandlerStub.go | 8 ++--- testscommon/state/accountAdapterStub.go | 10 +++---- testscommon/state/accountWrapperMock.go | 8 ++--- testscommon/state/userAccountStub.go | 10 +++---- vm/systemSmartContracts/defaults/gasMap.go | 3 +- 37 files changed, 132 insertions(+), 122 deletions(-) diff --git a/api/groups/addressGroup.go b/api/groups/addressGroup.go index 357e8e9e0db..422c91b057e 100644 --- a/api/groups/addressGroup.go +++ b/api/groups/addressGroup.go @@ -316,7 +316,7 @@ func (ag *addressGroup) getValueForKey(c *gin.Context) { shared.RespondWithSuccess(c, gin.H{"value": value, "blockInfo": blockInfo}) } -// getGuardianData returns the guardian data and frozen state for a given account +// getGuardianData returns the guardian data and guarded state for a given account func (ag *addressGroup) getGuardianData(c *gin.Context) { addr := c.Param("address") if addr == "" { diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index 7f9cad01488..5cf5c42b35d 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -1106,14 +1106,14 @@ func TestGetGuardianData(t *testing.T) { t.Run("should work", func(t *testing.T) { expectedGuardianData := api.GuardianData{ ActiveGuardian: &api.Guardian{ - Address: "guardian1", - ActivationEpoch: 0, + Address: "guardian1", + ActivationEpoch: 0, }, PendingGuardian: &api.Guardian{ - Address: "guardian2", - ActivationEpoch: 10, + Address: "guardian2", + ActivationEpoch: 10, }, - Frozen: true, + Guarded: true, } facade := mock.FacadeStub{ GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index b0820ccacfb..8f84366d159 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -233,8 +233,8 @@ { EnableEpoch = 3, Type = "KOSK"} ] - # FreezeAccountFeatureEnableEpoch represents the epoch when the freeze account feature is enabled in the protocol - FreezeAccountFeatureEnableEpoch = 2 + # GuardAccountFeatureEnableEpoch represents the epoch when the guard account feature is enabled in the protocol + GuardAccountFeatureEnableEpoch = 2 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ diff --git a/cmd/node/config/gasSchedules/gasScheduleV1.toml b/cmd/node/config/gasSchedules/gasScheduleV1.toml index e08462e4476..5512e5d5752 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV1.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV1.toml @@ -16,7 +16,8 @@ ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 SetGuardian = 250000 - FreezeAccount = 250000 + GuardAccount = 250000 + UnGuardAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV2.toml b/cmd/node/config/gasSchedules/gasScheduleV2.toml index f8a27d41310..e976fec21e6 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV2.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV2.toml @@ -16,7 +16,8 @@ ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 SetGuardian = 250000 - FreezeAccount = 250000 + GuardAccount = 250000 + UnGuardAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV3.toml b/cmd/node/config/gasSchedules/gasScheduleV3.toml index 665455815c8..5f577fd7ef4 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV3.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV3.toml @@ -16,7 +16,8 @@ ESDTNFTUpdateAttributes = 500000 ESDTNFTMultiTransfer = 1000000 SetGuardian = 250000 - FreezeAccount = 250000 + GuardAccount = 250000 + UnGuardAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV4.toml b/cmd/node/config/gasSchedules/gasScheduleV4.toml index 4601021421b..911abd20aae 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV4.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV4.toml @@ -16,7 +16,8 @@ ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 SetGuardian = 250000 - FreezeAccount = 250000 + GuardAccount = 250000 + UnGuardAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV5.toml b/cmd/node/config/gasSchedules/gasScheduleV5.toml index 7b9efa63321..717ca236603 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV5.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV5.toml @@ -16,7 +16,8 @@ ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 SetGuardian = 250000 - FreezeAccount = 250000 + GuardAccount = 250000 + UnGuardAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV6.toml b/cmd/node/config/gasSchedules/gasScheduleV6.toml index 8bb4caca5fe..9a2d2e5e6af 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV6.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV6.toml @@ -16,7 +16,8 @@ ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 SetGuardian = 250000 - FreezeAccount = 250000 + GuardAccount = 250000 + UnGuardAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV7.toml b/cmd/node/config/gasSchedules/gasScheduleV7.toml index 07aa0aec0eb..2b5b79c4b6a 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV7.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV7.toml @@ -16,6 +16,9 @@ ESDTNFTUpdateAttributes = 50000 ESDTNFTMultiTransfer = 200000 MultiESDTNFTTransfer = 200000 # should be the same value with the ESDTNFTMultiTransfer + SetGuardian = 250000 + GuardAccount = 250000 + UnGuardAccount = 250000 [MetaChainSystemSCsCost] Stake = 5000000 diff --git a/common/constants.go b/common/constants.go index 5148a37e890..71008fc9e27 100644 --- a/common/constants.go +++ b/common/constants.go @@ -595,8 +595,8 @@ const ( // MetricRatingsPeerHonestyUnitValue represents the peer honesty unit value MetricRatingsPeerHonestyUnitValue = "erd_ratings_peerhonesty_unit_value" - // MetricFreezeAccountFeatureEnableEpoch represents the epoch when the freeze account feature is enabled - MetricFreezeAccountFeatureEnableEpoch = "erd_freeze_account_feature_enable_epoch" + // MetricGuardAccountFeatureEnableEpoch represents the epoch when the guard account feature is enabled + MetricGuardAccountFeatureEnableEpoch = "erd_guard_account_feature_enable_epoch" ) const ( diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index 357c5e06ab9..3e94bd36b97 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -84,7 +84,7 @@ type epochFlagsHolder struct { fixAsyncCallBackArgsList *atomic.Flag fixOldTokenLiquidity *atomic.Flag runtimeMemStoreLimitFlag *atomic.Flag - freezeAccountFlag *atomic.Flag + guardAccountFlag *atomic.Flag setGuardianFlag *atomic.Flag } @@ -171,7 +171,7 @@ func newEpochFlagsHolder() *epochFlagsHolder { fixAsyncCallBackArgsList: &atomic.Flag{}, fixOldTokenLiquidity: &atomic.Flag{}, runtimeMemStoreLimitFlag: &atomic.Flag{}, - freezeAccountFlag: &atomic.Flag{}, + guardAccountFlag: &atomic.Flag{}, setGuardianFlag: &atomic.Flag{}, } } @@ -634,9 +634,9 @@ func (holder *epochFlagsHolder) IsRuntimeMemStoreLimitEnabled() bool { return holder.runtimeMemStoreLimitFlag.IsSet() } -// IsFreezeAccountEnabled returns true if freezeAccountFlag is enabled -func (holder *epochFlagsHolder) IsFreezeAccountEnabled() bool { - return holder.freezeAccountFlag.IsSet() +// IsGuardAccountEnabled returns true if GuardAccountFlag is enabled +func (holder *epochFlagsHolder) IsGuardAccountEnabled() bool { + return holder.guardAccountFlag.IsSet() } // IsSetGuardianEnabled returns true if setGuardianFlag is enabled diff --git a/common/interface.go b/common/interface.go index d49d69e35a5..7c26a38f96b 100644 --- a/common/interface.go +++ b/common/interface.go @@ -333,7 +333,7 @@ type EnableEpochsHandler interface { IsFixAsyncCallBackArgsListFlagEnabled() bool IsFixOldTokenLiquidityEnabled() bool IsRuntimeMemStoreLimitEnabled() bool - IsFreezeAccountEnabled() bool + IsGuardAccountEnabled() bool IsSetGuardianEnabled() bool IsInterfaceNil() bool diff --git a/config/epochConfig.go b/config/epochConfig.go index 3e551dbadae..3062ab3b55a 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -90,7 +90,7 @@ type EnableEpochs struct { SetSenderInEeiOutputTransferEnableEpoch uint32 RefactorPeersMiniBlocksEnableEpoch uint32 BLSMultiSignerEnableEpoch []MultiSignerConfig - FreezeAccountFeatureEnableEpoch uint32 + GuardAccountFeatureEnableEpoch uint32 } // GasScheduleByEpochs represents a gas schedule toml entry that will be applied from the provided epoch diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 00029cca19a..7093ee900b6 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -674,8 +674,8 @@ func TestEnableEpochConfig(t *testing.T) { # SetSenderInEeiOutputTransferEnableEpoch represents the epoch when setting the sender in eei output transfers will be enabled SetSenderInEeiOutputTransferEnableEpoch = 58 - # FreezeAccountFeatureEnableEpoch represents the epoch when freeze account feature is enabled - FreezeAccountFeatureEnableEpoch = 10 + # GuardAccountFeatureEnableEpoch represents the epoch when guard account feature is enabled + GuardAccountFeatureEnableEpoch = 10 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ @@ -767,7 +767,7 @@ func TestEnableEpochConfig(t *testing.T) { FixAsyncCallBackArgsListEnableEpoch: 56, FixOldTokenLiquidityEnableEpoch: 57, SetSenderInEeiOutputTransferEnableEpoch: 58, - FreezeAccountFeatureEnableEpoch: 10, + GuardAccountFeatureEnableEpoch: 10, BLSMultiSignerEnableEpoch: []MultiSignerConfig{ { EnableEpoch: 0, diff --git a/facade/nodeFacade_test.go b/facade/nodeFacade_test.go index 0cd539df377..7dcd0cb1cde 100644 --- a/facade/nodeFacade_test.go +++ b/facade/nodeFacade_test.go @@ -768,14 +768,14 @@ func TestNodeFacade_GetGuardianData(t *testing.T) { expectedGuardianData := api.GuardianData{ ActiveGuardian: &api.Guardian{ - Address: "guardian1", - ActivationEpoch: 0, + Address: "guardian1", + ActivationEpoch: 0, }, PendingGuardian: &api.Guardian{ - Address: "guardian2", - ActivationEpoch: 10, + Address: "guardian2", + ActivationEpoch: 10, }, - Frozen: true, + Guarded: true, } arg.Node = &mock.NodeStub{ GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { diff --git a/genesis/mock/userAccountMock.go b/genesis/mock/userAccountMock.go index 5e4970c086f..67fe2ca0ae9 100644 --- a/genesis/mock/userAccountMock.go +++ b/genesis/mock/userAccountMock.go @@ -144,7 +144,7 @@ func (uam *UserAccountMock) SaveDirtyData(_ common.Trie) (map[string][]byte, err return nil, nil } -// IsFrozen - -func (uam *UserAccountMock) IsFrozen() bool { +// IsGuarded - +func (uam *UserAccountMock) IsGuarded() bool { return false } diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index e2a388adf7d..62ae50474f3 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -138,7 +138,7 @@ func createGenesisConfig() config.EnableEpochs { RefactorPeersMiniBlocksEnableEpoch: unreachableEpoch, DoNotReturnOldBlockInBlockchainHookEnableEpoch: unreachableEpoch, BLSMultiSignerEnableEpoch: blsMultiSignerEnableEpoch, - FreezeAccountFeatureEnableEpoch: unreachableEpoch, + GuardAccountFeatureEnableEpoch: unreachableEpoch, } } @@ -398,7 +398,7 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo EnableEpochsHandler: enableEpochsHandler, AutomaticCrawlerAddresses: [][]byte{make([]byte, 32)}, MaxNumNodesInTransferRole: math.MaxUint32, - GuardedAccountHandler: disabledGuardian.NewDisabledGuardedAccountHandler(), + GuardedAccountHandler: disabledGuardian.NewDisabledGuardedAccountHandler(), } builtInFuncFactory, err := builtInFunctions.CreateBuiltInFunctionsFactory(argsBuiltIn) if err != nil { @@ -570,8 +570,8 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo ArgsParser: smartContract.NewArgumentParser(), ScrForwarder: scForwarder, EnableEpochsHandler: enableEpochsHandler, - TxVersionChecker: arg.Core.TxVersionChecker(), - GuardianChecker: disabledGuardian.NewDisabledGuardedAccountHandler(), + TxVersionChecker: arg.Core.TxVersionChecker(), + GuardianChecker: disabledGuardian.NewDisabledGuardedAccountHandler(), } transactionProcessor, err := transaction.NewTxProcessor(argsNewTxProcessor) if err != nil { diff --git a/go.mod b/go.mod index 9d62e48e2d4..fdfe72804b6 100644 --- a/go.mod +++ b/go.mod @@ -4,15 +4,15 @@ go 1.17 require ( github.com/ElrondNetwork/elastic-indexer-go v1.3.3 - github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221128163152-4b8ad7af81f6 + github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8 github.com/ElrondNetwork/elrond-go-crypto v1.2.2 github.com/ElrondNetwork/elrond-go-logger v1.0.10 github.com/ElrondNetwork/elrond-go-p2p v1.0.5 github.com/ElrondNetwork/elrond-go-storage v1.0.4 - github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221129104037-fa2c7a8d2b30 - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221129104732-5b44c1047940 - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221129105202-b9c1eb97eb0f - github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221129130511-5325130db086 + github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221207113912-5e51bac72fff + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221207114041-931b5bdf1ded + github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221207114657-b4eea3cf49af github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index 39ca049f4a1..6064228bc1a 100644 --- a/go.sum +++ b/go.sum @@ -49,8 +49,8 @@ github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53 github.com/ElrondNetwork/elastic-indexer-go v1.3.3 h1:RgJ043yt92PUWMbSAQHRrC+GiyNnFdwdM/kseHlpLoo= github.com/ElrondNetwork/elastic-indexer-go v1.3.3/go.mod h1:E3VO5712GkGSGYnOTJ+0wxW74JXgjV6XCRPlcHiTTK0= github.com/ElrondNetwork/elrond-go-core v1.1.26/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= -github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221128163152-4b8ad7af81f6 h1:CVd3T+JFBoKNibSZvVarlf9xlHzDC8j2XBD+wth6dAk= -github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221128163152-4b8ad7af81f6/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= +github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8 h1:iYFJrSgKmyRDFkDFBXABqs7UwjrGeA0b5Nit9xmogzk= +github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= github.com/ElrondNetwork/elrond-go-crypto v1.2.2 h1:Q59dZUeyibuskq5vjgk3ng/87ifOcd9YZMTnlYJAuIU= github.com/ElrondNetwork/elrond-go-crypto v1.2.2/go.mod h1:MyQPKUKti7Axnx/eihhL0F2jLTalvSV/Ytv1mIxvYyM= github.com/ElrondNetwork/elrond-go-logger v1.0.10 h1:2xQOWZErcHW5sl9qSRO+7mGNw+QhFhqiUlLLtOgvuuk= @@ -61,16 +61,16 @@ github.com/ElrondNetwork/elrond-go-storage v1.0.2/go.mod h1:SRsv4hUtL1BCiQe0eADt github.com/ElrondNetwork/elrond-go-storage v1.0.4 h1:esyXbHQvlR6m4HGeC86Nq0xAJ74+QG9EnUgfG+wQDYQ= github.com/ElrondNetwork/elrond-go-storage v1.0.4/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34= github.com/ElrondNetwork/elrond-vm-common v1.3.27/go.mod h1:3GKLv9hUFYEVxoBgtaCmaZo9HMNfKN9mM/O/xX83Rbw= -github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221129104037-fa2c7a8d2b30 h1:mvjKr242mZK/X9/+S6cmFML8lsyG2voxL7bDpGLYj48= -github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221129104037-fa2c7a8d2b30/go.mod h1:o9lFg2B6ZAMrYZcbdqhb/LOQWxKGzoNBKc0ArMwiLD8= +github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58 h1:ZduFPEw1cMjTDpJPLXfxOybidOzJ++FWeH/xMsgRxP4= +github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58/go.mod h1:vBVpGtyb7ZerSqX/EOtUIGBGK9VtogmjwAmjAWCnCSw= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221129104732-5b44c1047940 h1:ETc0zYNSVUDmZ91+HesC2ljr1Sp+bz7tf1Mf5HwJEtM= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221129104732-5b44c1047940/go.mod h1:gWZjAgqUcI6XXV76fMLyspYJUgiXCsmZMAHwUsu3Vn4= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221129105202-b9c1eb97eb0f h1:hpXxDt09WE+rNHWS1/JbQIZrkLy7galsxJHBdeLVhTU= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221129105202-b9c1eb97eb0f/go.mod h1:6xyi6knkzWjypN3rD6Hd8sYuBTE/3QInjC0+9fm53Ec= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221129130511-5325130db086 h1:wEntMY5Wn1tVZBtk/YamjIye+7Zww4BBlYd2b+J0TyA= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221129130511-5325130db086/go.mod h1:sXz+Ljb1KnVZaVH+FQqKDarubE+392TWZHcS0GCM4F8= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221207113912-5e51bac72fff h1:o10OzmXIsvUuj2oJx2tOdSeZCBkrcCvRm0Wb6kr+XRk= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221207113912-5e51bac72fff/go.mod h1:FT0hOm/rl6tHtD5CxXmX8mpds/ePJu4bkUP5FtaccBA= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221207114041-931b5bdf1ded h1:AA/9h/bBpnci8BiIHL45aw6Fj8FmWtqwXA2XOunYr7g= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221207114041-931b5bdf1ded/go.mod h1:d1MOr0Pj2fbhEY+s11fymAJ1zh1NIgelPEbb2JYUFeM= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221207114657-b4eea3cf49af h1:ZKnMeXgqnMVY72OB4nrg6soOm/YAnOvKq3U7WLK85s4= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221207114657-b4eea3cf49af/go.mod h1:ULGc4UkHCZ7s3/6Jl8dncbUYSWmGQ4ey+0/cmjJ4jhU= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= diff --git a/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go b/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go index 365340577a9..8b0807cd2a0 100644 --- a/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go +++ b/integrationTests/vm/arwen/arwenvm/deployment/deploy_test.go @@ -30,8 +30,8 @@ func TestScDeployShouldManageCorrectlyTheCodeMetadata(t *testing.T) { senderAddressBytes, senderBalance, config.EnableEpochs{ - IsPayableBySCEnableEpoch: 1, - FreezeAccountFeatureEnableEpoch: 1, + IsPayableBySCEnableEpoch: 1, + GuardAccountFeatureEnableEpoch: 1, }, ) require.Nil(t, err) @@ -47,7 +47,7 @@ func TestScDeployShouldManageCorrectlyTheCodeMetadata(t *testing.T) { PayableBySC: false, Upgradeable: true, Readable: true, - Frozen: false, + Guarded: false, } assert.Equal(t, expectedCodeMetadata.ToBytes(), getCodeMetadata(t, testContext.Accounts, contractAddress)) @@ -62,7 +62,7 @@ func TestScDeployShouldManageCorrectlyTheCodeMetadata(t *testing.T) { PayableBySC: true, Upgradeable: true, Readable: true, - Frozen: false, + Guarded: false, } assert.Equal(t, expectedCodeMetadata.ToBytes(), getCodeMetadata(t, testContext.Accounts, contractAddress)) diff --git a/node/node.go b/node/node.go index 75c798f9de4..5de81dcb831 100644 --- a/node/node.go +++ b/node/node.go @@ -359,7 +359,7 @@ func (n *Node) GetGuardianData(address string, options api.AccountQueryOptions) return api.GuardianData{ ActiveGuardian: activeGuardian, PendingGuardian: pendingGuardian, - Frozen: userAccount.IsFrozen(), + Guarded: userAccount.IsGuarded(), }, blockInfo, nil } diff --git a/node/node_test.go b/node/node_test.go index 4831f9358de..f590bb0067e 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4126,19 +4126,19 @@ func TestNode_GetGuardianData(t *testing.T) { stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) userAddress := coreComponents.AddressPubKeyConverter().Encode(userAddressBytes) g1 := &guardians.Guardian{ - Address: bytes.Repeat([]byte{1}, 32), + Address: bytes.Repeat([]byte{1}, 32), ActivationEpoch: 0, } g2 := &guardians.Guardian{ - Address: bytes.Repeat([]byte{2}, 32), + Address: bytes.Repeat([]byte{2}, 32), ActivationEpoch: 1, } apiG1 := &api.Guardian{ - Address: coreComponents.AddressPubKeyConverter().Encode(g1.Address), + Address: coreComponents.AddressPubKeyConverter().Encode(g1.Address), ActivationEpoch: g1.ActivationEpoch, } apiG2 := &api.Guardian{ - Address: coreComponents.AddressPubKeyConverter().Encode(g2.Address), + Address: coreComponents.AddressPubKeyConverter().Encode(g2.Address), ActivationEpoch: g2.ActivationEpoch, } t.Run("error on loadUserAccountHandlerByAddress", func(t *testing.T) { @@ -4204,7 +4204,7 @@ func TestNode_GetGuardianData(t *testing.T) { require.Equal(t, api.GuardianData{ ActiveGuardian: apiG1, PendingGuardian: nil, - Frozen: false, + Guarded: false, }, guardianData) require.Equal(t, api.BlockInfo{}, blockInfo) require.Nil(t, err) @@ -4226,7 +4226,7 @@ func TestNode_GetGuardianData(t *testing.T) { require.Equal(t, api.GuardianData{ ActiveGuardian: nil, PendingGuardian: apiG1, - Frozen: false, + Guarded: false, }, guardianData) require.Equal(t, api.BlockInfo{}, blockInfo) require.Nil(t, err) @@ -4248,14 +4248,14 @@ func TestNode_GetGuardianData(t *testing.T) { require.Equal(t, api.GuardianData{ ActiveGuardian: apiG1, PendingGuardian: apiG2, - Frozen: false, + Guarded: false, }, guardianData) require.Equal(t, api.BlockInfo{}, blockInfo) require.Nil(t, err) }) - t.Run("one active and one pending and account frozen", func(t *testing.T) { + t.Run("one active and one pending and account guarded", func(t *testing.T) { acc, _ := state.NewUserAccount(userAddressBytes) - acc.CodeMetadata = (&vmcommon.CodeMetadata{Frozen: true}).ToBytes() + acc.CodeMetadata = (&vmcommon.CodeMetadata{Guarded: true}).ToBytes() accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { return acc, nil, nil @@ -4287,7 +4287,7 @@ func TestNode_GetGuardianData(t *testing.T) { require.Equal(t, api.GuardianData{ ActiveGuardian: apiG1, PendingGuardian: apiG2, - Frozen: true, + Guarded: true, }, guardianData) require.Equal(t, api.BlockInfo{}, blockInfo) require.Nil(t, err) @@ -4310,12 +4310,12 @@ func TestNode_getPendingAndActiveGuardians(t *testing.T) { } expectedG1 := &api.Guardian{ - Address: coreComponents.AddrPubKeyConv.Encode(g1.Address), - ActivationEpoch: g1.ActivationEpoch, + Address: coreComponents.AddrPubKeyConv.Encode(g1.Address), + ActivationEpoch: g1.ActivationEpoch, } expectedG2 := &api.Guardian{ - Address: coreComponents.AddrPubKeyConv.Encode(g2.Address), - ActivationEpoch: g2.ActivationEpoch, + Address: coreComponents.AddrPubKeyConv.Encode(g2.Address), + ActivationEpoch: g2.ActivationEpoch, } t.Run("get configured guardians with error should propagate error", func(t *testing.T) { diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index cd0ac4e9e9e..4e245e39df2 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -145,7 +145,7 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac return err } - if account.IsFrozen() { + if account.IsGuarded() { err = txv.checkGuardedTransaction(interceptedTx, account) if err == nil { return nil @@ -159,14 +159,14 @@ func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransac // block non guarded setGuardian Txs if there is a pending guardian hasPendingGuardian := txv.guardianSigVerifier.HasPendingGuardian(account) if process.IsSetGuardianCall(txData) && hasPendingGuardian { - return process.ErrCannotReplaceFrozenAccountPendingGuardian + return process.ErrCannotReplaceGuardedAccountPendingGuardian } } return nil } -// Setting a guardian is allowed with regular transactions on a frozen account +// Setting a guardian is allowed with regular transactions on a guarded account // but in this case is set with the default epochs delay func checkOperationAllowedToBypassGuardian(txData []byte) error { if process.IsSetGuardianCall(txData) { diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index f2b06eb8ed1..ce3500d35b8 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -462,34 +462,34 @@ func TestTxValidator_checkPermission(t *testing.T) { ) require.Nil(t, err) - t.Run("non frozen account with getTxData error should err", func(t *testing.T) { + t.Run("non guarded account with getTxData error should err", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { return nil } acc := &stateMock.UserAccountStub{ - IsFrozenCalled: func() bool { + IsGuardedCalled: func() bool { return false }, } err = txValidator.CheckPermission(inTx, acc) require.Equal(t, process.ErrNilTransaction, err) }) - t.Run("non frozen account without getTxData error should allow", func(t *testing.T) { + t.Run("non guarded account without getTxData error should allow", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { return &transaction.Transaction{} } acc := &stateMock.UserAccountStub{ - IsFrozenCalled: func() bool { + IsGuardedCalled: func() bool { return false }, } err = txValidator.CheckPermission(inTx, acc) require.Nil(t, err) }) - t.Run("frozen account with no guarded tx and no bypass permission should err", func(t *testing.T) { + t.Run("guarded account with no guarded tx and no bypass permission should err", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { return &transaction.Transaction{ @@ -497,7 +497,7 @@ func TestTxValidator_checkPermission(t *testing.T) { } } - acc := createDummyFrozenAccount() + acc := createDummyGuardedAccount() txV, err := dataValidators.NewTxValidator( adb, shardCoordinator, @@ -520,7 +520,7 @@ func TestTxValidator_checkPermission(t *testing.T) { err = txV.CheckPermission(inTx, acc) require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) }) - t.Run("frozen account with no guarded tx and bypass permission should allow if no pending guardian", func(t *testing.T) { + t.Run("guarded account with no guarded tx and bypass permission should allow if no pending guardian", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { return &transaction.Transaction{ @@ -528,7 +528,7 @@ func TestTxValidator_checkPermission(t *testing.T) { } } - acc := createDummyFrozenAccount() + acc := createDummyGuardedAccount() txV, err := dataValidators.NewTxValidator( adb, shardCoordinator, @@ -554,7 +554,7 @@ func TestTxValidator_checkPermission(t *testing.T) { err = txV.CheckPermission(inTx, acc) require.Nil(t, err) }) - t.Run("frozen account with no guarded tx and bypass permission with pending guardian should block", func(t *testing.T) { + t.Run("guarded account with no guarded tx and bypass permission with pending guardian should block", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { return &transaction.Transaction{ @@ -562,7 +562,7 @@ func TestTxValidator_checkPermission(t *testing.T) { } } - acc := createDummyFrozenAccount() + acc := createDummyGuardedAccount() txV, err := dataValidators.NewTxValidator( adb, shardCoordinator, @@ -586,9 +586,9 @@ func TestTxValidator_checkPermission(t *testing.T) { require.Nil(t, err) err = txV.CheckPermission(inTx, acc) - require.Equal(t, process.ErrCannotReplaceFrozenAccountPendingGuardian, err) + require.Equal(t, process.ErrCannotReplaceGuardedAccountPendingGuardian, err) }) - t.Run("frozen account with guarded Tx should allow", func(t *testing.T) { + t.Run("guarded account with guarded Tx should allow", func(t *testing.T) { inTx := getDefaultInterceptedTx() inTx.TransactionCalled = func() data.TransactionHandler { return &transaction.Transaction{ @@ -596,7 +596,7 @@ func TestTxValidator_checkPermission(t *testing.T) { } } - acc := createDummyFrozenAccount() + acc := createDummyGuardedAccount() txV, err := dataValidators.NewTxValidator( adb, shardCoordinator, @@ -863,9 +863,9 @@ func getDefaultInterceptedTx() *mock.InterceptedTxHandlerStub { } } -func createDummyFrozenAccount() state.UserAccountHandler { +func createDummyGuardedAccount() state.UserAccountHandler { acc := state.NewEmptyUserAccount() - metadata := &vmcommon.CodeMetadata{Frozen: true} + metadata := &vmcommon.CodeMetadata{Guarded: true} acc.SetCodeMetadata(metadata.ToBytes()) return acc } diff --git a/process/errors.go b/process/errors.go index 93432e5f73a..fba4136f74e 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1182,8 +1182,8 @@ var ErrTransactionAndAccountGuardianMismatch = errors.New("mismatch between tran // ErrInvalidSetGuardianEpochsDelay signals an invalid configuration for the epochs delay var ErrInvalidSetGuardianEpochsDelay = errors.New("incorrect setting for set guardian epochs delay") -// ErrCannotReplaceFrozenAccountPendingGuardian signals that a pending guardian on a frozen account cannot be replaced -var ErrCannotReplaceFrozenAccountPendingGuardian = errors.New("cannot replace pending guardian on frozen account") +// ErrCannotReplaceGuardedAccountPendingGuardian signals that a pending guardian on a guarded account cannot be replaced +var ErrCannotReplaceGuardedAccountPendingGuardian = errors.New("cannot replace pending guardian on guarded account") // ErrGasPriceTooHigh signals a too high gas price var ErrGasPriceTooHigh = errors.New("gas price is too high for the transaction") diff --git a/process/smartContract/builtInFunctions/factory_test.go b/process/smartContract/builtInFunctions/factory_test.go index c1f13089126..bfa10819153 100644 --- a/process/smartContract/builtInFunctions/factory_test.go +++ b/process/smartContract/builtInFunctions/factory_test.go @@ -37,7 +37,7 @@ func createMockArguments() ArgsCreateBuiltInFunctionContainer { bytes.Repeat([]byte{1}, 32), }, MaxNumNodesInTransferRole: 100, - GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } return args @@ -87,7 +87,7 @@ func fillGasMapBuiltInCosts(value uint64) map[string]uint64 { gasMap["ESDTNFTUpdateAttributes"] = value gasMap["ESDTNFTMultiTransfer"] = value gasMap["SetGuardian"] = value - gasMap["FreezeAccount"] = value + gasMap["GuardAccount"] = value return gasMap } diff --git a/process/smartContract/hooks/blockChainHook.go b/process/smartContract/hooks/blockChainHook.go index 7d2d6f82a67..9c848a79434 100644 --- a/process/smartContract/hooks/blockChainHook.go +++ b/process/smartContract/hooks/blockChainHook.go @@ -506,7 +506,7 @@ func (bh *BlockChainHookImpl) FilterCodeMetadataForUpgrade(input []byte) ([]byte // ApplyFiltersOnSCCodeMetadata will apply all known filters on the provided code metadata value func (bh *BlockChainHookImpl) ApplyFiltersOnSCCodeMetadata(codeMetadata vmcommon.CodeMetadata) vmcommon.CodeMetadata { codeMetadata.PayableBySC = codeMetadata.PayableBySC && bh.enableEpochsHandler.IsPayableBySCFlagEnabled() - codeMetadata.Frozen = false + codeMetadata.Guarded = false return codeMetadata } diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index a8605a0a31f..605ea870757 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -26,8 +26,8 @@ type baseTxProcessor struct { marshalizer marshal.Marshalizer scProcessor process.SmartContractProcessor enableEpochsHandler common.EnableEpochsHandler - txVersionChecker process.TxVersionCheckerHandler - guardianChecker process.GuardianChecker + txVersionChecker process.TxVersionCheckerHandler + guardianChecker process.GuardianChecker } func (txProc *baseTxProcessor) getAccounts( @@ -222,7 +222,7 @@ func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, accou if check.IfNil(account) { return nil } - if !account.IsFrozen() { + if !account.IsGuarded() { return nil } diff --git a/sharding/mock/enableEpochsHandlerMock.go b/sharding/mock/enableEpochsHandlerMock.go index b884231c340..e53e7b4020d 100644 --- a/sharding/mock/enableEpochsHandlerMock.go +++ b/sharding/mock/enableEpochsHandlerMock.go @@ -546,8 +546,8 @@ func (mock *EnableEpochsHandlerMock) IsRuntimeMemStoreLimitEnabled() bool { return false } -// IsFreezeAccountEnabled returns false -func (mock *EnableEpochsHandlerMock) IsFreezeAccountEnabled() bool { +// IsGuardAccountEnabled returns false +func (mock *EnableEpochsHandlerMock) IsGuardAccountEnabled() bool { return false } diff --git a/state/interface.go b/state/interface.go index de31bfaed73..bee5485a5a5 100644 --- a/state/interface.go +++ b/state/interface.go @@ -85,7 +85,7 @@ type UserAccountHandler interface { GetOwnerAddress() []byte SetUserName(userName []byte) GetUserName() []byte - IsFrozen() bool + IsGuarded() bool vmcommon.AccountHandler } diff --git a/state/userAccount.go b/state/userAccount.go index 3a5bf531997..635f66920eb 100644 --- a/state/userAccount.go +++ b/state/userAccount.go @@ -142,11 +142,11 @@ func (a *userAccount) SetCodeMetadata(codeMetadata []byte) { a.CodeMetadata = codeMetadata } -// IsFrozen returns true if the account is in frozen state -func (a *userAccount) IsFrozen() bool { +// IsGuarded returns true if the account is in guarded state +func (a *userAccount) IsGuarded() bool { codeMetaDataBytes := a.GetCodeMetadata() codeMetaData := vmcommon.CodeMetadataFromBytes(codeMetaDataBytes) - return codeMetaData.Frozen + return codeMetaData.Guarded } // IsInterfaceNil returns true if there is no value under the interface diff --git a/testscommon/enableEpochsHandlerStub.go b/testscommon/enableEpochsHandlerStub.go index 167b67aaded..7ae9b04e7e8 100644 --- a/testscommon/enableEpochsHandlerStub.go +++ b/testscommon/enableEpochsHandlerStub.go @@ -113,7 +113,7 @@ type EnableEpochsHandlerStub struct { IsFixAsyncCallBackArgsListFlagEnabledField bool IsFixOldTokenLiquidityEnabledField bool IsRuntimeMemStoreLimitEnabledField bool - IsFreezeAccountEnabledField bool + IsGuardAccountEnabledField bool IsSetGuardianEnabledField bool } @@ -972,12 +972,12 @@ func (stub *EnableEpochsHandlerStub) IsFixOldTokenLiquidityEnabled() bool { return stub.IsFixOldTokenLiquidityEnabledField } -// IsFreezeAccountEnabled - -func (stub *EnableEpochsHandlerStub) IsFreezeAccountEnabled() bool { +// IsGuardAccountEnabled - +func (stub *EnableEpochsHandlerStub) IsGuardAccountEnabled() bool { stub.RLock() defer stub.RUnlock() - return stub.IsFreezeAccountEnabledField + return stub.IsGuardAccountEnabledField } // IsRuntimeMemStoreLimitEnabled - diff --git a/testscommon/state/accountAdapterStub.go b/testscommon/state/accountAdapterStub.go index 582329d5410..2206ab8c066 100644 --- a/testscommon/state/accountAdapterStub.go +++ b/testscommon/state/accountAdapterStub.go @@ -33,7 +33,7 @@ type StateUserAccountHandlerStub struct { GetOwnerAddressCalled func() []byte SetUserNameCalled func(userName []byte) GetUserNameCalled func() []byte - IsFrozenCalled func() bool + IsGuardedCalled func() bool } // AddressBytes - @@ -228,10 +228,10 @@ func (aas *StateUserAccountHandlerStub) GetUserName() []byte { return nil } -//IsFrozen - -func (aas *StateUserAccountHandlerStub) IsFrozen() bool { - if aas.IsFrozenCalled != nil { - return aas.IsFrozenCalled() +//IsGuarded - +func (aas *StateUserAccountHandlerStub) IsGuarded() bool { + if aas.IsGuardedCalled != nil { + return aas.IsGuardedCalled() } return false } diff --git a/testscommon/state/accountWrapperMock.go b/testscommon/state/accountWrapperMock.go index c13eaf1e919..377ee3c3fb9 100644 --- a/testscommon/state/accountWrapperMock.go +++ b/testscommon/state/accountWrapperMock.go @@ -22,7 +22,7 @@ type AccountWrapMock struct { address []byte trackableDataTrie state.DataTrieTracker Balance *big.Int - frozen bool + guarded bool SetNonceWithJournalCalled func(nonce uint64) error `json:"-"` SetCodeHashWithJournalCalled func(codeHash []byte) error `json:"-"` @@ -190,7 +190,7 @@ func (awm *AccountWrapMock) GetNonce() uint64 { return awm.nonce } -// IsFrozen - -func (awm *AccountWrapMock) IsFrozen() bool { - return awm.frozen +// IsGuarded - +func (awm *AccountWrapMock) IsGuarded() bool { + return awm.guarded } diff --git a/testscommon/state/userAccountStub.go b/testscommon/state/userAccountStub.go index e4d6b61a531..b28b0305c6b 100644 --- a/testscommon/state/userAccountStub.go +++ b/testscommon/state/userAccountStub.go @@ -16,7 +16,7 @@ type UserAccountStub struct { Balance *big.Int AddToBalanceCalled func(value *big.Int) error DataTrieTrackerCalled func() state.DataTrieTracker - IsFrozenCalled func() bool + IsGuardedCalled func() bool AccountDataHandlerCalled func() vmcommon.AccountDataHandler RetrieveValueCalled func(_ []byte) ([]byte, uint32, error) } @@ -155,10 +155,10 @@ func (u *UserAccountStub) SaveKeyValue(_ []byte, _ []byte) error { return nil } -// IsFrozen - -func (u *UserAccountStub) IsFrozen() bool { - if u.IsFrozenCalled != nil { - return u.IsFrozenCalled() +// IsGuarded - +func (u *UserAccountStub) IsGuarded() bool { + if u.IsGuardedCalled != nil { + return u.IsGuardedCalled() } return false } diff --git a/vm/systemSmartContracts/defaults/gasMap.go b/vm/systemSmartContracts/defaults/gasMap.go index 97729546039..ad981b66b94 100644 --- a/vm/systemSmartContracts/defaults/gasMap.go +++ b/vm/systemSmartContracts/defaults/gasMap.go @@ -46,7 +46,8 @@ func FillGasMapBuiltInCosts(value uint64) map[string]uint64 { gasMap["ESDTNFTUpdateAttributes"] = value gasMap["ESDTNFTMultiTransfer"] = value gasMap["SetGuardian"] = value - gasMap["FreezeAccount"] = value + gasMap["GuardAccount"] = value + gasMap["UnGuardAccount"] = value return gasMap } From 48c5dc1ec6b2c5b7a2066fd660722b9c71e16559 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 9 Dec 2022 12:50:59 +0200 Subject: [PATCH 100/335] fixes for enable epoch flags --- cmd/node/config/enableEpochs.toml | 1 + common/enablers/enableEpochsHandler.go | 2 ++ config/epochConfig.go | 1 + 3 files changed, 4 insertions(+) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 8f84366d159..aa79bcb5fc0 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -235,6 +235,7 @@ # GuardAccountFeatureEnableEpoch represents the epoch when the guard account feature is enabled in the protocol GuardAccountFeatureEnableEpoch = 2 + SetGuardianEnableEpoch = 2 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index 34d6b571a59..9402fc01d61 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -114,6 +114,8 @@ func (handler *enableEpochsHandler) EpochConfirmed(epoch uint32, _ uint64) { handler.setFlagValue(epoch >= handler.enableEpochsConfig.FixAsyncCallBackArgsListEnableEpoch, handler.fixAsyncCallBackArgsList, "fixAsyncCallBackArgsList") handler.setFlagValue(epoch >= handler.enableEpochsConfig.FixOldTokenLiquidityEnableEpoch, handler.fixOldTokenLiquidity, "fixOldTokenLiquidity") handler.setFlagValue(epoch >= handler.enableEpochsConfig.RuntimeMemStoreLimitEnableEpoch, handler.runtimeMemStoreLimitFlag, "runtimeMemStoreLimitFlag") + handler.setFlagValue(epoch >= handler.enableEpochsConfig.GuardAccountFeatureEnableEpoch, handler.guardAccountFlag, "guardAccountFeatureFlag") + handler.setFlagValue(epoch >= handler.enableEpochsConfig.SetGuardianEnableEpoch, handler.setGuardianFlag, "setGuardianFlag") } func (handler *enableEpochsHandler) setFlagValue(value bool, flag *atomic.Flag, flagName string) { diff --git a/config/epochConfig.go b/config/epochConfig.go index 3062ab3b55a..bfa9101de1a 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -91,6 +91,7 @@ type EnableEpochs struct { RefactorPeersMiniBlocksEnableEpoch uint32 BLSMultiSignerEnableEpoch []MultiSignerConfig GuardAccountFeatureEnableEpoch uint32 + SetGuardianEnableEpoch uint32 } // GasScheduleByEpochs represents a gas schedule toml entry that will be applied from the provided epoch From 2a251b3d161675256d15153799c2893bb3e965d9 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 9 Dec 2022 15:34:53 +0200 Subject: [PATCH 101/335] add functions to ComputeBuiltInCost --- process/economics/builtInFunctionsCost.go | 6 ++++++ process/gasCost.go | 3 +++ 2 files changed, 9 insertions(+) diff --git a/process/economics/builtInFunctionsCost.go b/process/economics/builtInFunctionsCost.go index fc9d0063468..97dd319e225 100644 --- a/process/economics/builtInFunctionsCost.go +++ b/process/economics/builtInFunctionsCost.go @@ -107,6 +107,12 @@ func (bc *builtInFunctionsCost) ComputeBuiltInCost(tx data.TransactionWithFeeHan case core.BuiltInFunctionESDTNFTCreate: costStorage := calculateLenOfArguments(arguments) * bc.gasConfig.BaseOperationCost.StorePerByte return bc.gasConfig.BuiltInCost.ESDTNFTCreate + costStorage + case core.BuiltInFunctionSetGuardian: + return bc.gasConfig.BuiltInCost.SetGuardian + case core.BuiltInFunctionGuardAccount: + return bc.gasConfig.BuiltInCost.GuardAccount + case core.BuiltInFunctionUnGuardAccount: + return bc.gasConfig.BuiltInCost.UnGuardAccount default: return 0 } diff --git a/process/gasCost.go b/process/gasCost.go index 87e54722c92..25b0dfe2881 100644 --- a/process/gasCost.go +++ b/process/gasCost.go @@ -28,6 +28,9 @@ type BuiltInCost struct { ESDTNFTAddUri uint64 ESDTNFTUpdateAttributes uint64 ESDTNFTMultiTransfer uint64 + SetGuardian uint64 + GuardAccount uint64 + UnGuardAccount uint64 } // GasCost holds all the needed gas costs for system smart contracts From 654f741e054bfb5388088d62b77168a59e319819 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 13 Dec 2022 10:15:22 +0200 Subject: [PATCH 102/335] updated elrond-go-crypto --- cmd/keygenerator/main.go | 7 ++--- common/converters_test.go | 4 +-- common/crypto/interface.go | 2 +- consensus/broadcast/export.go | 2 +- consensus/interface.go | 2 +- consensus/mock/consensusDataContainerMock.go | 2 +- consensus/mock/mockTestInitializer.go | 2 +- consensus/signing/signing.go | 2 +- consensus/signing/signing_test.go | 2 +- consensus/spos/bls/subroundEndRound_test.go | 2 +- consensus/spos/consensusCore.go | 2 +- consensus/spos/interface.go | 2 +- consensus/spos/worker.go | 2 +- .../disabled/disabledMultiSignerContainer.go | 2 +- examples/blsSigning_test.go | 3 +- examples/construction_test.go | 4 +-- examples/messageSign_test.go | 6 ++-- factory/bootstrap/shardingFactory.go | 2 +- factory/crypto/cryptoComponents.go | 5 ++-- factory/crypto/cryptoComponentsHandler.go | 2 +- factory/crypto/cryptoComponents_test.go | 9 +++--- factory/crypto/export_test.go | 2 +- factory/crypto/multiSignerContainer.go | 2 +- factory/interface.go | 2 +- genesis/checking/nodesSetupChecker.go | 2 +- genesis/dtos.go | 2 +- genesis/parsing/accountsParser.go | 2 +- genesis/parsing/export_test.go | 2 +- genesis/parsing/smartContractParser.go | 2 +- .../disabled/messageSignVerifier_test.go | 4 +-- go.mod | 8 ++--- go.sum | 16 +++++----- heartbeat/sender/baseSender.go | 2 +- heartbeat/sender/bootstrapSender.go | 2 +- heartbeat/sender/peerAuthenticationSender.go | 2 +- .../sender/peerAuthenticationSender_test.go | 5 ++-- heartbeat/sender/sender.go | 2 +- .../frontend/wallet/dataField_test.go | 3 +- .../interceptedHeadersSigVerification_test.go | 5 ++-- .../transaction/txRouting/txRouting_test.go | 2 +- integrationTests/multisig/blsMultisig_test.go | 3 +- .../interceptedBulkTx_test.go | 2 +- .../state/stateTrie/stateTrie_test.go | 2 +- integrationTests/testConsensusNode.go | 2 +- integrationTests/testHeartbeatNode.go | 9 +++--- integrationTests/testInitializer.go | 13 ++++----- integrationTests/testProcessorNode.go | 29 +++++++++---------- .../testProcessorNodeWithCoordinator.go | 7 ++--- .../testProcessorNodeWithMultisigner.go | 2 +- .../vm/delegation/delegationScenarios_test.go | 5 ++-- node/nodeTesting.go | 2 +- node/nodeTesting_test.go | 2 +- node/node_test.go | 2 +- process/factory/interceptorscontainer/args.go | 2 +- process/guardedtx/guardedTxVerifier.go | 2 +- process/guardedtx/guardedTxVerifier_test.go | 5 ++-- process/headerCheck/headerSignatureVerify.go | 2 +- .../headerCheck/headerSignatureVerify_test.go | 2 +- .../interceptedPeerAuthentication.go | 2 +- .../factory/argInterceptedDataFactory.go | 2 +- .../interceptedMetaHeaderDataFactory_test.go | 2 +- ...nterceptedPeerAuthenticationDataFactory.go | 2 +- process/mock/peerSignatureHandlerStub.go | 2 +- process/transaction/interceptedTransaction.go | 2 +- redundancy/bootstrapRedundancy.go | 2 +- testscommon/components/default.go | 2 +- .../cryptoMocks/multiSignerContainerMock.go | 2 +- .../cryptoMocks/multiSignerContainerStub.go | 2 +- .../cryptoMocks/peerSignatureHandlerStub.go | 2 +- 69 files changed, 118 insertions(+), 130 deletions(-) diff --git a/cmd/keygenerator/main.go b/cmd/keygenerator/main.go index 8216da66612..b97331dcf85 100644 --- a/cmd/keygenerator/main.go +++ b/cmd/keygenerator/main.go @@ -14,8 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" - crypto "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -187,8 +186,8 @@ func generateKeys(typeKey string, numKeys int, prefix string, shardID int) ([]ke p2pKeys := make([]key, 0) var err error - blockSigningGenerator := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) - txSigningGenerator := signing.NewKeyGenerator(ed25519.NewEd25519()) + blockSigningGenerator := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) + txSigningGenerator := crypto.NewKeyGenerator(ed25519.NewEd25519()) for i := 0; i < numKeys; i++ { switch typeKey { diff --git a/common/converters_test.go b/common/converters_test.go index cda64640239..bde60472316 100644 --- a/common/converters_test.go +++ b/common/converters_test.go @@ -10,7 +10,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/batch" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/common/mock" @@ -301,7 +301,7 @@ func TestAssignShardForPubKeyWhenNotSpecifiedShouldReturnSameShardForSameKey(t * func TestShardAssignment(t *testing.T) { t.Skip() - keyGen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keyGen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) generatePubKey := func() []byte { _, pk := keyGen.GeneratePair() pkB, _ := pk.ToByteArray() diff --git a/common/crypto/interface.go b/common/crypto/interface.go index 3e7f1bbeb6f..db6cdc0afb2 100644 --- a/common/crypto/interface.go +++ b/common/crypto/interface.go @@ -1,6 +1,6 @@ package crypto -import crypto "github.com/ElrondNetwork/elrond-go-crypto" +import "github.com/ElrondNetwork/elrond-go-crypto" // MultiSignerContainer defines the container for different versioned multiSigner instances type MultiSignerContainer interface { diff --git a/consensus/broadcast/export.go b/consensus/broadcast/export.go index 277576f16ba..6c9939f057a 100644 --- a/consensus/broadcast/export.go +++ b/consensus/broadcast/export.go @@ -5,7 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/sharding" ) diff --git a/consensus/interface.go b/consensus/interface.go index ca67c5e5a7c..3ed6b67a34c 100644 --- a/consensus/interface.go +++ b/consensus/interface.go @@ -6,7 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/p2p" ) diff --git a/consensus/mock/consensusDataContainerMock.go b/consensus/mock/consensusDataContainerMock.go index eb93be5e2eb..53574902972 100644 --- a/consensus/mock/consensusDataContainerMock.go +++ b/consensus/mock/consensusDataContainerMock.go @@ -4,7 +4,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/epochStart" diff --git a/consensus/mock/mockTestInitializer.go b/consensus/mock/mockTestInitializer.go index ce275ac47d8..88ff7d74b27 100644 --- a/consensus/mock/mockTestInitializer.go +++ b/consensus/mock/mockTestInitializer.go @@ -5,7 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/block" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" "github.com/ElrondNetwork/elrond-go/testscommon" diff --git a/consensus/signing/signing.go b/consensus/signing/signing.go index 90761a34fb8..6e9f7f0b45e 100644 --- a/consensus/signing/signing.go +++ b/consensus/signing/signing.go @@ -4,7 +4,7 @@ import ( "sync" "github.com/ElrondNetwork/elrond-go-core/core/check" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" ) diff --git a/consensus/signing/signing_test.go b/consensus/signing/signing_test.go index 304361ee909..29cbf40b34c 100644 --- a/consensus/signing/signing_test.go +++ b/consensus/signing/signing_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/ElrondNetwork/elrond-go-core/core/check" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/consensus/signing" "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" "github.com/stretchr/testify/require" diff --git a/consensus/spos/bls/subroundEndRound_test.go b/consensus/spos/bls/subroundEndRound_test.go index 26e5bc9d4b1..177f0f36910 100644 --- a/consensus/spos/bls/subroundEndRound_test.go +++ b/consensus/spos/bls/subroundEndRound_test.go @@ -9,7 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/block" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/consensus/mock" "github.com/ElrondNetwork/elrond-go/consensus/spos" diff --git a/consensus/spos/consensusCore.go b/consensus/spos/consensusCore.go index dac0c8aa7c6..ef3ec81bd1d 100644 --- a/consensus/spos/consensusCore.go +++ b/consensus/spos/consensusCore.go @@ -4,7 +4,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/epochStart" diff --git a/consensus/spos/interface.go b/consensus/spos/interface.go index 5720a82fffa..78735f8468c 100644 --- a/consensus/spos/interface.go +++ b/consensus/spos/interface.go @@ -8,7 +8,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/outport" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" "github.com/ElrondNetwork/elrond-go/consensus" "github.com/ElrondNetwork/elrond-go/epochStart" diff --git a/consensus/spos/worker.go b/consensus/spos/worker.go index cbd87294ff1..07ade6cd575 100644 --- a/consensus/spos/worker.go +++ b/consensus/spos/worker.go @@ -16,7 +16,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/consensus" errorsErd "github.com/ElrondNetwork/elrond-go/errors" diff --git a/epochStart/bootstrap/disabled/disabledMultiSignerContainer.go b/epochStart/bootstrap/disabled/disabledMultiSignerContainer.go index cb5a735fe13..1c9ae40cb9d 100644 --- a/epochStart/bootstrap/disabled/disabledMultiSignerContainer.go +++ b/epochStart/bootstrap/disabled/disabledMultiSignerContainer.go @@ -1,6 +1,6 @@ package disabled -import crypto "github.com/ElrondNetwork/elrond-go-crypto" +import "github.com/ElrondNetwork/elrond-go-crypto" type disabledMultiSignerContainer struct { multiSigner crypto.MultiSigner diff --git a/examples/blsSigning_test.go b/examples/blsSigning_test.go index 5a07c384d86..f548c6eca98 100644 --- a/examples/blsSigning_test.go +++ b/examples/blsSigning_test.go @@ -8,7 +8,6 @@ import ( "testing" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" mclsig "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl/singlesig" "github.com/stretchr/testify/require" @@ -22,7 +21,7 @@ MGQ1YTAzZTkxNWYxZTIxZg== ` var blsSigner = &mclsig.BlsSingleSigner{} -var keyGen = signing.NewKeyGenerator(&mcl.SuiteBLS12{}) +var keyGen = crypto.NewKeyGenerator(&mcl.SuiteBLS12{}) func TestBLSSigning(t *testing.T) { privateKey, publicKey, publicKeyAsHex := loadSkPk(t) diff --git a/examples/construction_test.go b/examples/construction_test.go index ffa5cd78d58..fe4fb305875 100644 --- a/examples/construction_test.go +++ b/examples/construction_test.go @@ -14,7 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing/blake2b" "github.com/ElrondNetwork/elrond-go-core/hashing/keccak" "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" "github.com/stretchr/testify/require" @@ -183,7 +183,7 @@ func getPubkeyOfAddress(t *testing.T, address string) []byte { } func computeTransactionSignature(t *testing.T, senderSeedHex string, tx *transaction.Transaction) []byte { - keyGenerator := signing.NewKeyGenerator(signingCryptoSuite) + keyGenerator := crypto.NewKeyGenerator(signingCryptoSuite) senderSeed, err := hex.DecodeString(senderSeedHex) require.Nil(t, err) diff --git a/examples/messageSign_test.go b/examples/messageSign_test.go index 67e1e4e0675..fa961a60e3b 100644 --- a/examples/messageSign_test.go +++ b/examples/messageSign_test.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/display" "github.com/ElrondNetwork/elrond-go-core/hashing/keccak" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/stretchr/testify/require" ) @@ -74,7 +74,7 @@ func checkSignature(address string, message string, signature string) error { } func signMessage(t *testing.T, senderSeedHex string, message string) (string, string, string) { - keyGenerator := signing.NewKeyGenerator(signingCryptoSuite) + keyGenerator := crypto.NewKeyGenerator(signingCryptoSuite) senderSeed, err := hex.DecodeString(senderSeedHex) require.Nil(t, err) @@ -105,7 +105,7 @@ func computeHashForMessage(message string) []byte { func checkMessageSignature(address string, message string, signature []byte) error { hash := computeHashForMessage(message) suite := ed25519.NewEd25519() - keyGen := signing.NewKeyGenerator(suite) + keyGen := crypto.NewKeyGenerator(suite) addressBytes, err := addressEncoder.Decode(address) if err != nil { diff --git a/factory/bootstrap/shardingFactory.go b/factory/bootstrap/shardingFactory.go index 562e8bf0eeb..37626cfe8d5 100644 --- a/factory/bootstrap/shardingFactory.go +++ b/factory/bootstrap/shardingFactory.go @@ -10,7 +10,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/endProcess" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" diff --git a/factory/crypto/cryptoComponents.go b/factory/crypto/cryptoComponents.go index 682960f85b1..a2af0b6c313 100644 --- a/factory/crypto/cryptoComponents.go +++ b/factory/crypto/cryptoComponents.go @@ -7,7 +7,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" disabledCrypto "github.com/ElrondNetwork/elrond-go-crypto/signing/disabled" disabledSig "github.com/ElrondNetwork/elrond-go-crypto/signing/disabled/singlesig" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" @@ -117,13 +116,13 @@ func (ccf *cryptoComponentsFactory) Create() (*cryptoComponents, error) { return nil, err } - blockSignKeyGen := signing.NewKeyGenerator(suite) + blockSignKeyGen := crypto.NewKeyGenerator(suite) cp, err := ccf.createCryptoParams(blockSignKeyGen) if err != nil { return nil, err } - txSignKeyGen := signing.NewKeyGenerator(ed25519.NewEd25519()) + txSignKeyGen := crypto.NewKeyGenerator(ed25519.NewEd25519()) txSingleSigner := &singlesig.Ed25519Signer{} processingSingleSigner, err := ccf.createSingleSigner(false) if err != nil { diff --git a/factory/crypto/cryptoComponentsHandler.go b/factory/crypto/cryptoComponentsHandler.go index 6abf4aa01cf..380a76111a4 100644 --- a/factory/crypto/cryptoComponentsHandler.go +++ b/factory/crypto/cryptoComponentsHandler.go @@ -5,7 +5,7 @@ import ( "sync" "github.com/ElrondNetwork/elrond-go-core/core/check" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" "github.com/ElrondNetwork/elrond-go/errors" "github.com/ElrondNetwork/elrond-go/factory" diff --git a/factory/crypto/cryptoComponents_test.go b/factory/crypto/cryptoComponents_test.go index 313ddc6f871..31e16e47ad4 100644 --- a/factory/crypto/cryptoComponents_test.go +++ b/factory/crypto/cryptoComponents_test.go @@ -6,7 +6,6 @@ import ( "testing" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go/config" errErd "github.com/ElrondNetwork/elrond-go/errors" cryptoComp "github.com/ElrondNetwork/elrond-go/factory/crypto" @@ -252,7 +251,7 @@ func TestCryptoComponentsFactory_CreateMultiSignerOK(t *testing.T) { require.Nil(t, err) suite, _ := ccf.GetSuite() - blockSignKeyGen := signing.NewKeyGenerator(suite) + blockSignKeyGen := crypto.NewKeyGenerator(suite) multiSigner, err := ccf.CreateMultiSignerContainer(blockSignKeyGen, false) require.Nil(t, err) @@ -307,7 +306,7 @@ func TestCryptoComponentsFactory_CreateCryptoParamsInvalidPrivateKeyByteArraySho ccf, _ := cryptoComp.NewCryptoComponentsFactory(args) suite, _ := ccf.GetSuite() - blockSignKeyGen := signing.NewKeyGenerator(suite) + blockSignKeyGen := crypto.NewKeyGenerator(suite) cryptoParams, err := ccf.CreateCryptoParams(blockSignKeyGen) require.Nil(t, cryptoParams) @@ -328,7 +327,7 @@ func TestCryptoComponentsFactory_CreateCryptoParamsLoadKeysFailShouldErr(t *test ccf, _ := cryptoComp.NewCryptoComponentsFactory(args) suite, _ := ccf.GetSuite() - blockSignKeyGen := signing.NewKeyGenerator(suite) + blockSignKeyGen := crypto.NewKeyGenerator(suite) cryptoParams, err := ccf.CreateCryptoParams(blockSignKeyGen) require.Nil(t, cryptoParams) @@ -346,7 +345,7 @@ func TestCryptoComponentsFactory_CreateCryptoParamsOK(t *testing.T) { ccf, _ := cryptoComp.NewCryptoComponentsFactory(args) suite, _ := ccf.GetSuite() - blockSignKeyGen := signing.NewKeyGenerator(suite) + blockSignKeyGen := crypto.NewKeyGenerator(suite) cryptoParams, err := ccf.CreateCryptoParams(blockSignKeyGen) require.Nil(t, err) diff --git a/factory/crypto/export_test.go b/factory/crypto/export_test.go index 9e006c825f3..1409b6b4d02 100644 --- a/factory/crypto/export_test.go +++ b/factory/crypto/export_test.go @@ -1,7 +1,7 @@ package crypto import ( - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" ) diff --git a/factory/crypto/multiSignerContainer.go b/factory/crypto/multiSignerContainer.go index b886bfa0ad4..fd10dcb9665 100644 --- a/factory/crypto/multiSignerContainer.go +++ b/factory/crypto/multiSignerContainer.go @@ -8,7 +8,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/hashing/blake2b" "github.com/ElrondNetwork/elrond-go-core/hashing/sha256" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" disabledMultiSig "github.com/ElrondNetwork/elrond-go-crypto/signing/disabled/multisig" mclMultiSig "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl/multisig" "github.com/ElrondNetwork/elrond-go-crypto/signing/multisig" diff --git a/factory/interface.go b/factory/interface.go index 525aca8f261..abcc5ddda79 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -13,7 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/cmd/node/factory" "github.com/ElrondNetwork/elrond-go/common" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" diff --git a/genesis/checking/nodesSetupChecker.go b/genesis/checking/nodesSetupChecker.go index 6481cd0da33..8a76d033ee9 100644 --- a/genesis/checking/nodesSetupChecker.go +++ b/genesis/checking/nodesSetupChecker.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/genesis" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" ) diff --git a/genesis/dtos.go b/genesis/dtos.go index 0cb3692b7cb..9c8533876f0 100644 --- a/genesis/dtos.go +++ b/genesis/dtos.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" ) // IndexingData specifies transactions sets that will be used for indexing diff --git a/genesis/parsing/accountsParser.go b/genesis/parsing/accountsParser.go index 12e7e83e1df..64a327438f4 100644 --- a/genesis/parsing/accountsParser.go +++ b/genesis/parsing/accountsParser.go @@ -14,7 +14,7 @@ import ( transactionData "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/genesis" "github.com/ElrondNetwork/elrond-go/genesis/data" diff --git a/genesis/parsing/export_test.go b/genesis/parsing/export_test.go index 16886ee47a0..018bfe6819e 100644 --- a/genesis/parsing/export_test.go +++ b/genesis/parsing/export_test.go @@ -8,7 +8,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/data/outport" transactionData "github.com/ElrondNetwork/elrond-go-core/data/transaction" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/genesis" "github.com/ElrondNetwork/elrond-go/genesis/data" "github.com/ElrondNetwork/elrond-go/genesis/mock" diff --git a/genesis/parsing/smartContractParser.go b/genesis/parsing/smartContractParser.go index 9a0274b6c63..1e52b618cbf 100644 --- a/genesis/parsing/smartContractParser.go +++ b/genesis/parsing/smartContractParser.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/genesis" "github.com/ElrondNetwork/elrond-go/genesis/data" "github.com/ElrondNetwork/elrond-go/sharding" diff --git a/genesis/process/disabled/messageSignVerifier_test.go b/genesis/process/disabled/messageSignVerifier_test.go index 04a703f9f53..3ab5f997d29 100644 --- a/genesis/process/disabled/messageSignVerifier_test.go +++ b/genesis/process/disabled/messageSignVerifier_test.go @@ -3,7 +3,7 @@ package disabled import ( "testing" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" "github.com/stretchr/testify/assert" ) @@ -12,7 +12,7 @@ func TestMessageSignVerifier_Verify(t *testing.T) { t.Parallel() suite := mcl.NewSuiteBLS12() - keygen := signing.NewKeyGenerator(suite) + keygen := crypto.NewKeyGenerator(suite) sv, _ := NewMessageSignVerifier(keygen) diff --git a/go.mod b/go.mod index fdfe72804b6..0c663253eba 100644 --- a/go.mod +++ b/go.mod @@ -5,14 +5,14 @@ go 1.17 require ( github.com/ElrondNetwork/elastic-indexer-go v1.3.3 github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8 - github.com/ElrondNetwork/elrond-go-crypto v1.2.2 + github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc github.com/ElrondNetwork/elrond-go-logger v1.0.10 github.com/ElrondNetwork/elrond-go-p2p v1.0.5 github.com/ElrondNetwork/elrond-go-storage v1.0.4 github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58 - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221207113912-5e51bac72fff - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221207114041-931b5bdf1ded - github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221207114657-b4eea3cf49af + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396 + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e + github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index 6064228bc1a..f5c6e793ca8 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,7 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= @@ -51,8 +52,9 @@ github.com/ElrondNetwork/elastic-indexer-go v1.3.3/go.mod h1:E3VO5712GkGSGYnOTJ+ github.com/ElrondNetwork/elrond-go-core v1.1.26/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8 h1:iYFJrSgKmyRDFkDFBXABqs7UwjrGeA0b5Nit9xmogzk= github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= -github.com/ElrondNetwork/elrond-go-crypto v1.2.2 h1:Q59dZUeyibuskq5vjgk3ng/87ifOcd9YZMTnlYJAuIU= github.com/ElrondNetwork/elrond-go-crypto v1.2.2/go.mod h1:MyQPKUKti7Axnx/eihhL0F2jLTalvSV/Ytv1mIxvYyM= +github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc h1:BpKdjLY05fH/Y80s4n5vqIR73hSuZp4zFlL8+TAUWp4= +github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc/go.mod h1:niLdPSYjcIzucSj2yMy+yq3KEW0jjFCfvTBOMQphmXk= github.com/ElrondNetwork/elrond-go-logger v1.0.10 h1:2xQOWZErcHW5sl9qSRO+7mGNw+QhFhqiUlLLtOgvuuk= github.com/ElrondNetwork/elrond-go-logger v1.0.10/go.mod h1:+rMODFw4yQptTi5WuLUBzvl/AE26V+2YJtc52wX30Eg= github.com/ElrondNetwork/elrond-go-p2p v1.0.5 h1:XzuieXEKrVSQ9gKKO3sq60RRZC29IRYgmn7RsPmgUOA= @@ -65,12 +67,12 @@ github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58 github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58/go.mod h1:vBVpGtyb7ZerSqX/EOtUIGBGK9VtogmjwAmjAWCnCSw= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221207113912-5e51bac72fff h1:o10OzmXIsvUuj2oJx2tOdSeZCBkrcCvRm0Wb6kr+XRk= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221207113912-5e51bac72fff/go.mod h1:FT0hOm/rl6tHtD5CxXmX8mpds/ePJu4bkUP5FtaccBA= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221207114041-931b5bdf1ded h1:AA/9h/bBpnci8BiIHL45aw6Fj8FmWtqwXA2XOunYr7g= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221207114041-931b5bdf1ded/go.mod h1:d1MOr0Pj2fbhEY+s11fymAJ1zh1NIgelPEbb2JYUFeM= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221207114657-b4eea3cf49af h1:ZKnMeXgqnMVY72OB4nrg6soOm/YAnOvKq3U7WLK85s4= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221207114657-b4eea3cf49af/go.mod h1:ULGc4UkHCZ7s3/6Jl8dncbUYSWmGQ4ey+0/cmjJ4jhU= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396 h1:f2FK3XFIySd2qhON8Q2IBB47ZCTO4AD+BYMPSKoVg6M= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396/go.mod h1:VF3fx+63lmKVkINjn2NkY4pb5s47ZcsiqP8U2AnnnZM= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e h1:R8qyNLa9HINdYiUX+MCbJ3xWWqXT3K/lQ8mTQuENz3g= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e/go.mod h1:HSy/wfbfbEqEyxuMNiDBqDzYnKhcKDNhte7HEzYHIbw= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76 h1:8cLs/YMhQq+uKpEW/rN3W9v65yb3T4G4B/Kls9563UU= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76/go.mod h1:OUoPdsZVaMbwSnsnBAKKVVzmUeXW1fSsahfgEUdq+Hc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= diff --git a/heartbeat/sender/baseSender.go b/heartbeat/sender/baseSender.go index b4275242519..f27233acd71 100644 --- a/heartbeat/sender/baseSender.go +++ b/heartbeat/sender/baseSender.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/core/random" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/heartbeat" ) diff --git a/heartbeat/sender/bootstrapSender.go b/heartbeat/sender/bootstrapSender.go index bae82f67e73..04d95946f2f 100644 --- a/heartbeat/sender/bootstrapSender.go +++ b/heartbeat/sender/bootstrapSender.go @@ -5,7 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/heartbeat" "github.com/ElrondNetwork/elrond-go/heartbeat/sender/disabled" ) diff --git a/heartbeat/sender/peerAuthenticationSender.go b/heartbeat/sender/peerAuthenticationSender.go index c6f1eb4d003..e9dfe2bf26a 100644 --- a/heartbeat/sender/peerAuthenticationSender.go +++ b/heartbeat/sender/peerAuthenticationSender.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data/batch" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/heartbeat" ) diff --git a/heartbeat/sender/peerAuthenticationSender_test.go b/heartbeat/sender/peerAuthenticationSender_test.go index b89087af7a0..da0ca6e3879 100644 --- a/heartbeat/sender/peerAuthenticationSender_test.go +++ b/heartbeat/sender/peerAuthenticationSender_test.go @@ -12,7 +12,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data/batch" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" ed25519SingleSig "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" @@ -41,7 +40,7 @@ func createMockPeerAuthenticationSenderArgs(argBase argBaseSender) argPeerAuthen } func createMockPeerAuthenticationSenderArgsSemiIntegrationTests(baseArg argBaseSender) argPeerAuthenticationSender { - keyGen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keyGen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) sk, _ := keyGen.GeneratePair() baseArg.privKey = sk singleSigner := singlesig.NewBlsSigner() @@ -346,7 +345,7 @@ func TestPeerAuthenticationSender_execute(t *testing.T) { startTime := time.Now() // use the Elrond defined ed25519 operations instead of the secp256k1 implemented in the "real" network messenger, // should work with both - keyGen := signing.NewKeyGenerator(ed25519.NewEd25519()) + keyGen := crypto.NewKeyGenerator(ed25519.NewEd25519()) skMessenger, pkMessenger := keyGen.GeneratePair() signerMessenger := ed25519SingleSig.Ed25519Signer{} diff --git a/heartbeat/sender/sender.go b/heartbeat/sender/sender.go index 61c6a2963aa..44aade306ca 100644 --- a/heartbeat/sender/sender.go +++ b/heartbeat/sender/sender.go @@ -5,7 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/heartbeat" "github.com/ElrondNetwork/elrond-go/heartbeat/sender/disabled" ) diff --git a/integrationTests/frontend/wallet/dataField_test.go b/integrationTests/frontend/wallet/dataField_test.go index cd7beaf075f..a11e630743c 100644 --- a/integrationTests/frontend/wallet/dataField_test.go +++ b/integrationTests/frontend/wallet/dataField_test.go @@ -12,7 +12,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/marshal" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/stretchr/testify/assert" @@ -20,7 +19,7 @@ import ( func TestTxDataFieldContainingUTF8Characters(t *testing.T) { suite := ed25519.NewEd25519() - keyGen := signing.NewKeyGenerator(suite) + keyGen := crypto.NewKeyGenerator(suite) singleSigner := integrationTests.TestSingleSigner sk, pk := keyGen.GeneratePair() diff --git a/integrationTests/multiShard/block/interceptedHeadersSigVerification/interceptedHeadersSigVerification_test.go b/integrationTests/multiShard/block/interceptedHeadersSigVerification/interceptedHeadersSigVerification_test.go index 103d6705d8e..113a9d7a219 100644 --- a/integrationTests/multiShard/block/interceptedHeadersSigVerification/interceptedHeadersSigVerification_test.go +++ b/integrationTests/multiShard/block/interceptedHeadersSigVerification/interceptedHeadersSigVerification_test.go @@ -9,7 +9,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/stretchr/testify/assert" @@ -164,7 +163,7 @@ func TestInterceptedShardBlockHeaderWithLeaderSignatureAndRandSeedChecks(t *test consensusGroupSize := 3 singleSigner := integrationTests.TestSingleBlsSigner - keyGen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keyGen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) // create map of shard - testNodeProcessors for metachain and shard chain nodesMap := integrationTests.CreateNodesWithNodesCoordinatorKeygenAndSingleSigner( nodesPerShard, @@ -236,7 +235,7 @@ func TestInterceptedShardHeaderBlockWithWrongPreviousRandSeedShouldNotBeAccepted consensusGroupSize := 3 singleSigner := integrationTests.TestSingleBlsSigner - keyGen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keyGen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) // create map of shard - testNodeProcessors for metachain and shard chain nodesMap := integrationTests.CreateNodesWithNodesCoordinatorKeygenAndSingleSigner( nodesPerShard, diff --git a/integrationTests/multiShard/transaction/txRouting/txRouting_test.go b/integrationTests/multiShard/transaction/txRouting/txRouting_test.go index e9526356561..9f5bfe1420d 100644 --- a/integrationTests/multiShard/transaction/txRouting/txRouting_test.go +++ b/integrationTests/multiShard/transaction/txRouting/txRouting_test.go @@ -9,7 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/transaction" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" diff --git a/integrationTests/multisig/blsMultisig_test.go b/integrationTests/multisig/blsMultisig_test.go index 31cef69fa84..4d733645375 100644 --- a/integrationTests/multisig/blsMultisig_test.go +++ b/integrationTests/multisig/blsMultisig_test.go @@ -7,7 +7,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/hashing/blake2b" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" llsig "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl/multisig" "github.com/ElrondNetwork/elrond-go-crypto/signing/multisig" @@ -20,7 +19,7 @@ func createKeysAndMultiSignerBls( suite crypto.Suite, ) ([][]byte, [][]byte, crypto.MultiSigner) { - kg := signing.NewKeyGenerator(suite) + kg := crypto.NewKeyGenerator(suite) privKeys := make([][]byte, grSize) pubKeys := make([][]byte, grSize) diff --git a/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go b/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go index d0b956d9545..fbded007565 100644 --- a/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go +++ b/integrationTests/singleShard/transaction/interceptedBulkTx/interceptedBulkTx_test.go @@ -11,7 +11,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/transaction" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/integrationTests" "github.com/ElrondNetwork/elrond-go/process" "github.com/stretchr/testify/assert" diff --git a/integrationTests/state/stateTrie/stateTrie_test.go b/integrationTests/state/stateTrie/stateTrie_test.go index e74133d036d..9f19f17fc4a 100644 --- a/integrationTests/state/stateTrie/stateTrie_test.go +++ b/integrationTests/state/stateTrie/stateTrie_test.go @@ -22,7 +22,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/block" dataTx "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing/sha256" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/integrationTests" diff --git a/integrationTests/testConsensusNode.go b/integrationTests/testConsensusNode.go index 3421bdd8095..37e2cc6e34a 100644 --- a/integrationTests/testConsensusNode.go +++ b/integrationTests/testConsensusNode.go @@ -12,7 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/endProcess" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/hashing/blake2b" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/config" "github.com/ElrondNetwork/elrond-go/consensus/round" "github.com/ElrondNetwork/elrond-go/dataRetriever" diff --git a/integrationTests/testHeartbeatNode.go b/integrationTests/testHeartbeatNode.go index aa30da500d3..07eae1ad4be 100644 --- a/integrationTests/testHeartbeatNode.go +++ b/integrationTests/testHeartbeatNode.go @@ -14,8 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/endProcess" "github.com/ElrondNetwork/elrond-go-core/display" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl/singlesig" "github.com/ElrondNetwork/elrond-go/common" @@ -115,7 +114,7 @@ func NewTestHeartbeatNode( p2pConfig p2pConfig.P2PConfig, heartbeatExpiryTimespanInSec int64, ) *TestHeartbeatNode { - keygen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keygen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) sk, pk := keygen.GeneratePair() pksBytes := make(map[uint32][]byte, maxShards) @@ -208,7 +207,7 @@ func NewTestHeartbeatNodeWithCoordinator( coordinator nodesCoordinator.NodesCoordinator, keys TestKeyPair, ) *TestHeartbeatNode { - keygen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keygen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) singleSigner := singlesig.NewBlsSigner() peerSigHandler := &cryptoMocks.PeerSignatureHandlerStub{ @@ -805,7 +804,7 @@ func (thn *TestHeartbeatNode) IsInterfaceNil() bool { func createCryptoPair() TestKeyPair { suite := mcl.NewSuiteBLS12() - keyGen := signing.NewKeyGenerator(suite) + keyGen := crypto.NewKeyGenerator(suite) kp := TestKeyPair{} kp.Sk, kp.Pk = keyGen.GeneratePair() diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index d17b65ea8f6..eeb0e666fc8 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -23,8 +23,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/hashing/sha256" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -1857,7 +1856,7 @@ func GenerateSkAndPkInShard( shardId uint32, ) (crypto.PrivateKey, crypto.PublicKey, crypto.KeyGenerator) { suite := ed25519.NewEd25519() - keyGen := signing.NewKeyGenerator(suite) + keyGen := crypto.NewKeyGenerator(suite) sk, pk := keyGen.GeneratePair() if shardId == core.MetachainShardId { @@ -2115,8 +2114,8 @@ func generateValidTx( cryptoComponents := GetDefaultCryptoComponents() cryptoComponents.TxSig = TestSingleSigner - cryptoComponents.TxKeyGen = signing.NewKeyGenerator(ed25519.NewEd25519()) - cryptoComponents.BlKeyGen = signing.NewKeyGenerator(ed25519.NewEd25519()) + cryptoComponents.TxKeyGen = crypto.NewKeyGenerator(ed25519.NewEd25519()) + cryptoComponents.BlKeyGen = crypto.NewKeyGenerator(ed25519.NewEd25519()) stateComponents := GetDefaultStateComponents() stateComponents.Accounts = accnts @@ -2219,10 +2218,10 @@ func GenValidatorsFromPubKeysAndTxPubKeys( // CreateCryptoParams generates the crypto parameters (key pairs, key generator and suite) for multiple nodes func CreateCryptoParams(nodesPerShard int, nbMetaNodes int, nbShards uint32) *CryptoParams { txSuite := ed25519.NewEd25519() - txKeyGen := signing.NewKeyGenerator(txSuite) + txKeyGen := crypto.NewKeyGenerator(txSuite) suite := mcl.NewSuiteBLS12() singleSigner := TestSingleSigner - keyGen := signing.NewKeyGenerator(suite) + keyGen := crypto.NewKeyGenerator(suite) txKeysMap := make(map[uint32][]*TestKeyPair) keysMap := make(map[uint32][]*TestKeyPair) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 38936e70df5..d4d13b75df7 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -25,8 +25,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing/keccak" "github.com/ElrondNetwork/elrond-go-core/hashing/sha256" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" ed25519SingleSig "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" @@ -152,7 +151,7 @@ var TestValidatorPubkeyConverter, _ = pubkeyConverter.NewHexPubkeyConverter(96) var TestMultiSig = cryptoMocks.NewMultiSigner() // TestKeyGenForAccounts represents a mock key generator for balances -var TestKeyGenForAccounts = signing.NewKeyGenerator(ed25519.NewEd25519()) +var TestKeyGenForAccounts = crypto.NewKeyGenerator(ed25519.NewEd25519()) // TestUint64Converter represents an uint64 to byte slice converter var TestUint64Converter = uint64ByteSlice.NewBigEndianConverter() @@ -448,7 +447,7 @@ func newBaseTestProcessorNode(args ArgTestProcessorNode) *TestProcessorNode { BootstrapStorer: &mock.BoostrapStorerMock{}, RatingsData: args.RatingsData, EpochStartNotifier: args.EpochStartSubscriber, - GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } tpn.NodeKeys = args.NodeKeys @@ -744,7 +743,7 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str EpochNotifier: tpn.EpochNotifier, EnableEpochsHandler: tpn.EnableEpochsHandler, MaxNumNodesInTransferRole: 100, - GuardedAccountHandler: tpn.GuardedAccountHandler, + GuardedAccountHandler: tpn.GuardedAccountHandler, } argsBuiltIn.AutomaticCrawlerAddresses = GenerateOneAddressPerShard(argsBuiltIn.ShardCoordinator) builtInFuncFactory, _ := builtInFunctions.CreateBuiltInFunctionsFactory(argsBuiltIn) @@ -932,7 +931,7 @@ func (tpn *TestProcessorNode) initEconomicsData(economicsConfig *config.Economic EpochNotifier: tpn.EpochNotifier, EnableEpochsHandler: tpn.EnableEpochsHandler, BuiltInFunctionsCostHandler: &mock.BuiltInCostHandlerStub{}, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } economicsData, _ := economics.NewEconomicsData(argsNewEconomicsData) tpn.EconomicsData = economics.NewTestEconomicsData(economicsData) @@ -1162,7 +1161,7 @@ func (tpn *TestProcessorNode) initInterceptors(heartbeatPk string) { HeartbeatExpiryTimespanInSec: 30, PeerShardMapper: tpn.PeerShardMapper, HardforkTrigger: tpn.HardforkTrigger, - GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, + GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorContainerFactoryArgs) @@ -1228,7 +1227,7 @@ func (tpn *TestProcessorNode) initInterceptors(heartbeatPk string) { HeartbeatExpiryTimespanInSec: 30, PeerShardMapper: tpn.PeerShardMapper, HardforkTrigger: tpn.HardforkTrigger, - GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, + GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewShardInterceptorsContainerFactory(shardIntereptorContainerFactoryArgs) @@ -1387,7 +1386,7 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u EpochNotifier: tpn.EpochNotifier, EnableEpochsHandler: tpn.EnableEpochsHandler, MaxNumNodesInTransferRole: 100, - GuardedAccountHandler: tpn.GuardedAccountHandler, + GuardedAccountHandler: tpn.GuardedAccountHandler, } argsBuiltIn.AutomaticCrawlerAddresses = GenerateOneAddressPerShard(argsBuiltIn.ShardCoordinator) builtInFuncFactory, _ := builtInFunctions.CreateBuiltInFunctionsFactory(argsBuiltIn) @@ -1501,8 +1500,8 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u ArgsParser: tpn.ArgsParser, ScrForwarder: tpn.ScrForwarder, EnableEpochsHandler: tpn.EnableEpochsHandler, - GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } tpn.TxProcessor, _ = transaction.NewTxProcessor(argsNewTxProcessor) scheduledSCRsStorer, _ := tpn.Storage.GetStorer(dataRetriever.ScheduledSCRsUnit) @@ -1602,7 +1601,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri EpochNotifier: tpn.EpochNotifier, EnableEpochsHandler: tpn.EnableEpochsHandler, MaxNumNodesInTransferRole: 100, - GuardedAccountHandler: tpn.GuardedAccountHandler, + GuardedAccountHandler: tpn.GuardedAccountHandler, } argsBuiltIn.AutomaticCrawlerAddresses = GenerateOneAddressPerShard(argsBuiltIn.ShardCoordinator) builtInFuncFactory, _ := builtInFunctions.CreateBuiltInFunctionsFactory(argsBuiltIn) @@ -1627,7 +1626,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri var signVerifier vm.MessageSignVerifier if tpn.UseValidVmBlsSigVerifier { signVerifier, _ = vmProcess.NewMessageSigVerifier( - signing.NewKeyGenerator(mcl.NewSuiteBLS12()), + crypto.NewKeyGenerator(mcl.NewSuiteBLS12()), mclsig.NewBlsSigner(), ) } else { @@ -1741,8 +1740,8 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri TxTypeHandler: txTypeHandler, EconomicsFee: tpn.EconomicsData, EnableEpochsHandler: tpn.EnableEpochsHandler, - GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } tpn.TxProcessor, _ = transaction.NewMetaTxProcessor(argsNewMetaTxProc) scheduledSCRsStorer, _ := tpn.Storage.GetStorer(dataRetriever.ScheduledSCRsUnit) diff --git a/integrationTests/testProcessorNodeWithCoordinator.go b/integrationTests/testProcessorNodeWithCoordinator.go index 43171a395e0..ae138525966 100644 --- a/integrationTests/testProcessorNodeWithCoordinator.go +++ b/integrationTests/testProcessorNodeWithCoordinator.go @@ -5,8 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/data/endProcess" - crypto "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" "github.com/ElrondNetwork/elrond-go/integrationTests/mock" @@ -132,8 +131,8 @@ func createNodesCryptoParams(rewardsAddrsAssignments map[uint32][]uint32) (map[u suiteBlock := mcl.NewSuiteBLS12() suiteTx := ed25519.NewEd25519() - blockSignKeyGen := signing.NewKeyGenerator(suiteBlock) - txSignKeyGen := signing.NewKeyGenerator(suiteTx) + blockSignKeyGen := crypto.NewKeyGenerator(suiteBlock) + txSignKeyGen := crypto.NewKeyGenerator(suiteTx) // we need to first precompute the num shard ID for shardID := range rewardsAddrsAssignments { diff --git a/integrationTests/testProcessorNodeWithMultisigner.go b/integrationTests/testProcessorNodeWithMultisigner.go index 162687db599..ec3d9ca184f 100644 --- a/integrationTests/testProcessorNodeWithMultisigner.go +++ b/integrationTests/testProcessorNodeWithMultisigner.go @@ -14,7 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/endProcess" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/hashing/blake2b" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" mclmultisig "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl/multisig" "github.com/ElrondNetwork/elrond-go-crypto/signing/multisig" "github.com/ElrondNetwork/elrond-go/config" diff --git a/integrationTests/vm/delegation/delegationScenarios_test.go b/integrationTests/vm/delegation/delegationScenarios_test.go index cf772a496a8..b01650867a8 100644 --- a/integrationTests/vm/delegation/delegationScenarios_test.go +++ b/integrationTests/vm/delegation/delegationScenarios_test.go @@ -17,7 +17,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/rewardTx" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl" mclsig "github.com/ElrondNetwork/elrond-go-crypto/signing/mcl/singlesig" "github.com/ElrondNetwork/elrond-go/dataRetriever/dataPool" @@ -428,7 +427,7 @@ func TestDelegationSystemMultipleDelegationContractsAndSameBlsKeysShouldNotWork( } // add same BLS keys to all delegation contracts - keyGen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keyGen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) signer := mclsig.NewBlsSigner() pubKeys := make([][]byte, totalNumNodes) @@ -1400,7 +1399,7 @@ func addNodesTxData(blsKeys, sigs [][]byte) string { } func getBlsKeysAndSignatures(msg []byte, num int) ([][]byte, [][]byte) { - keyGen := signing.NewKeyGenerator(mcl.NewSuiteBLS12()) + keyGen := crypto.NewKeyGenerator(mcl.NewSuiteBLS12()) signer := mclsig.NewBlsSigner() pubKeys := make([][]byte, num) diff --git a/node/nodeTesting.go b/node/nodeTesting.go index b4bf7369e99..4cb3b38bcca 100644 --- a/node/nodeTesting.go +++ b/node/nodeTesting.go @@ -11,7 +11,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/partitioning" "github.com/ElrondNetwork/elrond-go-core/data/batch" "github.com/ElrondNetwork/elrond-go-core/data/transaction" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/process/factory" "github.com/ElrondNetwork/elrond-go/process/txsSender" diff --git a/node/nodeTesting_test.go b/node/nodeTesting_test.go index cb605fa5361..d692000454f 100644 --- a/node/nodeTesting_test.go +++ b/node/nodeTesting_test.go @@ -10,7 +10,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/batch" "github.com/ElrondNetwork/elrond-go-core/data/transaction" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/node" diff --git a/node/node_test.go b/node/node_test.go index f590bb0067e..633b081f8ff 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -28,7 +28,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/hashing/sha256" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/common/holders" "github.com/ElrondNetwork/elrond-go/dataRetriever" diff --git a/process/factory/interceptorscontainer/args.go b/process/factory/interceptorscontainer/args.go index 40800309184..4fc5e5351d3 100644 --- a/process/factory/interceptorscontainer/args.go +++ b/process/factory/interceptorscontainer/args.go @@ -1,7 +1,7 @@ package interceptorscontainer import ( - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/dataRetriever" "github.com/ElrondNetwork/elrond-go/heartbeat" "github.com/ElrondNetwork/elrond-go/process" diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index e0b15d06c4f..053656f6b6f 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -6,7 +6,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go index 3a26a9fc3b7..2ba1552aca7 100644 --- a/process/guardedtx/guardedTxVerifier_test.go +++ b/process/guardedtx/guardedTxVerifier_test.go @@ -12,8 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" txStruct "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" "github.com/ElrondNetwork/elrond-go/process" @@ -92,7 +91,7 @@ func TestGuardedTxSigVerifier_IsInterfaceNil(t *testing.T) { func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { suite := ed25519.NewEd25519() - keyGenerator := signing.NewKeyGenerator(suite) + keyGenerator := crypto.NewKeyGenerator(suite) privateKeyGuardian, publicKeyGuardian := keyGenerator.GeneratePair() privateKeyOwner, publicKeyOwner := keyGenerator.GeneratePair() pubKeyGuardianBytes, _ := publicKeyGuardian.ToByteArray() diff --git a/process/headerCheck/headerSignatureVerify.go b/process/headerCheck/headerSignatureVerify.go index e424ef68677..abc8426c115 100644 --- a/process/headerCheck/headerSignatureVerify.go +++ b/process/headerCheck/headerSignatureVerify.go @@ -8,7 +8,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" logger "github.com/ElrondNetwork/elrond-go-logger" cryptoCommon "github.com/ElrondNetwork/elrond-go/common/crypto" "github.com/ElrondNetwork/elrond-go/process" diff --git a/process/headerCheck/headerSignatureVerify_test.go b/process/headerCheck/headerSignatureVerify_test.go index 7d01fbe656c..829b4c44955 100644 --- a/process/headerCheck/headerSignatureVerify_test.go +++ b/process/headerCheck/headerSignatureVerify_test.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data" dataBlock "github.com/ElrondNetwork/elrond-go-core/data/block" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/sharding/nodesCoordinator" diff --git a/process/heartbeat/interceptedPeerAuthentication.go b/process/heartbeat/interceptedPeerAuthentication.go index 39b1f8c4cc8..4bb3d829827 100644 --- a/process/heartbeat/interceptedPeerAuthentication.go +++ b/process/heartbeat/interceptedPeerAuthentication.go @@ -7,7 +7,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/heartbeat" "github.com/ElrondNetwork/elrond-go/process" diff --git a/process/interceptors/factory/argInterceptedDataFactory.go b/process/interceptors/factory/argInterceptedDataFactory.go index 73a95b38bd0..39a8a6d1126 100644 --- a/process/interceptors/factory/argInterceptedDataFactory.go +++ b/process/interceptors/factory/argInterceptedDataFactory.go @@ -5,7 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/typeConverters" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" diff --git a/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go b/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go index 0b23244fc18..2825b4a6879 100644 --- a/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go +++ b/process/interceptors/factory/interceptedMetaHeaderDataFactory_test.go @@ -9,7 +9,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/core/versioning" "github.com/ElrondNetwork/elrond-go-core/data/block" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/block/interceptedBlocks" "github.com/ElrondNetwork/elrond-go/process/mock" diff --git a/process/interceptors/factory/interceptedPeerAuthenticationDataFactory.go b/process/interceptors/factory/interceptedPeerAuthenticationDataFactory.go index 38b491bae9b..6603f4c580e 100644 --- a/process/interceptors/factory/interceptedPeerAuthenticationDataFactory.go +++ b/process/interceptors/factory/interceptedPeerAuthenticationDataFactory.go @@ -5,7 +5,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/heartbeat" "github.com/ElrondNetwork/elrond-go/process/heartbeat/validator" diff --git a/process/mock/peerSignatureHandlerStub.go b/process/mock/peerSignatureHandlerStub.go index 87f8d78d774..3314bc239d0 100644 --- a/process/mock/peerSignatureHandlerStub.go +++ b/process/mock/peerSignatureHandlerStub.go @@ -2,7 +2,7 @@ package mock import ( "github.com/ElrondNetwork/elrond-go-core/core" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" ) // PeerSignatureHandlerStub - diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index 2beab56ff7b..d250f0fd57c 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -12,7 +12,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go-core/hashing" "github.com/ElrondNetwork/elrond-go-core/marshal" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" diff --git a/redundancy/bootstrapRedundancy.go b/redundancy/bootstrapRedundancy.go index 5d29f2558a8..7fbea30a32e 100644 --- a/redundancy/bootstrapRedundancy.go +++ b/redundancy/bootstrapRedundancy.go @@ -2,7 +2,7 @@ package redundancy import ( "github.com/ElrondNetwork/elrond-go-core/core/check" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" ) type bootstrapNodeRedundancy struct { diff --git a/testscommon/components/default.go b/testscommon/components/default.go index bc9d8be35cd..37b5aaa260c 100644 --- a/testscommon/components/default.go +++ b/testscommon/components/default.go @@ -3,7 +3,7 @@ package components import ( "time" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/common" "github.com/ElrondNetwork/elrond-go/factory/mock" "github.com/ElrondNetwork/elrond-go/sharding" diff --git a/testscommon/cryptoMocks/multiSignerContainerMock.go b/testscommon/cryptoMocks/multiSignerContainerMock.go index f76dbd8236d..3ef77db205b 100644 --- a/testscommon/cryptoMocks/multiSignerContainerMock.go +++ b/testscommon/cryptoMocks/multiSignerContainerMock.go @@ -1,6 +1,6 @@ package cryptoMocks -import crypto "github.com/ElrondNetwork/elrond-go-crypto" +import "github.com/ElrondNetwork/elrond-go-crypto" // MultiSignerContainerMock - type MultiSignerContainerMock struct { diff --git a/testscommon/cryptoMocks/multiSignerContainerStub.go b/testscommon/cryptoMocks/multiSignerContainerStub.go index 048c124b009..1a921851c52 100644 --- a/testscommon/cryptoMocks/multiSignerContainerStub.go +++ b/testscommon/cryptoMocks/multiSignerContainerStub.go @@ -1,6 +1,6 @@ package cryptoMocks -import crypto "github.com/ElrondNetwork/elrond-go-crypto" +import "github.com/ElrondNetwork/elrond-go-crypto" // MultiSignerContainerStub - type MultiSignerContainerStub struct { diff --git a/testscommon/cryptoMocks/peerSignatureHandlerStub.go b/testscommon/cryptoMocks/peerSignatureHandlerStub.go index a6bb3c04633..ca946319e68 100644 --- a/testscommon/cryptoMocks/peerSignatureHandlerStub.go +++ b/testscommon/cryptoMocks/peerSignatureHandlerStub.go @@ -2,7 +2,7 @@ package cryptoMocks import ( "github.com/ElrondNetwork/elrond-go-core/core" - crypto "github.com/ElrondNetwork/elrond-go-crypto" + "github.com/ElrondNetwork/elrond-go-crypto" ) // PeerSignatureHandlerStub - From d79cba30baf7867aa81a5ab68e690f1ce0096dc9 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 19 Dec 2022 17:49:05 +0200 Subject: [PATCH 103/335] add guardian service UID --- go.mod | 4 +- go.sum | 6 ++- node/node.go | 2 + process/errors.go | 3 ++ .../disabled/disabledGuardedAccount.go | 2 +- process/guardian/guardedAccount.go | 11 ++++- process/guardian/guardedAccount_test.go | 44 ++++++++++++++++--- process/interface.go | 2 +- .../guardianAccountHandlerStub.go | 6 +-- 9 files changed, 62 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 0c663253eba..7ea4ca77309 100644 --- a/go.mod +++ b/go.mod @@ -4,12 +4,12 @@ go 1.17 require ( github.com/ElrondNetwork/elastic-indexer-go v1.3.3 - github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8 + github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9 github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc github.com/ElrondNetwork/elrond-go-logger v1.0.10 github.com/ElrondNetwork/elrond-go-p2p v1.0.5 github.com/ElrondNetwork/elrond-go-storage v1.0.4 - github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58 + github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396 github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76 diff --git a/go.sum b/go.sum index f5c6e793ca8..f1fe2328ad3 100644 --- a/go.sum +++ b/go.sum @@ -50,8 +50,9 @@ github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53 github.com/ElrondNetwork/elastic-indexer-go v1.3.3 h1:RgJ043yt92PUWMbSAQHRrC+GiyNnFdwdM/kseHlpLoo= github.com/ElrondNetwork/elastic-indexer-go v1.3.3/go.mod h1:E3VO5712GkGSGYnOTJ+0wxW74JXgjV6XCRPlcHiTTK0= github.com/ElrondNetwork/elrond-go-core v1.1.26/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= -github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8 h1:iYFJrSgKmyRDFkDFBXABqs7UwjrGeA0b5Nit9xmogzk= github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= +github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9 h1:bqVom8Mvfmep6YYW8JjAfrZ+L0I139Llm68hgNc1tP4= +github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= github.com/ElrondNetwork/elrond-go-crypto v1.2.2/go.mod h1:MyQPKUKti7Axnx/eihhL0F2jLTalvSV/Ytv1mIxvYyM= github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc h1:BpKdjLY05fH/Y80s4n5vqIR73hSuZp4zFlL8+TAUWp4= github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc/go.mod h1:niLdPSYjcIzucSj2yMy+yq3KEW0jjFCfvTBOMQphmXk= @@ -63,8 +64,9 @@ github.com/ElrondNetwork/elrond-go-storage v1.0.2/go.mod h1:SRsv4hUtL1BCiQe0eADt github.com/ElrondNetwork/elrond-go-storage v1.0.4 h1:esyXbHQvlR6m4HGeC86Nq0xAJ74+QG9EnUgfG+wQDYQ= github.com/ElrondNetwork/elrond-go-storage v1.0.4/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34= github.com/ElrondNetwork/elrond-vm-common v1.3.27/go.mod h1:3GKLv9hUFYEVxoBgtaCmaZo9HMNfKN9mM/O/xX83Rbw= -github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58 h1:ZduFPEw1cMjTDpJPLXfxOybidOzJ++FWeH/xMsgRxP4= github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58/go.mod h1:vBVpGtyb7ZerSqX/EOtUIGBGK9VtogmjwAmjAWCnCSw= +github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d h1:pm2jV0AzYtkW4J0phwIuQwEQDVk0For8qC8rZZvFWHM= +github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d/go.mod h1:7aTygO6Kr+Bj8T7nQVFhSqLOji32E7FMHjzNhEkrL7M= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396 h1:f2FK3XFIySd2qhON8Q2IBB47ZCTO4AD+BYMPSKoVg6M= diff --git a/node/node.go b/node/node.go index 5de81dcb831..946902437ad 100644 --- a/node/node.go +++ b/node/node.go @@ -377,12 +377,14 @@ func (n *Node) getPendingAndActiveGuardians( activeGuardian = &api.Guardian{ Address: n.coreComponents.AddressPubKeyConverter().Encode(active.Address), ActivationEpoch: active.ActivationEpoch, + ServiceUID: string(active.ServiceUID), } } if pending != nil { pendingGuardian = &api.Guardian{ Address: n.coreComponents.AddressPubKeyConverter().Encode(pending.Address), ActivationEpoch: pending.ActivationEpoch, + ServiceUID: string(pending.ServiceUID), } } diff --git a/process/errors.go b/process/errors.go index fba4136f74e..46baf579b63 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1185,5 +1185,8 @@ var ErrInvalidSetGuardianEpochsDelay = errors.New("incorrect setting for set gua // ErrCannotReplaceGuardedAccountPendingGuardian signals that a pending guardian on a guarded account cannot be replaced var ErrCannotReplaceGuardedAccountPendingGuardian = errors.New("cannot replace pending guardian on guarded account") +// ErrNilGuardianServiceUID signals that a nil guardian service identifier was provided +var ErrNilGuardianServiceUID = errors.New("nil guardian service unique identifier") + // ErrGasPriceTooHigh signals a too high gas price var ErrGasPriceTooHigh = errors.New("gas price is too high for the transaction") diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go index 1bfb65db1c5..80863dca1d7 100644 --- a/process/guardian/disabled/disabledGuardedAccount.go +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -29,7 +29,7 @@ func (dga *disabledGuardedAccount) HasPendingGuardian(_ state.UserAccountHandler } // SetGuardian returns nil as this is a disabled implementation -func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte, _ []byte) error { +func (dga *disabledGuardedAccount) SetGuardian(_ vmcommon.UserAccountHandler, _ []byte, _ []byte, _ []byte) error { return nil } diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 2b606afb724..1ea1ddc5385 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -115,19 +115,24 @@ func (agc *guardedAccount) HasPendingGuardian(uah state.UserAccountHandler) bool } // SetGuardian sets a guardian for an account -func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error { +func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error { stateUserAccount, ok := uah.(state.UserAccountHandler) if !ok { return process.ErrWrongTypeAssertion } + if len(guardianServiceUID) == 0 { + return process.ErrNilGuardianServiceUID + } + if len(txGuardianAddress) > 0 { - return agc.instantSetGuardian(stateUserAccount, guardianAddress, txGuardianAddress) + return agc.instantSetGuardian(stateUserAccount, guardianAddress, txGuardianAddress, guardianServiceUID) } guardian := &guardians.Guardian{ Address: guardianAddress, ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochsDelay, + ServiceUID: guardianServiceUID, } return agc.setAccountGuardian(stateUserAccount, guardian) @@ -173,6 +178,7 @@ func (agc *guardedAccount) instantSetGuardian( uah state.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, + guardianServiceUID []byte, ) error { accountGuardians, err := agc.getConfiguredGuardians(uah) if err != nil { @@ -192,6 +198,7 @@ func (agc *guardedAccount) instantSetGuardian( guardian := &guardians.Guardian{ Address: guardianAddress, ActivationEpoch: agc.currentEpoch, + ServiceUID: guardianServiceUID, } accountGuardians.Slice = []*guardians.Guardian{guardian} diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 0ffd67e2eae..40bac28cba1 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -349,6 +349,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { ActivationEpoch: 20, } txGuardianAddress := []byte("guardian address") + guardianServiceUID := []byte("testID") t.Run("getActiveGuardianErr with err (no active guardian) should error", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{}} @@ -360,7 +361,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { }, } - err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) + err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress, guardianServiceUID) require.Equal(t, process.ErrAccountHasNoActiveGuardian, err) }) t.Run("tx signed by different than active guardian should err", func(t *testing.T) { @@ -378,17 +379,19 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { }, } - err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) + err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress, guardianServiceUID) require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err) }) t.Run("immediately set the guardian if setGuardian tx is signed by active guardian", func(t *testing.T) { activeGuardian := &guardians.Guardian{ Address: txGuardianAddress, ActivationEpoch: 1, + ServiceUID: guardianServiceUID, } newGuardian := &guardians.Guardian{ Address: []byte("new guardian address"), ActivationEpoch: currentEpoch, + ServiceUID: []byte("testServiceID2"), } configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{activeGuardian}} @@ -409,7 +412,7 @@ func TestGuardedAccount_instantSetGuardian(t *testing.T) { } }} - err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress) + err := ga.instantSetGuardian(ua, newGuardian.Address, txGuardianAddress, newGuardian.ServiceUID) require.Nil(t, err) }) } @@ -597,18 +600,22 @@ func TestGuardedAccount_getPendingGuardian(t *testing.T) { func TestGuardedAccount_SetGuardian(t *testing.T) { currentEpoch := uint32(10) ga := createGuardedAccountWithEpoch(currentEpoch) + guardianServiceUID := []byte("testID") + initialServiceUID := []byte("test2ID") g1 := &guardians.Guardian{ Address: []byte("guardian address 1"), ActivationEpoch: currentEpoch - 2, + ServiceUID: initialServiceUID, } g2 := &guardians.Guardian{ Address: []byte("guardian address 2"), ActivationEpoch: currentEpoch - 1, + ServiceUID: initialServiceUID, } newGuardianAddress := []byte("new guardian address") t.Run("invalid user account handler should err", func(t *testing.T) { - err := ga.SetGuardian(nil, newGuardianAddress, g1.Address) + err := ga.SetGuardian(nil, newGuardianAddress, g1.Address, guardianServiceUID) require.Equal(t, process.ErrWrongTypeAssertion, err) }) t.Run("transaction signed by current active guardian but instantSetGuardian returns error", func(t *testing.T) { @@ -619,7 +626,7 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { return val, 0, err }, } - err := ga.SetGuardian(uah, newGuardianAddress, g2.Address) + err := ga.SetGuardian(uah, newGuardianAddress, g2.Address, guardianServiceUID) require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err) }) t.Run("instantly set guardian if tx signed by current active guardian", func(t *testing.T) { @@ -627,6 +634,7 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { newGuardian := &guardians.Guardian{ Address: newGuardianAddress, ActivationEpoch: currentEpoch, + ServiceUID: guardianServiceUID, } expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{newGuardian}}) @@ -645,14 +653,36 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { } }, } - err := ga.SetGuardian(uah, newGuardianAddress, g1.Address) + err := ga.SetGuardian(uah, newGuardianAddress, g1.Address, guardianServiceUID) require.Nil(t, err) }) + t.Run("nil guardian serviceUID should err", func(t *testing.T) { + configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} + saveKeyValueCalled := false + uah := &stateMocks.UserAccountStub{ + RetrieveValueCalled: func(key []byte) ([]byte, uint32, error) { + val, err := ga.marshaller.Marshal(configuredGuardians) + return val, 0, err + }, + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(_ []byte, _ []byte) error { + saveKeyValueCalled = true + return nil + }, + } + }, + } + err := ga.SetGuardian(uah, newGuardianAddress, g1.Address, nil) + require.False(t, saveKeyValueCalled) + require.Equal(t, process.ErrNilGuardianServiceUID, err) + }) t.Run("tx not signed by active guardian sets guardian with delay", func(t *testing.T) { configuredGuardians := &guardians.Guardians{Slice: []*guardians.Guardian{g1}} newGuardian := &guardians.Guardian{ Address: newGuardianAddress, ActivationEpoch: currentEpoch + ga.guardianActivationEpochsDelay, + ServiceUID: guardianServiceUID, } expectedNewGuardians, _ := ga.marshaller.Marshal(&guardians.Guardians{Slice: []*guardians.Guardian{g1, newGuardian}}) @@ -671,7 +701,7 @@ func TestGuardedAccount_SetGuardian(t *testing.T) { } }, } - err := ga.SetGuardian(uah, newGuardianAddress, nil) + err := ga.SetGuardian(uah, newGuardianAddress, nil, guardianServiceUID) require.Nil(t, err) }) } diff --git a/process/interface.go b/process/interface.go index b5d4070c86a..70c71394fc0 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1258,7 +1258,7 @@ type GuardedAccountHandler interface { GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) HasActiveGuardian(uah state.UserAccountHandler) bool HasPendingGuardian(uah state.UserAccountHandler) bool - SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error + SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error CleanOtherThanActive(uah vmcommon.UserAccountHandler) GetConfiguredGuardians(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) IsInterfaceNil() bool diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go index bf0f600dbe7..f3c86715f96 100644 --- a/testscommon/guardianMocks/guardianAccountHandlerStub.go +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -9,7 +9,7 @@ import ( // GuardedAccountHandlerStub - type GuardedAccountHandlerStub struct { GetActiveGuardianCalled func(handler vmcommon.UserAccountHandler) ([]byte, error) - SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error + SetGuardianCalled func(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error HasPendingGuardianCalled func(uah state.UserAccountHandler) bool HasActiveGuardianCalled func(uah state.UserAccountHandler) bool CleanOtherThanActiveCalled func(uah vmcommon.UserAccountHandler) @@ -41,9 +41,9 @@ func (gahs *GuardedAccountHandlerStub) HasPendingGuardian(uah state.UserAccountH } // SetGuardian - -func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte) error { +func (gahs *GuardedAccountHandlerStub) SetGuardian(uah vmcommon.UserAccountHandler, guardianAddress []byte, txGuardianAddress []byte, guardianServiceUID []byte) error { if gahs.SetGuardianCalled != nil { - return gahs.SetGuardianCalled(uah, guardianAddress, txGuardianAddress) + return gahs.SetGuardianCalled(uah, guardianAddress, txGuardianAddress, guardianServiceUID) } return nil } From fb798ededa125daafe0296fd492930f28f056fc9 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 20 Dec 2022 11:49:07 +0200 Subject: [PATCH 104/335] update gomod --- go.mod | 8 ++++---- go.sum | 18 ++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 7ea4ca77309..3777cd8e274 100644 --- a/go.mod +++ b/go.mod @@ -5,14 +5,14 @@ go 1.17 require ( github.com/ElrondNetwork/elastic-indexer-go v1.3.3 github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9 - github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc + github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce github.com/ElrondNetwork/elrond-go-logger v1.0.10 github.com/ElrondNetwork/elrond-go-p2p v1.0.5 github.com/ElrondNetwork/elrond-go-storage v1.0.4 github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d - github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396 - github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e - github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76 + github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c + github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221220092736-8cf25a9de448 + github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.70-0.20221220092056-49d2bc14b314 github.com/beevik/ntp v0.3.0 github.com/davecgh/go-spew v1.1.1 github.com/elastic/go-elasticsearch/v7 v7.12.0 diff --git a/go.sum b/go.sum index f1fe2328ad3..dc0b16b3c57 100644 --- a/go.sum +++ b/go.sum @@ -50,12 +50,11 @@ github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53 github.com/ElrondNetwork/elastic-indexer-go v1.3.3 h1:RgJ043yt92PUWMbSAQHRrC+GiyNnFdwdM/kseHlpLoo= github.com/ElrondNetwork/elastic-indexer-go v1.3.3/go.mod h1:E3VO5712GkGSGYnOTJ+0wxW74JXgjV6XCRPlcHiTTK0= github.com/ElrondNetwork/elrond-go-core v1.1.26/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= -github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221207113027-6add1889c6e8/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9 h1:bqVom8Mvfmep6YYW8JjAfrZ+L0I139Llm68hgNc1tP4= github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= github.com/ElrondNetwork/elrond-go-crypto v1.2.2/go.mod h1:MyQPKUKti7Axnx/eihhL0F2jLTalvSV/Ytv1mIxvYyM= -github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc h1:BpKdjLY05fH/Y80s4n5vqIR73hSuZp4zFlL8+TAUWp4= -github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221212134904-9faa0161e5dc/go.mod h1:niLdPSYjcIzucSj2yMy+yq3KEW0jjFCfvTBOMQphmXk= +github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce h1:zRLWpUnawPkbJ0b3lDkVWJwhNHwlaPN5POcXz+ToqqE= +github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce/go.mod h1:niLdPSYjcIzucSj2yMy+yq3KEW0jjFCfvTBOMQphmXk= github.com/ElrondNetwork/elrond-go-logger v1.0.10 h1:2xQOWZErcHW5sl9qSRO+7mGNw+QhFhqiUlLLtOgvuuk= github.com/ElrondNetwork/elrond-go-logger v1.0.10/go.mod h1:+rMODFw4yQptTi5WuLUBzvl/AE26V+2YJtc52wX30Eg= github.com/ElrondNetwork/elrond-go-p2p v1.0.5 h1:XzuieXEKrVSQ9gKKO3sq60RRZC29IRYgmn7RsPmgUOA= @@ -64,17 +63,16 @@ github.com/ElrondNetwork/elrond-go-storage v1.0.2/go.mod h1:SRsv4hUtL1BCiQe0eADt github.com/ElrondNetwork/elrond-go-storage v1.0.4 h1:esyXbHQvlR6m4HGeC86Nq0xAJ74+QG9EnUgfG+wQDYQ= github.com/ElrondNetwork/elrond-go-storage v1.0.4/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34= github.com/ElrondNetwork/elrond-vm-common v1.3.27/go.mod h1:3GKLv9hUFYEVxoBgtaCmaZo9HMNfKN9mM/O/xX83Rbw= -github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221207113405-6973ba06dc58/go.mod h1:vBVpGtyb7ZerSqX/EOtUIGBGK9VtogmjwAmjAWCnCSw= github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d h1:pm2jV0AzYtkW4J0phwIuQwEQDVk0For8qC8rZZvFWHM= github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d/go.mod h1:7aTygO6Kr+Bj8T7nQVFhSqLOji32E7FMHjzNhEkrL7M= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396 h1:f2FK3XFIySd2qhON8Q2IBB47ZCTO4AD+BYMPSKoVg6M= -github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221213075903-473826256396/go.mod h1:VF3fx+63lmKVkINjn2NkY4pb5s47ZcsiqP8U2AnnnZM= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e h1:R8qyNLa9HINdYiUX+MCbJ3xWWqXT3K/lQ8mTQuENz3g= -github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221213080744-6f0dfc0d2d8e/go.mod h1:HSy/wfbfbEqEyxuMNiDBqDzYnKhcKDNhte7HEzYHIbw= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76 h1:8cLs/YMhQq+uKpEW/rN3W9v65yb3T4G4B/Kls9563UU= -github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.69-0.20221213080907-de31f5655d76/go.mod h1:OUoPdsZVaMbwSnsnBAKKVVzmUeXW1fSsahfgEUdq+Hc= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c h1:uFUfLY3kAOzdkIgd3BgZ3anAoISVn5nY0YD/n5uXCdI= +github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c/go.mod h1:uPhPRwI8mRJTVZ9ytFTOq+ZAUVrwih0g32PGGT3t7yU= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221220092736-8cf25a9de448 h1:Qp0N3U0dPSFbGfMl6Tfh18/bT02KZownknnEoCgXUE4= +github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221220092736-8cf25a9de448/go.mod h1:Rpq4orzireC64k1WfBh0KMB0mQ09X7wrLWJgLpq9ExA= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.70-0.20221220092056-49d2bc14b314 h1:FYOkSKADmVad/4lInR6p92Zd1yts8pAkWfs0YOnQTdQ= +github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.70-0.20221220092056-49d2bc14b314/go.mod h1:7ei2wjHna2Ag5fQ7LHhIBUaN0XQGJGIIfE7XewIGwfI= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= From fad91096e0a8d867d9f1122fb39e3f25b5b2341b Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 23 Dec 2022 14:59:54 +0200 Subject: [PATCH 105/335] update dependencies after merge --- cmd/keygenerator/converter/pidPubkeyConverter.go | 3 +-- cmd/seednode/main.go | 4 ++-- factory/crypto/cryptoComponents.go | 2 +- go.mod | 8 ++++---- go.sum | 16 +++++++++------- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/cmd/keygenerator/converter/pidPubkeyConverter.go b/cmd/keygenerator/converter/pidPubkeyConverter.go index 8f308c89972..00b781faf3a 100644 --- a/cmd/keygenerator/converter/pidPubkeyConverter.go +++ b/cmd/keygenerator/converter/pidPubkeyConverter.go @@ -5,7 +5,6 @@ import ( "runtime/debug" crypto "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing" "github.com/ElrondNetwork/elrond-go-crypto/signing/secp256k1" logger "github.com/ElrondNetwork/elrond-go-logger" "github.com/ElrondNetwork/elrond-go/p2p/factory" @@ -20,7 +19,7 @@ type pidPubkeyConverter struct { // NewPidPubkeyConverter creates a new instance of a public key converter that can handle conversions involving core.PeerID string representations func NewPidPubkeyConverter() *pidPubkeyConverter { return &pidPubkeyConverter{ - keyGen: signing.NewKeyGenerator(secp256k1.NewSecp256k1()), + keyGen: crypto.NewKeyGenerator(secp256k1.NewSecp256k1()), } } diff --git a/cmd/seednode/main.go b/cmd/seednode/main.go index bf7fc43e95b..ff98ea77cc1 100644 --- a/cmd/seednode/main.go +++ b/cmd/seednode/main.go @@ -14,7 +14,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/display" "github.com/ElrondNetwork/elrond-go-core/marshal" factoryMarshalizer "github.com/ElrondNetwork/elrond-go-core/marshal/factory" - "github.com/ElrondNetwork/elrond-go-crypto/signing" + crypto "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go-crypto/signing/secp256k1" secp256k1SinglerSig "github.com/ElrondNetwork/elrond-go-crypto/signing/secp256k1/singlesig" logger "github.com/ElrondNetwork/elrond-go-logger" @@ -250,7 +250,7 @@ func createNode( p2pKeyFileName string, ) (p2p.Messenger, error) { p2pSingleSigner := &secp256k1SinglerSig.Secp256k1Signer{} - p2pKeyGen := signing.NewKeyGenerator(secp256k1.NewSecp256k1()) + p2pKeyGen := crypto.NewKeyGenerator(secp256k1.NewSecp256k1()) p2pKey, _, err := cryptoFactory.CreateP2pKeyPair(p2pKeyFileName, p2pKeyGen, log) if err != nil { diff --git a/factory/crypto/cryptoComponents.go b/factory/crypto/cryptoComponents.go index e0a4e2ef84c..a2d7ca4a9e9 100644 --- a/factory/crypto/cryptoComponents.go +++ b/factory/crypto/cryptoComponents.go @@ -180,7 +180,7 @@ func (ccf *cryptoComponentsFactory) Create() (*cryptoComponents, error) { return nil, err } - p2pKeyGenerator := signing.NewKeyGenerator(secp256k1.NewSecp256k1()) + p2pKeyGenerator := crypto.NewKeyGenerator(secp256k1.NewSecp256k1()) p2pCryptoParams, err := ccf.createP2pCryptoParams(p2pKeyGenerator) if err != nil { return nil, err diff --git a/go.mod b/go.mod index 143dd8fa470..d398767df0f 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,13 @@ module github.com/ElrondNetwork/elrond-go go 1.17 require ( - github.com/ElrondNetwork/elastic-indexer-go v1.3.3 - github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9 + github.com/ElrondNetwork/elastic-indexer-go v1.3.5 + github.com/ElrondNetwork/elrond-go-core v1.1.29-0.20221223124225-1a71b43f8eec github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce github.com/ElrondNetwork/elrond-go-logger v1.0.10 - github.com/ElrondNetwork/elrond-go-p2p v1.0.8 + github.com/ElrondNetwork/elrond-go-p2p v1.0.9-0.20221223122528-ab465a5d26d9 github.com/ElrondNetwork/elrond-go-storage v1.0.4 - github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d + github.com/ElrondNetwork/elrond-vm-common v1.3.32-0.20221223125018-8a38e6d8fe79 github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c github.com/ElrondNetwork/wasm-vm-v1_3 v1.3.49-0.20221220092736-8cf25a9de448 github.com/ElrondNetwork/wasm-vm-v1_4 v1.4.70-0.20221220092056-49d2bc14b314 diff --git a/go.sum b/go.sum index dc0b16b3c57..cea1f44d2ca 100644 --- a/go.sum +++ b/go.sum @@ -47,24 +47,26 @@ github.com/ElrondNetwork/big-int-util v0.1.0 h1:vTMoJ5azhVmr7jhpSD3JUjQdkdyXoEPV github.com/ElrondNetwork/big-int-util v0.1.0/go.mod h1:96viBvoTXLjZOhEvE0D+QnAwg1IJLPAK6GVHMbC7Aw4= github.com/ElrondNetwork/concurrent-map v0.1.3 h1:j2LtPrNJuerannC1cQDE79STvi/P04gd61sNYo04Zf0= github.com/ElrondNetwork/concurrent-map v0.1.3/go.mod h1:3XwSwn4JHI0lrKxWLZvtp53Emr8BXYTmNQGwcukHJEE= -github.com/ElrondNetwork/elastic-indexer-go v1.3.3 h1:RgJ043yt92PUWMbSAQHRrC+GiyNnFdwdM/kseHlpLoo= -github.com/ElrondNetwork/elastic-indexer-go v1.3.3/go.mod h1:E3VO5712GkGSGYnOTJ+0wxW74JXgjV6XCRPlcHiTTK0= +github.com/ElrondNetwork/elastic-indexer-go v1.3.5 h1:fV7Yz2lpSzJ9qS1G755lqnwWp/SHBeVtOiH1OwghFO0= +github.com/ElrondNetwork/elastic-indexer-go v1.3.5/go.mod h1:arIYQ4yhrzDQf2pD5wOKVUOpzaZkqEfEvednyqa754E= github.com/ElrondNetwork/elrond-go-core v1.1.26/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= -github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9 h1:bqVom8Mvfmep6YYW8JjAfrZ+L0I139Llm68hgNc1tP4= github.com/ElrondNetwork/elrond-go-core v1.1.27-0.20221219143439-1bc10dae0ea9/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= -github.com/ElrondNetwork/elrond-go-crypto v1.2.2/go.mod h1:MyQPKUKti7Axnx/eihhL0F2jLTalvSV/Ytv1mIxvYyM= +github.com/ElrondNetwork/elrond-go-core v1.1.28/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= +github.com/ElrondNetwork/elrond-go-core v1.1.29-0.20221223124225-1a71b43f8eec h1:CT1biUt0CwMueMxMvROtW14BT3JocOp0Eh0EgmAnn2U= +github.com/ElrondNetwork/elrond-go-core v1.1.29-0.20221223124225-1a71b43f8eec/go.mod h1:N/RI++YU2M6OlnD1GSZepc1wPhI84ykRDQ1IyD3B0wk= github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce h1:zRLWpUnawPkbJ0b3lDkVWJwhNHwlaPN5POcXz+ToqqE= github.com/ElrondNetwork/elrond-go-crypto v1.2.4-0.20221213102512-0180dd3e00ce/go.mod h1:niLdPSYjcIzucSj2yMy+yq3KEW0jjFCfvTBOMQphmXk= github.com/ElrondNetwork/elrond-go-logger v1.0.10 h1:2xQOWZErcHW5sl9qSRO+7mGNw+QhFhqiUlLLtOgvuuk= github.com/ElrondNetwork/elrond-go-logger v1.0.10/go.mod h1:+rMODFw4yQptTi5WuLUBzvl/AE26V+2YJtc52wX30Eg= -github.com/ElrondNetwork/elrond-go-p2p v1.0.5 h1:XzuieXEKrVSQ9gKKO3sq60RRZC29IRYgmn7RsPmgUOA= -github.com/ElrondNetwork/elrond-go-p2p v1.0.5/go.mod h1:yCdKTQWNHNKrrQAK5xx1uQT02BEiumjz88I/fk5m1f8= +github.com/ElrondNetwork/elrond-go-p2p v1.0.9-0.20221223122528-ab465a5d26d9 h1:6dIhUcd67v/CEXMJXTtQtzbLO4vFqr1PP1VzJiWCU+Q= +github.com/ElrondNetwork/elrond-go-p2p v1.0.9-0.20221223122528-ab465a5d26d9/go.mod h1:ZM0GwbwUmm3Mik6FMhkEjsmz/9VQDXrDoi02DLmnnq8= github.com/ElrondNetwork/elrond-go-storage v1.0.2/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34= github.com/ElrondNetwork/elrond-go-storage v1.0.4 h1:esyXbHQvlR6m4HGeC86Nq0xAJ74+QG9EnUgfG+wQDYQ= github.com/ElrondNetwork/elrond-go-storage v1.0.4/go.mod h1:SRsv4hUtL1BCiQe0eADth3C0EZH9baijzIJDCUitR34= github.com/ElrondNetwork/elrond-vm-common v1.3.27/go.mod h1:3GKLv9hUFYEVxoBgtaCmaZo9HMNfKN9mM/O/xX83Rbw= -github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d h1:pm2jV0AzYtkW4J0phwIuQwEQDVk0For8qC8rZZvFWHM= github.com/ElrondNetwork/elrond-vm-common v1.3.29-0.20221219143644-8d3505605a6d/go.mod h1:7aTygO6Kr+Bj8T7nQVFhSqLOji32E7FMHjzNhEkrL7M= +github.com/ElrondNetwork/elrond-vm-common v1.3.32-0.20221223125018-8a38e6d8fe79 h1:07sYSIqIDhptzBKNW6MMkZwIChOHJZba/ffGcin5d4I= +github.com/ElrondNetwork/elrond-vm-common v1.3.32-0.20221223125018-8a38e6d8fe79/go.mod h1:7aTygO6Kr+Bj8T7nQVFhSqLOji32E7FMHjzNhEkrL7M= github.com/ElrondNetwork/protobuf v1.3.2 h1:qoCSYiO+8GtXBEZWEjw0WPcZfM3g7QuuJrwpN+y6Mvg= github.com/ElrondNetwork/protobuf v1.3.2/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/ElrondNetwork/wasm-vm-v1_2 v1.2.49-0.20221220091555-43a76f302a3c h1:uFUfLY3kAOzdkIgd3BgZ3anAoISVn5nY0YD/n5uXCdI= From e1a83d3b88ae9730379cf525440dc1342952f90e Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 6 Jan 2023 15:36:46 +0200 Subject: [PATCH 106/335] fix edge case on guardian sig verification --- process/dataValidators/export_test.go | 22 ------ process/dataValidators/txValidator.go | 71 ------------------- process/errors.go | 6 ++ process/guardedtx/guardedTxVerifier.go | 37 +++++----- process/interface.go | 2 +- process/mock/txValidatorStub.go | 6 +- process/transaction/baseProcess.go | 27 ++++++- process/transaction/interceptedTransaction.go | 65 ++++++++++++++--- .../guardianMocks/guardianSigVerifierStub.go | 7 +- 9 files changed, 109 insertions(+), 134 deletions(-) diff --git a/process/dataValidators/export_test.go b/process/dataValidators/export_test.go index 3ddb09f2fdf..b192ae6274c 100644 --- a/process/dataValidators/export_test.go +++ b/process/dataValidators/export_test.go @@ -2,7 +2,6 @@ package dataValidators import ( "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) @@ -14,27 +13,6 @@ func (txv *txValidator) CheckAccount( return txv.checkAccount(interceptedTx, accountHandler) } -// CheckPermission - -func (txv *txValidator) CheckPermission( - interceptedTx process.InterceptedTransactionHandler, - account state.UserAccountHandler, -) error { - return txv.checkPermission(interceptedTx, account) -} - -// CheckGuardedTransaction - -func (txv *txValidator) CheckGuardedTransaction( - interceptedTx process.InterceptedTransactionHandler, - account state.UserAccountHandler, -) error { - return txv.checkGuardedTransaction(interceptedTx, account) -} - -// CheckOperationAllowedToBypassGuardian - -func CheckOperationAllowedToBypassGuardian(txData []byte) error { - return checkOperationAllowedToBypassGuardian(txData) -} - // GetTxData - func GetTxData(interceptedTx process.InterceptedTransactionHandler) ([]byte, error) { return getTxData(interceptedTx) diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index 4e245e39df2..d389a25b2a8 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -5,7 +5,6 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/sharding" "github.com/ElrondNetwork/elrond-go/state" @@ -100,11 +99,6 @@ func (txv *txValidator) checkAccount( return err } - err = txv.checkPermission(interceptedTx, account) - if err != nil { - return err - } - return txv.checkBalance(interceptedTx, account) } @@ -139,71 +133,6 @@ func (txv *txValidator) checkBalance(interceptedTx process.InterceptedTransactio return nil } -func (txv *txValidator) checkPermission(interceptedTx process.InterceptedTransactionHandler, account state.UserAccountHandler) error { - txData, err := getTxData(interceptedTx) - if err != nil { - return err - } - - if account.IsGuarded() { - err = txv.checkGuardedTransaction(interceptedTx, account) - if err == nil { - return nil - } - - err = checkOperationAllowedToBypassGuardian(txData) - if err != nil { - return err - } - - // block non guarded setGuardian Txs if there is a pending guardian - hasPendingGuardian := txv.guardianSigVerifier.HasPendingGuardian(account) - if process.IsSetGuardianCall(txData) && hasPendingGuardian { - return process.ErrCannotReplaceGuardedAccountPendingGuardian - } - } - - return nil -} - -// Setting a guardian is allowed with regular transactions on a guarded account -// but in this case is set with the default epochs delay -func checkOperationAllowedToBypassGuardian(txData []byte) error { - if process.IsSetGuardianCall(txData) { - return nil - } - - return process.ErrOperationNotPermitted -} - -func (txv *txValidator) checkGuardedTransaction(interceptedTx process.InterceptedTransactionHandler, account state.UserAccountHandler) error { - txHandler := interceptedTx.Transaction() - if check.IfNil(txHandler) { - return process.ErrNilTransaction - } - - tx, ok := txHandler.(*transaction.Transaction) - if !ok { - return fmt.Errorf("%w on transaction handler", process.ErrWrongTypeAssertion) - } - - if !txv.txVersionChecker.IsGuardedTransaction(tx) { - return fmt.Errorf("%w without guardian signature", process.ErrOperationNotPermitted) - } - - vmUserAccount, ok := account.(vmcommon.UserAccountHandler) - if !ok { - return fmt.Errorf("%w on account", process.ErrWrongTypeAssertion) - } - - errGuardianSignature := txv.guardianSigVerifier.VerifyGuardianSignature(vmUserAccount, interceptedTx) - if errGuardianSignature != nil { - return fmt.Errorf("%w due to error in signature verification %s", process.ErrOperationNotPermitted, errGuardianSignature.Error()) - } - - return nil -} - func (txv *txValidator) checkNonce(interceptedTx process.InterceptedTransactionHandler, accountHandler vmcommon.AccountHandler) error { accountNonce := accountHandler.GetNonce() txNonce := interceptedTx.Nonce() diff --git a/process/errors.go b/process/errors.go index 42b9c099e77..9d2441c790e 100644 --- a/process/errors.go +++ b/process/errors.go @@ -528,6 +528,12 @@ var ErrInvalidExtraGasLimitGuardedTx = errors.New("invalid extra gas limit for g // ErrInvalidMaxGasPriceSetGuardian signals that an invalid maximum gas price has been provided in the config file var ErrInvalidMaxGasPriceSetGuardian = errors.New("invalid maximum gas price for set guardian") +// ErrGuardianAddressNotExpected signals that the guardian address is not expected +var ErrGuardianAddressNotExpected = errors.New("guardian address not expected") + +// ErrGuardianSignatureNotExpected signals that the guardian signature is not expected +var ErrGuardianSignatureNotExpected = errors.New("guardian signature not expected") + // ErrInvalidMinimumGasLimitForTx signals that an invalid minimum gas limit for transactions has been read from config file var ErrInvalidMinimumGasLimitForTx = errors.New("invalid minimum gas limit for transactions") diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index 053656f6b6f..169c0da83d6 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -9,7 +9,6 @@ import ( "github.com/ElrondNetwork/elrond-go-crypto" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/state" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // GuardedTxSigVerifierArgs holds the argument to instantiate a guarded tx signature verifier @@ -57,12 +56,7 @@ func NewGuardedTxSigVerifier(args GuardedTxSigVerifierArgs) (*guardedTxSigVerifi } // VerifyGuardianSignature verifies the guardian signature over the guarded transaction -func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { - guardianPubKey, err := gtx.GetGuardianPublicKey(account) - if err != nil { - return err - } - +func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(inTx process.InterceptedTransactionHandler) error { txHandler := inTx.Transaction() if check.IfNil(txHandler) { return process.ErrNilTransaction @@ -73,6 +67,12 @@ func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAc return process.ErrWrongTypeAssertion } + guardianAddress := guardedTxHandler.GetGuardianAddr() + guardianPubKey, err := gtx.guardianPubKyeFromBytes(guardianAddress) + if err != nil { + return err + } + inSignedTx, ok := inTx.(process.InterceptedSignedTransactionHandler) if !ok { return fmt.Errorf("%w to InterceptedSignedTransactionHandler", process.ErrWrongTypeAssertion) @@ -86,20 +86,6 @@ func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(account vmcommon.UserAc return gtx.sigVerifier.Verify(guardianPubKey, msgForSigVerification, guardedTxHandler.GetGuardianSignature()) } -// GetGuardianPublicKey returns the guardian public key for the given account -func (gtx *guardedTxSigVerifier) GetGuardianPublicKey(account vmcommon.UserAccountHandler) (crypto.PublicKey, error) { - guardianPubKeyBytes, err := gtx.guardianChecker.GetActiveGuardian(account) - if err != nil { - return nil, err - } - - if len(guardianPubKeyBytes) == 0 { - return nil, process.ErrNilGuardianPublicKey - } - - return gtx.keyGen.PublicKeyFromByteArray(guardianPubKeyBytes) -} - // HasPendingGuardian true if the given account has a pending guardian set func (gtx *guardedTxSigVerifier) HasPendingGuardian(uah state.UserAccountHandler) bool { return gtx.guardianChecker.HasPendingGuardian(uah) @@ -109,3 +95,12 @@ func (gtx *guardedTxSigVerifier) HasPendingGuardian(uah state.UserAccountHandler func (gtx *guardedTxSigVerifier) IsInterfaceNil() bool { return gtx == nil } + +// guardianPubKyeFromBytes returns the guardian public key for the given account +func (gtx *guardedTxSigVerifier) guardianPubKyeFromBytes(guardianPubKeyBytes []byte) (crypto.PublicKey, error) { + if len(guardianPubKeyBytes) == 0 { + return nil, process.ErrNilGuardianPublicKey + } + + return gtx.keyGen.PublicKeyFromByteArray(guardianPubKeyBytes) +} \ No newline at end of file diff --git a/process/interface.go b/process/interface.go index b081e7377b3..56b67d035f1 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1242,7 +1242,7 @@ type InterceptedSignedTransactionHandler interface { // GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions type GuardianSigVerifier interface { - VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx InterceptedTransactionHandler) error + VerifyGuardianSignature(inTx InterceptedTransactionHandler) error HasPendingGuardian(uah state.UserAccountHandler) bool IsInterfaceNil() bool } diff --git a/process/mock/txValidatorStub.go b/process/mock/txValidatorStub.go index d2c79feee5c..31ac1a6b40e 100644 --- a/process/mock/txValidatorStub.go +++ b/process/mock/txValidatorStub.go @@ -6,9 +6,9 @@ import ( // TxValidatorStub - type TxValidatorStub struct { - CheckTxValidityCalled func(interceptedTx process.InterceptedTransactionHandler) error - CheckTxWhiteListCalled func(data process.InterceptedData) error - RejectedTxsCalled func() uint64 + CheckTxValidityCalled func(interceptedTx process.InterceptedTransactionHandler) error + CheckTxWhiteListCalled func(data process.InterceptedData) error + RejectedTxsCalled func() uint64 } // CheckTxValidity - diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 605ea870757..3a475ddda92 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -218,6 +218,31 @@ func (txProc *baseTxProcessor) VerifyTransaction(tx *transaction.Transaction) er return txProc.checkTxValues(tx, senderAccount, receiverAccount, false) } +// Setting a guardian is allowed with regular transactions on a guarded account +// but in this case is set with the default epochs delay +func checkOperationAllowedToBypassGuardian(txData []byte) error { + if process.IsSetGuardianCall(txData) { + return nil + } + + return process.ErrOperationNotPermitted +} + +func (txProc *baseTxProcessor) checkGuardedAccountUnguardedTxPermission(txData []byte, account state.UserAccountHandler) error { + err := checkOperationAllowedToBypassGuardian(txData) + if err != nil { + return err + } + + // block non guarded setGuardian Txs if there is a pending guardian + hasPendingGuardian := txProc.guardianChecker.HasPendingGuardian(account) + if process.IsSetGuardianCall(txData) && hasPendingGuardian { + return process.ErrCannotReplaceGuardedAccountPendingGuardian + } + + return nil +} + func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, account state.UserAccountHandler) error { if check.IfNil(account) { return nil @@ -227,7 +252,7 @@ func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, accou } if !txProc.txVersionChecker.IsGuardedTransaction(tx) { - return nil + return txProc.checkGuardedAccountUnguardedTxPermission(tx.GetData(), account) } acc, ok := account.(vmcommon.UserAccountHandler) diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index d250f0fd57c..bde61ed578f 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -152,17 +152,19 @@ func createRelayedV2(relayedTx *transaction.Transaction, args [][]byte) (*transa return nil, process.ErrInvalidArguments } tx := &transaction.Transaction{ - Nonce: big.NewInt(0).SetBytes(args[1]).Uint64(), - Value: big.NewInt(0), - RcvAddr: args[0], - SndAddr: relayedTx.RcvAddr, - GasPrice: relayedTx.GasPrice, - GasLimit: 0, // the user had to sign a transaction with 0 gasLimit - as all gasLimit is coming from the relayer - Data: args[2], - ChainID: relayedTx.ChainID, - Version: relayedTx.Version, - Signature: args[3], - Options: relayedTx.Options, + Nonce: big.NewInt(0).SetBytes(args[1]).Uint64(), + Value: big.NewInt(0), + RcvAddr: args[0], + SndAddr: relayedTx.RcvAddr, + GasPrice: relayedTx.GasPrice, + GasLimit: 0, // the user had to sign a transaction with 0 gasLimit - as all gasLimit is coming from the relayer + Data: args[2], + ChainID: relayedTx.ChainID, + Version: relayedTx.Version, + Signature: args[3], + Options: relayedTx.Options, + GuardianAddr: nil, + GuardianSignature: nil, } return tx, nil @@ -182,6 +184,11 @@ func (inTx *InterceptedTransaction) CheckValidity() error { return err } + err = inTx.VerifyGuardianSig(inTx.tx) + if err != nil { + return err + } + err = inTx.verifyIfRelayedTx(inTx.tx) if err != nil { return err @@ -221,6 +228,11 @@ func (inTx *InterceptedTransaction) verifyIfRelayedTxV2(tx *transaction.Transact return err } + err = inTx.VerifyGuardianSig(userTx) + if err != nil { + return err + } + funcName, _, err = inTx.argsParser.ParseCallData(string(userTx.Data)) if err != nil { return nil @@ -266,6 +278,11 @@ func (inTx *InterceptedTransaction) verifyIfRelayedTx(tx *transaction.Transactio return err } + err = inTx.VerifyGuardianSig(userTx) + if err != nil { + return err + } + if len(userTx.Data) == 0 { return nil } @@ -364,6 +381,32 @@ func (inTx *InterceptedTransaction) verifySig(tx *transaction.Transaction) error return inTx.singleSigner.Verify(senderPubKey, txMessageForSigVerification, tx.Signature) } +// VerifyGuardianSig verifies if the guardian signature is valid +func (inTx *InterceptedTransaction) VerifyGuardianSig(tx *transaction.Transaction) error { + txMessageForSigVerification, err := inTx.getTxMessageForGivenTx(tx) + if err != nil { + return err + } + + if !inTx.txVersionChecker.IsGuardedTransaction(tx) { + if len(tx.GetGuardianAddr()) > 0 { + return fmt.Errorf("%w without guardian signature", process.ErrGuardianAddressNotExpected) + } + if len(tx.GetGuardianSignature()) > 0 { + return fmt.Errorf("%w without guardian signature", process.ErrGuardianSignatureNotExpected) + } + + return nil + } + + guardianPubKey, err := inTx.keyGen.PublicKeyFromByteArray(tx.GuardianAddr) + if err != nil { + return err + } + + return inTx.singleSigner.Verify(guardianPubKey, txMessageForSigVerification, tx.GuardianSignature) +} + func (inTx *InterceptedTransaction) getTxMessageForGivenTx(tx *transaction.Transaction) ([]byte, error) { if inTx.txVersionChecker.IsSignedWithHash(tx) && !inTx.enableSignedTxWithHash { return nil, process.ErrTransactionSignedWithHashIsNotEnabled diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go index 5c62de8f22b..6866d94ec6d 100644 --- a/testscommon/guardianMocks/guardianSigVerifierStub.go +++ b/testscommon/guardianMocks/guardianSigVerifierStub.go @@ -3,19 +3,18 @@ package guardianMocks import ( "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/state" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" ) // GuardianSigVerifierStub - type GuardianSigVerifierStub struct { - VerifyGuardianSignatureCalled func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error + VerifyGuardianSignatureCalled func(inTx process.InterceptedTransactionHandler) error HasPendingGuardianCalled func(uah state.UserAccountHandler) bool } // VerifyGuardianSignature - -func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { +func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(inTx process.InterceptedTransactionHandler) error { if gsvs.VerifyGuardianSignatureCalled != nil { - return gsvs.VerifyGuardianSignatureCalled(account, inTx) + return gsvs.VerifyGuardianSignatureCalled(inTx) } return nil } From 10de9c99f2f99c02fc9080e85d5d2ebe344c0656 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 6 Jan 2023 15:48:18 +0200 Subject: [PATCH 107/335] remove guardian sig verifier --- .../epochStartInterceptorsContainerFactory.go | 5 -- process/dataValidators/txValidator.go | 6 -- process/dataValidators/txValidator_test.go | 74 ------------------- process/factory/interceptorscontainer/args.go | 1 - .../baseInterceptorsContainerFactory.go | 5 -- .../metaInterceptorsContainerFactory.go | 2 - .../metaInterceptorsContainerFactory_test.go | 2 - .../shardInterceptorsContainerFactory.go | 2 - .../shardInterceptorsContainerFactory_test.go | 2 - process/guardedtx/guardedTxVerifier.go | 33 --------- .../factory/argInterceptedDataFactory.go | 1 - process/interface.go | 7 -- .../guardianMocks/guardianSigVerifierStub.go | 33 --------- update/factory/fullSyncInterceptors.go | 1 - 14 files changed, 174 deletions(-) delete mode 100644 testscommon/guardianMocks/guardianSigVerifierStub.go diff --git a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go index d4468953552..3be59c013f3 100644 --- a/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go +++ b/epochStart/bootstrap/factory/epochStartInterceptorsContainerFactory.go @@ -40,7 +40,6 @@ type ArgsEpochStartInterceptorContainer struct { HeaderIntegrityVerifier process.HeaderIntegrityVerifier RequestHandler process.RequestHandler SignaturesHandler process.SignaturesHandler - GuardianSigVerifier process.GuardianSigVerifier } // NewEpochStartInterceptorsContainer will return a real interceptors container factory, but with many disabled components @@ -54,9 +53,6 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) if check.IfNil(args.CoreComponents.AddressPubKeyConverter()) { return nil, epochStart.ErrNilPubkeyConverter } - if check.IfNil(args.GuardianSigVerifier) { - return nil, epochStart.ErrNilGuardianSigVerifier - } cryptoComponents := args.CryptoComponents.Clone().(process.CryptoComponentsHolder) err := cryptoComponents.SetMultiSignerContainer(disabled.NewMultiSignerContainer()) @@ -106,7 +102,6 @@ func NewEpochStartInterceptorsContainer(args ArgsEpochStartInterceptorContainer) HeartbeatExpiryTimespanInSec: args.Config.HeartbeatV2.HeartbeatExpiryTimespanInSec, PeerShardMapper: peerShardMapper, HardforkTrigger: hardforkTrigger, - GuardianSigVerifier: args.GuardianSigVerifier, } interceptorsContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(containerFactoryArgs) diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index d389a25b2a8..ae1035a7248 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -19,7 +19,6 @@ type txValidator struct { shardCoordinator sharding.Coordinator whiteListHandler process.WhiteListHandler pubKeyConverter core.PubkeyConverter - guardianSigVerifier process.GuardianSigVerifier txVersionChecker process.TxVersionCheckerHandler maxNonceDeltaAllowed int } @@ -30,7 +29,6 @@ func NewTxValidator( shardCoordinator sharding.Coordinator, whiteListHandler process.WhiteListHandler, pubKeyConverter core.PubkeyConverter, - guardianSigVerifier process.GuardianSigVerifier, txVersionChecker process.TxVersionCheckerHandler, maxNonceDeltaAllowed int, ) (*txValidator, error) { @@ -46,9 +44,6 @@ func NewTxValidator( if check.IfNil(pubKeyConverter) { return nil, fmt.Errorf("%w in NewTxValidator", process.ErrNilPubkeyConverter) } - if check.IfNil(guardianSigVerifier) { - return nil, process.ErrNilGuardianSigVerifier - } if check.IfNil(txVersionChecker) { return nil, process.ErrNilTransactionVersionChecker } @@ -59,7 +54,6 @@ func NewTxValidator( whiteListHandler: whiteListHandler, maxNonceDeltaAllowed: maxNonceDeltaAllowed, pubKeyConverter: pubKeyConverter, - guardianSigVerifier: guardianSigVerifier, txVersionChecker: txVersionChecker, }, nil } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index ce3500d35b8..791678580d6 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -86,7 +86,6 @@ func TestNewTxValidator_NilAccountsShouldErr(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -105,7 +104,6 @@ func TestNewTxValidator_NilShardCoordinatorShouldErr(t *testing.T) { nil, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -125,7 +123,6 @@ func TestTxValidator_NewValidatorNilWhiteListHandlerShouldErr(t *testing.T) { shardCoordinator, nil, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -145,7 +142,6 @@ func TestNewTxValidator_NilPubkeyConverterShouldErr(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, nil, - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -154,25 +150,6 @@ func TestNewTxValidator_NilPubkeyConverterShouldErr(t *testing.T) { assert.True(t, errors.Is(err, process.ErrNilPubkeyConverter)) } -func TestNewTxValidator_NilGuardianSigVerifierShouldErr(t *testing.T) { - t.Parallel() - - adb := getAccAdapter(0, big.NewInt(0)) - shardCoordinator := createMockCoordinator("_", 0) - maxNonceDeltaAllowed := 100 - txValidator, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - nil, - &testscommon.TxVersionCheckerStub{}, - maxNonceDeltaAllowed, - ) - assert.Nil(t, txValidator) - assert.True(t, errors.Is(err, process.ErrNilGuardianSigVerifier)) -} - func TestNewTxValidator_NilTxVersionCheckerShouldErr(t *testing.T) { t.Parallel() @@ -184,7 +161,6 @@ func TestNewTxValidator_NilTxVersionCheckerShouldErr(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, nil, maxNonceDeltaAllowed, ) @@ -203,7 +179,6 @@ func TestNewTxValidator_ShouldWork(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -227,7 +202,6 @@ func TestTxValidator_CheckTxValidityTxCrossShardShouldWork(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -254,7 +228,6 @@ func TestTxValidator_CheckTxValidityAccountNonceIsGreaterThanTxNonceShouldReturn shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -282,7 +255,6 @@ func TestTxValidator_CheckTxValidityTxNonceIsTooHigh(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -312,7 +284,6 @@ func TestTxValidator_CheckTxValidityAccountBalanceIsLessThanTxTotalValueShouldRe shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -341,7 +312,6 @@ func TestTxValidator_CheckTxValidityAccountNotExitsShouldReturnFalse(t *testing. shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -372,7 +342,6 @@ func TestTxValidator_CheckTxValidityAccountNotExitsButWhiteListedShouldReturnTru }, }, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -408,7 +377,6 @@ func TestTxValidator_CheckTxValidityWrongAccountTypeShouldReturnFalse(t *testing shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -434,7 +402,6 @@ func TestTxValidator_CheckTxValidityTxIsOkShouldReturnTrue(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -456,7 +423,6 @@ func TestTxValidator_checkPermission(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -503,11 +469,6 @@ func TestTxValidator_checkPermission(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{ - VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { - return errors.New("error") - }, - }, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return false @@ -534,14 +495,6 @@ func TestTxValidator_checkPermission(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{ - VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { - return errors.New("error") - }, - HasPendingGuardianCalled: func(uah state.UserAccountHandler) bool { - return false - }, - }, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return false @@ -568,14 +521,6 @@ func TestTxValidator_checkPermission(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{ - VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { - return errors.New("error") - }, - HasPendingGuardianCalled: func(uah state.UserAccountHandler) bool { - return true - }, - }, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return false @@ -602,11 +547,6 @@ func TestTxValidator_checkPermission(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{ - VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { - return nil - }, - }, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return true @@ -630,7 +570,6 @@ func TestTxValidator_checkGuardedTransaction(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, maxNonceDeltaAllowed, ) @@ -666,7 +605,6 @@ func TestTxValidator_checkGuardedTransaction(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return false @@ -691,7 +629,6 @@ func TestTxValidator_checkGuardedTransaction(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return true @@ -718,11 +655,6 @@ func TestTxValidator_checkGuardedTransaction(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{ - VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { - return expectedSigVerifyError - }, - }, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return true @@ -747,11 +679,6 @@ func TestTxValidator_checkGuardedTransaction(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{ - VerifyGuardianSignatureCalled: func(account vmcommon.UserAccountHandler, inTx process.InterceptedTransactionHandler) error { - return nil - }, - }, &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { return true @@ -830,7 +757,6 @@ func TestTxValidator_IsInterfaceNil(t *testing.T) { shardCoordinator, &testscommon.WhiteListHandlerStub{}, mock.NewPubkeyConverterMock(32), - &guardianMocks.GuardianSigVerifierStub{}, &testscommon.TxVersionCheckerStub{}, 100, ) diff --git a/process/factory/interceptorscontainer/args.go b/process/factory/interceptorscontainer/args.go index 4fc5e5351d3..10a90fb5d91 100644 --- a/process/factory/interceptorscontainer/args.go +++ b/process/factory/interceptorscontainer/args.go @@ -34,7 +34,6 @@ type CommonInterceptorsContainerFactoryArgs struct { PreferredPeersHolder process.PreferredPeersHolderHandler SizeCheckDelta uint32 RequestHandler process.RequestHandler - GuardianSigVerifier process.GuardianSigVerifier PeerSignatureHandler crypto.PeerSignatureHandler SignaturesHandler process.SignaturesHandler HeartbeatExpiryTimespanInSec int64 diff --git a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go index 8d3c5c13a01..e5e7ede0709 100644 --- a/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go @@ -61,7 +61,6 @@ func checkBaseParams( whiteListerVerifiedTxs process.WhiteListHandler, preferredPeersHolder process.PreferredPeersHolderHandler, requestHandler process.RequestHandler, - guardianSigVerifier process.GuardianSigVerifier, peerShardMapper process.PeerShardMapper, hardforkTrigger heartbeat.HardforkTrigger, ) error { @@ -150,9 +149,6 @@ func checkBaseParams( if check.IfNil(requestHandler) { return process.ErrNilRequestHandler } - if check.IfNil(guardianSigVerifier) { - return process.ErrNilGuardianSigVerifier - } if check.IfNil(peerShardMapper) { return process.ErrNilPeerShardMapper } @@ -228,7 +224,6 @@ func (bicf *baseInterceptorsContainerFactory) createOneTxInterceptor(topic strin bicf.shardCoordinator, bicf.whiteListHandler, addrPubKeyConverter, - bicf.argInterceptorFactory.GuardianSigVerifier, bicf.argInterceptorFactory.CoreComponents.TxVersionChecker(), bicf.maxTxNonceDeltaAllowed, ) diff --git a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go index 5adde889905..eb4615dc75c 100644 --- a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory.go @@ -39,7 +39,6 @@ func NewMetaInterceptorsContainerFactory( args.WhiteListerVerifiedTxs, args.PreferredPeersHolder, args.RequestHandler, - args.GuardianSigVerifier, args.PeerShardMapper, args.HardforkTrigger, ) @@ -94,7 +93,6 @@ func NewMetaInterceptorsContainerFactory( HeaderIntegrityVerifier: args.HeaderIntegrityVerifier, EpochStartTrigger: args.EpochStartTrigger, ArgsParser: args.ArgumentsParser, - GuardianSigVerifier: args.GuardianSigVerifier, PeerSignatureHandler: args.PeerSignatureHandler, SignaturesHandler: args.SignaturesHandler, HeartbeatExpiryTimespanInSec: args.HeartbeatExpiryTimespanInSec, diff --git a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go index 54c8b505692..5fe9c0dbc5c 100644 --- a/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go +++ b/process/factory/interceptorscontainer/metaInterceptorsContainerFactory_test.go @@ -16,7 +16,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" @@ -650,6 +649,5 @@ func getArgumentsMeta( HeartbeatExpiryTimespanInSec: 30, PeerShardMapper: &p2pmocks.NetworkShardingCollectorStub{}, HardforkTrigger: &testscommon.HardforkTriggerStub{}, - GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go index 2c00d58bfd4..7b5e597c8ec 100644 --- a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go +++ b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory.go @@ -37,7 +37,6 @@ func NewShardInterceptorsContainerFactory( args.WhiteListerVerifiedTxs, args.PreferredPeersHolder, args.RequestHandler, - args.GuardianSigVerifier, args.PeerShardMapper, args.HardforkTrigger, ) @@ -93,7 +92,6 @@ func NewShardInterceptorsContainerFactory( EpochStartTrigger: args.EpochStartTrigger, WhiteListerVerifiedTxs: args.WhiteListerVerifiedTxs, ArgsParser: args.ArgumentsParser, - GuardianSigVerifier: args.GuardianSigVerifier, PeerSignatureHandler: args.PeerSignatureHandler, SignaturesHandler: args.SignaturesHandler, HeartbeatExpiryTimespanInSec: args.HeartbeatExpiryTimespanInSec, diff --git a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go index 90739ee900f..b120a997418 100644 --- a/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go +++ b/process/factory/interceptorscontainer/shardInterceptorsContainerFactory_test.go @@ -17,7 +17,6 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" @@ -733,6 +732,5 @@ func getArgumentsShard( HeartbeatExpiryTimespanInSec: 30, PeerShardMapper: &p2pmocks.NetworkShardingCollectorStub{}, HardforkTrigger: &testscommon.HardforkTriggerStub{}, - GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go index 169c0da83d6..7a9a5be1025 100644 --- a/process/guardedtx/guardedTxVerifier.go +++ b/process/guardedtx/guardedTxVerifier.go @@ -1,8 +1,6 @@ package guardedtx import ( - "fmt" - "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" @@ -55,37 +53,6 @@ func NewGuardedTxSigVerifier(args GuardedTxSigVerifierArgs) (*guardedTxSigVerifi }, nil } -// VerifyGuardianSignature verifies the guardian signature over the guarded transaction -func (gtx *guardedTxSigVerifier) VerifyGuardianSignature(inTx process.InterceptedTransactionHandler) error { - txHandler := inTx.Transaction() - if check.IfNil(txHandler) { - return process.ErrNilTransaction - } - - guardedTxHandler, ok := txHandler.(data.GuardedTransactionHandler) - if !ok { - return process.ErrWrongTypeAssertion - } - - guardianAddress := guardedTxHandler.GetGuardianAddr() - guardianPubKey, err := gtx.guardianPubKyeFromBytes(guardianAddress) - if err != nil { - return err - } - - inSignedTx, ok := inTx.(process.InterceptedSignedTransactionHandler) - if !ok { - return fmt.Errorf("%w to InterceptedSignedTransactionHandler", process.ErrWrongTypeAssertion) - } - - msgForSigVerification, err := inSignedTx.GetTxMessageForSignatureVerification() - if err != nil { - return err - } - - return gtx.sigVerifier.Verify(guardianPubKey, msgForSigVerification, guardedTxHandler.GetGuardianSignature()) -} - // HasPendingGuardian true if the given account has a pending guardian set func (gtx *guardedTxSigVerifier) HasPendingGuardian(uah state.UserAccountHandler) bool { return gtx.guardianChecker.HasPendingGuardian(uah) diff --git a/process/interceptors/factory/argInterceptedDataFactory.go b/process/interceptors/factory/argInterceptedDataFactory.go index 39a8a6d1126..f7a8166e691 100644 --- a/process/interceptors/factory/argInterceptedDataFactory.go +++ b/process/interceptors/factory/argInterceptedDataFactory.go @@ -53,7 +53,6 @@ type ArgInterceptedDataFactory struct { HeaderIntegrityVerifier process.HeaderIntegrityVerifier EpochStartTrigger process.EpochStartTriggerHandler ArgsParser process.ArgumentsParser - GuardianSigVerifier process.GuardianSigVerifier PeerSignatureHandler crypto.PeerSignatureHandler SignaturesHandler process.SignaturesHandler HeartbeatExpiryTimespanInSec int64 diff --git a/process/interface.go b/process/interface.go index 56b67d035f1..42ca720f3f8 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1240,13 +1240,6 @@ type InterceptedSignedTransactionHandler interface { GetTxMessageForSignatureVerification() ([]byte, error) } -// GuardianSigVerifier allows the verification of the guardian signatures for guarded transactions -type GuardianSigVerifier interface { - VerifyGuardianSignature(inTx InterceptedTransactionHandler) error - HasPendingGuardian(uah state.UserAccountHandler) bool - IsInterfaceNil() bool -} - // GuardianChecker can check an account guardian type GuardianChecker interface { GetActiveGuardian(handler vmcommon.UserAccountHandler) ([]byte, error) diff --git a/testscommon/guardianMocks/guardianSigVerifierStub.go b/testscommon/guardianMocks/guardianSigVerifierStub.go deleted file mode 100644 index 6866d94ec6d..00000000000 --- a/testscommon/guardianMocks/guardianSigVerifierStub.go +++ /dev/null @@ -1,33 +0,0 @@ -package guardianMocks - -import ( - "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/state" -) - -// GuardianSigVerifierStub - -type GuardianSigVerifierStub struct { - VerifyGuardianSignatureCalled func(inTx process.InterceptedTransactionHandler) error - HasPendingGuardianCalled func(uah state.UserAccountHandler) bool -} - -// VerifyGuardianSignature - -func (gsvs *GuardianSigVerifierStub) VerifyGuardianSignature(inTx process.InterceptedTransactionHandler) error { - if gsvs.VerifyGuardianSignatureCalled != nil { - return gsvs.VerifyGuardianSignatureCalled(inTx) - } - return nil -} - -// HasPendingGuardian - -func (gsvs *GuardianSigVerifierStub) HasPendingGuardian(uah state.UserAccountHandler) bool { - if gsvs.HasPendingGuardianCalled != nil { - return gsvs.HasPendingGuardianCalled(uah) - } - return false -} - -// IsInterfaceNil - -func (gsvs *GuardianSigVerifierStub) IsInterfaceNil() bool { - return gsvs == nil -} diff --git a/update/factory/fullSyncInterceptors.go b/update/factory/fullSyncInterceptors.go index 8190fb2ac85..418d23069db 100644 --- a/update/factory/fullSyncInterceptors.go +++ b/update/factory/fullSyncInterceptors.go @@ -489,7 +489,6 @@ func (ficf *fullSyncInterceptorsContainerFactory) createOneTxInterceptor(topic s ficf.shardCoordinator, ficf.whiteListHandler, ficf.addressPubkeyConv, - ficf.argInterceptorFactory.GuardianSigVerifier, ficf.argInterceptorFactory.CoreComponents.TxVersionChecker(), ficf.maxTxNonceDeltaAllowed, ) From 606df6bb7653895c5255026e6ccc96b069e06e24 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 6 Jan 2023 16:38:43 +0200 Subject: [PATCH 108/335] guardian tx sig verifier cleanup --- epochStart/bootstrap/common.go | 3 - epochStart/bootstrap/process.go | 4 - epochStart/bootstrap/process_test.go | 2 - factory/bootstrap/bootstrapComponents.go | 21 -- .../bootstrap/bootstrapComponentsHandler.go | 12 - factory/interface.go | 1 - factory/processing/processComponents.go | 5 - integrationTests/testProcessorNode.go | 5 - node/node.go | 1 - node/node_test.go | 1 - process/dataValidators/txValidator_test.go | 1 - process/guardedtx/guardedTxVerifier.go | 73 ----- process/guardedtx/guardedTxVerifier_test.go | 281 ------------------ .../bootstrapComponentsStub.go | 6 - 14 files changed, 416 deletions(-) delete mode 100644 process/guardedtx/guardedTxVerifier.go delete mode 100644 process/guardedtx/guardedTxVerifier_test.go diff --git a/epochStart/bootstrap/common.go b/epochStart/bootstrap/common.go index ab48abc247c..2deb4cd019e 100644 --- a/epochStart/bootstrap/common.go +++ b/epochStart/bootstrap/common.go @@ -109,9 +109,6 @@ func checkArguments(args ArgsEpochStartBootstrap) error { if args.GeneralConfig.TrieSync.NumConcurrentTrieSyncers < 1 { return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrInvalidNumConcurrentTrieSyncers) } - if check.IfNil(args.GuardianSigVerifier) { - return fmt.Errorf("%s: %w", baseErrorMessage, epochStart.ErrNilGuardianSigVerifier) - } return nil } diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index b6aab4703cd..bcdd9638ffb 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -114,7 +114,6 @@ type epochStartBootstrap struct { checkNodesOnDisk bool bootstrapHeartbeatSender update.Closer trieSyncStatisticsProvider common.SizeSyncStatisticsHandler - guardianSigVerifier process.GuardianSigVerifier // created components requestHandler process.RequestHandler @@ -178,7 +177,6 @@ type ArgsEpochStartBootstrap struct { DataSyncerCreator types.ScheduledDataSyncerCreator ScheduledSCRsStorer storage.Storer TrieSyncStatisticsProvider common.SizeSyncStatisticsHandler - GuardianSigVerifier process.GuardianSigVerifier } type dataToSync struct { @@ -224,7 +222,6 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, storerScheduledSCRs: args.ScheduledSCRsStorer, shardCoordinator: args.GenesisShardCoordinator, trieSyncStatisticsProvider: args.TrieSyncStatisticsProvider, - guardianSigVerifier: args.GuardianSigVerifier, } whiteListCache, err := storageunit.NewCache(storageFactory.GetCacherFromConfig(epochStartProvider.generalConfig.WhiteListPool)) @@ -549,7 +546,6 @@ func (e *epochStartBootstrap) createSyncers() error { HeaderIntegrityVerifier: e.headerIntegrityVerifier, RequestHandler: e.requestHandler, SignaturesHandler: e.messenger, - GuardianSigVerifier: e.guardianSigVerifier, } e.interceptorContainer, err = factoryInterceptors.NewEpochStartInterceptorsContainer(args) diff --git a/epochStart/bootstrap/process_test.go b/epochStart/bootstrap/process_test.go index 2909f41c988..2b62ff2b112 100644 --- a/epochStart/bootstrap/process_test.go +++ b/epochStart/bootstrap/process_test.go @@ -34,7 +34,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/genericMocks" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/p2pmocks" @@ -226,7 +225,6 @@ func createMockEpochStartBootstrapArgs( ForceStartFromNetwork: false, }, TrieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, - GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } } diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 6830e7e4736..bf424073175 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -15,7 +15,6 @@ import ( "github.com/ElrondNetwork/elrond-go/factory" "github.com/ElrondNetwork/elrond-go/factory/block" "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/process/guardedtx" "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/headerCheck" "github.com/ElrondNetwork/elrond-go/process/smartContract" @@ -64,7 +63,6 @@ type bootstrapComponents struct { versionedHeaderFactory nodeFactory.VersionedHeaderFactory headerIntegrityVerifier nodeFactory.HeaderIntegrityVerifierHandler guardedAccountHandler process.GuardedAccountHandler - guardianSigVerifier process.GuardianSigVerifier } // NewBootstrapComponentsFactory creates an instance of bootstrapComponentsFactory @@ -190,11 +188,6 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { return nil, err } - guardianSigVerifier, err := bcf.newGuardianSigVerifier(guardedAccountHandler) - if err != nil { - return nil, err - } - epochStartBootstrapArgs := bootstrap.ArgsEpochStartBootstrap{ CoreComponentsHolder: bcf.coreComponents, CryptoComponentsHolder: bcf.cryptoComponents, @@ -217,7 +210,6 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { DataSyncerCreator: dataSyncerFactory, ScheduledSCRsStorer: nil, // will be updated after sync from network TrieSyncStatisticsProvider: tss, - GuardianSigVerifier: guardianSigVerifier, } var epochStartBootstrapper factory.EpochStartBootstrapper @@ -273,23 +265,10 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { headerVersionHandler: headerVersionHandler, headerIntegrityVerifier: headerIntegrityVerifier, versionedHeaderFactory: versionedHeaderFactory, - guardianSigVerifier: guardianSigVerifier, guardedAccountHandler: guardedAccountHandler, }, nil } -func (bcf *bootstrapComponentsFactory) newGuardianSigVerifier(guardedAccountHandler process.GuardedAccountHandler) (process.GuardianSigVerifier, error) { - argGuardianSigVerifier := guardedtx.GuardedTxSigVerifierArgs{ - SigVerifier: bcf.cryptoComponents.TxSingleSigner(), - GuardianChecker: guardedAccountHandler, - PubKeyConverter: bcf.coreComponents.AddressPubKeyConverter(), - Marshaller: bcf.coreComponents.TxMarshalizer(), - KeyGen: bcf.cryptoComponents.TxSignKeyGen(), - } - - return guardedtx.NewGuardedTxSigVerifier(argGuardianSigVerifier) -} - func (bcf *bootstrapComponentsFactory) createHeaderFactory(handler nodeFactory.HeaderVersionHandler, shardID uint32) (nodeFactory.VersionedHeaderFactory, error) { if shardID == core.MetachainShardId { return block.NewMetaHeaderFactory(handler) diff --git a/factory/bootstrap/bootstrapComponentsHandler.go b/factory/bootstrap/bootstrapComponentsHandler.go index efd1b1d3261..a933d7d1091 100644 --- a/factory/bootstrap/bootstrapComponentsHandler.go +++ b/factory/bootstrap/bootstrapComponentsHandler.go @@ -94,18 +94,6 @@ func (mbf *managedBootstrapComponents) EpochStartBootstrapper() factory.EpochSta return mbf.bootstrapComponents.epochStartBootstrapper } -// GuardianSigVerifier returns the guardian signature verifier -func (mbf *managedBootstrapComponents) GuardianSigVerifier() process.GuardianSigVerifier { - mbf.mutBootstrapComponents.RLock() - defer mbf.mutBootstrapComponents.RUnlock() - - if mbf.bootstrapComponents == nil { - return nil - } - - return mbf.bootstrapComponents.guardianSigVerifier -} - // GuardedAccountHandler returns the guarded account handler func (mbf *managedBootstrapComponents) GuardedAccountHandler() process.GuardedAccountHandler { mbf.mutBootstrapComponents.RLock() diff --git a/factory/interface.go b/factory/interface.go index db54a521df4..6c1f3178e28 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -438,7 +438,6 @@ type BootstrapComponentsHolder interface { VersionedHeaderFactory() factory.VersionedHeaderFactory HeaderVersionHandler() factory.HeaderVersionHandler HeaderIntegrityVerifier() factory.HeaderIntegrityVerifierHandler - GuardianSigVerifier() process.GuardianSigVerifier GuardedAccountHandler() process.GuardedAccountHandler IsInterfaceNil() bool } diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index a420982a71b..c48e77b29e3 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -1585,7 +1585,6 @@ func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( HeartbeatExpiryTimespanInSec: pcf.config.HeartbeatV2.HeartbeatExpiryTimespanInSec, PeerShardMapper: peerShardMapper, HardforkTrigger: hardforkTrigger, - GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), } interceptorContainerFactory, err := interceptorscontainer.NewShardInterceptorsContainerFactory(shardInterceptorsContainerFactoryArgs) @@ -1634,7 +1633,6 @@ func (pcf *processComponentsFactory) newMetaInterceptorContainerFactory( HeartbeatExpiryTimespanInSec: pcf.config.HeartbeatV2.HeartbeatExpiryTimespanInSec, PeerShardMapper: peerShardMapper, HardforkTrigger: hardforkTrigger, - GuardianSigVerifier: pcf.bootstrapComponents.GuardianSigVerifier(), } interceptorContainerFactory, err := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorsContainerFactoryArgs) @@ -1885,9 +1883,6 @@ func checkProcessComponentsArgs(args ProcessComponentsFactoryArgs) error { if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilAppStatusHandler) } - if check.IfNil(args.BootstrapComponents.GuardianSigVerifier()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilGuardianSigVerifier) - } return nil } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 38971f4992f..81f159b2499 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1113,8 +1113,6 @@ func (tpn *TestProcessorNode) initInterceptors(heartbeatPk string) { cryptoComponents.BlKeyGen = tpn.OwnAccount.KeygenBlockSign cryptoComponents.TxKeyGen = tpn.OwnAccount.KeygenTxSign - bootstrapComponents := getDefaultBootstrapComponents(tpn.ShardCoordinator) - if tpn.ShardCoordinator.SelfId() == core.MetachainShardId { argsEpochStart := &metachain.ArgsNewMetaEpochStartTrigger{ GenesisTime: tpn.RoundHandler.TimeStamp(), @@ -1164,7 +1162,6 @@ func (tpn *TestProcessorNode) initInterceptors(heartbeatPk string) { HeartbeatExpiryTimespanInSec: 30, PeerShardMapper: tpn.PeerShardMapper, HardforkTrigger: tpn.HardforkTrigger, - GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewMetaInterceptorsContainerFactory(metaInterceptorContainerFactoryArgs) @@ -1230,7 +1227,6 @@ func (tpn *TestProcessorNode) initInterceptors(heartbeatPk string) { HeartbeatExpiryTimespanInSec: 30, PeerShardMapper: tpn.PeerShardMapper, HardforkTrigger: tpn.HardforkTrigger, - GuardianSigVerifier: bootstrapComponents.GuardianSigVerifierField, } interceptorContainerFactory, _ := interceptorscontainer.NewShardInterceptorsContainerFactory(shardIntereptorContainerFactoryArgs) @@ -3141,7 +3137,6 @@ func getDefaultBootstrapComponents(shardCoordinator sharding.Coordinator) *mainF HdrVersionHandler: headerVersionHandler, VersionedHdrFactory: versionedHeaderFactory, HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, - GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, } } diff --git a/node/node.go b/node/node.go index d71facb7f1d..83857c89222 100644 --- a/node/node.go +++ b/node/node.go @@ -723,7 +723,6 @@ func (n *Node) commonTransactionValidation( n.processComponents.ShardCoordinator(), whiteListRequest, n.coreComponents.AddressPubKeyConverter(), - n.bootstrapComponents.GuardianSigVerifier(), n.coreComponents.TxVersionChecker(), common.MaxTxNonceDeltaAllowed, ) diff --git a/node/node_test.go b/node/node_test.go index 7903e5c46e0..d83790acda7 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4500,7 +4500,6 @@ func getDefaultBootstrapComponents() *mainFactoryMocks.BootstrapComponentsStub { NodeRole: "", ShCoordinator: &mock.ShardCoordinatorMock{}, HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, - GuardianSigVerifierField: &guardianMocks.GuardianSigVerifierStub{}, GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, } } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 791678580d6..86783ee4241 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -16,7 +16,6 @@ import ( "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/state" "github.com/ElrondNetwork/elrond-go/testscommon" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" vmcommon "github.com/ElrondNetwork/elrond-vm-common" "github.com/stretchr/testify/assert" diff --git a/process/guardedtx/guardedTxVerifier.go b/process/guardedtx/guardedTxVerifier.go deleted file mode 100644 index 7a9a5be1025..00000000000 --- a/process/guardedtx/guardedTxVerifier.go +++ /dev/null @@ -1,73 +0,0 @@ -package guardedtx - -import ( - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data" - "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/state" -) - -// GuardedTxSigVerifierArgs holds the argument to instantiate a guarded tx signature verifier -type GuardedTxSigVerifierArgs struct { - SigVerifier crypto.SingleSigner - GuardianChecker process.GuardianChecker - PubKeyConverter core.PubkeyConverter - Marshaller data.Marshaller - KeyGen crypto.KeyGenerator -} - -type guardedTxSigVerifier struct { - sigVerifier crypto.SingleSigner - guardianChecker process.GuardianChecker - encoder core.PubkeyConverter - marshaller data.Marshaller - keyGen crypto.KeyGenerator -} - -// NewGuardedTxSigVerifier creates a new instance of a guarded transaction signature verifier -func NewGuardedTxSigVerifier(args GuardedTxSigVerifierArgs) (*guardedTxSigVerifier, error) { - if check.IfNil(args.SigVerifier) { - return nil, process.ErrNilSingleSigner - } - if check.IfNil(args.GuardianChecker) { - return nil, process.ErrNilGuardianChecker - } - if check.IfNil(args.PubKeyConverter) { - return nil, process.ErrNilPubkeyConverter - } - if check.IfNil(args.Marshaller) { - return nil, process.ErrNilMarshalizer - } - if check.IfNil(args.KeyGen) { - return nil, process.ErrNilKeyGen - } - - return &guardedTxSigVerifier{ - sigVerifier: args.SigVerifier, - guardianChecker: args.GuardianChecker, - encoder: args.PubKeyConverter, - marshaller: args.Marshaller, - keyGen: args.KeyGen, - }, nil -} - -// HasPendingGuardian true if the given account has a pending guardian set -func (gtx *guardedTxSigVerifier) HasPendingGuardian(uah state.UserAccountHandler) bool { - return gtx.guardianChecker.HasPendingGuardian(uah) -} - -// IsInterfaceNil returns nil if the receiver is nil -func (gtx *guardedTxSigVerifier) IsInterfaceNil() bool { - return gtx == nil -} - -// guardianPubKyeFromBytes returns the guardian public key for the given account -func (gtx *guardedTxSigVerifier) guardianPubKyeFromBytes(guardianPubKeyBytes []byte) (crypto.PublicKey, error) { - if len(guardianPubKeyBytes) == 0 { - return nil, process.ErrNilGuardianPublicKey - } - - return gtx.keyGen.PublicKeyFromByteArray(guardianPubKeyBytes) -} \ No newline at end of file diff --git a/process/guardedtx/guardedTxVerifier_test.go b/process/guardedtx/guardedTxVerifier_test.go deleted file mode 100644 index 2ba1552aca7..00000000000 --- a/process/guardedtx/guardedTxVerifier_test.go +++ /dev/null @@ -1,281 +0,0 @@ -package guardedtx - -import ( - "math/big" - "strings" - "testing" - - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/core/mock" - "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" - "github.com/ElrondNetwork/elrond-go-core/data" - txStruct "github.com/ElrondNetwork/elrond-go-core/data/transaction" - "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go-crypto" - "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519" - "github.com/ElrondNetwork/elrond-go-crypto/signing/ed25519/singlesig" - "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/testscommon" - "github.com/ElrondNetwork/elrond-go/testscommon/cryptoMocks" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" - "github.com/ElrondNetwork/elrond-go/testscommon/interceptedTxMocks" - stateMocks "github.com/ElrondNetwork/elrond-go/testscommon/state" - "github.com/ElrondNetwork/elrond-go/testscommon/vmcommonMocks" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" - "github.com/stretchr/testify/require" -) - -func TestNewGuardedTxSigVerifier(t *testing.T) { - args := GuardedTxSigVerifierArgs{ - SigVerifier: &cryptoMocks.SingleSignerStub{}, - GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, - PubKeyConverter: &testscommon.PubkeyConverterMock{}, - Marshaller: &testscommon.MarshalizerMock{}, - KeyGen: &cryptoMocks.KeyGenStub{}, - } - - t.Run("nil guardian sig verifier ", func(t *testing.T) { - changedArgs := args - changedArgs.SigVerifier = nil - gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) - require.Equal(t, process.ErrNilSingleSigner, err) - require.True(t, check.IfNil(gtxSigVerifier)) - }) - t.Run("nil guardian checker", func(t *testing.T) { - changedArgs := args - changedArgs.GuardianChecker = nil - gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) - require.Equal(t, process.ErrNilGuardianChecker, err) - require.True(t, check.IfNil(gtxSigVerifier)) - }) - t.Run("nil public key converter", func(t *testing.T) { - changedArgs := args - changedArgs.PubKeyConverter = nil - gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) - require.Equal(t, process.ErrNilPubkeyConverter, err) - require.True(t, check.IfNil(gtxSigVerifier)) - }) - t.Run("nil marshaller", func(t *testing.T) { - changedArgs := args - changedArgs.Marshaller = nil - gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) - require.Equal(t, process.ErrNilMarshalizer, err) - require.True(t, check.IfNil(gtxSigVerifier)) - }) - t.Run("nil keyGen", func(t *testing.T) { - changedArgs := args - changedArgs.KeyGen = nil - gtxSigVerifier, err := NewGuardedTxSigVerifier(changedArgs) - require.Equal(t, process.ErrNilKeyGen, err) - require.True(t, check.IfNil(gtxSigVerifier)) - }) - t.Run("ok params", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(args) - require.Nil(t, err) - require.False(t, check.IfNil(gtxSigVerifier)) - }) -} - -func TestGuardedTxSigVerifier_IsInterfaceNil(t *testing.T) { - var gsv process.GuardianSigVerifier - require.True(t, check.IfNil(gsv)) - - var gsvNilPtr *guardedTxSigVerifier - require.True(t, check.IfNil(gsvNilPtr)) - - gsv = &guardedTxSigVerifier{} - require.False(t, check.IfNil(gsv)) -} - -func TestGuardedTxSigVerifier_VerifyGuardianSignature(t *testing.T) { - suite := ed25519.NewEd25519() - keyGenerator := crypto.NewKeyGenerator(suite) - privateKeyGuardian, publicKeyGuardian := keyGenerator.GeneratePair() - privateKeyOwner, publicKeyOwner := keyGenerator.GeneratePair() - pubKeyGuardianBytes, _ := publicKeyGuardian.ToByteArray() - publicKeyOwnerBytes, _ := publicKeyOwner.ToByteArray() - - signer := &singlesig.Ed25519Signer{} - - acc := &vmcommonMocks.UserAccountStub{} - guardianChecker := &guardianMocks.GuardedAccountHandlerStub{ - GetActiveGuardianCalled: func(handler vmcommon.UserAccountHandler) ([]byte, error) { - return pubKeyGuardianBytes, nil - }, - } - - value, _ := big.NewInt(0).SetString("100000000000000000000", 10) - - tx := &txStruct.Transaction{ - Nonce: 11, - Value: value, - RcvAddr: publicKeyOwnerBytes, - RcvUserName: nil, - SndAddr: publicKeyOwnerBytes, - SndUserName: nil, - GasPrice: 1000000000, - GasLimit: 50000, - Data: nil, - ChainID: []byte{31}, - Version: 2, - Signature: nil, - Options: 0, - GuardianSignature: nil, - } - - marshaller := &marshal.JsonMarshalizer{} - converter, _ := pubkeyConverter.NewBech32PubkeyConverter(32, &mock.LoggerMock{}) - inTx := createSignedInterceptedTx(tx, signer, privateKeyOwner, privateKeyGuardian, converter, marshaller) - args := GuardedTxSigVerifierArgs{ - SigVerifier: signer, - GuardianChecker: guardianChecker, - PubKeyConverter: converter, - Marshaller: marshaller, - KeyGen: keyGenerator, - } - - t.Run("verify OK", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(args) - require.Nil(t, err) - - err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx) - require.Nil(t, err) - }) - t.Run("wrong type assertion intercepted signed tx", func(t *testing.T) { - inTxChanged := &interceptedTxMocks.InterceptedUnsignedTxHandlerStub{ - TransactionCalled: func() data.TransactionHandler { - txCopy := *tx - return &txCopy - }, - } - - gtxSigVerifier, err := NewGuardedTxSigVerifier(args) - require.Nil(t, err) - - err = gtxSigVerifier.VerifyGuardianSignature(acc, inTxChanged) - require.NotNil(t, err) - require.True(t, strings.Contains(err.Error(), "InterceptedSignedTransactionHandler")) - }) - t.Run("invalid guardian signature", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(args) - require.Nil(t, err) - - // owner signs for guardian - inTx2 := createSignedInterceptedTx(tx, signer, privateKeyOwner, privateKeyOwner, converter, marshaller) - err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx2) - require.NotNil(t, err) - }) - t.Run("nil guardian signature", func(t *testing.T) { - gtxSigVerifier, err := NewGuardedTxSigVerifier(args) - require.Nil(t, err) - - // owner signs for guardian - inTx2 := createSignedInterceptedTx(tx, signer, privateKeyOwner, privateKeyOwner, converter, marshaller) - txHandler := inTx2.Transaction() - inTx2.TransactionCalled = func() data.TransactionHandler { - tx2, ok := txHandler.(*txStruct.Transaction) - require.True(t, ok) - - tx2.GuardianSignature = nil - return tx2 - } - err = gtxSigVerifier.VerifyGuardianSignature(acc, inTx2) - require.NotNil(t, err) - }) -} - -func createSignedInterceptedTx( - tx *txStruct.Transaction, - signer crypto.SingleSigner, - senderSk crypto.PrivateKey, - guardianSk crypto.PrivateKey, - converter core.PubkeyConverter, - marshaller data.Marshaller, -) *interceptedTxMocks.InterceptedTxHandlerStub { - ownerSig, guardianSig := signAndGuardTx(tx, signer, senderSk, guardianSk, converter, marshaller) - - txCopy := *tx - txCopy.Signature = ownerSig - txCopy.GuardianSignature = guardianSig - - return &interceptedTxMocks.InterceptedTxHandlerStub{ - TransactionCalled: func() data.TransactionHandler { - return &txCopy - }, - GetTxMessageForSignatureVerificationCalled: func() ([]byte, error) { - ftx := GetFrontEndTransaction(tx, converter) - return marshaller.Marshal(ftx) - }, - } -} - -func signAndGuardTx( - tx *txStruct.Transaction, - signer crypto.SingleSigner, - sk crypto.PrivateKey, - skGuardian crypto.PrivateKey, - converter core.PubkeyConverter, - marshaller data.Marshaller, -) ([]byte, []byte) { - ftx := GetFrontEndTransaction(tx, converter) - buff, _ := marshaller.Marshal(ftx) - signature, _ := signer.Sign(sk, buff) - guardianSignature, _ := signer.Sign(skGuardian, buff) - - return signature, guardianSignature -} - -func GetFrontEndTransaction(tx *txStruct.Transaction, converter core.PubkeyConverter) *txStruct.FrontendTransaction { - ftx := &txStruct.FrontendTransaction{ - Nonce: tx.Nonce, - Value: tx.Value.String(), - Receiver: converter.Encode(tx.RcvAddr), - Sender: converter.Encode(tx.SndAddr), - SenderUsername: nil, - ReceiverUsername: nil, - GasPrice: tx.GasPrice, - GasLimit: tx.GasLimit, - Data: tx.Data, - Signature: "", - ChainID: string(tx.ChainID), - Version: tx.Version, - GuardianSignature: "", - } - return ftx -} - -func TestGuardedTxSigVerifier_HasPendingGuardian(t *testing.T) { - t.Parallel() - - acc := &stateMocks.UserAccountStub{} - args := GuardedTxSigVerifierArgs{ - SigVerifier: &cryptoMocks.SingleSignerStub{}, - PubKeyConverter: &testscommon.PubkeyConverterMock{}, - Marshaller: &testscommon.MarshalizerMock{}, - KeyGen: &cryptoMocks.KeyGenStub{}, - } - t.Run("no pending guardian", func(t *testing.T) { - guardianChecker := &guardianMocks.GuardedAccountHandlerStub{ - HasPendingGuardianCalled: func(handler state.UserAccountHandler) bool { - return false - }, - } - arg := args - arg.GuardianChecker = guardianChecker - gtxSigVerifier, _ := NewGuardedTxSigVerifier(arg) - require.False(t, gtxSigVerifier.HasPendingGuardian(acc)) - }) - t.Run("with pending guardian", func(t *testing.T) { - guardianChecker := &guardianMocks.GuardedAccountHandlerStub{ - HasPendingGuardianCalled: func(handler state.UserAccountHandler) bool { - return true - }, - } - arg := args - arg.GuardianChecker = guardianChecker - gtxSigVerifier, _ := NewGuardedTxSigVerifier(arg) - require.True(t, gtxSigVerifier.HasPendingGuardian(acc)) - }) -} diff --git a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go index a5dcf30f461..72d3a10fc22 100644 --- a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go +++ b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go @@ -18,7 +18,6 @@ type BootstrapComponentsStub struct { VersionedHdrFactory nodeFactory.VersionedHeaderFactory HdrIntegrityVerifier nodeFactory.HeaderIntegrityVerifierHandler GuardedAccountHandlerField process.GuardedAccountHandler - GuardianSigVerifierField process.GuardianSigVerifier } // Create - @@ -77,11 +76,6 @@ func (bcs *BootstrapComponentsStub) SetShardCoordinator(shardCoordinator shardin return nil } -// GuardianSigVerifier - -func (bcs *BootstrapComponentsStub) GuardianSigVerifier() process.GuardianSigVerifier { - return bcs.GuardianSigVerifierField -} - // GuardedAccountHandler - func (bcs *BootstrapComponentsStub) GuardedAccountHandler() process.GuardedAccountHandler { return bcs.GuardedAccountHandlerField From ad3a4d069540e52d02c85ffa56582bc4bfcc95e8 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 6 Jan 2023 16:55:37 +0200 Subject: [PATCH 109/335] further cleanup guarded tx signer --- .../startInEpoch/startInEpoch_test.go | 2 - process/dataValidators/txValidator_test.go | 299 ------------------ 2 files changed, 301 deletions(-) diff --git a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go index 4b2a2cdc255..f11e3caa7b3 100644 --- a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go +++ b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go @@ -31,7 +31,6 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon" epochNotifierMock "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" "github.com/ElrondNetwork/elrond-go/testscommon/genericMocks" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/nodeTypeProviderMock" "github.com/ElrondNetwork/elrond-go/testscommon/scheduledDataSyncer" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" @@ -260,7 +259,6 @@ func testNodeStartsInEpoch(t *testing.T, shardID uint32, expectedHighestRound ui ForceStartFromNetwork: false, }, TrieSyncStatisticsProvider: &testscommon.SizeSyncStatisticsHandlerStub{}, - GuardianSigVerifier: &guardianMocks.GuardianSigVerifierStub{}, } epochStartBootstrap, err := bootstrap.NewEpochStartBootstrap(argsBootstrapHandler) diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 86783ee4241..ce6a6d6e5aa 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -4,12 +4,10 @@ import ( "errors" "math/big" "strconv" - "strings" "testing" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/data" - "github.com/ElrondNetwork/elrond-go-core/data/receipt" "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/dataValidators" @@ -413,303 +411,6 @@ func TestTxValidator_CheckTxValidityTxIsOkShouldReturnTrue(t *testing.T) { assert.Nil(t, result) } -func TestTxValidator_checkPermission(t *testing.T) { - adb := getAccAdapter(0, big.NewInt(0)) - shardCoordinator := createMockCoordinator("_", 0) - maxNonceDeltaAllowed := 100 - txValidator, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{}, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - - t.Run("non guarded account with getTxData error should err", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return nil - } - acc := &stateMock.UserAccountStub{ - IsGuardedCalled: func() bool { - return false - }, - } - err = txValidator.CheckPermission(inTx, acc) - require.Equal(t, process.ErrNilTransaction, err) - }) - t.Run("non guarded account without getTxData error should allow", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{} - } - - acc := &stateMock.UserAccountStub{ - IsGuardedCalled: func() bool { - return false - }, - } - err = txValidator.CheckPermission(inTx, acc) - require.Nil(t, err) - }) - t.Run("guarded account with no guarded tx and no bypass permission should err", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{ - Data: []byte("dummy data"), - } - } - - acc := createDummyGuardedAccount() - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return false - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - - err = txV.CheckPermission(inTx, acc) - require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) - }) - t.Run("guarded account with no guarded tx and bypass permission should allow if no pending guardian", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{ - Data: []byte("SetGuardian@..."), - } - } - - acc := createDummyGuardedAccount() - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return false - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - - err = txV.CheckPermission(inTx, acc) - require.Nil(t, err) - }) - t.Run("guarded account with no guarded tx and bypass permission with pending guardian should block", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{ - Data: []byte("SetGuardian@..."), - } - } - - acc := createDummyGuardedAccount() - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return false - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - - err = txV.CheckPermission(inTx, acc) - require.Equal(t, process.ErrCannotReplaceGuardedAccountPendingGuardian, err) - }) - t.Run("guarded account with guarded Tx should allow", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{ - Data: []byte("dummy data"), - } - } - - acc := createDummyGuardedAccount() - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return true - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - - err = txV.CheckPermission(inTx, acc) - require.Nil(t, err) - }) -} - -func TestTxValidator_checkGuardedTransaction(t *testing.T) { - adb := getAccAdapter(0, big.NewInt(0)) - shardCoordinator := createMockCoordinator("_", 0) - maxNonceDeltaAllowed := 100 - txValidator, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{}, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - - t.Run("nil tx should err", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return nil - } - acc := &stateMock.UserAccountStub{} - err = txValidator.CheckGuardedTransaction(inTx, acc) - require.Equal(t, process.ErrNilTransaction, err) - }) - t.Run("invalid transaction should fail", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &receipt.Receipt{} - } - acc := &stateMock.UserAccountStub{} - err = txValidator.CheckGuardedTransaction(inTx, acc) - require.True(t, errors.Is(err, process.ErrWrongTypeAssertion)) - }) - t.Run("not guarded Tx should err", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{} - } - acc := &stateMock.UserAccountStub{} - - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return false - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - err = txV.CheckGuardedTransaction(inTx, acc) - require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) - }) - t.Run("non user account should err", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{} - } - - var acc state.UserAccountHandler - - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return true - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - err = txV.CheckGuardedTransaction(inTx, acc) - require.True(t, errors.Is(err, process.ErrWrongTypeAssertion)) - }) - t.Run("invalid guardian signature should err", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{} - } - - acc := state.NewEmptyUserAccount() - - expectedSigVerifyError := errors.New("expected error") - - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return true - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - err = txV.CheckGuardedTransaction(inTx, acc) - require.True(t, errors.Is(err, process.ErrOperationNotPermitted)) - require.True(t, strings.Contains(err.Error(), expectedSigVerifyError.Error())) - }) - t.Run("valid signed guarded tx OK", func(t *testing.T) { - inTx := getDefaultInterceptedTx() - inTx.TransactionCalled = func() data.TransactionHandler { - return &transaction.Transaction{} - } - - acc := state.NewEmptyUserAccount() - txV, err := dataValidators.NewTxValidator( - adb, - shardCoordinator, - &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), - &testscommon.TxVersionCheckerStub{ - IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { - return true - }, - }, - maxNonceDeltaAllowed, - ) - require.Nil(t, err) - err = txV.CheckGuardedTransaction(inTx, acc) - require.Nil(t, err) - }) -} - -func Test_checkOperationAllowedToBypassGuardian(t *testing.T) { - t.Run("operations not allowed to bypass", func(t *testing.T) { - txData := []byte("#@!") - require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) - txData = []byte(nil) - require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) - txData = []byte("SomeOtherFunction@") - require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) - }) - t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { - txData := []byte("setGuardian") - require.Equal(t, process.ErrOperationNotPermitted, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) - }) - t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { - txData := []byte("SetGuardian@") - require.Nil(t, dataValidators.CheckOperationAllowedToBypassGuardian(txData)) - }) -} - func Test_getTxData(t *testing.T) { t.Run("nil tx in intercepted tx returns error", func(t *testing.T) { interceptedTx := getDefaultInterceptedTx() From c5c95e5665a1b4e1fc0b3d4517ce772146d38561 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Fri, 6 Jan 2023 17:26:07 +0200 Subject: [PATCH 110/335] remove unused guardian errors --- epochStart/errors.go | 3 --- errors/errors.go | 3 --- process/errors.go | 9 --------- 3 files changed, 15 deletions(-) diff --git a/epochStart/errors.go b/epochStart/errors.go index 4298c621444..4d30f202d74 100644 --- a/epochStart/errors.go +++ b/epochStart/errors.go @@ -325,6 +325,3 @@ var ErrNilValidatorInfoStorage = errors.New("nil validator info storage") // ErrNilTrieSyncStatistics signals that nil trie sync statistics has been provided var ErrNilTrieSyncStatistics = errors.New("nil trie sync statistics") - -// ErrNilGuardianSigVerifier signals that a nil guardian signature verifier was provided -var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") diff --git a/errors/errors.go b/errors/errors.go index 06df5e1c1e0..b9b526eb95b 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -541,6 +541,3 @@ 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") - -// ErrNilGuardianSigVerifier signals that a nil guardian signature verifier was provided -var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") diff --git a/process/errors.go b/process/errors.go index 9d2441c790e..e73de0a8da3 100644 --- a/process/errors.go +++ b/process/errors.go @@ -528,9 +528,6 @@ var ErrInvalidExtraGasLimitGuardedTx = errors.New("invalid extra gas limit for g // ErrInvalidMaxGasPriceSetGuardian signals that an invalid maximum gas price has been provided in the config file var ErrInvalidMaxGasPriceSetGuardian = errors.New("invalid maximum gas price for set guardian") -// ErrGuardianAddressNotExpected signals that the guardian address is not expected -var ErrGuardianAddressNotExpected = errors.New("guardian address not expected") - // ErrGuardianSignatureNotExpected signals that the guardian signature is not expected var ErrGuardianSignatureNotExpected = errors.New("guardian signature not expected") @@ -1164,12 +1161,6 @@ var ErrMaxBuiltInCallsReached = errors.New("max built in call reached") // ErrNilGuardianChecker signals that a nil guardian checker was provided var ErrNilGuardianChecker = errors.New("nil guardian checker") -// ErrNilGuardianPublicKey signals that a nil guardian public key was provided -var ErrNilGuardianPublicKey = errors.New("nil guardian public key") - -// ErrNilGuardianSigVerifier signals that a nil signature verifier was provided -var ErrNilGuardianSigVerifier = errors.New("nil guardian signature verifier") - // ErrAccountHasNoGuardianSet signals that the account has no guardians set var ErrAccountHasNoGuardianSet = errors.New("account has no guardian set") From 49dedf8e994b0c676a8edc8a3c5f8ffa10816823 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 9 Jan 2023 11:45:35 +0200 Subject: [PATCH 111/335] fix missing error definition add unit tests --- process/errors.go | 3 +++ process/transaction/baseProcess.go | 1 - process/transaction/export_test.go | 12 ++++++++++++ process/transaction/shardProcess_test.go | 20 ++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/process/errors.go b/process/errors.go index e73de0a8da3..0f4738a669d 100644 --- a/process/errors.go +++ b/process/errors.go @@ -531,6 +531,9 @@ var ErrInvalidMaxGasPriceSetGuardian = errors.New("invalid maximum gas price for // ErrGuardianSignatureNotExpected signals that the guardian signature is not expected var ErrGuardianSignatureNotExpected = errors.New("guardian signature not expected") +// ErrGuardianAddressNotExpected signals that the guardian address is not expected +var ErrGuardianAddressNotExpected = errors.New("guardian address not expected") + // ErrInvalidMinimumGasLimitForTx signals that an invalid minimum gas limit for transactions has been read from config file var ErrInvalidMinimumGasLimitForTx = errors.New("invalid minimum gas limit for transactions") diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 3a475ddda92..6db67473585 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -250,7 +250,6 @@ func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, accou if !account.IsGuarded() { return nil } - if !txProc.txVersionChecker.IsGuardedTransaction(tx) { return txProc.checkGuardedAccountUnguardedTxPermission(tx.GetData(), account) } diff --git a/process/transaction/export_test.go b/process/transaction/export_test.go index 7fa5c00b55d..a591b42c5e2 100644 --- a/process/transaction/export_test.go +++ b/process/transaction/export_test.go @@ -83,3 +83,15 @@ func (txProc *txProcessor) ExecuteFailedRelayedTransaction( func (inTx *InterceptedTransaction) CheckMaxGasPrice() error { return inTx.checkMaxGasPrice() } + +func (txProc *txProcessor) VerifyGuardian(tx *transaction.Transaction, account state.UserAccountHandler) error { + return txProc.verifyGuardian(tx, account) +} + +func (txProc *txProcessor) CheckGuardedAccountUnguardedTxPermissions(txData []byte, account state.UserAccountHandler) error { + return txProc.checkGuardedAccountUnguardedTxPermission(txData, account) +} + +func CheckOperationAllowedToBypassGuardian(txData []byte) error { + return checkOperationAllowedToBypassGuardian(txData) +} diff --git a/process/transaction/shardProcess_test.go b/process/transaction/shardProcess_test.go index 815ca593ceb..c538498e069 100644 --- a/process/transaction/shardProcess_test.go +++ b/process/transaction/shardProcess_test.go @@ -29,6 +29,7 @@ import ( "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/ElrondNetwork/elrond-vm-common/parsers" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func generateRandomByteSlice(size int) []byte { @@ -3240,3 +3241,22 @@ func TestTxProcessor_ExecuteFailingRelayedTxShouldNotHaveNegativeFee(t *testing. assert.Nil(t, err) assert.False(t, negativeCost) } + +func Test_checkOperationAllowedToBypassGuardian(t *testing.T) { + t.Run("operations not allowed to bypass", func(t *testing.T) { + txData := []byte("#@!") + require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) + txData = []byte(nil) + require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) + txData = []byte("SomeOtherFunction@") + require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) + }) + t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { + txData := []byte("setGuardian") + require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) + }) + t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { + txData := []byte("SetGuardian@") + require.Nil(t, txproc.CheckOperationAllowedToBypassGuardian(txData)) + }) +} From d03ce73893d09700b70b6044a23eb2a1c20196fc Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 9 Jan 2023 13:53:55 +0200 Subject: [PATCH 112/335] add tests for transactions baseProcess new funcs --- process/transaction/baseProcess_test.go | 92 ++++++++++++++++++++++++ process/transaction/export_test.go | 8 --- process/transaction/shardProcess_test.go | 20 ------ 3 files changed, 92 insertions(+), 28 deletions(-) create mode 100644 process/transaction/baseProcess_test.go diff --git a/process/transaction/baseProcess_test.go b/process/transaction/baseProcess_test.go new file mode 100644 index 00000000000..394927f8e75 --- /dev/null +++ b/process/transaction/baseProcess_test.go @@ -0,0 +1,92 @@ +package transaction + +import ( + "math/big" + "testing" + + "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/process/mock" + "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/testscommon" + "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" + "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" + "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" + stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" + "github.com/stretchr/testify/require" +) + +func Test_checkOperationAllowedToBypassGuardian(t *testing.T) { + t.Run("operations not allowed to bypass", func(t *testing.T) { + txData := []byte("#@!") + require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + txData = []byte(nil) + require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + txData = []byte("SomeOtherFunction@") + require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + }) + t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { + txData := []byte("setGuardian") + require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + }) + t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { + txData := []byte("SetGuardian@") + require.Nil(t, checkOperationAllowedToBypassGuardian(txData)) + }) +} + +func Test_checkGuardedAccountUnguardedTxPermission(t *testing.T) { + + baseProc := baseTxProcessor{ + accounts: &stateMock.AccountsStub{}, + shardCoordinator: mock.NewOneShardCoordinatorMock(), + pubkeyConv: testscommon.NewPubkeyConverterMock(32), + economicsFee: &economicsmocks.EconomicsHandlerStub{ + CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { + return nil + }, + ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { + return big.NewInt(0) + }, + }, + hasher: &hashingMocks.HasherMock{}, + marshalizer: &testscommon.MarshalizerMock{}, + scProcessor: &testscommon.SCProcessorMock{}, + enableEpochsHandler: &testscommon.EnableEpochsHandlerStub{ + IsPenalizedTooMuchGasFlagEnabledField: true, + }, + txVersionChecker: &testscommon.TxVersionCheckerStub{}, + guardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + } + + account:= &stateMock.UserAccountStub{} + + t.Run("nil txData", func(t *testing.T) { + require.Equal(t, process.ErrOperationNotPermitted, baseProc.checkGuardedAccountUnguardedTxPermission(nil, account)) + }) + t.Run("empty txData", func(t *testing.T) { + require.Equal(t, process.ErrOperationNotPermitted, baseProc.checkGuardedAccountUnguardedTxPermission([]byte(""), account)) + }) + t.Run("nil account", func(t *testing.T) { + txData := []byte("SetGuardian@") + require.Nil(t, baseProc.checkGuardedAccountUnguardedTxPermission(txData, nil)) + }) + t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { + txData := []byte("setGuardian") + require.Equal(t, process.ErrOperationNotPermitted, baseProc.checkGuardedAccountUnguardedTxPermission(txData, account)) + }) + t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { + txData := []byte("SetGuardian@") + require.Nil(t, baseProc.checkGuardedAccountUnguardedTxPermission(txData, account)) + }) + t.Run("set guardian builtin call with pending guardian not allowed", func(t *testing.T) { + txData := []byte("SetGuardian@") + baseProc := baseProc + baseProc.guardianChecker = &guardianMocks.GuardedAccountHandlerStub{ + HasPendingGuardianCalled: func(uah state.UserAccountHandler) bool { + return true + }, + } + require.Equal(t, process.ErrCannotReplaceGuardedAccountPendingGuardian, baseProc.checkGuardedAccountUnguardedTxPermission(txData, account)) + }) +} diff --git a/process/transaction/export_test.go b/process/transaction/export_test.go index a591b42c5e2..f1385ee2c21 100644 --- a/process/transaction/export_test.go +++ b/process/transaction/export_test.go @@ -87,11 +87,3 @@ func (inTx *InterceptedTransaction) CheckMaxGasPrice() error { func (txProc *txProcessor) VerifyGuardian(tx *transaction.Transaction, account state.UserAccountHandler) error { return txProc.verifyGuardian(tx, account) } - -func (txProc *txProcessor) CheckGuardedAccountUnguardedTxPermissions(txData []byte, account state.UserAccountHandler) error { - return txProc.checkGuardedAccountUnguardedTxPermission(txData, account) -} - -func CheckOperationAllowedToBypassGuardian(txData []byte) error { - return checkOperationAllowedToBypassGuardian(txData) -} diff --git a/process/transaction/shardProcess_test.go b/process/transaction/shardProcess_test.go index c538498e069..815ca593ceb 100644 --- a/process/transaction/shardProcess_test.go +++ b/process/transaction/shardProcess_test.go @@ -29,7 +29,6 @@ import ( "github.com/ElrondNetwork/elrond-vm-common/builtInFunctions" "github.com/ElrondNetwork/elrond-vm-common/parsers" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func generateRandomByteSlice(size int) []byte { @@ -3241,22 +3240,3 @@ func TestTxProcessor_ExecuteFailingRelayedTxShouldNotHaveNegativeFee(t *testing. assert.Nil(t, err) assert.False(t, negativeCost) } - -func Test_checkOperationAllowedToBypassGuardian(t *testing.T) { - t.Run("operations not allowed to bypass", func(t *testing.T) { - txData := []byte("#@!") - require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) - txData = []byte(nil) - require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) - txData = []byte("SomeOtherFunction@") - require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) - }) - t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { - txData := []byte("setGuardian") - require.Equal(t, process.ErrOperationNotPermitted, txproc.CheckOperationAllowedToBypassGuardian(txData)) - }) - t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { - txData := []byte("SetGuardian@") - require.Nil(t, txproc.CheckOperationAllowedToBypassGuardian(txData)) - }) -} From 8ab2d16927fc88af88d5b8cc052d5f3e1e5c0f9b Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Mon, 9 Jan 2023 15:13:55 +0200 Subject: [PATCH 113/335] add unit tests --- .../interceptedTransaction_test.go | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index f923fb25978..cb2ca697214 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -1774,3 +1774,89 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { require.Equal(t, process.ErrGasPriceTooHigh, errMaxGasPrice) }) } + +func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { + t.Parallel() + + txVersionChecker := testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *dataTransaction.Transaction) bool { + return true + }, + } + feeHandler := &economicsmocks.EconomicsHandlerStub{ + MaxGasPriceSetGuardianCalled: func() uint64 { + return 1000 + }, + } + tx := dataTransaction.Transaction{ + Data: []byte("some data"), + GuardianAddr: []byte("guardian addr"), + GuardianSignature: []byte("guardian signature"), + } + + t.Run("get data for signing with error", func(t *testing.T) { + tx := tx + txVersionChecker := txVersionChecker + txVersionChecker.IsSignedWithHashCalled = func(tx *dataTransaction.Transaction) bool { + return true + } + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + require.Nil(t, err) + err = inTx.VerifyGuardianSig(&tx) + require.Equal(t, process.ErrTransactionSignedWithHashIsNotEnabled, err) + }) + t.Run("nil guardian sig", func(t *testing.T) { + tx := tx + tx.GuardianSignature = nil + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + require.Nil(t, err) + + err = inTx.VerifyGuardianSig(&tx) + require.Equal(t, errSignerMockVerifySigFails, err) + }) + t.Run("normal TX with not empty guardian address", func(t *testing.T) { + tx := tx + tx.GuardianAddr = []byte("guardian addr") + txVersionChecker := txVersionChecker + txVersionChecker.IsGuardedTransactionCalled = func(tx *dataTransaction.Transaction) bool { + return false + } + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + require.Nil(t, err) + + err = inTx.VerifyGuardianSig(&tx) + require.True(t, errors.Is(err, process.ErrGuardianAddressNotExpected)) + }) + t.Run("normal TX with guardian sig", func(t *testing.T) { + tx := tx + tx.GuardianAddr = nil + tx.GuardianSignature = []byte("guardian signature") + txVersionChecker := txVersionChecker + txVersionChecker.IsGuardedTransactionCalled = func(tx *dataTransaction.Transaction) bool { + return false + } + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + require.Nil(t, err) + + err = inTx.VerifyGuardianSig(&tx) + require.True(t, errors.Is(err, process.ErrGuardianSignatureNotExpected)) + }) + t.Run("wrong guardian sig", func(t *testing.T) { + tx := tx + tx.GuardianSignature = sigBad + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + require.Nil(t, err) + + err = inTx.VerifyGuardianSig(&tx) + require.Equal(t, errSignerMockVerifySigFails, err) + }) + t.Run("correct guardian sig", func(t *testing.T) { + tx := tx + tx.GuardianSignature = sigOk + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + require.Nil(t, err) + + err = inTx.VerifyGuardianSig(&tx) + require.Nil(t, err) + }) +} From 5b61ffcee67e9cf18576c2472f51a9367a3347b2 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 12 Jan 2023 10:18:56 +0200 Subject: [PATCH 114/335] extract consistency check for not guarded tx, remove unused workflow --- .github/workflows/deployment.yml | 0 process/transaction/interceptedTransaction.go | 20 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) delete mode 100644 .github/workflows/deployment.yml diff --git a/.github/workflows/deployment.yml b/.github/workflows/deployment.yml deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index bde61ed578f..a9ab61abddd 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -389,14 +389,7 @@ func (inTx *InterceptedTransaction) VerifyGuardianSig(tx *transaction.Transactio } if !inTx.txVersionChecker.IsGuardedTransaction(tx) { - if len(tx.GetGuardianAddr()) > 0 { - return fmt.Errorf("%w without guardian signature", process.ErrGuardianAddressNotExpected) - } - if len(tx.GetGuardianSignature()) > 0 { - return fmt.Errorf("%w without guardian signature", process.ErrGuardianSignatureNotExpected) - } - - return nil + return verifyConsistencyForNotGuardedTx(tx) } guardianPubKey, err := inTx.keyGen.PublicKeyFromByteArray(tx.GuardianAddr) @@ -407,6 +400,17 @@ func (inTx *InterceptedTransaction) VerifyGuardianSig(tx *transaction.Transactio return inTx.singleSigner.Verify(guardianPubKey, txMessageForSigVerification, tx.GuardianSignature) } +func verifyConsistencyForNotGuardedTx(tx *transaction.Transaction) error { + if len(tx.GetGuardianAddr()) > 0 { + return process.ErrGuardianAddressNotExpected + } + if len(tx.GetGuardianSignature()) > 0 { + return process.ErrGuardianSignatureNotExpected + } + + return nil +} + func (inTx *InterceptedTransaction) getTxMessageForGivenTx(tx *transaction.Transaction) ([]byte, error) { if inTx.txVersionChecker.IsSignedWithHash(tx) && !inTx.enableSignedTxWithHash { return nil, process.ErrTransactionSignedWithHashIsNotEnabled From 66535985ea1e123012f576f6f5604ea7e7252c83 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 12 Jan 2023 12:58:48 +0200 Subject: [PATCH 115/335] fix guardian verification before execution to cover all cases (also scheduled txs) --- process/block/preprocess/transactions.go | 2 +- process/block/preprocess/transactionsV2.go | 2 +- process/errors.go | 3 +++ process/transaction/baseProcess.go | 17 ++++++++++------- process/transaction/metaProcess.go | 9 ++------- process/transaction/shardProcess.go | 5 ----- 6 files changed, 17 insertions(+), 21 deletions(-) diff --git a/process/block/preprocess/transactions.go b/process/block/preprocess/transactions.go index 6b75f366543..1c72473bc34 100644 --- a/process/block/preprocess/transactions.go +++ b/process/block/preprocess/transactions.go @@ -872,7 +872,7 @@ func (txs *transactions) processAndRemoveBadTransaction( ) error { _, err := txs.txProcessor.ProcessTransaction(tx) - isTxTargetedForDeletion := errors.Is(err, process.ErrLowerNonceInTransaction) || errors.Is(err, process.ErrInsufficientFee) + isTxTargetedForDeletion := errors.Is(err, process.ErrLowerNonceInTransaction) || errors.Is(err, process.ErrInsufficientFee) || errors.Is(err, process.ErrTransactionNotExecutable) if isTxTargetedForDeletion { strCache := process.ShardCacherIdentifier(sndShardId, dstShardId) txs.txPool.RemoveData(txHash, strCache) diff --git a/process/block/preprocess/transactionsV2.go b/process/block/preprocess/transactionsV2.go index 2ddb4abecf3..7f3eae0a3f5 100644 --- a/process/block/preprocess/transactionsV2.go +++ b/process/block/preprocess/transactionsV2.go @@ -379,7 +379,7 @@ func (txs *transactions) verifyTransaction( txs.accountTxsShards.Unlock() if err != nil { - isTxTargetedForDeletion := errors.Is(err, process.ErrLowerNonceInTransaction) || errors.Is(err, process.ErrInsufficientFee) + isTxTargetedForDeletion := errors.Is(err, process.ErrLowerNonceInTransaction) || errors.Is(err, process.ErrInsufficientFee) || errors.Is(err, process.ErrTransactionNotExecutable) if isTxTargetedForDeletion { strCache := process.ShardCacherIdentifier(senderShardID, receiverShardID) txs.txPool.RemoveData(txHash, strCache) diff --git a/process/errors.go b/process/errors.go index 0f4738a669d..3e338b5f295 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1179,6 +1179,9 @@ var ErrNilGuardedAccountHandler = errors.New("nil guarded account handler") // ErrOperationNotPermitted signals that operation is not permitted var ErrOperationNotPermitted = errors.New("operation in account not permitted") +// ErrTransactionNotExecutable signals that a transaction is not executable and gas will not be consumed +var ErrTransactionNotExecutable = errors.New("transaction is not executable and gas will not be consumed") + // ErrTransactionAndAccountGuardianMismatch signals a mismatch between the guardian on the account and the one on the transaction var ErrTransactionAndAccountGuardianMismatch = errors.New("mismatch between transaction guardian and configured account guardian") diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 6db67473585..151c7c004db 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -125,14 +125,12 @@ func (txProc *baseTxProcessor) checkTxValues( if check.IfNil(acntSnd) { return nil } - if acntSnd.GetNonce() < tx.Nonce { return process.ErrHigherNonceInTransaction } if acntSnd.GetNonce() > tx.Nonce { return process.ErrLowerNonceInTransaction } - err = txProc.economicsFee.CheckValidityTxValues(tx) if err != nil { return err @@ -167,6 +165,11 @@ func (txProc *baseTxProcessor) checkTxValues( return process.ErrInsufficientFunds } + err = txProc.verifyGuardian(tx, acntSnd) + if err != nil { + return err + } + return nil } @@ -225,7 +228,7 @@ func checkOperationAllowedToBypassGuardian(txData []byte) error { return nil } - return process.ErrOperationNotPermitted + return fmt.Errorf("%w, not allowed to bypass guardian", process.ErrTransactionNotExecutable) } func (txProc *baseTxProcessor) checkGuardedAccountUnguardedTxPermission(txData []byte, account state.UserAccountHandler) error { @@ -237,7 +240,7 @@ func (txProc *baseTxProcessor) checkGuardedAccountUnguardedTxPermission(txData [ // block non guarded setGuardian Txs if there is a pending guardian hasPendingGuardian := txProc.guardianChecker.HasPendingGuardian(account) if process.IsSetGuardianCall(txData) && hasPendingGuardian { - return process.ErrCannotReplaceGuardedAccountPendingGuardian + return fmt.Errorf("%w, %s", process.ErrTransactionNotExecutable, process.ErrCannotReplaceGuardedAccountPendingGuardian.Error()) } return nil @@ -256,16 +259,16 @@ func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, accou acc, ok := account.(vmcommon.UserAccountHandler) if !ok { - return process.ErrWrongTypeAssertion + return fmt.Errorf("%w, %s", process.ErrTransactionNotExecutable, process.ErrWrongTypeAssertion.Error()) } guardian, err := txProc.guardianChecker.GetActiveGuardian(acc) if err != nil { - return err + return fmt.Errorf("%w, %s", process.ErrTransactionNotExecutable, err.Error()) } if !bytes.Equal(guardian, tx.GuardianAddr) { - return process.ErrTransactionAndAccountGuardianMismatch + return fmt.Errorf("%w, %s", process.ErrTransactionNotExecutable, process.ErrTransactionAndAccountGuardianMismatch.Error()) } return nil diff --git a/process/transaction/metaProcess.go b/process/transaction/metaProcess.go index 549ab5122cb..7abdac5a44f 100644 --- a/process/transaction/metaProcess.go +++ b/process/transaction/metaProcess.go @@ -77,8 +77,8 @@ func NewMetaTxProcessor(args ArgsNewMetaTxProcessor) (*metaTxProcessor, error) { marshalizer: args.Marshalizer, scProcessor: args.ScProcessor, enableEpochsHandler: args.EnableEpochsHandler, - txVersionChecker: args.TxVersionChecker, - guardianChecker: args.GuardianChecker, + txVersionChecker: args.TxVersionChecker, + guardianChecker: args.GuardianChecker, } // backwards compatibility baseTxProcess.enableEpochsHandler.ResetPenalizedTooMuchGasFlag() @@ -103,11 +103,6 @@ func (txProc *metaTxProcessor) ProcessTransaction(tx *transaction.Transaction) ( return 0, err } - err = txProc.verifyGuardian(tx, acntSnd) - if err != nil { - return 0, err - } - txHash, err := core.CalculateHash(txProc.marshalizer, txProc.hasher, tx) if err != nil { return 0, err diff --git a/process/transaction/shardProcess.go b/process/transaction/shardProcess.go index 20e2a37fff9..d5ab8da7c5c 100644 --- a/process/transaction/shardProcess.go +++ b/process/transaction/shardProcess.go @@ -161,11 +161,6 @@ func (txProc *txProcessor) ProcessTransaction(tx *transaction.Transaction) (vmco return 0, err } - err = txProc.verifyGuardian(tx, acntSnd) - if err != nil { - return 0, err - } - txHash, err := core.CalculateHash(txProc.marshalizer, txProc.hasher, tx) if err != nil { return 0, err From 5e495972d49683b9a390cd420dcd541b7f6a2c06 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Thu, 12 Jan 2023 13:22:41 +0200 Subject: [PATCH 116/335] fix unit tests --- process/transaction/baseProcess_test.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/process/transaction/baseProcess_test.go b/process/transaction/baseProcess_test.go index 394927f8e75..ed0dfa0608f 100644 --- a/process/transaction/baseProcess_test.go +++ b/process/transaction/baseProcess_test.go @@ -1,7 +1,9 @@ package transaction import ( + "errors" "math/big" + "strings" "testing" "github.com/ElrondNetwork/elrond-go-core/data" @@ -19,15 +21,15 @@ import ( func Test_checkOperationAllowedToBypassGuardian(t *testing.T) { t.Run("operations not allowed to bypass", func(t *testing.T) { txData := []byte("#@!") - require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + require.True(t, errors.Is(checkOperationAllowedToBypassGuardian(txData), process.ErrTransactionNotExecutable)) txData = []byte(nil) - require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + require.True(t, errors.Is(checkOperationAllowedToBypassGuardian(txData), process.ErrTransactionNotExecutable)) txData = []byte("SomeOtherFunction@") - require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + require.True(t, errors.Is(checkOperationAllowedToBypassGuardian(txData), process.ErrTransactionNotExecutable)) }) t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { txData := []byte("setGuardian") - require.Equal(t, process.ErrOperationNotPermitted, checkOperationAllowedToBypassGuardian(txData)) + require.True(t, errors.Is(checkOperationAllowedToBypassGuardian(txData), process.ErrTransactionNotExecutable)) }) t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { txData := []byte("SetGuardian@") @@ -59,13 +61,13 @@ func Test_checkGuardedAccountUnguardedTxPermission(t *testing.T) { guardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, } - account:= &stateMock.UserAccountStub{} + account := &stateMock.UserAccountStub{} t.Run("nil txData", func(t *testing.T) { - require.Equal(t, process.ErrOperationNotPermitted, baseProc.checkGuardedAccountUnguardedTxPermission(nil, account)) + require.True(t, errors.Is(baseProc.checkGuardedAccountUnguardedTxPermission(nil, account), process.ErrTransactionNotExecutable)) }) t.Run("empty txData", func(t *testing.T) { - require.Equal(t, process.ErrOperationNotPermitted, baseProc.checkGuardedAccountUnguardedTxPermission([]byte(""), account)) + require.True(t, errors.Is(baseProc.checkGuardedAccountUnguardedTxPermission([]byte(""), account), process.ErrTransactionNotExecutable)) }) t.Run("nil account", func(t *testing.T) { txData := []byte("SetGuardian@") @@ -73,7 +75,7 @@ func Test_checkGuardedAccountUnguardedTxPermission(t *testing.T) { }) t.Run("setGuardian data field (non builtin call) not allowed", func(t *testing.T) { txData := []byte("setGuardian") - require.Equal(t, process.ErrOperationNotPermitted, baseProc.checkGuardedAccountUnguardedTxPermission(txData, account)) + require.True(t, errors.Is(baseProc.checkGuardedAccountUnguardedTxPermission(txData, account), process.ErrTransactionNotExecutable)) }) t.Run("set guardian builtin call allowed to bypass", func(t *testing.T) { txData := []byte("SetGuardian@") @@ -81,12 +83,15 @@ func Test_checkGuardedAccountUnguardedTxPermission(t *testing.T) { }) t.Run("set guardian builtin call with pending guardian not allowed", func(t *testing.T) { txData := []byte("SetGuardian@") - baseProc := baseProc + baseProc := baseProc baseProc.guardianChecker = &guardianMocks.GuardedAccountHandlerStub{ HasPendingGuardianCalled: func(uah state.UserAccountHandler) bool { return true }, } - require.Equal(t, process.ErrCannotReplaceGuardedAccountPendingGuardian, baseProc.checkGuardedAccountUnguardedTxPermission(txData, account)) + + err := baseProc.checkGuardedAccountUnguardedTxPermission(txData, account) + require.True(t, errors.Is(err, process.ErrTransactionNotExecutable)) + require.True(t, strings.Contains(err.Error(), process.ErrCannotReplaceGuardedAccountPendingGuardian.Error())) }) } From 6be0c6e4af3f1d1d0b48a8adf833a0f82ddb1be7 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 12 Jan 2023 17:09:43 +0200 Subject: [PATCH 117/335] - added semi-integration tests for freeze accounts feature --- integrationTests/vm/testInitializer.go | 251 ++++++++---- .../vm/txsFee/freezeAccounts_test.go | 376 ++++++++++++++++++ 2 files changed, 539 insertions(+), 88 deletions(-) create mode 100644 integrationTests/vm/txsFee/freezeAccounts_test.go diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index d41bb403bf6..020a19f705a 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -13,6 +13,7 @@ import ( "github.com/ElrondNetwork/elrond-go-core/core" "github.com/ElrondNetwork/elrond-go-core/core/check" "github.com/ElrondNetwork/elrond-go-core/core/pubkeyConverter" + "github.com/ElrondNetwork/elrond-go-core/core/versioning" "github.com/ElrondNetwork/elrond-go-core/data" "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/data/scheduled" @@ -37,6 +38,7 @@ import ( "github.com/ElrondNetwork/elrond-go/process/economics" "github.com/ElrondNetwork/elrond-go/process/factory/metachain" "github.com/ElrondNetwork/elrond-go/process/factory/shard" + "github.com/ElrondNetwork/elrond-go/process/guardian" "github.com/ElrondNetwork/elrond-go/process/smartContract" "github.com/ElrondNetwork/elrond-go/process/smartContract/builtInFunctions" "github.com/ElrondNetwork/elrond-go/process/smartContract/hooks" @@ -54,7 +56,6 @@ import ( dataRetrieverMock "github.com/ElrondNetwork/elrond-go/testscommon/dataRetriever" "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/integrationtests" "github.com/ElrondNetwork/elrond-go/testscommon/shardingMocks" storageStubs "github.com/ElrondNetwork/elrond-go/testscommon/storage" @@ -68,6 +69,10 @@ import ( "github.com/stretchr/testify/require" ) +// EpochGuardianDelay is the test constant for the delay in epochs for the guardian feature +const EpochGuardianDelay = uint32(2) +const minTransactionVersion = 1 + var dnsAddr = []byte{0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 137, 17, 46, 56, 127, 47, 62, 172, 4, 126, 190, 242, 221, 230, 209, 243, 105, 104, 242, 66, 49, 49} // TODO: Merge test utilities from this file with the ones from "arwen/utils.go" @@ -96,22 +101,23 @@ type VMTestAccount struct { // VMTestContext - type VMTestContext struct { - ChainHandler *testscommon.ChainHandlerStub - TxProcessor process.TransactionProcessor - ScProcessor *smartContract.TestScProcessor - Accounts state.AccountsAdapter - BlockchainHook vmcommon.BlockchainHook - VMContainer process.VirtualMachinesContainer - TxFeeHandler process.TransactionFeeHandler - ShardCoordinator sharding.Coordinator - ScForwarder process.IntermediateTransactionHandler - EconomicsData process.EconomicsDataHandler - Marshalizer marshal.Marshalizer - GasSchedule core.GasScheduleNotifier - VMConfiguration *config.VirtualMachineConfig - EpochNotifier process.EpochNotifier - EnableEpochsHandler common.EnableEpochsHandler - SCQueryService *smartContract.SCQueryService + ChainHandler *testscommon.ChainHandlerStub + TxProcessor process.TransactionProcessor + ScProcessor *smartContract.TestScProcessor + Accounts state.AccountsAdapter + BlockchainHook vmcommon.BlockchainHook + VMContainer process.VirtualMachinesContainer + TxFeeHandler process.TransactionFeeHandler + ShardCoordinator sharding.Coordinator + ScForwarder process.IntermediateTransactionHandler + EconomicsData process.EconomicsDataHandler + Marshalizer marshal.Marshalizer + GasSchedule core.GasScheduleNotifier + VMConfiguration *config.VirtualMachineConfig + EpochNotifier process.EpochNotifier + EnableEpochsHandler common.EnableEpochsHandler + SCQueryService *smartContract.SCQueryService + GuardedAccountsHandler process.GuardedAccountHandler Alice VMTestAccount Bob VMTestAccount @@ -145,10 +151,10 @@ func (vmTestContext *VMTestContext) GetGasRemaining() uint64 { } // GetIntermediateTransactions - -func (vmTestContext *VMTestContext) GetIntermediateTransactions(t *testing.T) []data.TransactionHandler { +func (vmTestContext *VMTestContext) GetIntermediateTransactions(tb testing.TB) []data.TransactionHandler { scForwarder := vmTestContext.ScForwarder mockIntermediate, ok := scForwarder.(*mock.IntermediateTransactionHandlerMock) - require.True(t, ok) + require.True(tb, ok) return mockIntermediate.GetIntermediateTransactions() } @@ -337,7 +343,7 @@ func createEconomicsData(enableEpochsConfig config.EnableEpochs) (process.Econom EpochNotifier: realEpochNotifier, EnableEpochsHandler: enableEpochsHandler, BuiltInFunctionsCostHandler: builtInCost, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + TxVersionChecker: versioning.NewTxVersionChecker(minTransactionVersion), } return economics.NewEconomicsData(argsNewEconomicsData) @@ -432,6 +438,11 @@ func CreateTxProcessorWithOneSCExecutorMockVM( } scProcessor, _ := smartContract.NewSmartContractProcessor(argsNewSCProcessor) + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, genericEpochNotifier, EpochGuardianDelay) + if err != nil { + return nil, err + } + argsNewTxProcessor := transaction.ArgsNewTxProcessor{ Accounts: accnts, Hasher: integrationtests.TestHasher, @@ -448,8 +459,8 @@ func CreateTxProcessorWithOneSCExecutorMockVM( ArgsParser: smartContract.NewArgumentParser(), ScrForwarder: &mock.IntermediateTransactionHandlerMock{}, EnableEpochsHandler: enableEpochsHandler, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + TxVersionChecker: versioning.NewTxVersionChecker(minTransactionVersion), + GuardianChecker: guardedAccountHandler, } return transaction.NewTxProcessor(argsNewTxProcessor) @@ -494,6 +505,7 @@ func CreateVMAndBlockchainHookAndDataPool( epochNotifierInstance process.EpochNotifier, enableEpochsHandler common.EnableEpochsHandler, chainHandler data.ChainHandler, + guardedAccountHandler vmcommon.GuardedAccountHandler, ) (process.VirtualMachinesContainer, *hooks.BlockChainHookImpl, dataRetriever.PoolsHolder) { if check.IfNil(gasSchedule) || gasSchedule.LatestGasSchedule() == nil { testGasSchedule := arwenConfig.MakeGasMapForTests() @@ -512,7 +524,7 @@ func CreateVMAndBlockchainHookAndDataPool( EpochNotifier: epochNotifierInstance, EnableEpochsHandler: enableEpochsHandler, MaxNumNodesInTransferRole: 100, - GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, + GuardedAccountHandler: guardedAccountHandler, } argsBuiltIn.AutomaticCrawlerAddresses = integrationTests.GenerateOneAddressPerShard(argsBuiltIn.ShardCoordinator) builtInFuncFactory, _ := builtInFunctions.CreateBuiltInFunctionsFactory(argsBuiltIn) @@ -584,6 +596,12 @@ func CreateVMAndBlockchainHookMeta( gasSchedule = mock.NewGasScheduleNotifierMock(testGasSchedule) } + var err error + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, globalEpochNotifier, EpochGuardianDelay) + if err != nil { + panic(err) + } + enableEpochsHandler, _ := enablers.NewEnableEpochsHandler(enableEpochsConfig, globalEpochNotifier) argsBuiltIn := builtInFunctions.ArgsCreateBuiltInFunctionContainer{ GasSchedule: gasSchedule, @@ -596,7 +614,7 @@ func CreateVMAndBlockchainHookMeta( EpochNotifier: globalEpochNotifier, EnableEpochsHandler: enableEpochsHandler, MaxNumNodesInTransferRole: 100, - GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, + GuardedAccountHandler: guardedAccountHandler, } argsBuiltIn.AutomaticCrawlerAddresses = integrationTests.GenerateOneAddressPerShard(argsBuiltIn.ShardCoordinator) builtInFuncFactory, _ := builtInFunctions.CreateBuiltInFunctionsFactory(argsBuiltIn) @@ -740,6 +758,7 @@ func CreateTxProcessorWithOneSCExecutorWithVMs( arwenChangeLocker common.Locker, poolsHolder dataRetriever.PoolsHolder, epochNotifierInstance process.EpochNotifier, + guardianChecker process.GuardianChecker, ) (*ResultsCreateTxProcessor, error) { if check.IfNil(poolsHolder) { poolsHolder = dataRetrieverMock.NewPoolsHolderMock() @@ -821,8 +840,8 @@ func CreateTxProcessorWithOneSCExecutorWithVMs( ArgsParser: smartContract.NewArgumentParser(), ScrForwarder: intermediateTxHandler, EnableEpochsHandler: enableEpochsHandler, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - GuardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + TxVersionChecker: versioning.NewTxVersionChecker(minTransactionVersion), + GuardianChecker: guardianChecker, } txProcessor, err := transaction.NewTxProcessor(argsNewTxProcessor) if err != nil { @@ -993,6 +1012,12 @@ func CreatePreparedTxProcessorAndAccountsWithVMs( enableEpochsHandler, _ := enablers.NewEnableEpochsHandler(enableEpochsConfig, epochNotifierInstance) chainHandler := &testscommon.ChainHandlerStub{} + var err error + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, epochNotifierInstance, EpochGuardianDelay) + if err != nil { + return nil, err + } + vmContainer, blockchainHook, pool := CreateVMAndBlockchainHookAndDataPool( accounts, nil, @@ -1002,6 +1027,7 @@ func CreatePreparedTxProcessorAndAccountsWithVMs( epochNotifierInstance, enableEpochsHandler, chainHandler, + guardedAccountHandler, ) res, err := CreateTxProcessorWithOneSCExecutorWithVMs( accounts, @@ -1013,22 +1039,24 @@ func CreatePreparedTxProcessorAndAccountsWithVMs( arwenChangeLocker, pool, epochNotifierInstance, + guardedAccountHandler, ) if err != nil { return nil, err } return &VMTestContext{ - TxProcessor: res.TxProc, - ScProcessor: res.SCProc, - Accounts: accounts, - BlockchainHook: blockchainHook, - VMContainer: vmContainer, - TxFeeHandler: feeAccumulator, - ScForwarder: res.IntermediateTxProc, - EpochNotifier: epochNotifierInstance, - EnableEpochsHandler: enableEpochsHandler, - ChainHandler: chainHandler, + TxProcessor: res.TxProc, + ScProcessor: res.SCProc, + Accounts: accounts, + BlockchainHook: blockchainHook, + VMContainer: vmContainer, + TxFeeHandler: feeAccumulator, + ScForwarder: res.IntermediateTxProc, + EpochNotifier: epochNotifierInstance, + EnableEpochsHandler: enableEpochsHandler, + ChainHandler: chainHandler, + GuardedAccountsHandler: guardedAccountHandler, }, nil } @@ -1086,6 +1114,12 @@ func CreatePreparedTxProcessorWithVMsWithShardCoordinatorDBAndGas( enableEpochsHandler, _ := enablers.NewEnableEpochsHandler(enableEpochsConfig, epochNotifierInstance) chainHandler := &testscommon.ChainHandlerStub{} + var err error + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, epochNotifierInstance, EpochGuardianDelay) + if err != nil { + return nil, err + } + vmContainer, blockchainHook, pool := CreateVMAndBlockchainHookAndDataPool( accounts, gasScheduleNotifier, @@ -1095,6 +1129,7 @@ func CreatePreparedTxProcessorWithVMsWithShardCoordinatorDBAndGas( epochNotifierInstance, enableEpochsHandler, chainHandler, + guardedAccountHandler, ) res, err := CreateTxProcessorWithOneSCExecutorWithVMs( accounts, @@ -1106,27 +1141,30 @@ func CreatePreparedTxProcessorWithVMsWithShardCoordinatorDBAndGas( arwenChangeLocker, pool, epochNotifierInstance, + guardedAccountHandler, ) if err != nil { return nil, err } return &VMTestContext{ - TxProcessor: res.TxProc, - ScProcessor: res.SCProc, - Accounts: accounts, - BlockchainHook: blockchainHook, - VMContainer: vmContainer, - TxFeeHandler: feeAccumulator, - ScForwarder: res.IntermediateTxProc, - ShardCoordinator: shardCoordinator, - EconomicsData: res.EconomicsHandler, - TxCostHandler: res.CostHandler, - TxsLogsProcessor: res.TxLogProc, - GasSchedule: gasScheduleNotifier, - EpochNotifier: epochNotifierInstance, - EnableEpochsHandler: enableEpochsHandler, - ChainHandler: chainHandler, + TxProcessor: res.TxProc, + ScProcessor: res.SCProc, + Accounts: accounts, + BlockchainHook: blockchainHook, + VMContainer: vmContainer, + TxFeeHandler: feeAccumulator, + ScForwarder: res.IntermediateTxProc, + ShardCoordinator: shardCoordinator, + EconomicsData: res.EconomicsHandler, + TxCostHandler: res.CostHandler, + TxsLogsProcessor: res.TxLogProc, + GasSchedule: gasScheduleNotifier, + EpochNotifier: epochNotifierInstance, + EnableEpochsHandler: enableEpochsHandler, + ChainHandler: chainHandler, + Marshalizer: integrationtests.TestMarshalizer, + GuardedAccountsHandler: guardedAccountHandler, }, nil } @@ -1148,6 +1186,13 @@ func CreateTxProcessorArwenVMWithGasSchedule( epochNotifierInstance := forking.NewGenericEpochNotifier() enableEpochsHandler, _ := enablers.NewEnableEpochsHandler(enableEpochsConfig, epochNotifierInstance) chainHandler := &testscommon.ChainHandlerStub{} + + var err error + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, epochNotifierInstance, EpochGuardianDelay) + if err != nil { + return nil, err + } + vmContainer, blockchainHook, pool := CreateVMAndBlockchainHookAndDataPool( accounts, gasScheduleNotifier, @@ -1157,6 +1202,7 @@ func CreateTxProcessorArwenVMWithGasSchedule( epochNotifierInstance, enableEpochsHandler, chainHandler, + guardedAccountHandler, ) res, err := CreateTxProcessorWithOneSCExecutorWithVMs( accounts, @@ -1168,23 +1214,25 @@ func CreateTxProcessorArwenVMWithGasSchedule( arwenChangeLocker, pool, epochNotifierInstance, + guardedAccountHandler, ) if err != nil { return nil, err } return &VMTestContext{ - TxProcessor: res.TxProc, - ScProcessor: res.SCProc, - Accounts: accounts, - BlockchainHook: blockchainHook, - VMContainer: vmContainer, - TxFeeHandler: feeAccumulator, - ScForwarder: res.IntermediateTxProc, - GasSchedule: gasScheduleNotifier, - EpochNotifier: epochNotifierInstance, - EnableEpochsHandler: enableEpochsHandler, - ChainHandler: chainHandler, + TxProcessor: res.TxProc, + ScProcessor: res.SCProc, + Accounts: accounts, + BlockchainHook: blockchainHook, + VMContainer: vmContainer, + TxFeeHandler: feeAccumulator, + ScForwarder: res.IntermediateTxProc, + GasSchedule: gasScheduleNotifier, + EpochNotifier: epochNotifierInstance, + EnableEpochsHandler: enableEpochsHandler, + ChainHandler: chainHandler, + GuardedAccountsHandler: guardedAccountHandler, }, nil } @@ -1201,6 +1249,13 @@ func CreateTxProcessorArwenWithVMConfig( epochNotifierInstance := forking.NewGenericEpochNotifier() enableEpochsHandler, _ := enablers.NewEnableEpochsHandler(enableEpochsConfig, epochNotifierInstance) chainHandler := &testscommon.ChainHandlerStub{} + + var err error + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, epochNotifierInstance, EpochGuardianDelay) + if err != nil { + return nil, err + } + vmContainer, blockchainHook, pool := CreateVMAndBlockchainHookAndDataPool( accounts, gasScheduleNotifier, @@ -1210,6 +1265,7 @@ func CreateTxProcessorArwenWithVMConfig( epochNotifierInstance, enableEpochsHandler, chainHandler, + guardedAccountHandler, ) res, err := CreateTxProcessorWithOneSCExecutorWithVMs( accounts, @@ -1221,24 +1277,26 @@ func CreateTxProcessorArwenWithVMConfig( arwenChangeLocker, pool, epochNotifierInstance, + guardedAccountHandler, ) if err != nil { return nil, err } return &VMTestContext{ - TxProcessor: res.TxProc, - ScProcessor: res.SCProc, - Accounts: accounts, - BlockchainHook: blockchainHook, - VMContainer: vmContainer, - TxFeeHandler: feeAccumulator, - ScForwarder: res.IntermediateTxProc, - GasSchedule: gasScheduleNotifier, - VMConfiguration: vmConfig, - EpochNotifier: epochNotifierInstance, - EnableEpochsHandler: enableEpochsHandler, - ChainHandler: chainHandler, + TxProcessor: res.TxProc, + ScProcessor: res.SCProc, + Accounts: accounts, + BlockchainHook: blockchainHook, + VMContainer: vmContainer, + TxFeeHandler: feeAccumulator, + ScForwarder: res.IntermediateTxProc, + GasSchedule: gasScheduleNotifier, + VMConfiguration: vmConfig, + EpochNotifier: epochNotifierInstance, + EnableEpochsHandler: enableEpochsHandler, + ChainHandler: chainHandler, + GuardedAccountsHandler: guardedAccountHandler, }, nil } @@ -1365,6 +1423,12 @@ func GetVmOutput(gasSchedule map[string]map[string]uint64, accnts state.Accounts gasScheduleNotifier := mock.NewGasScheduleNotifierMock(gasSchedule) epochNotifierInstance := forking.NewGenericEpochNotifier() enableEpochsHandler, _ := enablers.NewEnableEpochsHandler(config.EnableEpochs{}, epochNotifierInstance) + + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, epochNotifierInstance, EpochGuardianDelay) + if err != nil { + panic(err) + } + vmContainer, blockChainHook, _ := CreateVMAndBlockchainHookAndDataPool( accnts, gasScheduleNotifier, @@ -1374,6 +1438,7 @@ func GetVmOutput(gasSchedule map[string]map[string]uint64, accnts state.Accounts epochNotifierInstance, enableEpochsHandler, &testscommon.ChainHandlerStub{}, + guardedAccountHandler, ) defer func() { _ = vmContainer.Close() @@ -1423,6 +1488,7 @@ func ComputeGasLimit(gasSchedule map[string]map[string]uint64, testContext *VMTe testContext.EpochNotifier, testContext.EnableEpochsHandler, &testscommon.ChainHandlerStub{}, + testContext.GuardedAccountsHandler, ) defer func() { _ = vmContainer.Close() @@ -1520,6 +1586,12 @@ func CreatePreparedTxProcessorWithVMsMultiShard(selfShardID uint32, enableEpochs epochNotifierInstance := forking.NewGenericEpochNotifier() enableEpochsHandler, _ := enablers.NewEnableEpochsHandler(enableEpochsConfig, epochNotifierInstance) chainHandler := &testscommon.ChainHandlerStub{} + + guardedAccountHandler, err := guardian.NewGuardedAccount(integrationtests.TestMarshalizer, epochNotifierInstance, EpochGuardianDelay) + if err != nil { + return nil, err + } + if selfShardID == core.MetachainShardId { vmContainer, blockchainHook = CreateVMAndBlockchainHookMeta(accounts, nil, shardCoordinator, enableEpochsConfig) } else { @@ -1533,6 +1605,7 @@ func CreatePreparedTxProcessorWithVMsMultiShard(selfShardID uint32, enableEpochs epochNotifierInstance, enableEpochsHandler, chainHandler, + guardedAccountHandler, ) } @@ -1546,26 +1619,28 @@ func CreatePreparedTxProcessorWithVMsMultiShard(selfShardID uint32, enableEpochs arwenChangeLocker, nil, epochNotifierInstance, + guardedAccountHandler, ) if err != nil { return nil, err } return &VMTestContext{ - TxProcessor: res.TxProc, - ScProcessor: res.SCProc, - Accounts: accounts, - BlockchainHook: blockchainHook, - VMContainer: vmContainer, - TxFeeHandler: feeAccumulator, - ShardCoordinator: shardCoordinator, - ScForwarder: res.IntermediateTxProc, - EconomicsData: res.EconomicsHandler, - Marshalizer: integrationtests.TestMarshalizer, - TxsLogsProcessor: res.TxLogProc, - EpochNotifier: epochNotifierInstance, - EnableEpochsHandler: enableEpochsHandler, - ChainHandler: chainHandler, + TxProcessor: res.TxProc, + ScProcessor: res.SCProc, + Accounts: accounts, + BlockchainHook: blockchainHook, + VMContainer: vmContainer, + TxFeeHandler: feeAccumulator, + ShardCoordinator: shardCoordinator, + ScForwarder: res.IntermediateTxProc, + EconomicsData: res.EconomicsHandler, + Marshalizer: integrationtests.TestMarshalizer, + TxsLogsProcessor: res.TxLogProc, + EpochNotifier: epochNotifierInstance, + EnableEpochsHandler: enableEpochsHandler, + ChainHandler: chainHandler, + GuardedAccountsHandler: guardedAccountHandler, }, nil } diff --git a/integrationTests/vm/txsFee/freezeAccounts_test.go b/integrationTests/vm/txsFee/freezeAccounts_test.go new file mode 100644 index 00000000000..0b56c70f037 --- /dev/null +++ b/integrationTests/vm/txsFee/freezeAccounts_test.go @@ -0,0 +1,376 @@ +//go:build !race +// +build !race + +// TODO remove build condition above to allow -race -short, after Arwen fix + +package txsFee + +import ( + "encoding/hex" + "math/big" + "sync" + "testing" + + "github.com/ElrondNetwork/elrond-go-core/core" + "github.com/ElrondNetwork/elrond-go-core/data/block" + "github.com/ElrondNetwork/elrond-go-core/data/guardians" + "github.com/ElrondNetwork/elrond-go-core/data/transaction" + "github.com/ElrondNetwork/elrond-go/common/forking" + "github.com/ElrondNetwork/elrond-go/config" + "github.com/ElrondNetwork/elrond-go/integrationTests/mock" + "github.com/ElrondNetwork/elrond-go/integrationTests/vm" + "github.com/ElrondNetwork/elrond-go/process" + "github.com/ElrondNetwork/elrond-go/process/guardian" + "github.com/ElrondNetwork/elrond-go/state" + "github.com/ElrondNetwork/elrond-go/testscommon/integrationtests" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const instantSetGuardian = true +const delayedSetGuardian = false + +func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { + unreachableEpoch := uint32(999999) + db := integrationtests.CreateStorer(tb.TempDir()) + gasScheduleDir := "../../../cmd/node/config/gasSchedules" + + cfg := config.GasScheduleByEpochs{ + StartEpoch: 0, + FileName: "gasScheduleV6.toml", + } + + argsGasScheduleNotifier := forking.ArgsNewGasScheduleNotifier{ + GasScheduleConfig: config.GasScheduleConfig{ + GasScheduleByEpochs: []config.GasScheduleByEpochs{cfg}, + }, + ConfigDir: gasScheduleDir, + EpochNotifier: forking.NewGenericEpochNotifier(), + ArwenChangeLocker: &sync.RWMutex{}, + } + gasScheduleNotifier, err := forking.NewGasScheduleNotifier(argsGasScheduleNotifier) + require.Nil(tb, err) + + testContext, err := vm.CreatePreparedTxProcessorWithVMsWithShardCoordinatorDBAndGas( + config.EnableEpochs{ + GovernanceEnableEpoch: unreachableEpoch, + WaitingListFixEnableEpoch: unreachableEpoch, + SetSenderInEeiOutputTransferEnableEpoch: unreachableEpoch, + RefactorPeersMiniBlocksEnableEpoch: unreachableEpoch, + GuardAccountFeatureEnableEpoch: 0, + }, + mock.NewMultiShardsCoordinatorMock(2), + db, + gasScheduleNotifier, + ) + require.Nil(tb, err) + + return testContext +} + +func mintAddress(tb testing.TB, testContext *vm.VMTestContext, address []byte, value *big.Int) { + accnt, err := testContext.Accounts.LoadAccount(address) + require.Nil(tb, err) + + userAccnt := accnt.(vmcommon.UserAccountHandler) + err = userAccnt.AddToBalance(value) + require.Nil(tb, err) + + err = testContext.Accounts.SaveAccount(accnt) + require.Nil(tb, err) + + _, err = testContext.Accounts.Commit() + require.Nil(tb, err) +} + +func getNonce(testContext *vm.VMTestContext, address []byte) uint64 { + accnt, _ := testContext.Accounts.LoadAccount(address) + + return accnt.GetNonce() +} + +func getGuardiansData(tb testing.TB, testContext *vm.VMTestContext, address []byte) (active *guardians.Guardian, pending *guardians.Guardian, err error) { + accnt, err := testContext.Accounts.GetExistingAccount(address) + require.Nil(tb, err) + + userAccnt := accnt.(state.UserAccountHandler) + guardedAccount, err := guardian.NewGuardedAccount( + testContext.Marshalizer, + testContext.EpochNotifier, + vm.EpochGuardianDelay) + require.Nil(tb, err) + + return guardedAccount.GetConfiguredGuardians(userAccnt) +} + +func setGuardian(testContext *vm.VMTestContext, userAddress []byte, guardianAddress []byte, uuid []byte, isInstantSet bool) (vmcommon.ReturnCode, error) { + gasPrice := uint64(10) + gasLimit := uint64(250000 + 1000) + + tx := vm.CreateTransaction( + getNonce(testContext, userAddress), + big.NewInt(0), + userAddress, + userAddress, + gasPrice, + gasLimit, + []byte("SetGuardian@"+hex.EncodeToString(guardianAddress)+"@"+hex.EncodeToString(uuid))) + + if isInstantSet { + tx.GuardianAddr = guardianAddress + } + + return testContext.TxProcessor.ProcessTransaction(tx) +} + +func guardAccount(testContext *vm.VMTestContext, userAddress []byte) (vmcommon.ReturnCode, error) { + gasPrice := uint64(10) + gasLimit := uint64(400000 + 1000) + + tx := vm.CreateTransaction( + getNonce(testContext, userAddress), + big.NewInt(0), + userAddress, + userAddress, + gasPrice, + gasLimit, + []byte("GuardAccount"), + ) + return testContext.TxProcessor.ProcessTransaction(tx) +} + +func transferFunds( + testContext *vm.VMTestContext, + senderAddress []byte, + transferValue *big.Int, + receiverAddress []byte, +) error { + gasPrice := uint64(10) + gasLimit := uint64(1000) + + tx := vm.CreateTransaction( + getNonce(testContext, senderAddress), + transferValue, + senderAddress, + receiverAddress, + gasPrice, + gasLimit, + make([]byte, 0)) + + _, err := testContext.TxProcessor.ProcessTransaction(tx) + return err +} + +func transferFundsWithGuardian( + testContext *vm.VMTestContext, + senderAddress []byte, + transferValue *big.Int, + receiverAddress []byte, + guardianAddress []byte, +) error { + gasPrice := uint64(10) + gasLimit := uint64(51000) + + tx := vm.CreateTransaction( + getNonce(testContext, senderAddress), + transferValue, + senderAddress, + receiverAddress, + gasPrice, + gasLimit, + make([]byte, 0)) + tx.Version = core.InitialVersionOfTransaction + 1 + tx.Options = tx.Options | transaction.MaskGuardedTransaction + tx.GuardianAddr = guardianAddress + + _, err := testContext.TxProcessor.ProcessTransaction(tx) + return err +} + +func getBalance(testContext *vm.VMTestContext, address []byte) *big.Int { + accnt, _ := testContext.Accounts.LoadAccount(address) + userAccnt := accnt.(vmcommon.UserAccountHandler) + + return userAccnt.GetBalance() +} + +func testNoGuardianIsSet(tb testing.TB, testContext *vm.VMTestContext, address []byte) { + active, pending, err := getGuardiansData(tb, testContext, address) + require.Nil(tb, err) + assert.Nil(tb, active) + assert.Nil(tb, pending) +} + +func testActiveGuardian( + tb testing.TB, + testContext *vm.VMTestContext, + address []byte, + shouldBeNil bool, + expectedAddress []byte, + expectedUUID []byte, +) { + active, _, err := getGuardiansData(tb, testContext, address) + require.Nil(tb, err) + + testGuardianData(tb, active, shouldBeNil, expectedAddress, expectedUUID) +} + +func testGuardianData( + tb testing.TB, + guardian *guardians.Guardian, + shouldBeNil bool, + expectedAddress []byte, + expectedUUID []byte, +) { + if shouldBeNil { + require.Nil(tb, guardian) + return + } + + require.NotNil(tb, guardian) + assert.Equal(tb, expectedAddress, guardian.Address) + assert.Equal(tb, expectedUUID, guardian.ServiceUID) +} + +func testPendingGuardian( + tb testing.TB, + testContext *vm.VMTestContext, + address []byte, + shouldBeNil bool, + expectedAddress []byte, + expectedUUID []byte, +) { + _, pending, err := getGuardiansData(tb, testContext, address) + require.Nil(tb, err) + + testGuardianData(tb, pending, shouldBeNil, expectedAddress, expectedUUID) +} + +func TestFreezeAccountsShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *testing.T) { + testContext := prepareTestContextForFreezeAccounts(t) + + defer testContext.Close() + + uuid := []byte("uuid") + initialMint := big.NewInt(1000000000000000000) + userAddress := []byte("user-123456789012345678901234567") + guardianAddress := []byte("guardian-12345678901234567890123") + mintAddress(t, testContext, userAddress, initialMint) + + testNoGuardianIsSet(t, testContext, userAddress) + + returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid, instantSetGuardian) + assert.Equal(t, process.ErrFailedTransaction, err) + assert.Equal(t, vmcommon.UserError, returnCode) + + testNoGuardianIsSet(t, testContext, userAddress) +} + +func TestFreezeAccountsShouldSetGuardianOnANotProtectedAccount(t *testing.T) { + testContext := prepareTestContextForFreezeAccounts(t) + + defer testContext.Close() + + uuid := []byte("uuid") + initialMint := big.NewInt(1000000000000000000) + userAddress := []byte("user-123456789012345678901234567") + guardianAddress := []byte("guardian-12345678901234567890123") + mintAddress(t, testContext, userAddress, initialMint) + + testNoGuardianIsSet(t, testContext, userAddress) + + returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid, delayedSetGuardian) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + + testActiveGuardian(t, testContext, userAddress, true, nil, nil) + testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid) + + // can not activate guardian now + returnCode, err = guardAccount(testContext, userAddress) + assert.Equal(t, process.ErrFailedTransaction, err) + assert.Equal(t, vmcommon.UserError, returnCode) + + hdr := &block.Header{ + Epoch: vm.EpochGuardianDelay, + } + testContext.EpochNotifier.CheckEpoch(hdr) + + testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid) + testPendingGuardian(t, testContext, userAddress, true, nil, nil) + + // can activate guardian now + returnCode, err = guardAccount(testContext, userAddress) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) +} + +func TestFreezeAccountsSendingFundsWhileProtectedAndNotProtected(t *testing.T) { + testContext := prepareTestContextForFreezeAccounts(t) + + defer testContext.Close() + + uuid := []byte("uuid") + transferValue := int64(2000000) + initialMint := big.NewInt(1000000000000000000) + userAddress := []byte("user-123456789012345678901234567") + receiverAddress := []byte("recv-123456789012345678901234567") + guardianAddress := []byte("guardian-12345678901234567890123") + wrongGuardianAddress := []byte("wrong-guardian-12345678901234523") + mintAddress(t, testContext, userAddress, initialMint) + + testNoGuardianIsSet(t, testContext, userAddress) + + // userAddress can send funds while not protected + err := transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + require.Nil(t, err) + require.Equal(t, big.NewInt(transferValue), getBalance(testContext, receiverAddress)) + + // userAddress can send funds while it just added a guardian + returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid, delayedSetGuardian) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + + testActiveGuardian(t, testContext, userAddress, true, nil, nil) + testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid) + + err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + require.Nil(t, err) + require.Equal(t, big.NewInt(transferValue*2), getBalance(testContext, receiverAddress)) + + // delay epoch pasts, the pending guardian is now active (but not activated), userAddress can send funds + hdr := &block.Header{ + Epoch: vm.EpochGuardianDelay, + } + testContext.EpochNotifier.CheckEpoch(hdr) + + testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid) + testPendingGuardian(t, testContext, userAddress, true, nil, nil) + + err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + require.Nil(t, err) + require.Equal(t, big.NewInt(transferValue*3), getBalance(testContext, receiverAddress)) + + // userAddress can not send funds while protected without setting the guardian address + returnCode, err = guardAccount(testContext, userAddress) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + + testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid) + testPendingGuardian(t, testContext, userAddress, true, nil, nil) + + err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + require.Equal(t, process.ErrOperationNotPermitted, err) + require.Equal(t, big.NewInt(transferValue*3), getBalance(testContext, receiverAddress)) + + // userAddress can send funds while protected with the guardian address + err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + require.Nil(t, err) + require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) + + // userAddress can not send funds while protected with a wrong guardian address + err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, wrongGuardianAddress) + require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err) + require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) +} From c6e9235b9ecc11aa98ac669de87b9745c150bd64 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 12 Jan 2023 17:14:18 +0200 Subject: [PATCH 118/335] - fixed tests --- integrationTests/vm/txsFee/freezeAccounts_test.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/txsFee/freezeAccounts_test.go b/integrationTests/vm/txsFee/freezeAccounts_test.go index 0b56c70f037..3a82e31adbd 100644 --- a/integrationTests/vm/txsFee/freezeAccounts_test.go +++ b/integrationTests/vm/txsFee/freezeAccounts_test.go @@ -361,7 +361,8 @@ func TestFreezeAccountsSendingFundsWhileProtectedAndNotProtected(t *testing.T) { testPendingGuardian(t, testContext, userAddress, true, nil, nil) err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) - require.Equal(t, process.ErrOperationNotPermitted, err) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Contains(t, err.Error(), "not allowed to bypass guardian") require.Equal(t, big.NewInt(transferValue*3), getBalance(testContext, receiverAddress)) // userAddress can send funds while protected with the guardian address @@ -371,6 +372,13 @@ func TestFreezeAccountsSendingFundsWhileProtectedAndNotProtected(t *testing.T) { // userAddress can not send funds while protected with a wrong guardian address err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, wrongGuardianAddress) - require.Equal(t, process.ErrTransactionAndAccountGuardianMismatch, err) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Contains(t, err.Error(), "mismatch between transaction guardian and configured account guardian") + require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) + + // userAddress can not send funds while protected with an empty guardian address + err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, nil) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Contains(t, err.Error(), "mismatch between transaction guardian and configured account guardian") require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) } From c47840e9f9966e980115f5d8d14125b562a91705 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 13 Jan 2023 14:03:18 +0200 Subject: [PATCH 119/335] added missing mut rlock on epoch --- process/guardian/guardedAccount.go | 4 +++ process/guardian/guardedAccount_test.go | 45 +++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index 1ea1ddc5385..b58c45c6dfb 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -129,11 +129,13 @@ func (agc *guardedAccount) SetGuardian(uah vmcommon.UserAccountHandler, guardian return agc.instantSetGuardian(stateUserAccount, guardianAddress, txGuardianAddress, guardianServiceUID) } + agc.mutEpoch.RLock() guardian := &guardians.Guardian{ Address: guardianAddress, ActivationEpoch: agc.currentEpoch + agc.guardianActivationEpochsDelay, ServiceUID: guardianServiceUID, } + agc.mutEpoch.RUnlock() return agc.setAccountGuardian(stateUserAccount, guardian) } @@ -195,11 +197,13 @@ func (agc *guardedAccount) instantSetGuardian( } // immediately set the new guardian + agc.mutEpoch.RLock() guardian := &guardians.Guardian{ Address: guardianAddress, ActivationEpoch: agc.currentEpoch, ServiceUID: guardianServiceUID, } + agc.mutEpoch.RUnlock() accountGuardians.Slice = []*guardians.Guardian{guardian} accHandler, ok := uah.(vmcommon.UserAccountHandler) diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 40bac28cba1..7b6ff16807e 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -1,11 +1,15 @@ package guardian import ( + "context" "errors" "testing" + "time" "github.com/ElrondNetwork/elrond-go-core/core/check" + "github.com/ElrondNetwork/elrond-go-core/data/block" "github.com/ElrondNetwork/elrond-go-core/data/guardians" + "github.com/ElrondNetwork/elrond-go/common/forking" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/testscommon" "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" @@ -1160,6 +1164,47 @@ func TestGuardedAccount_IsInterfaceNil(t *testing.T) { require.False(t, check.IfNil(ga)) } +func TestGuardedAccount_EpochConcurrency(t *testing.T) { + t.Parallel() + + marshaller := &testscommon.MarshalizerMock{} + currentEpoch := uint32(0) + en := forking.NewGenericEpochNotifier() + ga, _ := NewGuardedAccount(marshaller, en, 2) + ctx := context.Background() + go func() { + epochTime := time.Millisecond + timer := time.NewTimer(epochTime) + defer timer.Stop() + + for { + timer.Reset(epochTime) + select { + case <-timer.C: + hdr := &block.Header{ + Epoch: currentEpoch, + } + en.CheckEpoch(hdr) + currentEpoch++ + case <-ctx.Done(): + return + } + } + }() + + uah := &stateMocks.UserAccountStub{ + AccountDataHandlerCalled: func() vmcommon.AccountDataHandler { + return &trie.DataTrieTrackerStub{ + SaveKeyValueCalled: func(key []byte, value []byte) error { + return nil + }, + } + }, + } + err := ga.SetGuardian(uah, []byte("guardian address"), nil, []byte("uuid")) + require.Nil(t, err) +} + func createGuardedAccountWithEpoch(epoch uint32) *guardedAccount { marshaller := &testscommon.MarshalizerMock{} en := &epochNotifier.EpochNotifierStub{ From 4478589df974e259ac979df6e4f63f45e298af7e Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 16 Jan 2023 11:08:57 +0200 Subject: [PATCH 120/335] - fixed check on the baseProcessor - added extra tests in the semi-integration test - added unit tests --- ...eAccounts_test.go => guardAccount_test.go} | 21 ++- process/errors.go | 6 +- process/transaction/baseProcess.go | 7 +- process/transaction/baseProcess_test.go | 151 +++++++++++++++++- 4 files changed, 172 insertions(+), 13 deletions(-) rename integrationTests/vm/txsFee/{freezeAccounts_test.go => guardAccount_test.go} (92%) diff --git a/integrationTests/vm/txsFee/freezeAccounts_test.go b/integrationTests/vm/txsFee/guardAccount_test.go similarity index 92% rename from integrationTests/vm/txsFee/freezeAccounts_test.go rename to integrationTests/vm/txsFee/guardAccount_test.go index 3a82e31adbd..224d414fd9b 100644 --- a/integrationTests/vm/txsFee/freezeAccounts_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -247,9 +247,8 @@ func testPendingGuardian( testGuardianData(tb, pending, shouldBeNil, expectedAddress, expectedUUID) } -func TestFreezeAccountsShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *testing.T) { +func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *testing.T) { testContext := prepareTestContextForFreezeAccounts(t) - defer testContext.Close() uuid := []byte("uuid") @@ -267,9 +266,8 @@ func TestFreezeAccountsShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *te testNoGuardianIsSet(t, testContext, userAddress) } -func TestFreezeAccountsShouldSetGuardianOnANotProtectedAccount(t *testing.T) { +func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { testContext := prepareTestContextForFreezeAccounts(t) - defer testContext.Close() uuid := []byte("uuid") @@ -306,9 +304,8 @@ func TestFreezeAccountsShouldSetGuardianOnANotProtectedAccount(t *testing.T) { assert.Equal(t, vmcommon.Ok, returnCode) } -func TestFreezeAccountsSendingFundsWhileProtectedAndNotProtected(t *testing.T) { +func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { testContext := prepareTestContextForFreezeAccounts(t) - defer testContext.Close() uuid := []byte("uuid") @@ -327,6 +324,12 @@ func TestFreezeAccountsSendingFundsWhileProtectedAndNotProtected(t *testing.T) { require.Nil(t, err) require.Equal(t, big.NewInt(transferValue), getBalance(testContext, receiverAddress)) + // userAddress can not send funds while not protected with a guardian address + err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Contains(t, err.Error(), "guarded transaction not expected") + require.Equal(t, big.NewInt(transferValue), getBalance(testContext, receiverAddress)) + // userAddress can send funds while it just added a guardian returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid, delayedSetGuardian) assert.Nil(t, err) @@ -339,6 +342,12 @@ func TestFreezeAccountsSendingFundsWhileProtectedAndNotProtected(t *testing.T) { require.Nil(t, err) require.Equal(t, big.NewInt(transferValue*2), getBalance(testContext, receiverAddress)) + // userAddress can not send funds while not protected with a guardian address + err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Contains(t, err.Error(), "guarded transaction not expected") + require.Equal(t, big.NewInt(transferValue*2), getBalance(testContext, receiverAddress)) + // delay epoch pasts, the pending guardian is now active (but not activated), userAddress can send funds hdr := &block.Header{ Epoch: vm.EpochGuardianDelay, diff --git a/process/errors.go b/process/errors.go index 3e338b5f295..53f96db5952 100644 --- a/process/errors.go +++ b/process/errors.go @@ -1176,9 +1176,6 @@ var ErrAccountHasNoPendingGuardian = errors.New("account has no pending guardian // ErrNilGuardedAccountHandler signals that a nil guarded account handler was provided var ErrNilGuardedAccountHandler = errors.New("nil guarded account handler") -// ErrOperationNotPermitted signals that operation is not permitted -var ErrOperationNotPermitted = errors.New("operation in account not permitted") - // ErrTransactionNotExecutable signals that a transaction is not executable and gas will not be consumed var ErrTransactionNotExecutable = errors.New("transaction is not executable and gas will not be consumed") @@ -1196,3 +1193,6 @@ var ErrNilGuardianServiceUID = errors.New("nil guardian service unique identifie // ErrGasPriceTooHigh signals a too high gas price var ErrGasPriceTooHigh = errors.New("gas price is too high for the transaction") + +// ErrGuardedTransactionNotExpected signals that a guarded transaction was received for processing but the account is not guarded +var ErrGuardedTransactionNotExpected = errors.New("guarded transaction not expected") diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 151c7c004db..6df9540038c 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -250,10 +250,15 @@ func (txProc *baseTxProcessor) verifyGuardian(tx *transaction.Transaction, accou if check.IfNil(account) { return nil } + isTransactionGuarded := txProc.txVersionChecker.IsGuardedTransaction(tx) if !account.IsGuarded() { + if isTransactionGuarded { + return fmt.Errorf("%w, %s", process.ErrTransactionNotExecutable, process.ErrGuardedTransactionNotExpected.Error()) + } + return nil } - if !txProc.txVersionChecker.IsGuardedTransaction(tx) { + if !isTransactionGuarded { return txProc.checkGuardedAccountUnguardedTxPermission(tx.GetData(), account) } diff --git a/process/transaction/baseProcess_test.go b/process/transaction/baseProcess_test.go index ed0dfa0608f..bea231db91a 100644 --- a/process/transaction/baseProcess_test.go +++ b/process/transaction/baseProcess_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/ElrondNetwork/elrond-go-core/data/transaction" "github.com/ElrondNetwork/elrond-go/process" "github.com/ElrondNetwork/elrond-go/process/mock" "github.com/ElrondNetwork/elrond-go/state" @@ -15,6 +16,8 @@ import ( "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" + vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -83,15 +86,157 @@ func Test_checkGuardedAccountUnguardedTxPermission(t *testing.T) { }) t.Run("set guardian builtin call with pending guardian not allowed", func(t *testing.T) { txData := []byte("SetGuardian@") - baseProc := baseProc - baseProc.guardianChecker = &guardianMocks.GuardedAccountHandlerStub{ + baseProcLocal := baseProc + baseProcLocal.guardianChecker = &guardianMocks.GuardedAccountHandlerStub{ HasPendingGuardianCalled: func(uah state.UserAccountHandler) bool { return true }, } - err := baseProc.checkGuardedAccountUnguardedTxPermission(txData, account) + err := baseProcLocal.checkGuardedAccountUnguardedTxPermission(txData, account) require.True(t, errors.Is(err, process.ErrTransactionNotExecutable)) require.True(t, strings.Contains(err.Error(), process.ErrCannotReplaceGuardedAccountPendingGuardian.Error())) }) } + +func TestBaseTxProcessor_VerifyGuardian(t *testing.T) { + t.Parallel() + + baseProc := baseTxProcessor{ + accounts: &stateMock.AccountsStub{}, + shardCoordinator: mock.NewOneShardCoordinatorMock(), + pubkeyConv: testscommon.NewPubkeyConverterMock(32), + economicsFee: &economicsmocks.EconomicsHandlerStub{ + CheckValidityTxValuesCalled: func(tx data.TransactionWithFeeHandler) error { + return nil + }, + ComputeMoveBalanceFeeCalled: func(tx data.TransactionWithFeeHandler) *big.Int { + return big.NewInt(0) + }, + }, + hasher: &hashingMocks.HasherMock{}, + marshalizer: &testscommon.MarshalizerMock{}, + scProcessor: &testscommon.SCProcessorMock{}, + enableEpochsHandler: &testscommon.EnableEpochsHandlerStub{ + IsPenalizedTooMuchGasFlagEnabledField: true, + }, + txVersionChecker: &testscommon.TxVersionCheckerStub{}, + guardianChecker: &guardianMocks.GuardedAccountHandlerStub{}, + } + + notGuardedAccount := &stateMock.UserAccountStub{} + guardedAccount := &stateMock.UserAccountStub{ + IsGuardedCalled: func() bool { + return true + }, + } + expectedErr := errors.New("expected error") + tx := &transaction.Transaction{ + GuardianAddr: []byte("guardian"), + } + + t.Run("nil account should not error", func(t *testing.T) { + t.Parallel() + + localBaseProc := baseProc + err := localBaseProc.verifyGuardian(&transaction.Transaction{}, nil) + assert.Nil(t, err) + }) + t.Run("guarded account with a not guarded transaction should error", func(t *testing.T) { + t.Parallel() + + localBaseProc := baseProc + localBaseProc.txVersionChecker = &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return false + }, + } + + err := localBaseProc.verifyGuardian(&transaction.Transaction{}, guardedAccount) + assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) + assert.Contains(t, err.Error(), "not allowed to bypass guardian") + }) + t.Run("not guarded account with guarded tx should error", func(t *testing.T) { + t.Parallel() + + localBaseProc := baseProc + localBaseProc.txVersionChecker = &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + } + + err := localBaseProc.verifyGuardian(&transaction.Transaction{}, notGuardedAccount) + assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) + assert.Contains(t, err.Error(), process.ErrGuardedTransactionNotExpected.Error()) + }) + t.Run("not guarded account with not guarded tx should work", func(t *testing.T) { + t.Parallel() + + localBaseProc := baseProc + localBaseProc.txVersionChecker = &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return false + }, + } + + err := localBaseProc.verifyGuardian(&transaction.Transaction{}, notGuardedAccount) + assert.Nil(t, err) + }) + t.Run("get active guardian fails should error", func(t *testing.T) { + t.Parallel() + + localBaseProc := baseProc + localBaseProc.txVersionChecker = &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + } + localBaseProc.guardianChecker = &guardianMocks.GuardedAccountHandlerStub{ + GetActiveGuardianCalled: func(uah vmcommon.UserAccountHandler) ([]byte, error) { + return nil, expectedErr + }, + } + + err := localBaseProc.verifyGuardian(&transaction.Transaction{}, guardedAccount) + assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) + assert.Contains(t, err.Error(), expectedErr.Error()) + }) + t.Run("guardian address mismatch should error", func(t *testing.T) { + t.Parallel() + + localBaseProc := baseProc + localBaseProc.txVersionChecker = &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + } + localBaseProc.guardianChecker = &guardianMocks.GuardedAccountHandlerStub{ + GetActiveGuardianCalled: func(uah vmcommon.UserAccountHandler) ([]byte, error) { + return []byte("account guardian"), nil + }, + } + + err := localBaseProc.verifyGuardian(tx, guardedAccount) + assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) + assert.Contains(t, err.Error(), process.ErrTransactionAndAccountGuardianMismatch.Error()) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + localBaseProc := baseProc + localBaseProc.txVersionChecker = &testscommon.TxVersionCheckerStub{ + IsGuardedTransactionCalled: func(tx *transaction.Transaction) bool { + return true + }, + } + localBaseProc.guardianChecker = &guardianMocks.GuardedAccountHandlerStub{ + GetActiveGuardianCalled: func(uah vmcommon.UserAccountHandler) ([]byte, error) { + return []byte("guardian"), nil + }, + } + + err := localBaseProc.verifyGuardian(tx, guardedAccount) + assert.Nil(t, err) + }) +} From 3b7bca6b23aa8871cf7e4ecec60767739146c5aa Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 16 Jan 2023 13:36:01 +0200 Subject: [PATCH 121/335] started the cleanup --- vm/systemSmartContracts/governance.go | 465 ++--------------------- vm/systemSmartContracts/governance.proto | 41 +- 2 files changed, 31 insertions(+), 475 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 6f6886d6c02..6995e694306 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -19,45 +19,41 @@ import ( ) const governanceConfigKey = "governanceConfig" -const hardForkPrefix = "hardFork_" const proposalPrefix = "proposal_" const fundsLockPrefix = "foundsLock_" -const whiteListPrefix = "whiteList_" const stakeLockPrefix = "stakeLock_" const yesString = "yes" const noString = "no" const vetoString = "veto" -const hardForkEpochGracePeriod = 2 +const abstainString = "abstain" const commitHashLength = 40 // ArgsNewGovernanceContract defines the arguments needed for the on-chain governance contract type ArgsNewGovernanceContract struct { - Eei vm.SystemEI - GasCost vm.GasCost - GovernanceConfig config.GovernanceSystemSCConfig - Marshalizer marshal.Marshalizer - Hasher hashing.Hasher - GovernanceSCAddress []byte - DelegationMgrSCAddress []byte - ValidatorSCAddress []byte - InitialWhiteListedAddresses [][]byte - EnableEpochsHandler common.EnableEpochsHandler + Eei vm.SystemEI + GasCost vm.GasCost + GovernanceConfig config.GovernanceSystemSCConfig + Marshalizer marshal.Marshalizer + Hasher hashing.Hasher + GovernanceSCAddress []byte + DelegationMgrSCAddress []byte + ValidatorSCAddress []byte + EnableEpochsHandler common.EnableEpochsHandler } type governanceContract struct { - eei vm.SystemEI - gasCost vm.GasCost - baseProposalCost *big.Int - ownerAddress []byte - governanceSCAddress []byte - delegationMgrSCAddress []byte - validatorSCAddress []byte - marshalizer marshal.Marshalizer - hasher hashing.Hasher - governanceConfig config.GovernanceSystemSCConfig - initialWhiteListedAddresses [][]byte - enableEpochsHandler common.EnableEpochsHandler - mutExecution sync.RWMutex + eei vm.SystemEI + gasCost vm.GasCost + baseProposalCost *big.Int + ownerAddress []byte + governanceSCAddress []byte + delegationMgrSCAddress []byte + validatorSCAddress []byte + marshalizer marshal.Marshalizer + hasher hashing.Hasher + governanceConfig config.GovernanceSystemSCConfig + enableEpochsHandler common.EnableEpochsHandler + mutExecution sync.RWMutex } // NewGovernanceContract creates a new governance smart contract @@ -105,12 +101,6 @@ func NewGovernanceContract(args ArgsNewGovernanceContract) (*governanceContract, enableEpochsHandler: args.EnableEpochsHandler, } - err := g.validateInitialWhiteListedAddresses(args.InitialWhiteListedAddresses) - if err != nil { - return nil, err - } - g.initialWhiteListedAddresses = args.InitialWhiteListedAddresses - return g, nil } @@ -145,22 +135,14 @@ func (g *governanceContract) Execute(args *vmcommon.ContractCallInput) vmcommon. return g.vote(args) case "delegateVote": return g.delegateVote(args) - case "voteWithFunds": - return g.voteWithFunds(args) case "claimFunds": return g.claimFunds(args) - case "whiteList": - return g.whiteListProposal(args) - case "hardFork": - return g.hardForkProposal(args) case "changeConfig": return g.changeConfig(args) case "closeProposal": return g.closeProposal(args) case "getValidatorVotingPower": return g.getValidatorVotingPower(args) - case "getBalanceVotingPower": - return g.getBalanceVotingPower(args) } g.eei.AddReturnMessage("invalid method to call") @@ -207,13 +189,6 @@ func (g *governanceContract) initV2(args *vmcommon.ContractCallInput) vmcommon.R g.ownerAddress = make([]byte, 0, len(args.CallerAddr)) g.ownerAddress = append(g.ownerAddress, args.CallerAddr...) - for _, address := range g.initialWhiteListedAddresses { - returnCode := g.whiteListAtGovernanceGenesis(address) - if returnCode != vmcommon.Ok { - return returnCode - } - } - return vmcommon.Ok } @@ -232,10 +207,6 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon g.eei.AddReturnMessage("invalid number of arguments, expected 3") return vmcommon.FunctionWrongSignature } - if !g.isWhiteListed(args.CallerAddr) { - g.eei.AddReturnMessage("called address is not whiteListed") - return vmcommon.UserError - } commitHash := args.Arguments[0] if len(commitHash) != commitHashLength { g.eei.AddReturnMessage(fmt.Sprintf("invalid github commit length, wanted exactly %d", commitHashLength)) @@ -319,8 +290,6 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } - // clean all the read storage - g.eei.CleanStorageUpdates() currentVote := &VoteDetails{ Value: voteOption, @@ -458,91 +427,6 @@ func (g *governanceContract) getVoteSetKeyForVoteWithFunds(proposalToVote, addre return key } -// voteWithFunds casts a vote taking the transaction value as input for the vote power. It receives 2 arguments: -// args.Arguments[0] - proposal reference (GitHub commit) -// args.Arguments[1] - vote option (yes, no, veto) -func (g *governanceContract) voteWithFunds(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Vote) - if err != nil { - g.eei.AddReturnMessage("not enough gas") - return vmcommon.OutOfGas - } - if len(args.Arguments) != 2 { - g.eei.AddReturnMessage("invalid number of arguments, expected 2") - return vmcommon.FunctionWrongSignature - } - minValueToVote, err := g.getMinValueToVote() - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - if args.CallValue.Cmp(minValueToVote) < 0 { - g.eei.AddReturnMessage("not enough funds to vote") - return vmcommon.UserError - } - - voterAddress := args.CallerAddr - proposalToVote := args.Arguments[0] - proposal, err := g.getValidProposal(proposalToVote) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - voteOption, err := g.castVoteType(string(args.Arguments[1])) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - - voteKey := g.getVoteSetKeyForVoteWithFunds(proposalToVote, voterAddress) - currentVoteSet, err := g.getOrCreateVoteSet(voteKey) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.ExecutionFailed - } - - lenVoteSet := len(currentVoteSet.VoteItems) - if lenVoteSet > 0 { - lastVote := currentVoteSet.VoteItems[lenVoteSet-1] - if lastVote.Value != voteOption { - g.eei.AddReturnMessage("conflicting votes for same proposal") - return vmcommon.UserError - } - } - - votePower, err := g.computeAccountLeveledPower(args.CallValue, currentVoteSet) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - - currentVote := &VoteDetails{ - Value: voteOption, - Power: votePower, - Balance: args.CallValue, - } - - newVoteSet, updatedProposal, err := g.applyVote(currentVote, currentVoteSet, proposal) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - - err = g.saveVoteSet(voterAddress, newVoteSet, updatedProposal) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - - err = g.saveGeneralProposal(proposal.CommitHash, proposal) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - - return vmcommon.Ok -} - // claimFunds returns the used funds for a particular proposal if they are unlocked. Accepts a single parameter: // args.Arguments[0] - proposal reference func (g *governanceContract) claimFunds(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { @@ -591,167 +475,6 @@ func (g *governanceContract) claimFunds(args *vmcommon.ContractCallInput) vmcomm return vmcommon.Ok } -// whiteListProposal will create a new proposal to white list an address -func (g *governanceContract) whiteListProposal(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if args.CallValue.Cmp(g.baseProposalCost) != 0 { - g.eei.AddReturnMessage("invalid callValue, needs exactly " + g.baseProposalCost.String()) - return vmcommon.OutOfFunds - } - err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Proposal) - if err != nil { - g.eei.AddReturnMessage("not enough gas") - return vmcommon.OutOfGas - } - if len(args.Arguments) != 3 { - g.eei.AddReturnMessage("invalid number of arguments") - return vmcommon.FunctionWrongSignature - } - if g.proposalExists(args.Arguments[0]) { - g.eei.AddReturnMessage("cannot re-propose existing proposal") - return vmcommon.UserError - } - if g.isWhiteListed(args.CallerAddr) { - g.eei.AddReturnMessage("address is already whitelisted") - return vmcommon.UserError - } - if len(args.Arguments[0]) != commitHashLength { - g.eei.AddReturnMessage(fmt.Sprintf("invalid github commit length, wanted exactly %d", commitHashLength)) - return vmcommon.UserError - } - - startVoteNonce, endVoteNonce, err := g.startEndNonceFromArguments(args.Arguments[1], args.Arguments[2]) - if err != nil { - g.eei.AddReturnMessage("invalid start/end vote nonce " + err.Error()) - return vmcommon.UserError - } - - key := append([]byte(proposalPrefix), args.CallerAddr...) - whiteListAcc := &WhiteListProposal{ - WhiteListAddress: args.CallerAddr, - ProposalStatus: key, - } - - key = append([]byte(whiteListPrefix), args.CallerAddr...) - generalProposal := &GeneralProposal{ - IssuerAddress: args.CallerAddr, - CommitHash: args.Arguments[0], - StartVoteNonce: startVoteNonce, - EndVoteNonce: endVoteNonce, - Yes: big.NewInt(0), - No: big.NewInt(0), - Veto: big.NewInt(0), - Passed: false, - Votes: make([][]byte, 0), - } - - marshaledData, err := g.marshalizer.Marshal(whiteListAcc) - if err != nil { - g.eei.AddReturnMessage("marshal error " + err.Error()) - return vmcommon.UserError - } - g.eei.SetStorage(key, marshaledData) - - err = g.saveGeneralProposal(args.CallerAddr, generalProposal) - if err != nil { - g.eei.AddReturnMessage("save proposal error " + err.Error()) - return vmcommon.UserError - } - - return vmcommon.Ok -} - -// hardForkProposal creates a new proposal for a hard-fork -func (g *governanceContract) hardForkProposal(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if args.CallValue.Cmp(g.baseProposalCost) != 0 { - g.eei.AddReturnMessage("invalid proposal cost, expected " + g.baseProposalCost.String()) - return vmcommon.OutOfFunds - } - err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Proposal) - if err != nil { - g.eei.AddReturnMessage("not enough gas") - return vmcommon.OutOfGas - } - if len(args.Arguments) != 5 { - g.eei.AddReturnMessage("invalid number of arguments, expected 5") - return vmcommon.FunctionWrongSignature - } - if !g.isWhiteListed(args.CallerAddr) { - g.eei.AddReturnMessage("called address is not whiteListed") - return vmcommon.UserError - } - commitHash := args.Arguments[2] - if len(commitHash) != commitHashLength { - g.eei.AddReturnMessage(fmt.Sprintf("invalid github commit length, wanted exactly %d", commitHashLength)) - return vmcommon.UserError - } - if g.proposalExists(commitHash) { - g.eei.AddReturnMessage("proposal already exists") - return vmcommon.UserError - } - - key := append([]byte(hardForkPrefix), commitHash...) - marshaledData := g.eei.GetStorage(key) - if len(marshaledData) != 0 { - g.eei.AddReturnMessage("hardFork proposal already exists") - return vmcommon.UserError - } - - startVoteNonce, endVoteNonce, err := g.startEndNonceFromArguments(args.Arguments[3], args.Arguments[4]) - if err != nil { - g.eei.AddReturnMessage("invalid start/end vote nonce" + err.Error()) - return vmcommon.UserError - } - - bigIntEpochToHardFork, okConvert := big.NewInt(0).SetString(string(args.Arguments[0]), conversionBase) - if !okConvert || !bigIntEpochToHardFork.IsUint64() { - g.eei.AddReturnMessage("invalid argument for epoch") - return vmcommon.UserError - } - - epochToHardFork := uint32(bigIntEpochToHardFork.Uint64()) - currentEpoch := g.eei.BlockChainHook().CurrentEpoch() - if epochToHardFork < currentEpoch && currentEpoch-epochToHardFork < hardForkEpochGracePeriod { - g.eei.AddReturnMessage("invalid epoch to hardFork") - return vmcommon.UserError - } - - key = append([]byte(proposalPrefix), commitHash...) - hardForkProposal := &HardForkProposal{ - EpochToHardFork: epochToHardFork, - NewSoftwareVersion: args.Arguments[1], - ProposalStatus: key, - } - - key = append([]byte(hardForkPrefix), commitHash...) - generalProposal := &GeneralProposal{ - IssuerAddress: args.CallerAddr, - CommitHash: commitHash, - StartVoteNonce: startVoteNonce, - EndVoteNonce: endVoteNonce, - Yes: big.NewInt(0), - No: big.NewInt(0), - Veto: big.NewInt(0), - Passed: false, - Votes: make([][]byte, 0), - } - marshaledData, err = g.marshalizer.Marshal(hardForkProposal) - if err != nil { - log.Warn("hardFork proposal marshal", "err", err) - g.eei.AddReturnMessage("marshal proposal" + err.Error()) - return vmcommon.UserError - } - g.eei.SetStorage(key, marshaledData) - - err = g.saveGeneralProposal(commitHash, generalProposal) - if err != nil { - log.Warn("save general proposal", "error", err) - g.eei.AddReturnMessage("saveGeneralProposal" + err.Error()) - return vmcommon.UserError - } - - return vmcommon.Ok -} - // changeConfig allows the owner to change the configuration for requesting proposals func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if !bytes.Equal(g.ownerAddress, args.CallerAddr) { @@ -815,10 +538,6 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc g.eei.AddReturnMessage("closeProposal callValue expected to be 0") return vmcommon.UserError } - if !g.isWhiteListed(args.CallerAddr) { - g.eei.AddReturnMessage("caller is not whitelisted") - return vmcommon.UserError - } if len(args.Arguments) != 1 { g.eei.AddReturnMessage("invalid number of arguments expected 1") return vmcommon.UserError @@ -853,8 +572,6 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.UserError } - g.deleteAllVotes(generalProposal) - err = g.saveGeneralProposal(proposal, generalProposal) if err != nil { g.eei.AddReturnMessage("saveGeneralProposal error" + err.Error()) @@ -864,16 +581,7 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.Ok } -//TODO: the problem is that voteKey has to be short - as these kind of lists can't be longer than 1MB -func (g *governanceContract) deleteAllVotes(proposal *GeneralProposal) { - for _, address := range proposal.Votes { - voteKey := getVoteItemKey(proposal.CommitHash, address) - g.eei.SetStorage(voteKey, nil) - } - proposal.Votes = make([][]byte, 0) -} - -// getConfig returns the curent system smart contract configuration +// getConfig returns the current system smart contract configuration func (g *governanceContract) getConfig() (*GovernanceConfigV2, error) { marshaledData := g.eei.GetStorage([]byte(governanceConfigKey)) scConfig := &GovernanceConfigV2{} @@ -918,33 +626,6 @@ func (g *governanceContract) getValidatorVotingPower(args *vmcommon.ContractCall return vmcommon.Ok } -// getBalanceVotingPower returns the voting power associated with the value sent in the transaction by the user -func (g *governanceContract) getBalanceVotingPower(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if args.CallValue.Cmp(zero) != 0 { - g.eei.AddReturnMessage(vm.TransactionValueMustBeZero) - return vmcommon.UserError - } - if len(args.Arguments) != 1 { - g.eei.AddReturnMessage("function accepts only one argument, the balance for computing the power") - return vmcommon.FunctionWrongSignature - } - err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Vote) - if err != nil { - g.eei.AddReturnMessage("not enough gas") - return vmcommon.OutOfGas - } - - balance := big.NewInt(0).SetBytes(args.Arguments[0]) - votingPower, err := g.computeVotingPower(balance) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - - g.eei.Finish(votingPower.Bytes()) - return vmcommon.Ok -} - // saveGeneralProposal saves a proposal into the storage func (g *governanceContract) saveGeneralProposal(reference []byte, generalProposal *GeneralProposal) error { marshaledData, err := g.marshalizer.Marshal(generalProposal) @@ -1014,71 +695,6 @@ func (g *governanceContract) getValidProposal(reference []byte) (*GeneralProposa return proposal, nil } -// isWhiteListed checks if an address is whitelisted -func (g *governanceContract) isWhiteListed(address []byte) bool { - key := append([]byte(whiteListPrefix), address...) - marshaledData := g.eei.GetStorage(key) - if len(marshaledData) == 0 { - return false - } - - key = append([]byte(proposalPrefix), address...) - marshaledData = g.eei.GetStorage(key) - generalProposal := &GeneralProposal{} - err := g.marshalizer.Unmarshal(generalProposal, marshaledData) - if err != nil { - return false - } - - return generalProposal.Passed -} - -func (g *governanceContract) whiteListAtGovernanceGenesis(address []byte) vmcommon.ReturnCode { - if g.proposalExists(address) { - log.Warn("proposal with this key already exists") - return vmcommon.UserError - } - - key := append([]byte(proposalPrefix), address...) - whiteListAcc := &WhiteListProposal{ - WhiteListAddress: address, - ProposalStatus: key, - } - - minQuorum, success := big.NewInt(0).SetString(g.governanceConfig.Active.MinQuorum, conversionBase) - if !success { - log.Warn("could not convert min quorum to bigInt") - return vmcommon.UserError - } - - key = append([]byte(whiteListPrefix), address...) - generalProposal := &GeneralProposal{ - IssuerAddress: address, - CommitHash: []byte("genesis"), - StartVoteNonce: 0, - EndVoteNonce: 0, - Yes: minQuorum, - No: big.NewInt(0), - Veto: big.NewInt(0), - Passed: true, - Votes: make([][]byte, 0), - } - marshaledData, err := g.marshalizer.Marshal(whiteListAcc) - if err != nil { - log.Warn("marshal error in whiteListAtGenesis", "err", err) - return vmcommon.UserError - } - g.eei.SetStorage(key, marshaledData) - - err = g.saveGeneralProposal(address, generalProposal) - if err != nil { - log.Warn("save general proposal ", "err", err) - return vmcommon.UserError - } - - return vmcommon.Ok -} - // applyVote takes in a vote and a full VoteSet object and correctly applies the new vote, then returning // the new full VoteSet object. In the same way applies the vote to the general proposal func (g *governanceContract) applyVote(vote *VoteDetails, voteData *VoteSet, proposal *GeneralProposal) (*VoteSet, *GeneralProposal, error) { @@ -1115,10 +731,6 @@ func (g *governanceContract) addNewVote(voterAddress []byte, currentVote *VoteDe return err } - if !g.proposalContainsVoter(proposal, voterAddress) { - proposal.Votes = append(proposal.Votes, voterAddress) - } - return g.saveGeneralProposal(proposal.CommitHash, proposal) } @@ -1140,18 +752,6 @@ func (g *governanceContract) saveVoteSet(voter []byte, voteData *VoteSet, propos return nil } -// proposalContainsVoter iterates through all the votes on a proposal and returns if it already contains a -// vote from a certain address -func (g *governanceContract) proposalContainsVoter(proposal *GeneralProposal, voteKey []byte) bool { - for _, vote := range proposal.Votes { - if bytes.Equal(vote, voteKey) { - return true - } - } - - return false -} - // computeVotingPower returns the voting power for a value. The value can be either a balance or // the staked value for a validator func (g *governanceContract) computeVotingPower(value *big.Int) (*big.Int, error) { @@ -1183,7 +783,7 @@ func (g *governanceContract) computeAccountLeveledPower(value *big.Int, voteData // isValidVoteString checks if a certain string represents a valid vote string func (g *governanceContract) isValidVoteString(vote string) bool { switch vote { - case yesString, noString, vetoString: + case yesString, noString, vetoString, abstainString: return true default: return false @@ -1327,23 +927,6 @@ func (g *governanceContract) getTotalStake(validatorAddress []byte) (*big.Int, e return validatorData.TotalStakeValue, nil } -// validateInitialWhiteListedAddresses makes basic checks that the provided initial whitelisted -// addresses have the correct format -func (g *governanceContract) validateInitialWhiteListedAddresses(addresses [][]byte) error { - if len(addresses) == 0 { - log.Debug("0 initial whiteListed addresses provided to the governance contract") - return vm.ErrInvalidNumOfInitialWhiteListedAddress - } - - for _, addr := range addresses { - if len(addr) != len(g.governanceSCAddress) { - return fmt.Errorf("invalid address length for %s", string(addr)) - } - } - - return nil -} - // startEndNonceFromArguments converts the nonce string arguments to uint64 func (g *governanceContract) startEndNonceFromArguments(argStart []byte, argEnd []byte) (uint64, uint64, error) { startVoteNonce, err := g.nonceFromBytes(argStart) diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index 60db9ce8892..e4a3b26d8d8 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -8,9 +8,10 @@ option (gogoproto.stable_marshaler_all) = true; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; enum VoteValueType { - Yes = 0; - No = 1; - Veto = 2; + Yes = 0; + No = 1; + Veto = 2; + Abstain = 3; } message GeneralProposal { @@ -21,21 +22,9 @@ message GeneralProposal { bytes Yes = 5 [(gogoproto.jsontag) = "Yes", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes No = 6 [(gogoproto.jsontag) = "No", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes Veto = 7 [(gogoproto.jsontag) = "Veto", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bool Passed = 8 [(gogoproto.jsontag) = "Passed"]; - repeated bytes Votes = 9 [(gogoproto.jsontag) = "Votes"]; - bytes TopReference = 10 [(gogoproto.jsontag) = "TopReference"]; - bool Closed = 11 [(gogoproto.jsontag) = "Closed"]; -} - -message WhiteListProposal { - bytes WhiteListAddress = 1 [(gogoproto.jsontag) = "WhiteListAddress"]; - bytes ProposalStatus = 2 [(gogoproto.jsontag) = "ProposalStatus"]; -} - -message HardForkProposal { - uint32 EpochToHardFork = 1 [(gogoproto.jsontag) = "EpochToHardFork"]; - bytes NewSoftwareVersion = 2 [(gogoproto.jsontag) = "NewSoftwareVersion"]; - bytes ProposalStatus = 3 [(gogoproto.jsontag) = "ProposalStatus"]; + bytes Abstain = 8 [(gogoproto.jsontag) = "Abstain", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bool Passed = 9 [(gogoproto.jsontag) = "Passed"]; + bool Closed = 12 [(gogoproto.jsontag) = "Closed"]; } message GovernanceConfig { @@ -52,19 +41,3 @@ message GovernanceConfigV2 { bytes MinVetoThreshold = 3 [(gogoproto.jsontag) = "MinVetoThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes ProposalFee = 4 [(gogoproto.jsontag) = "ProposalFee", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; } - -message VoteDetails { - VoteValueType Value = 1 [(gogoproto.jsontag) = "Value"]; - bytes Power = 2 [(gogoproto.jsontag) = "Power", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes Balance = 3 [(gogoproto.jsontag) = "Balance", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes DelegatedTo = 4 [(gogoproto.jsontag) = "DelegatedTo"]; -} - -message VoteSet { - bytes UsedPower = 1 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes UsedBalance = 2 [(gogoproto.jsontag) = "UsedBalance", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes TotalYes = 3 [(gogoproto.jsontag) = "TotalYes", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes TotalNo = 4 [(gogoproto.jsontag) = "TotalNo", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes TotalVeto = 5 [(gogoproto.jsontag) = "TotalVeto", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - repeated VoteDetails VoteItems = 6 [(gogoproto.jsontag) = "VoteItems"]; -} From 44ace79bc65142c76aabbc719a7eb4dfe4a7ac5e Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 16 Jan 2023 13:58:50 +0200 Subject: [PATCH 122/335] new proto --- vm/systemSmartContracts/governance.go | 51 +----------------------- vm/systemSmartContracts/governance.proto | 9 ++++- 2 files changed, 8 insertions(+), 52 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 6995e694306..6a960b172c4 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -135,8 +135,6 @@ func (g *governanceContract) Execute(args *vmcommon.ContractCallInput) vmcommon. return g.vote(args) case "delegateVote": return g.delegateVote(args) - case "claimFunds": - return g.claimFunds(args) case "changeConfig": return g.changeConfig(args) case "closeProposal": @@ -231,6 +229,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon Yes: big.NewInt(0), No: big.NewInt(0), Veto: big.NewInt(0), + Abstain: big.NewInt(0), Passed: false, Votes: make([][]byte, 0), } @@ -427,54 +426,6 @@ func (g *governanceContract) getVoteSetKeyForVoteWithFunds(proposalToVote, addre return key } -// claimFunds returns the used funds for a particular proposal if they are unlocked. Accepts a single parameter: -// args.Arguments[0] - proposal reference -func (g *governanceContract) claimFunds(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if args.CallValue.Cmp(big.NewInt(0)) != 0 { - g.eei.AddReturnMessage("invalid callValue, should be 0") - return vmcommon.UserError - } - err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Claim) - if err != nil { - g.eei.AddReturnMessage("not enough gas") - return vmcommon.OutOfGas - } - - if len(args.Arguments) != 1 { - g.eei.AddReturnMessage("invalid number of arguments, expected 1") - return vmcommon.FunctionWrongSignature - } - - endNonce := g.getEndNonceForProposal(args.Arguments[0]) - currentNonce := g.eei.BlockChainHook().CurrentNonce() - - if endNonce > currentNonce { - g.eei.AddReturnMessage("your funds are still locked") - return vmcommon.UserError - } - - voteKey := g.getVoteSetKeyForVoteWithFunds(args.Arguments[0], args.CallerAddr) - currentVoteSet, err := g.getOrCreateVoteSet(voteKey) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.ExecutionFailed - } - if currentVoteSet.UsedBalance.Cmp(zero) <= 0 { - g.eei.AddReturnMessage("no funds to claim for this proposal") - return vmcommon.UserError - } - - g.eei.SetStorage(voteKey, nil) - - err = g.eei.Transfer(args.CallerAddr, g.governanceSCAddress, currentVoteSet.UsedBalance, nil, 0) - if err != nil { - g.eei.AddReturnMessage("transfer error on claimFunds function") - return vmcommon.ExecutionFailed - } - - return vmcommon.Ok -} - // changeConfig allows the owner to change the configuration for requesting proposals func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if !bytes.Equal(g.ownerAddress, args.CallerAddr) { diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index e4a3b26d8d8..2abffa079a5 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -15,7 +15,7 @@ enum VoteValueType { } message GeneralProposal { - bytes IssuerAddress = 1 [(gogoproto.jsontag) = "IssuerAddress"]; + uint64 Nonce = 1 [(gogoproto.jsontag) = "Nonce"]; bytes CommitHash = 2 [(gogoproto.jsontag) = "CommitHash"]; uint64 StartVoteNonce = 3 [(gogoproto.jsontag) = "StartVoteNonce"]; uint64 EndVoteNonce = 4 [(gogoproto.jsontag) = "EndVoteNonce"]; @@ -24,7 +24,8 @@ message GeneralProposal { bytes Veto = 7 [(gogoproto.jsontag) = "Veto", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes Abstain = 8 [(gogoproto.jsontag) = "Abstain", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bool Passed = 9 [(gogoproto.jsontag) = "Passed"]; - bool Closed = 12 [(gogoproto.jsontag) = "Closed"]; + bool Closed = 10 [(gogoproto.jsontag) = "Closed"]; + bytes IssuerAddress = 11 [(gogoproto.jsontag) = "IssuerAddress"]; } message GovernanceConfig { @@ -41,3 +42,7 @@ message GovernanceConfigV2 { bytes MinVetoThreshold = 3 [(gogoproto.jsontag) = "MinVetoThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes ProposalFee = 4 [(gogoproto.jsontag) = "ProposalFee", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; } + +message OngoingVotedList { + repeated uint64 ProposalNonces = 1 [(gogoproto.jsontag) = "ProposalNonces"]; +} \ No newline at end of file From 132fe16c310ad3ddc1fe8d8bf483dfcb4def439a Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 16 Jan 2023 15:21:22 +0200 Subject: [PATCH 123/335] - regenerated proto struct --- vm/systemSmartContracts/governance.pb.go | 2137 +++++----------------- 1 file changed, 410 insertions(+), 1727 deletions(-) diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 3860f68fa2e..a24fde62110 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -32,21 +32,24 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type VoteValueType int32 const ( - Yes VoteValueType = 0 - No VoteValueType = 1 - Veto VoteValueType = 2 + Yes VoteValueType = 0 + No VoteValueType = 1 + Veto VoteValueType = 2 + Abstain VoteValueType = 3 ) var VoteValueType_name = map[int32]string{ 0: "Yes", 1: "No", 2: "Veto", + 3: "Abstain", } var VoteValueType_value = map[string]int32{ - "Yes": 0, - "No": 1, - "Veto": 2, + "Yes": 0, + "No": 1, + "Veto": 2, + "Abstain": 3, } func (VoteValueType) EnumDescriptor() ([]byte, []int) { @@ -54,17 +57,17 @@ func (VoteValueType) EnumDescriptor() ([]byte, []int) { } type GeneralProposal struct { - IssuerAddress []byte `protobuf:"bytes,1,opt,name=IssuerAddress,proto3" json:"IssuerAddress"` + Nonce uint64 `protobuf:"varint,1,opt,name=Nonce,proto3" json:"Nonce"` CommitHash []byte `protobuf:"bytes,2,opt,name=CommitHash,proto3" json:"CommitHash"` StartVoteNonce uint64 `protobuf:"varint,3,opt,name=StartVoteNonce,proto3" json:"StartVoteNonce"` EndVoteNonce uint64 `protobuf:"varint,4,opt,name=EndVoteNonce,proto3" json:"EndVoteNonce"` Yes *math_big.Int `protobuf:"bytes,5,opt,name=Yes,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Yes"` No *math_big.Int `protobuf:"bytes,6,opt,name=No,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"No"` Veto *math_big.Int `protobuf:"bytes,7,opt,name=Veto,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Veto"` - Passed bool `protobuf:"varint,8,opt,name=Passed,proto3" json:"Passed"` - Votes [][]byte `protobuf:"bytes,9,rep,name=Votes,proto3" json:"Votes"` - TopReference []byte `protobuf:"bytes,10,opt,name=TopReference,proto3" json:"TopReference"` - Closed bool `protobuf:"varint,11,opt,name=Closed,proto3" json:"Closed"` + Abstain *math_big.Int `protobuf:"bytes,8,opt,name=Abstain,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Abstain"` + Passed bool `protobuf:"varint,9,opt,name=Passed,proto3" json:"Passed"` + Closed bool `protobuf:"varint,10,opt,name=Closed,proto3" json:"Closed"` + IssuerAddress []byte `protobuf:"bytes,11,opt,name=IssuerAddress,proto3" json:"IssuerAddress"` } func (m *GeneralProposal) Reset() { *m = GeneralProposal{} } @@ -95,11 +98,11 @@ func (m *GeneralProposal) XXX_DiscardUnknown() { var xxx_messageInfo_GeneralProposal proto.InternalMessageInfo -func (m *GeneralProposal) GetIssuerAddress() []byte { +func (m *GeneralProposal) GetNonce() uint64 { if m != nil { - return m.IssuerAddress + return m.Nonce } - return nil + return 0 } func (m *GeneralProposal) GetCommitHash() []byte { @@ -144,25 +147,18 @@ func (m *GeneralProposal) GetVeto() *math_big.Int { return nil } -func (m *GeneralProposal) GetPassed() bool { - if m != nil { - return m.Passed - } - return false -} - -func (m *GeneralProposal) GetVotes() [][]byte { +func (m *GeneralProposal) GetAbstain() *math_big.Int { if m != nil { - return m.Votes + return m.Abstain } return nil } -func (m *GeneralProposal) GetTopReference() []byte { +func (m *GeneralProposal) GetPassed() bool { if m != nil { - return m.TopReference + return m.Passed } - return nil + return false } func (m *GeneralProposal) GetClosed() bool { @@ -172,104 +168,9 @@ func (m *GeneralProposal) GetClosed() bool { return false } -type WhiteListProposal struct { - WhiteListAddress []byte `protobuf:"bytes,1,opt,name=WhiteListAddress,proto3" json:"WhiteListAddress"` - ProposalStatus []byte `protobuf:"bytes,2,opt,name=ProposalStatus,proto3" json:"ProposalStatus"` -} - -func (m *WhiteListProposal) Reset() { *m = WhiteListProposal{} } -func (*WhiteListProposal) ProtoMessage() {} -func (*WhiteListProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_e18a03da5266c714, []int{1} -} -func (m *WhiteListProposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *WhiteListProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *WhiteListProposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_WhiteListProposal.Merge(m, src) -} -func (m *WhiteListProposal) XXX_Size() int { - return m.Size() -} -func (m *WhiteListProposal) XXX_DiscardUnknown() { - xxx_messageInfo_WhiteListProposal.DiscardUnknown(m) -} - -var xxx_messageInfo_WhiteListProposal proto.InternalMessageInfo - -func (m *WhiteListProposal) GetWhiteListAddress() []byte { - if m != nil { - return m.WhiteListAddress - } - return nil -} - -func (m *WhiteListProposal) GetProposalStatus() []byte { - if m != nil { - return m.ProposalStatus - } - return nil -} - -type HardForkProposal struct { - EpochToHardFork uint32 `protobuf:"varint,1,opt,name=EpochToHardFork,proto3" json:"EpochToHardFork"` - NewSoftwareVersion []byte `protobuf:"bytes,2,opt,name=NewSoftwareVersion,proto3" json:"NewSoftwareVersion"` - ProposalStatus []byte `protobuf:"bytes,3,opt,name=ProposalStatus,proto3" json:"ProposalStatus"` -} - -func (m *HardForkProposal) Reset() { *m = HardForkProposal{} } -func (*HardForkProposal) ProtoMessage() {} -func (*HardForkProposal) Descriptor() ([]byte, []int) { - return fileDescriptor_e18a03da5266c714, []int{2} -} -func (m *HardForkProposal) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *HardForkProposal) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *HardForkProposal) XXX_Merge(src proto.Message) { - xxx_messageInfo_HardForkProposal.Merge(m, src) -} -func (m *HardForkProposal) XXX_Size() int { - return m.Size() -} -func (m *HardForkProposal) XXX_DiscardUnknown() { - xxx_messageInfo_HardForkProposal.DiscardUnknown(m) -} - -var xxx_messageInfo_HardForkProposal proto.InternalMessageInfo - -func (m *HardForkProposal) GetEpochToHardFork() uint32 { - if m != nil { - return m.EpochToHardFork - } - return 0 -} - -func (m *HardForkProposal) GetNewSoftwareVersion() []byte { - if m != nil { - return m.NewSoftwareVersion - } - return nil -} - -func (m *HardForkProposal) GetProposalStatus() []byte { +func (m *GeneralProposal) GetIssuerAddress() []byte { if m != nil { - return m.ProposalStatus + return m.IssuerAddress } return nil } @@ -285,7 +186,7 @@ type GovernanceConfig struct { func (m *GovernanceConfig) Reset() { *m = GovernanceConfig{} } func (*GovernanceConfig) ProtoMessage() {} func (*GovernanceConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_e18a03da5266c714, []int{3} + return fileDescriptor_e18a03da5266c714, []int{1} } func (m *GovernanceConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -355,7 +256,7 @@ type GovernanceConfigV2 struct { func (m *GovernanceConfigV2) Reset() { *m = GovernanceConfigV2{} } func (*GovernanceConfigV2) ProtoMessage() {} func (*GovernanceConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_e18a03da5266c714, []int{4} + return fileDescriptor_e18a03da5266c714, []int{2} } func (m *GovernanceConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -408,87 +309,19 @@ func (m *GovernanceConfigV2) GetProposalFee() *math_big.Int { return nil } -type VoteDetails struct { - Value VoteValueType `protobuf:"varint,1,opt,name=Value,proto3,enum=proto.VoteValueType" json:"Value"` - Power *math_big.Int `protobuf:"bytes,2,opt,name=Power,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Power"` - Balance *math_big.Int `protobuf:"bytes,3,opt,name=Balance,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Balance"` - DelegatedTo []byte `protobuf:"bytes,4,opt,name=DelegatedTo,proto3" json:"DelegatedTo"` -} - -func (m *VoteDetails) Reset() { *m = VoteDetails{} } -func (*VoteDetails) ProtoMessage() {} -func (*VoteDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_e18a03da5266c714, []int{5} -} -func (m *VoteDetails) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *VoteDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil -} -func (m *VoteDetails) XXX_Merge(src proto.Message) { - xxx_messageInfo_VoteDetails.Merge(m, src) -} -func (m *VoteDetails) XXX_Size() int { - return m.Size() -} -func (m *VoteDetails) XXX_DiscardUnknown() { - xxx_messageInfo_VoteDetails.DiscardUnknown(m) -} - -var xxx_messageInfo_VoteDetails proto.InternalMessageInfo - -func (m *VoteDetails) GetValue() VoteValueType { - if m != nil { - return m.Value - } - return Yes -} - -func (m *VoteDetails) GetPower() *math_big.Int { - if m != nil { - return m.Power - } - return nil -} - -func (m *VoteDetails) GetBalance() *math_big.Int { - if m != nil { - return m.Balance - } - return nil -} - -func (m *VoteDetails) GetDelegatedTo() []byte { - if m != nil { - return m.DelegatedTo - } - return nil -} - -type VoteSet struct { - UsedPower *math_big.Int `protobuf:"bytes,1,opt,name=UsedPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` - UsedBalance *math_big.Int `protobuf:"bytes,2,opt,name=UsedBalance,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedBalance"` - TotalYes *math_big.Int `protobuf:"bytes,3,opt,name=TotalYes,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalYes"` - TotalNo *math_big.Int `protobuf:"bytes,4,opt,name=TotalNo,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalNo"` - TotalVeto *math_big.Int `protobuf:"bytes,5,opt,name=TotalVeto,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalVeto"` - VoteItems []*VoteDetails `protobuf:"bytes,6,rep,name=VoteItems,proto3" json:"VoteItems"` +type OngoingVotedList struct { + ProposalNonces []uint64 `protobuf:"varint,1,rep,packed,name=ProposalNonces,proto3" json:"ProposalNonces"` } -func (m *VoteSet) Reset() { *m = VoteSet{} } -func (*VoteSet) ProtoMessage() {} -func (*VoteSet) Descriptor() ([]byte, []int) { - return fileDescriptor_e18a03da5266c714, []int{6} +func (m *OngoingVotedList) Reset() { *m = OngoingVotedList{} } +func (*OngoingVotedList) ProtoMessage() {} +func (*OngoingVotedList) Descriptor() ([]byte, []int) { + return fileDescriptor_e18a03da5266c714, []int{3} } -func (m *VoteSet) XXX_Unmarshal(b []byte) error { +func (m *OngoingVotedList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *VoteSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *OngoingVotedList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) if err != nil { @@ -496,56 +329,21 @@ func (m *VoteSet) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { } return b[:n], nil } -func (m *VoteSet) XXX_Merge(src proto.Message) { - xxx_messageInfo_VoteSet.Merge(m, src) +func (m *OngoingVotedList) XXX_Merge(src proto.Message) { + xxx_messageInfo_OngoingVotedList.Merge(m, src) } -func (m *VoteSet) XXX_Size() int { +func (m *OngoingVotedList) XXX_Size() int { return m.Size() } -func (m *VoteSet) XXX_DiscardUnknown() { - xxx_messageInfo_VoteSet.DiscardUnknown(m) -} - -var xxx_messageInfo_VoteSet proto.InternalMessageInfo - -func (m *VoteSet) GetUsedPower() *math_big.Int { - if m != nil { - return m.UsedPower - } - return nil -} - -func (m *VoteSet) GetUsedBalance() *math_big.Int { - if m != nil { - return m.UsedBalance - } - return nil -} - -func (m *VoteSet) GetTotalYes() *math_big.Int { - if m != nil { - return m.TotalYes - } - return nil -} - -func (m *VoteSet) GetTotalNo() *math_big.Int { - if m != nil { - return m.TotalNo - } - return nil +func (m *OngoingVotedList) XXX_DiscardUnknown() { + xxx_messageInfo_OngoingVotedList.DiscardUnknown(m) } -func (m *VoteSet) GetTotalVeto() *math_big.Int { - if m != nil { - return m.TotalVeto - } - return nil -} +var xxx_messageInfo_OngoingVotedList proto.InternalMessageInfo -func (m *VoteSet) GetVoteItems() []*VoteDetails { +func (m *OngoingVotedList) GetProposalNonces() []uint64 { if m != nil { - return m.VoteItems + return m.ProposalNonces } return nil } @@ -553,83 +351,61 @@ func (m *VoteSet) GetVoteItems() []*VoteDetails { func init() { proto.RegisterEnum("proto.VoteValueType", VoteValueType_name, VoteValueType_value) proto.RegisterType((*GeneralProposal)(nil), "proto.GeneralProposal") - proto.RegisterType((*WhiteListProposal)(nil), "proto.WhiteListProposal") - proto.RegisterType((*HardForkProposal)(nil), "proto.HardForkProposal") proto.RegisterType((*GovernanceConfig)(nil), "proto.GovernanceConfig") proto.RegisterType((*GovernanceConfigV2)(nil), "proto.GovernanceConfigV2") - proto.RegisterType((*VoteDetails)(nil), "proto.VoteDetails") - proto.RegisterType((*VoteSet)(nil), "proto.VoteSet") + proto.RegisterType((*OngoingVotedList)(nil), "proto.OngoingVotedList") } func init() { proto.RegisterFile("governance.proto", fileDescriptor_e18a03da5266c714) } var fileDescriptor_e18a03da5266c714 = []byte{ - // 1028 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x6f, 0xe3, 0x44, - 0x14, 0x8f, 0x93, 0xb8, 0x7f, 0xa6, 0xe9, 0x36, 0x3b, 0x54, 0x28, 0xe2, 0x60, 0x47, 0x39, 0x45, - 0x8b, 0x9a, 0x88, 0x02, 0x42, 0x02, 0x21, 0xc0, 0xd9, 0x76, 0xb7, 0x12, 0x1b, 0xba, 0x93, 0x6c, - 0xf8, 0x23, 0x21, 0x34, 0x89, 0xa7, 0x89, 0x85, 0xed, 0x09, 0x33, 0x93, 0xed, 0x2e, 0x27, 0xae, - 0xdc, 0xe0, 0xc0, 0x95, 0x33, 0xe2, 0x0b, 0xf0, 0x15, 0x38, 0x96, 0x03, 0x52, 0x4f, 0x86, 0xa6, - 0x17, 0xf0, 0x69, 0x3f, 0x02, 0x9a, 0xb1, 0xe3, 0xd8, 0x49, 0x84, 0x38, 0x58, 0x9c, 0x66, 0xde, - 0xef, 0xd9, 0xef, 0x3d, 0xbf, 0xdf, 0xef, 0x8d, 0x07, 0x54, 0xc7, 0xf4, 0x29, 0x61, 0x3e, 0xf6, - 0x47, 0xa4, 0x35, 0x65, 0x54, 0x50, 0xa8, 0xab, 0xe5, 0x95, 0xa3, 0xb1, 0x23, 0x26, 0xb3, 0x61, - 0x6b, 0x44, 0xbd, 0xf6, 0x98, 0x8e, 0x69, 0x5b, 0xc1, 0xc3, 0xd9, 0x85, 0xb2, 0x94, 0xa1, 0x76, - 0xd1, 0x5b, 0x8d, 0x5f, 0x74, 0x70, 0xf0, 0x80, 0xf8, 0x84, 0x61, 0xf7, 0x9c, 0xd1, 0x29, 0xe5, - 0xd8, 0x85, 0x6f, 0x81, 0xfd, 0x33, 0xce, 0x67, 0x84, 0x7d, 0x60, 0xdb, 0x8c, 0x70, 0x5e, 0xd3, - 0xea, 0x5a, 0xb3, 0x62, 0xdd, 0x0d, 0x03, 0x33, 0xeb, 0x40, 0x59, 0x13, 0xb6, 0x00, 0xe8, 0x50, - 0xcf, 0x73, 0xc4, 0x43, 0xcc, 0x27, 0xb5, 0xa2, 0x7a, 0xeb, 0x4e, 0x18, 0x98, 0x29, 0x14, 0xa5, - 0xf6, 0xf0, 0x6d, 0x70, 0xa7, 0x27, 0x30, 0x13, 0x03, 0x2a, 0x48, 0x97, 0xfa, 0x23, 0x52, 0x2b, - 0xd5, 0xb5, 0x66, 0xd9, 0x82, 0x61, 0x60, 0xae, 0x78, 0xd0, 0x8a, 0x0d, 0xdf, 0x00, 0x95, 0x13, - 0xdf, 0x5e, 0xbe, 0x59, 0x56, 0x6f, 0x56, 0xc3, 0xc0, 0xcc, 0xe0, 0x28, 0x63, 0xc1, 0x21, 0x28, - 0x7d, 0x4a, 0x78, 0x4d, 0x57, 0xa5, 0x9d, 0x87, 0x81, 0x29, 0xcd, 0x9f, 0xff, 0x30, 0x4f, 0x3c, - 0x2c, 0x26, 0xed, 0xa1, 0x33, 0x6e, 0x9d, 0xf9, 0xe2, 0x9d, 0x54, 0x0b, 0xbd, 0x99, 0x2b, 0x9c, - 0xa7, 0x84, 0xf1, 0x67, 0x6d, 0xef, 0xd9, 0xd1, 0x68, 0x82, 0x1d, 0xff, 0x68, 0x44, 0x19, 0x39, - 0x1a, 0xd3, 0xb6, 0x8d, 0x05, 0x6e, 0x59, 0xce, 0xf8, 0xcc, 0x17, 0x1d, 0xcc, 0x05, 0x61, 0x48, - 0x46, 0x83, 0x5f, 0x80, 0x62, 0x97, 0xd6, 0xb6, 0x54, 0x8a, 0x8f, 0xc2, 0xc0, 0x2c, 0x76, 0x69, - 0x7e, 0x19, 0x8a, 0x5d, 0x0a, 0x09, 0x28, 0x0f, 0x88, 0xa0, 0xb5, 0x6d, 0x95, 0xe2, 0x71, 0x18, - 0x98, 0xca, 0xce, 0x2f, 0x89, 0x0a, 0x07, 0x1b, 0x60, 0xeb, 0x1c, 0x73, 0x4e, 0xec, 0xda, 0x4e, - 0x5d, 0x6b, 0xee, 0x58, 0x20, 0x0c, 0xcc, 0x18, 0x41, 0xf1, 0x0a, 0x4d, 0xa0, 0xcb, 0xe6, 0xf2, - 0xda, 0x6e, 0xbd, 0xd4, 0xac, 0x58, 0xbb, 0x61, 0x60, 0x46, 0x00, 0x8a, 0x16, 0x49, 0x53, 0x9f, - 0x4e, 0x11, 0xb9, 0x20, 0x8c, 0x48, 0x9a, 0x80, 0xaa, 0x59, 0xd1, 0x94, 0xc6, 0x51, 0xc6, 0x92, - 0xa9, 0x3b, 0x2e, 0x95, 0xa9, 0xf7, 0x96, 0xa9, 0x23, 0x04, 0xc5, 0x6b, 0xe3, 0x7b, 0x0d, 0xdc, - 0xfd, 0x78, 0xe2, 0x08, 0xf2, 0xa1, 0xc3, 0x45, 0xa2, 0xdd, 0xf7, 0x41, 0x35, 0x01, 0xb3, 0xf2, - 0x3d, 0x0c, 0x03, 0x73, 0xcd, 0x87, 0xd6, 0x10, 0x29, 0xca, 0x45, 0xb4, 0x9e, 0xc0, 0x62, 0xc6, - 0x63, 0x21, 0x2b, 0x51, 0x66, 0x3d, 0x68, 0xc5, 0x6e, 0xfc, 0xae, 0x81, 0xea, 0x43, 0xcc, 0xec, - 0x53, 0xca, 0xbe, 0x4c, 0x4a, 0x7a, 0x17, 0x1c, 0x9c, 0x4c, 0xe9, 0x68, 0xd2, 0xa7, 0x0b, 0x97, - 0xaa, 0x68, 0xdf, 0x7a, 0x29, 0x0c, 0xcc, 0x55, 0x17, 0x5a, 0x05, 0xe0, 0x29, 0x80, 0x5d, 0x72, - 0xd9, 0xa3, 0x17, 0xe2, 0x12, 0x33, 0x32, 0x20, 0x8c, 0x3b, 0xd4, 0x8f, 0x6b, 0x7a, 0x39, 0x0c, - 0xcc, 0x0d, 0x5e, 0xb4, 0x01, 0xdb, 0xf0, 0x5d, 0xa5, 0xff, 0xfc, 0x5d, 0x7f, 0x17, 0x41, 0xf5, - 0x41, 0x72, 0xe0, 0x74, 0xa8, 0x7f, 0xe1, 0x8c, 0x61, 0x13, 0xec, 0x74, 0x67, 0x5e, 0x97, 0xda, - 0x24, 0x6a, 0x71, 0xc9, 0xaa, 0x84, 0x81, 0x99, 0x60, 0x28, 0xd9, 0xc1, 0x57, 0xc1, 0xee, 0x23, - 0xc7, 0x7f, 0x3c, 0xa3, 0x6c, 0xe6, 0xa9, 0xca, 0x75, 0x6b, 0x3f, 0x0c, 0xcc, 0x25, 0x88, 0x96, - 0x5b, 0xc9, 0xe0, 0x23, 0xc7, 0x97, 0xfa, 0xea, 0x4f, 0x18, 0xe1, 0x13, 0xea, 0xda, 0xaa, 0x52, - 0x3d, 0x62, 0x70, 0xd5, 0x87, 0xd6, 0x90, 0x38, 0x82, 0xd4, 0xf0, 0x32, 0x42, 0x39, 0x13, 0x21, - 0xe3, 0x43, 0x6b, 0x08, 0xfc, 0x1a, 0xec, 0x2d, 0x3a, 0x70, 0x4a, 0x48, 0x7c, 0x5c, 0x7c, 0x12, - 0x06, 0x66, 0x1a, 0xce, 0x6f, 0xde, 0xd2, 0x51, 0x1b, 0x3f, 0x96, 0x01, 0x5c, 0xed, 0xf5, 0xe0, - 0x18, 0x8a, 0x74, 0x0f, 0x23, 0x45, 0x0f, 0x32, 0x3d, 0xcc, 0xaf, 0x9c, 0x14, 0x19, 0xdf, 0x6a, - 0x1b, 0xd8, 0x88, 0xb4, 0xf7, 0xf9, 0x26, 0x36, 0xf2, 0x2b, 0x62, 0x9d, 0xd6, 0xb8, 0x96, 0x2c, - 0xaf, 0xa5, 0x4c, 0x2d, 0x19, 0x5f, 0xbe, 0xb5, 0xfc, 0xab, 0x40, 0xca, 0xff, 0xa7, 0x40, 0x7e, - 0x2b, 0x82, 0x3d, 0x79, 0xb8, 0xde, 0x27, 0x02, 0x3b, 0x2e, 0x87, 0x6f, 0x02, 0x7d, 0x80, 0xdd, - 0x19, 0x51, 0xaa, 0xb8, 0x73, 0x7c, 0x18, 0xfd, 0xd9, 0x5b, 0xf2, 0x11, 0x85, 0xf7, 0x9f, 0x4f, - 0x49, 0x7c, 0x32, 0x4b, 0x13, 0x45, 0x0b, 0x9c, 0x00, 0xfd, 0x9c, 0x5e, 0x12, 0x16, 0xd3, 0x89, - 0xe4, 0x03, 0x0a, 0xc8, 0xaf, 0xec, 0x28, 0x1e, 0xf4, 0xc1, 0xb6, 0x85, 0x5d, 0xbc, 0xf8, 0xbf, - 0x57, 0xac, 0x7e, 0x18, 0x98, 0x0b, 0x28, 0xbf, 0x6c, 0x8b, 0x88, 0xf0, 0x35, 0xb0, 0x77, 0x9f, - 0xb8, 0x64, 0x8c, 0x05, 0xb1, 0xfb, 0x34, 0x26, 0xe7, 0x40, 0x92, 0x93, 0x82, 0x51, 0xda, 0x68, - 0xfc, 0xa0, 0x83, 0x6d, 0xd9, 0xb0, 0x1e, 0x11, 0x72, 0xd2, 0x9e, 0x70, 0x62, 0x47, 0xcd, 0x49, - 0x4d, 0x5a, 0x02, 0xe6, 0x38, 0x69, 0x49, 0x4c, 0xa9, 0x28, 0x69, 0x2c, 0x1a, 0x55, 0x5c, 0x2a, - 0x2a, 0x05, 0xe7, 0xa8, 0xa8, 0x54, 0x54, 0xf8, 0x15, 0xd8, 0xe9, 0x53, 0x81, 0x5d, 0x79, 0x35, - 0x8a, 0x18, 0x7a, 0x22, 0x4f, 0xf2, 0x05, 0x96, 0x5f, 0xd6, 0x24, 0xa4, 0xd4, 0x84, 0xda, 0x77, - 0x17, 0xfc, 0x28, 0x4d, 0xc4, 0x50, 0x8e, 0x9a, 0x88, 0x23, 0x4a, 0x52, 0xd5, 0x56, 0x5d, 0x9c, - 0xf4, 0x25, 0xa9, 0x09, 0x98, 0x23, 0xa9, 0x49, 0x4c, 0xf8, 0x1e, 0xd8, 0x95, 0xaa, 0x3a, 0x13, - 0xc4, 0xe3, 0xb5, 0xad, 0x7a, 0xa9, 0xb9, 0x77, 0x0c, 0x53, 0xe3, 0x19, 0x4f, 0x70, 0xf4, 0x33, - 0x4c, 0x1e, 0x44, 0xcb, 0xed, 0xbd, 0x7b, 0x60, 0x3f, 0x33, 0xc7, 0x70, 0x5b, 0x5d, 0x60, 0xab, - 0x05, 0xb8, 0x25, 0x6f, 0x99, 0x55, 0x0d, 0xee, 0x44, 0x97, 0xc1, 0x6a, 0xd1, 0xea, 0x5e, 0xdd, - 0x18, 0x85, 0xeb, 0x1b, 0xa3, 0xf0, 0xe2, 0xc6, 0xd0, 0xbe, 0x99, 0x1b, 0xda, 0x4f, 0x73, 0x43, - 0xfb, 0x75, 0x6e, 0x68, 0x57, 0x73, 0x43, 0xbb, 0x9e, 0x1b, 0xda, 0x9f, 0x73, 0x43, 0xfb, 0x6b, - 0x6e, 0x14, 0x5e, 0xcc, 0x0d, 0xed, 0xbb, 0x5b, 0xa3, 0x70, 0x75, 0x6b, 0x14, 0xae, 0x6f, 0x8d, - 0xc2, 0x67, 0x87, 0xfc, 0x39, 0x17, 0xc4, 0xeb, 0x79, 0x98, 0x89, 0x0e, 0xf5, 0x05, 0xc3, 0x23, - 0xc1, 0x87, 0x5b, 0xaa, 0xd0, 0xd7, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0xad, 0x5b, 0xe6, 0xfd, - 0x6b, 0x0c, 0x00, 0x00, + // 734 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xbd, 0x6e, 0xdb, 0x3a, + 0x14, 0x36, 0xfd, 0x17, 0x87, 0xf9, 0xb9, 0xba, 0x44, 0x06, 0xe1, 0x0e, 0x62, 0xe0, 0xc9, 0xb8, + 0x17, 0xb6, 0x81, 0xdb, 0x02, 0x01, 0xda, 0xa5, 0x91, 0x91, 0xa6, 0x01, 0x1a, 0x25, 0x51, 0x02, + 0xa3, 0x2d, 0x50, 0x14, 0xb4, 0xc5, 0xc8, 0x02, 0x2c, 0x32, 0x10, 0xa9, 0x20, 0xe9, 0xd4, 0xb5, + 0x5b, 0x9f, 0xa0, 0x73, 0xd1, 0x27, 0xe9, 0x98, 0x31, 0x93, 0xda, 0x28, 0x4b, 0xab, 0x29, 0x7d, + 0x83, 0x42, 0xf4, 0xaf, 0xec, 0xa0, 0x93, 0xd1, 0x89, 0x3c, 0xdf, 0xa1, 0xbe, 0xf3, 0x89, 0xe7, + 0xf0, 0x1c, 0xa8, 0xb9, 0xfc, 0x9c, 0x06, 0x8c, 0xb0, 0x2e, 0x6d, 0x9c, 0x05, 0x5c, 0x72, 0x54, + 0x52, 0xcb, 0x3f, 0x75, 0xd7, 0x93, 0xbd, 0xb0, 0xd3, 0xe8, 0x72, 0xbf, 0xe9, 0x72, 0x97, 0x37, + 0x15, 0xdc, 0x09, 0x4f, 0x95, 0xa5, 0x0c, 0xb5, 0x1b, 0x7c, 0x55, 0xfd, 0x59, 0x82, 0x7f, 0xed, + 0x52, 0x46, 0x03, 0xd2, 0x3f, 0x0c, 0xf8, 0x19, 0x17, 0xa4, 0x8f, 0x30, 0x2c, 0x59, 0x9c, 0x75, + 0xa9, 0x0e, 0x36, 0x41, 0xad, 0x68, 0x2e, 0x27, 0x11, 0x1e, 0x00, 0xf6, 0x60, 0x41, 0x0d, 0x08, + 0x5b, 0xdc, 0xf7, 0x3d, 0xf9, 0x8c, 0x88, 0x9e, 0x9e, 0xdf, 0x04, 0xb5, 0x55, 0x73, 0x3d, 0x89, + 0xf0, 0x14, 0x6a, 0x4f, 0xed, 0xd1, 0x23, 0xb8, 0x7e, 0x2c, 0x49, 0x20, 0xdb, 0x5c, 0xd2, 0x01, + 0x73, 0x41, 0x31, 0xa3, 0x24, 0xc2, 0x33, 0x1e, 0x7b, 0xc6, 0x46, 0x0f, 0xe1, 0xea, 0x0e, 0x73, + 0x26, 0x5f, 0x16, 0xd5, 0x97, 0x5a, 0x12, 0xe1, 0x0c, 0x6e, 0x67, 0x2c, 0xd4, 0x81, 0x85, 0x97, + 0x54, 0xe8, 0x25, 0x25, 0xed, 0x30, 0x89, 0x70, 0x6a, 0x7e, 0xfe, 0x8a, 0x77, 0x7c, 0x22, 0x7b, + 0xcd, 0x8e, 0xe7, 0x36, 0xf6, 0x98, 0x7c, 0x3c, 0x75, 0x55, 0x7e, 0xd8, 0x97, 0xde, 0x39, 0x0d, + 0xc4, 0x45, 0xd3, 0xbf, 0xa8, 0x77, 0x7b, 0xc4, 0x63, 0xf5, 0x2e, 0x0f, 0x68, 0xdd, 0xe5, 0x4d, + 0x87, 0x48, 0xd2, 0x30, 0x3d, 0x77, 0x8f, 0xc9, 0x16, 0x11, 0x92, 0x06, 0x76, 0xca, 0x86, 0xde, + 0xc0, 0xbc, 0xc5, 0xf5, 0xb2, 0x0a, 0x71, 0x90, 0x44, 0x38, 0x6f, 0xf1, 0xc5, 0x45, 0xc8, 0x5b, + 0x1c, 0x51, 0x58, 0x6c, 0x53, 0xc9, 0xf5, 0x25, 0x15, 0xe2, 0x28, 0x89, 0xb0, 0xb2, 0x17, 0x17, + 0x44, 0xd1, 0x21, 0x06, 0x97, 0xb6, 0x3b, 0x42, 0x12, 0x8f, 0xe9, 0x15, 0x15, 0xe9, 0x24, 0x89, + 0xf0, 0x08, 0x5a, 0x5c, 0xb0, 0x11, 0x23, 0xaa, 0xc2, 0xf2, 0x21, 0x11, 0x82, 0x3a, 0xfa, 0xf2, + 0x26, 0xa8, 0x55, 0x4c, 0x98, 0x44, 0x78, 0x88, 0xd8, 0xc3, 0x35, 0x3d, 0xd3, 0xea, 0xf3, 0xf4, + 0x0c, 0x9c, 0x9c, 0x19, 0x20, 0xf6, 0x70, 0x45, 0x5b, 0x70, 0x6d, 0x4f, 0x88, 0x90, 0x06, 0xdb, + 0x8e, 0x13, 0x50, 0x21, 0xf4, 0x15, 0xa5, 0xfe, 0xef, 0x24, 0xc2, 0x59, 0x87, 0x9d, 0x35, 0xab, + 0x3f, 0xf2, 0x50, 0xdb, 0x1d, 0x3f, 0x9f, 0x16, 0x67, 0xa7, 0x9e, 0x8b, 0x6a, 0xb0, 0x62, 0x85, + 0xbe, 0xc5, 0x1d, 0x2a, 0x54, 0xdd, 0x17, 0xcc, 0xd5, 0x24, 0xc2, 0x63, 0xcc, 0x1e, 0xef, 0xd0, + 0x7f, 0x70, 0x79, 0xdf, 0x63, 0x47, 0x21, 0x0f, 0x42, 0x5f, 0x15, 0x7f, 0xc9, 0x5c, 0x4b, 0x22, + 0x3c, 0x01, 0xed, 0xc9, 0x16, 0x3d, 0x81, 0xda, 0xbe, 0xc7, 0xd2, 0xbf, 0x3a, 0xe9, 0x05, 0x54, + 0xf4, 0x78, 0xdf, 0x51, 0xc5, 0x5f, 0x32, 0x37, 0x92, 0x08, 0xcf, 0xf9, 0xec, 0x39, 0x64, 0xc8, + 0x90, 0x66, 0x6a, 0xc2, 0x50, 0xcc, 0x30, 0x64, 0x7c, 0xf6, 0x1c, 0x82, 0xde, 0xc2, 0x95, 0xd1, + 0xdb, 0x7e, 0x4a, 0xe9, 0xf0, 0x51, 0xbc, 0x48, 0x22, 0x3c, 0x0d, 0x2f, 0x2e, 0xd1, 0xd3, 0xac, + 0xd5, 0x8f, 0x45, 0x88, 0x66, 0xef, 0xba, 0xfd, 0x3f, 0x92, 0xd3, 0x77, 0x08, 0x94, 0xa0, 0x76, + 0xe6, 0x0e, 0x17, 0x27, 0x67, 0x2a, 0x19, 0xef, 0xc1, 0x3d, 0xd9, 0x18, 0xb4, 0xaf, 0xd7, 0xf7, + 0x65, 0x63, 0x71, 0x22, 0xe6, 0xd3, 0x3a, 0xd4, 0x92, 0xcd, 0x6b, 0x21, 0xa3, 0x25, 0xe3, 0x5b, + 0xac, 0x96, 0xdf, 0x16, 0x48, 0xf1, 0x4f, 0x16, 0x88, 0x05, 0xb5, 0x03, 0xe6, 0x72, 0x8f, 0xb9, + 0x69, 0xf7, 0x76, 0x9e, 0x7b, 0x42, 0xa6, 0xf3, 0x62, 0x74, 0x44, 0xb5, 0xf3, 0xf4, 0x45, 0x16, + 0x46, 0xf3, 0x22, 0xeb, 0xb1, 0x67, 0xec, 0x7f, 0xb7, 0xe0, 0x5a, 0x4a, 0xd4, 0x26, 0xfd, 0x90, + 0x9e, 0x5c, 0x9e, 0x51, 0xb4, 0xa4, 0x46, 0x81, 0x96, 0x43, 0xe5, 0xb4, 0x5f, 0x6b, 0x00, 0x55, + 0x06, 0x6d, 0x55, 0xcb, 0xa3, 0x95, 0x71, 0xe7, 0xd3, 0x0a, 0xa6, 0x75, 0x75, 0x63, 0xe4, 0xae, + 0x6f, 0x8c, 0xdc, 0xdd, 0x8d, 0x01, 0xde, 0xc5, 0x06, 0xf8, 0x14, 0x1b, 0xe0, 0x4b, 0x6c, 0x80, + 0xab, 0xd8, 0x00, 0xd7, 0xb1, 0x01, 0xbe, 0xc5, 0x06, 0xf8, 0x1e, 0x1b, 0xb9, 0xbb, 0xd8, 0x00, + 0x1f, 0x6e, 0x8d, 0xdc, 0xd5, 0xad, 0x91, 0xbb, 0xbe, 0x35, 0x72, 0xaf, 0x36, 0xc4, 0xa5, 0x90, + 0xd4, 0x3f, 0xf6, 0x49, 0x20, 0x5b, 0x9c, 0xc9, 0x80, 0x74, 0xa5, 0xe8, 0x94, 0xd5, 0x80, 0x7d, + 0xf0, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x17, 0xda, 0x44, 0xaa, 0x07, 0x00, 0x00, } func (x VoteValueType) String() string { @@ -658,7 +434,7 @@ func (this *GeneralProposal) Equal(that interface{}) bool { } else if this == nil { return false } - if !bytes.Equal(this.IssuerAddress, that1.IssuerAddress) { + if this.Nonce != that1.Nonce { return false } if !bytes.Equal(this.CommitHash, that1.CommitHash) { @@ -688,78 +464,19 @@ func (this *GeneralProposal) Equal(that interface{}) bool { return false } } - if this.Passed != that1.Passed { - return false - } - if len(this.Votes) != len(that1.Votes) { - return false - } - for i := range this.Votes { - if !bytes.Equal(this.Votes[i], that1.Votes[i]) { + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if !__caster.Equal(this.Abstain, that1.Abstain) { return false } } - if !bytes.Equal(this.TopReference, that1.TopReference) { + if this.Passed != that1.Passed { return false } if this.Closed != that1.Closed { return false } - return true -} -func (this *WhiteListProposal) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*WhiteListProposal) - if !ok { - that2, ok := that.(WhiteListProposal) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if !bytes.Equal(this.WhiteListAddress, that1.WhiteListAddress) { - return false - } - if !bytes.Equal(this.ProposalStatus, that1.ProposalStatus) { - return false - } - return true -} -func (this *HardForkProposal) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*HardForkProposal) - if !ok { - that2, ok := that.(HardForkProposal) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.EpochToHardFork != that1.EpochToHardFork { - return false - } - if !bytes.Equal(this.NewSoftwareVersion, that1.NewSoftwareVersion) { - return false - } - if !bytes.Equal(this.ProposalStatus, that1.ProposalStatus) { + if !bytes.Equal(this.IssuerAddress, that1.IssuerAddress) { return false } return true @@ -848,53 +565,14 @@ func (this *GovernanceConfigV2) Equal(that interface{}) bool { } return true } -func (this *VoteDetails) Equal(that interface{}) bool { - if that == nil { - return this == nil - } - - that1, ok := that.(*VoteDetails) - if !ok { - that2, ok := that.(VoteDetails) - if ok { - that1 = &that2 - } else { - return false - } - } - if that1 == nil { - return this == nil - } else if this == nil { - return false - } - if this.Value != that1.Value { - return false - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.Power, that1.Power) { - return false - } - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.Balance, that1.Balance) { - return false - } - } - if !bytes.Equal(this.DelegatedTo, that1.DelegatedTo) { - return false - } - return true -} -func (this *VoteSet) Equal(that interface{}) bool { +func (this *OngoingVotedList) Equal(that interface{}) bool { if that == nil { return this == nil } - that1, ok := that.(*VoteSet) + that1, ok := that.(*OngoingVotedList) if !ok { - that2, ok := that.(VoteSet) + that2, ok := that.(OngoingVotedList) if ok { that1 = &that2 } else { @@ -906,41 +584,11 @@ func (this *VoteSet) Equal(that interface{}) bool { } else if this == nil { return false } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.UsedPower, that1.UsedPower) { - return false - } - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.UsedBalance, that1.UsedBalance) { - return false - } - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.TotalYes, that1.TotalYes) { - return false - } - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.TotalNo, that1.TotalNo) { - return false - } - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.TotalVeto, that1.TotalVeto) { - return false - } - } - if len(this.VoteItems) != len(that1.VoteItems) { + if len(this.ProposalNonces) != len(that1.ProposalNonces) { return false } - for i := range this.VoteItems { - if !this.VoteItems[i].Equal(that1.VoteItems[i]) { + for i := range this.ProposalNonces { + if this.ProposalNonces[i] != that1.ProposalNonces[i] { return false } } @@ -952,44 +600,21 @@ func (this *GeneralProposal) GoString() string { } s := make([]string, 0, 15) s = append(s, "&systemSmartContracts.GeneralProposal{") - s = append(s, "IssuerAddress: "+fmt.Sprintf("%#v", this.IssuerAddress)+",\n") + s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") s = append(s, "CommitHash: "+fmt.Sprintf("%#v", this.CommitHash)+",\n") s = append(s, "StartVoteNonce: "+fmt.Sprintf("%#v", this.StartVoteNonce)+",\n") s = append(s, "EndVoteNonce: "+fmt.Sprintf("%#v", this.EndVoteNonce)+",\n") s = append(s, "Yes: "+fmt.Sprintf("%#v", this.Yes)+",\n") s = append(s, "No: "+fmt.Sprintf("%#v", this.No)+",\n") s = append(s, "Veto: "+fmt.Sprintf("%#v", this.Veto)+",\n") + s = append(s, "Abstain: "+fmt.Sprintf("%#v", this.Abstain)+",\n") s = append(s, "Passed: "+fmt.Sprintf("%#v", this.Passed)+",\n") - s = append(s, "Votes: "+fmt.Sprintf("%#v", this.Votes)+",\n") - s = append(s, "TopReference: "+fmt.Sprintf("%#v", this.TopReference)+",\n") s = append(s, "Closed: "+fmt.Sprintf("%#v", this.Closed)+",\n") + s = append(s, "IssuerAddress: "+fmt.Sprintf("%#v", this.IssuerAddress)+",\n") s = append(s, "}") return strings.Join(s, "") } -func (this *WhiteListProposal) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 6) - s = append(s, "&systemSmartContracts.WhiteListProposal{") - s = append(s, "WhiteListAddress: "+fmt.Sprintf("%#v", this.WhiteListAddress)+",\n") - s = append(s, "ProposalStatus: "+fmt.Sprintf("%#v", this.ProposalStatus)+",\n") - s = append(s, "}") - return strings.Join(s, "") -} -func (this *HardForkProposal) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 7) - s = append(s, "&systemSmartContracts.HardForkProposal{") - s = append(s, "EpochToHardFork: "+fmt.Sprintf("%#v", this.EpochToHardFork)+",\n") - s = append(s, "NewSoftwareVersion: "+fmt.Sprintf("%#v", this.NewSoftwareVersion)+",\n") - s = append(s, "ProposalStatus: "+fmt.Sprintf("%#v", this.ProposalStatus)+",\n") - s = append(s, "}") - return strings.Join(s, "") -} -func (this *GovernanceConfig) GoString() string { +func (this *GovernanceConfig) GoString() string { if this == nil { return "nil" } @@ -1016,33 +641,13 @@ func (this *GovernanceConfigV2) GoString() string { s = append(s, "}") return strings.Join(s, "") } -func (this *VoteDetails) GoString() string { - if this == nil { - return "nil" - } - s := make([]string, 0, 8) - s = append(s, "&systemSmartContracts.VoteDetails{") - s = append(s, "Value: "+fmt.Sprintf("%#v", this.Value)+",\n") - s = append(s, "Power: "+fmt.Sprintf("%#v", this.Power)+",\n") - s = append(s, "Balance: "+fmt.Sprintf("%#v", this.Balance)+",\n") - s = append(s, "DelegatedTo: "+fmt.Sprintf("%#v", this.DelegatedTo)+",\n") - s = append(s, "}") - return strings.Join(s, "") -} -func (this *VoteSet) GoString() string { +func (this *OngoingVotedList) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 10) - s = append(s, "&systemSmartContracts.VoteSet{") - s = append(s, "UsedPower: "+fmt.Sprintf("%#v", this.UsedPower)+",\n") - s = append(s, "UsedBalance: "+fmt.Sprintf("%#v", this.UsedBalance)+",\n") - s = append(s, "TotalYes: "+fmt.Sprintf("%#v", this.TotalYes)+",\n") - s = append(s, "TotalNo: "+fmt.Sprintf("%#v", this.TotalNo)+",\n") - s = append(s, "TotalVeto: "+fmt.Sprintf("%#v", this.TotalVeto)+",\n") - if this.VoteItems != nil { - s = append(s, "VoteItems: "+fmt.Sprintf("%#v", this.VoteItems)+",\n") - } + s := make([]string, 0, 5) + s = append(s, "&systemSmartContracts.OngoingVotedList{") + s = append(s, "ProposalNonces: "+fmt.Sprintf("%#v", this.ProposalNonces)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -1074,6 +679,13 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.IssuerAddress) > 0 { + i -= len(m.IssuerAddress) + copy(dAtA[i:], m.IssuerAddress) + i = encodeVarintGovernance(dAtA, i, uint64(len(m.IssuerAddress))) + i-- + dAtA[i] = 0x5a + } if m.Closed { i-- if m.Closed { @@ -1082,23 +694,7 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x58 - } - if len(m.TopReference) > 0 { - i -= len(m.TopReference) - copy(dAtA[i:], m.TopReference) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.TopReference))) - i-- - dAtA[i] = 0x52 - } - if len(m.Votes) > 0 { - for iNdEx := len(m.Votes) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Votes[iNdEx]) - copy(dAtA[i:], m.Votes[iNdEx]) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.Votes[iNdEx]))) - i-- - dAtA[i] = 0x4a - } + dAtA[i] = 0x50 } if m.Passed { i-- @@ -1108,8 +704,19 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x40 + dAtA[i] = 0x48 + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + size := __caster.Size(m.Abstain) + i -= size + if _, err := __caster.MarshalTo(m.Abstain, dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGovernance(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x42 { __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} size := __caster.Size(m.Veto) @@ -1160,89 +767,8 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.IssuerAddress) > 0 { - i -= len(m.IssuerAddress) - copy(dAtA[i:], m.IssuerAddress) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.IssuerAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *WhiteListProposal) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *WhiteListProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WhiteListProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ProposalStatus) > 0 { - i -= len(m.ProposalStatus) - copy(dAtA[i:], m.ProposalStatus) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.ProposalStatus))) - i-- - dAtA[i] = 0x12 - } - if len(m.WhiteListAddress) > 0 { - i -= len(m.WhiteListAddress) - copy(dAtA[i:], m.WhiteListAddress) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.WhiteListAddress))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *HardForkProposal) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *HardForkProposal) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *HardForkProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.ProposalStatus) > 0 { - i -= len(m.ProposalStatus) - copy(dAtA[i:], m.ProposalStatus) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.ProposalStatus))) - i-- - dAtA[i] = 0x1a - } - if len(m.NewSoftwareVersion) > 0 { - i -= len(m.NewSoftwareVersion) - copy(dAtA[i:], m.NewSoftwareVersion) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.NewSoftwareVersion))) - i-- - dAtA[i] = 0x12 - } - if m.EpochToHardFork != 0 { - i = encodeVarintGovernance(dAtA, i, uint64(m.EpochToHardFork)) + if m.Nonce != 0 { + i = encodeVarintGovernance(dAtA, i, uint64(m.Nonce)) i-- dAtA[i] = 0x8 } @@ -1370,7 +896,7 @@ func (m *GovernanceConfigV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *VoteDetails) Marshal() (dAtA []byte, err error) { +func (m *OngoingVotedList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1380,142 +906,34 @@ func (m *VoteDetails) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *VoteDetails) MarshalTo(dAtA []byte) (int, error) { +func (m *OngoingVotedList) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *VoteDetails) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *OngoingVotedList) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.DelegatedTo) > 0 { - i -= len(m.DelegatedTo) - copy(dAtA[i:], m.DelegatedTo) - i = encodeVarintGovernance(dAtA, i, uint64(len(m.DelegatedTo))) - i-- - dAtA[i] = 0x22 - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.Balance) - i -= size - if _, err := __caster.MarshalTo(m.Balance, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.Power) - i -= size - if _, err := __caster.MarshalTo(m.Power, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - if m.Value != 0 { - i = encodeVarintGovernance(dAtA, i, uint64(m.Value)) + if len(m.ProposalNonces) > 0 { + dAtA2 := make([]byte, len(m.ProposalNonces)*10) + var j1 int + for _, num := range m.ProposalNonces { + for num >= 1<<7 { + dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j1++ + } + dAtA2[j1] = uint8(num) + j1++ + } + i -= j1 + copy(dAtA[i:], dAtA2[:j1]) + i = encodeVarintGovernance(dAtA, i, uint64(j1)) i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *VoteSet) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *VoteSet) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *VoteSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if len(m.VoteItems) > 0 { - for iNdEx := len(m.VoteItems) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.VoteItems[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGovernance(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.TotalVeto) - i -= size - if _, err := __caster.MarshalTo(m.TotalVeto, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.TotalNo) - i -= size - if _, err := __caster.MarshalTo(m.TotalNo, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.TotalYes) - i -= size - if _, err := __caster.MarshalTo(m.TotalYes, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.UsedBalance) - i -= size - if _, err := __caster.MarshalTo(m.UsedBalance, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.UsedPower) - i -= size - if _, err := __caster.MarshalTo(m.UsedPower, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) + dAtA[i] = 0xa } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -1536,9 +954,8 @@ func (m *GeneralProposal) Size() (n int) { } var l int _ = l - l = len(m.IssuerAddress) - if l > 0 { - n += 1 + l + sovGovernance(uint64(l)) + if m.Nonce != 0 { + n += 1 + sovGovernance(uint64(m.Nonce)) } l = len(m.CommitHash) if l > 0 { @@ -1565,56 +982,18 @@ func (m *GeneralProposal) Size() (n int) { l = __caster.Size(m.Veto) n += 1 + l + sovGovernance(uint64(l)) } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + l = __caster.Size(m.Abstain) + n += 1 + l + sovGovernance(uint64(l)) + } if m.Passed { n += 2 } - if len(m.Votes) > 0 { - for _, b := range m.Votes { - l = len(b) - n += 1 + l + sovGovernance(uint64(l)) - } - } - l = len(m.TopReference) - if l > 0 { - n += 1 + l + sovGovernance(uint64(l)) - } if m.Closed { n += 2 } - return n -} - -func (m *WhiteListProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WhiteListAddress) - if l > 0 { - n += 1 + l + sovGovernance(uint64(l)) - } - l = len(m.ProposalStatus) - if l > 0 { - n += 1 + l + sovGovernance(uint64(l)) - } - return n -} - -func (m *HardForkProposal) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EpochToHardFork != 0 { - n += 1 + sovGovernance(uint64(m.EpochToHardFork)) - } - l = len(m.NewSoftwareVersion) - if l > 0 { - n += 1 + l + sovGovernance(uint64(l)) - } - l = len(m.ProposalStatus) + l = len(m.IssuerAddress) if l > 0 { n += 1 + l + sovGovernance(uint64(l)) } @@ -1676,117 +1055,44 @@ func (m *GovernanceConfigV2) Size() (n int) { return n } -func (m *VoteDetails) Size() (n int) { +func (m *OngoingVotedList) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Value != 0 { - n += 1 + sovGovernance(uint64(m.Value)) - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.Power) - n += 1 + l + sovGovernance(uint64(l)) - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.Balance) - n += 1 + l + sovGovernance(uint64(l)) - } - l = len(m.DelegatedTo) - if l > 0 { - n += 1 + l + sovGovernance(uint64(l)) + if len(m.ProposalNonces) > 0 { + l = 0 + for _, e := range m.ProposalNonces { + l += sovGovernance(uint64(e)) + } + n += 1 + sovGovernance(uint64(l)) + l } return n } -func (m *VoteSet) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.UsedPower) - n += 1 + l + sovGovernance(uint64(l)) - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.UsedBalance) - n += 1 + l + sovGovernance(uint64(l)) - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.TotalYes) - n += 1 + l + sovGovernance(uint64(l)) - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.TotalNo) - n += 1 + l + sovGovernance(uint64(l)) - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.TotalVeto) - n += 1 + l + sovGovernance(uint64(l)) - } - if len(m.VoteItems) > 0 { - for _, e := range m.VoteItems { - l = e.Size() - n += 1 + l + sovGovernance(uint64(l)) - } - } - return n -} - -func sovGovernance(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGovernance(x uint64) (n int) { - return sovGovernance(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (this *GeneralProposal) String() string { - if this == nil { - return "nil" +func sovGovernance(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGovernance(x uint64) (n int) { + return sovGovernance(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *GeneralProposal) String() string { + if this == nil { + return "nil" } s := strings.Join([]string{`&GeneralProposal{`, - `IssuerAddress:` + fmt.Sprintf("%v", this.IssuerAddress) + `,`, + `Nonce:` + fmt.Sprintf("%v", this.Nonce) + `,`, `CommitHash:` + fmt.Sprintf("%v", this.CommitHash) + `,`, `StartVoteNonce:` + fmt.Sprintf("%v", this.StartVoteNonce) + `,`, `EndVoteNonce:` + fmt.Sprintf("%v", this.EndVoteNonce) + `,`, `Yes:` + fmt.Sprintf("%v", this.Yes) + `,`, `No:` + fmt.Sprintf("%v", this.No) + `,`, `Veto:` + fmt.Sprintf("%v", this.Veto) + `,`, + `Abstain:` + fmt.Sprintf("%v", this.Abstain) + `,`, `Passed:` + fmt.Sprintf("%v", this.Passed) + `,`, - `Votes:` + fmt.Sprintf("%v", this.Votes) + `,`, - `TopReference:` + fmt.Sprintf("%v", this.TopReference) + `,`, `Closed:` + fmt.Sprintf("%v", this.Closed) + `,`, - `}`, - }, "") - return s -} -func (this *WhiteListProposal) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&WhiteListProposal{`, - `WhiteListAddress:` + fmt.Sprintf("%v", this.WhiteListAddress) + `,`, - `ProposalStatus:` + fmt.Sprintf("%v", this.ProposalStatus) + `,`, - `}`, - }, "") - return s -} -func (this *HardForkProposal) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&HardForkProposal{`, - `EpochToHardFork:` + fmt.Sprintf("%v", this.EpochToHardFork) + `,`, - `NewSoftwareVersion:` + fmt.Sprintf("%v", this.NewSoftwareVersion) + `,`, - `ProposalStatus:` + fmt.Sprintf("%v", this.ProposalStatus) + `,`, + `IssuerAddress:` + fmt.Sprintf("%v", this.IssuerAddress) + `,`, `}`, }, "") return s @@ -1818,35 +1124,12 @@ func (this *GovernanceConfigV2) String() string { }, "") return s } -func (this *VoteDetails) String() string { - if this == nil { - return "nil" - } - s := strings.Join([]string{`&VoteDetails{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, - `Power:` + fmt.Sprintf("%v", this.Power) + `,`, - `Balance:` + fmt.Sprintf("%v", this.Balance) + `,`, - `DelegatedTo:` + fmt.Sprintf("%v", this.DelegatedTo) + `,`, - `}`, - }, "") - return s -} -func (this *VoteSet) String() string { +func (this *OngoingVotedList) String() string { if this == nil { return "nil" } - repeatedStringForVoteItems := "[]*VoteDetails{" - for _, f := range this.VoteItems { - repeatedStringForVoteItems += strings.Replace(f.String(), "VoteDetails", "VoteDetails", 1) + "," - } - repeatedStringForVoteItems += "}" - s := strings.Join([]string{`&VoteSet{`, - `UsedPower:` + fmt.Sprintf("%v", this.UsedPower) + `,`, - `UsedBalance:` + fmt.Sprintf("%v", this.UsedBalance) + `,`, - `TotalYes:` + fmt.Sprintf("%v", this.TotalYes) + `,`, - `TotalNo:` + fmt.Sprintf("%v", this.TotalNo) + `,`, - `TotalVeto:` + fmt.Sprintf("%v", this.TotalVeto) + `,`, - `VoteItems:` + repeatedStringForVoteItems + `,`, + s := strings.Join([]string{`&OngoingVotedList{`, + `ProposalNonces:` + fmt.Sprintf("%v", this.ProposalNonces) + `,`, `}`, }, "") return s @@ -1889,10 +1172,10 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IssuerAddress", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) } - var byteLen int + m.Nonce = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGovernance @@ -1902,26 +1185,11 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.Nonce |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.IssuerAddress = append(m.IssuerAddress[:0], dAtA[iNdEx:postIndex]...) - if m.IssuerAddress == nil { - m.IssuerAddress = []byte{} - } - iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field CommitHash", wireType) @@ -2028,676 +1296,13 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.Yes = tmp - } - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field No", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.No = tmp - } - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Veto", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.Veto = tmp - } - } - iNdEx = postIndex - case 8: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Passed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Passed = bool(v != 0) - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Votes", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Votes = append(m.Votes, make([]byte, postIndex-iNdEx)) - copy(m.Votes[len(m.Votes)-1], dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TopReference", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TopReference = append(m.TopReference[:0], dAtA[iNdEx:postIndex]...) - if m.TopReference == nil { - m.TopReference = []byte{} - } - iNdEx = postIndex - case 11: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Closed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Closed = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipGovernance(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *WhiteListProposal) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: WhiteListProposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WhiteListProposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WhiteListAddress", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WhiteListAddress = append(m.WhiteListAddress[:0], dAtA[iNdEx:postIndex]...) - if m.WhiteListAddress == nil { - m.WhiteListAddress = []byte{} - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalStatus", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProposalStatus = append(m.ProposalStatus[:0], dAtA[iNdEx:postIndex]...) - if m.ProposalStatus == nil { - m.ProposalStatus = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGovernance(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *HardForkProposal) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: HardForkProposal: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: HardForkProposal: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EpochToHardFork", wireType) - } - m.EpochToHardFork = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EpochToHardFork |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewSoftwareVersion", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewSoftwareVersion = append(m.NewSoftwareVersion[:0], dAtA[iNdEx:postIndex]...) - if m.NewSoftwareVersion == nil { - m.NewSoftwareVersion = []byte{} - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalStatus", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProposalStatus = append(m.ProposalStatus[:0], dAtA[iNdEx:postIndex]...) - if m.ProposalStatus == nil { - m.ProposalStatus = []byte{} - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGovernance(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GovernanceConfig) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GovernanceConfig: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GovernanceConfig: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field NumNodes", wireType) - } - m.NumNodes = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.NumNodes |= int64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MinQuorum", wireType) - } - m.MinQuorum = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MinQuorum |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MinPassThreshold", wireType) - } - m.MinPassThreshold = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MinPassThreshold |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field MinVetoThreshold", wireType) - } - m.MinVetoThreshold = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.MinVetoThreshold |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalFee", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.ProposalFee = tmp - } - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGovernance(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthGovernance - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GovernanceConfigV2: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GovernanceConfigV2: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Yes = tmp + } + } + iNdEx = postIndex + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinQuorum", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field No", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -2729,13 +1334,13 @@ func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.MinQuorum = tmp + m.No = tmp } } iNdEx = postIndex - case 2: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinPassThreshold", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Veto", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -2767,13 +1372,13 @@ func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.MinPassThreshold = tmp + m.Veto = tmp } } iNdEx = postIndex - case 3: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinVetoThreshold", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Abstain", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -2805,13 +1410,53 @@ func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.MinVetoThreshold = tmp + m.Abstain = tmp } } iNdEx = postIndex - case 4: + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Passed", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Passed = bool(v != 0) + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Closed", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Closed = bool(v != 0) + case 11: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalFee", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IssuerAddress", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -2838,13 +1483,9 @@ func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.ProposalFee = tmp - } + m.IssuerAddress = append(m.IssuerAddress[:0], dAtA[iNdEx:postIndex]...) + if m.IssuerAddress == nil { + m.IssuerAddress = []byte{} } iNdEx = postIndex default: @@ -2871,7 +1512,7 @@ func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { } return nil } -func (m *VoteDetails) Unmarshal(dAtA []byte) error { +func (m *GovernanceConfig) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2894,17 +1535,17 @@ func (m *VoteDetails) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: VoteDetails: wiretype end group for non-group") + return fmt.Errorf("proto: GovernanceConfig: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: VoteDetails: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GovernanceConfig: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NumNodes", wireType) } - m.Value = 0 + m.NumNodes = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGovernance @@ -2914,16 +1555,16 @@ func (m *VoteDetails) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Value |= VoteValueType(b&0x7F) << shift + m.NumNodes |= int64(b&0x7F) << shift if b < 0x80 { break } } case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Power", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinQuorum", wireType) } - var byteLen int + m.MinQuorum = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGovernance @@ -2933,35 +1574,16 @@ func (m *VoteDetails) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.MinQuorum |= int32(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.Power = tmp - } - } - iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Balance", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinPassThreshold", wireType) } - var byteLen int + m.MinPassThreshold = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGovernance @@ -2971,33 +1593,33 @@ func (m *VoteDetails) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - byteLen |= int(b&0x7F) << shift + m.MinPassThreshold |= int32(b&0x7F) << shift if b < 0x80 { break } } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinVetoThreshold", wireType) } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.Balance = tmp + m.MinVetoThreshold = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinVetoThreshold |= int32(b&0x7F) << shift + if b < 0x80 { + break } } - iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatedTo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ProposalFee", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -3024,9 +1646,13 @@ func (m *VoteDetails) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DelegatedTo = append(m.DelegatedTo[:0], dAtA[iNdEx:postIndex]...) - if m.DelegatedTo == nil { - m.DelegatedTo = []byte{} + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } else { + m.ProposalFee = tmp + } } iNdEx = postIndex default: @@ -3053,7 +1679,7 @@ func (m *VoteDetails) Unmarshal(dAtA []byte) error { } return nil } -func (m *VoteSet) Unmarshal(dAtA []byte) error { +func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3076,15 +1702,15 @@ func (m *VoteSet) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: VoteSet: wiretype end group for non-group") + return fmt.Errorf("proto: GovernanceConfigV2: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: VoteSet: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GovernanceConfigV2: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UsedPower", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MinQuorum", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -3116,13 +1742,13 @@ func (m *VoteSet) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.UsedPower = tmp + m.MinQuorum = tmp } } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UsedBalance", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MinPassThreshold", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -3154,13 +1780,13 @@ func (m *VoteSet) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.UsedBalance = tmp + m.MinPassThreshold = tmp } } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalYes", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MinVetoThreshold", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -3192,13 +1818,13 @@ func (m *VoteSet) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.TotalYes = tmp + m.MinVetoThreshold = tmp } } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalNo", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ProposalFee", wireType) } var byteLen int for shift := uint(0); ; shift += 7 { @@ -3230,82 +1856,139 @@ func (m *VoteSet) Unmarshal(dAtA []byte) error { if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } else { - m.TotalNo = tmp + m.ProposalFee = tmp } } iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalVeto", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipGovernance(dAtA[iNdEx:]) + if err != nil { + return err } - if byteLen < 0 { + if skippy < 0 { return ErrInvalidLengthGovernance } - postIndex := iNdEx + byteLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthGovernance } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.TotalVeto = tmp - } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *OngoingVotedList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VoteItems", wireType) + if iNdEx >= l { + return io.ErrUnexpectedEOF } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: OngoingVotedList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: OngoingVotedList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ProposalNonces = append(m.ProposalNonces, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.VoteItems = append(m.VoteItems, &VoteDetails{}) - if err := m.VoteItems[len(m.VoteItems)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.ProposalNonces) == 0 { + m.ProposalNonces = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ProposalNonces = append(m.ProposalNonces, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field ProposalNonces", wireType) } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGovernance(dAtA[iNdEx:]) From e2d4dbb1c7ffd2af2d578698de3d0898b49f1609 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 16 Jan 2023 17:54:15 +0200 Subject: [PATCH 124/335] changing stuff, new implementation --- vm/systemSmartContracts/governance.go | 321 +++++++++++------------ vm/systemSmartContracts/governance.proto | 13 +- 2 files changed, 156 insertions(+), 178 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 6a960b172c4..3eb6023d28c 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -19,9 +19,8 @@ import ( ) const governanceConfigKey = "governanceConfig" -const proposalPrefix = "proposal_" -const fundsLockPrefix = "foundsLock_" -const stakeLockPrefix = "stakeLock_" +const proposalPrefix = "p_" +const stakeLockPrefix = "s_" const yesString = "yes" const noString = "no" const vetoString = "veto" @@ -176,13 +175,12 @@ func (g *governanceContract) initV2(args *vmcommon.ContractCallInput) vmcommon.R return vmcommon.UserError } - marshaledData, err := g.marshalizer.Marshal(cfg) + err = g.saveConfig(cfg) if err != nil { - log.Error("marshal error on governance init function") - return vmcommon.ExecutionFailed + log.Error(err.Error()) + return vmcommon.UserError } - g.eei.SetStorage([]byte(governanceConfigKey), marshaledData) g.eei.SetStorage([]byte(ownerKey), args.CallerAddr) g.ownerAddress = make([]byte, 0, len(args.CallerAddr)) g.ownerAddress = append(g.ownerAddress, args.CallerAddr...) @@ -190,12 +188,74 @@ func (g *governanceContract) initV2(args *vmcommon.ContractCallInput) vmcommon.R return vmcommon.Ok } +// changeConfig allows the owner to change the configuration for requesting proposals +func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + if !bytes.Equal(g.ownerAddress, args.CallerAddr) { + g.eei.AddReturnMessage("changeConfig can be called only by owner") + return vmcommon.UserError + } + if args.CallValue.Cmp(zero) != 0 { + g.eei.AddReturnMessage("changeConfig can be called only without callValue") + return vmcommon.UserError + } + if len(args.Arguments) != 4 { + g.eei.AddReturnMessage("changeConfig needs 4 arguments") + return vmcommon.UserError + } + + proposalFee, okConvert := big.NewInt(0).SetString(string(args.Arguments[0]), conversionBase) + if !okConvert || proposalFee.Cmp(zero) < 0 { + g.eei.AddReturnMessage("changeConfig first argument is incorrectly formatted") + return vmcommon.UserError + } + minQuorum, okConvert := big.NewInt(0).SetString(string(args.Arguments[1]), conversionBase) + if !okConvert || minQuorum.Cmp(zero) < 0 { + g.eei.AddReturnMessage("changeConfig second argument is incorrectly formatted") + return vmcommon.UserError + } + minVeto, okConvert := big.NewInt(0).SetString(string(args.Arguments[2]), conversionBase) + if !okConvert || minVeto.Cmp(zero) < 0 { + g.eei.AddReturnMessage("changeConfig third argument is incorrectly formatted") + return vmcommon.UserError + } + minPass, okConvert := big.NewInt(0).SetString(string(args.Arguments[3]), conversionBase) + if !okConvert || minPass.Cmp(zero) < 0 { + g.eei.AddReturnMessage("changeConfig fourth argument is incorrectly formatted") + return vmcommon.UserError + } + + scConfig, err := g.getConfig() + if err != nil { + g.eei.AddReturnMessage("changeConfig error " + err.Error()) + return vmcommon.UserError + } + + scConfig.MinQuorum = minQuorum + scConfig.MinVetoThreshold = minVeto + scConfig.MinPassThreshold = minPass + scConfig.ProposalFee = proposalFee + + err = g.saveConfig(scConfig) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + return vmcommon.Ok +} + +func (g *governanceContract) saveConfig(cfg *GovernanceConfigV2) error { + marshaledData, err := g.marshalizer.Marshal(cfg) + if err != nil { + return err + } + + g.eei.SetStorage([]byte(governanceConfigKey), marshaledData) + return nil +} + // proposal creates a new proposal from passed arguments func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if args.CallValue.Cmp(g.baseProposalCost) != 0 { - g.eei.AddReturnMessage("invalid proposal cost, expected " + g.baseProposalCost.String()) - return vmcommon.OutOfFunds - } err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Proposal) if err != nil { g.eei.AddReturnMessage("not enough gas") @@ -205,6 +265,24 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon g.eei.AddReturnMessage("invalid number of arguments, expected 3") return vmcommon.FunctionWrongSignature } + generalConfig, err := g.getConfig() + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + if args.CallValue.Cmp(generalConfig.ProposalFee) != 0 { + g.eei.AddReturnMessage("invalid proposal cost, expected " + g.baseProposalCost.String()) + return vmcommon.OutOfFunds + } + + generalConfig.LastProposalNonce++ + nextNonce := generalConfig.LastProposalNonce + err = g.saveConfig(generalConfig) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + commitHash := args.Arguments[0] if len(commitHash) != commitHashLength { g.eei.AddReturnMessage(fmt.Sprintf("invalid github commit length, wanted exactly %d", commitHashLength)) @@ -231,21 +309,22 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon Veto: big.NewInt(0), Abstain: big.NewInt(0), Passed: false, - Votes: make([][]byte, 0), + ProposalCost: generalConfig.ProposalFee, } err = g.saveGeneralProposal(commitHash, generalProposal) if err != nil { - log.Warn("saveGeneralProposal", "err", err) g.eei.AddReturnMessage("saveGeneralProposal " + err.Error()) return vmcommon.UserError } + g.eei.SetStorage(big.NewInt(0).SetUint64(nextNonce).Bytes(), commitHash) + return vmcommon.Ok } // vote casts a vote for a validator/delegation. This function receives 2 parameters and will vote with its full delegation + validator amount -// args.Arguments[0] - proposal reference (GitHub commit) -// args.Arguments[1] - vote option (yes, no, veto) +// args.Arguments[0] - nonce - it is smaller than a github commit +// args.Arguments[1] - vote option (yes, no, veto, abstain) func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if args.CallValue.Cmp(zero) != 0 { g.eei.AddReturnMessage("function is not payable") @@ -273,39 +352,60 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } - - currentVoteSet, err := g.getOrCreateVoteSet(append(proposalToVote, voterAddress...)) + totalVotingPower, err := g.computeVotingPowerFromTotalStake(voterAddress) if err != nil { g.eei.AddReturnMessage(err.Error()) - return vmcommon.ExecutionFailed - } - if len(currentVoteSet.VoteItems) > 0 { - g.eei.AddReturnMessage("vote only once") return vmcommon.UserError } - totalVotingPower, err := g.computeVotingPowerFromTotalStake(voterAddress) + err = g.updateUserVotes(voterAddress, big.NewInt(0).SetBytes(proposalToVote).Uint64()) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } - currentVote := &VoteDetails{ - Value: voteOption, - Power: totalVotingPower, - Balance: big.NewInt(0), - } - err = g.addNewVote(voterAddress, currentVote, currentVoteSet, proposal) + err = g.addNewVote(voteOption, totalVotingPower, proposal) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } - g.lockStake(voterAddress, proposal.EndVoteNonce) return vmcommon.Ok } +func (g *governanceContract) updateUserVotes(address []byte, nonce uint64) error { + + return nil +} + +func (g *governanceContract) saveUserVotes(address []byte, votedList *OngoingVotedList) error { + marshaledData, err := g.marshalizer.Marshal(votedList) + if err != nil { + return err + } + g.eei.SetStorage(address, marshaledData) + + return nil +} + +func (g *governanceContract) getUserVotes(address []byte) (*OngoingVotedList, error) { + onGoingList := &OngoingVotedList{ + ProposalNonces: make([]uint64, 0), + } + marshaledData := g.eei.GetStorage(address) + if len(marshaledData) == 0 { + return onGoingList, nil + } + + err := g.marshalizer.Unmarshal(onGoingList, marshaledData) + if err != nil { + return nil, err + } + + return onGoingList, nil +} + func (g *governanceContract) lockStake(address []byte, endNonce uint64) { stakeLockKey := append([]byte(stakeLockPrefix), address...) lastData := g.eei.GetStorage(stakeLockKey) @@ -401,7 +501,7 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco return vmcommon.UserError } - err = g.addNewVote(voterAddress, currentVote, currentVoteSet, proposal) + err = g.addNewVote(currentVote, currentVoteSet, proposal) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -420,69 +520,6 @@ func (g *governanceContract) getMinValueToVote() (*big.Int, error) { return delegationManagement.MinDelegationAmount, nil } -func (g *governanceContract) getVoteSetKeyForVoteWithFunds(proposalToVote, address []byte) []byte { - key := append(proposalToVote, address...) - key = append([]byte(fundsLockPrefix), key...) - return key -} - -// changeConfig allows the owner to change the configuration for requesting proposals -func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if !bytes.Equal(g.ownerAddress, args.CallerAddr) { - g.eei.AddReturnMessage("changeConfig can be called only by owner") - return vmcommon.UserError - } - if args.CallValue.Cmp(zero) != 0 { - g.eei.AddReturnMessage("changeConfig can be called only without callValue") - return vmcommon.UserError - } - if len(args.Arguments) != 4 { - g.eei.AddReturnMessage("changeConfig needs 4 arguments") - return vmcommon.UserError - } - - proposalFee, okConvert := big.NewInt(0).SetString(string(args.Arguments[0]), conversionBase) - if !okConvert || proposalFee.Cmp(zero) < 0 { - g.eei.AddReturnMessage("changeConfig first argument is incorrectly formatted") - return vmcommon.UserError - } - minQuorum, okConvert := big.NewInt(0).SetString(string(args.Arguments[1]), conversionBase) - if !okConvert || minQuorum.Cmp(zero) < 0 { - g.eei.AddReturnMessage("changeConfig second argument is incorrectly formatted") - return vmcommon.UserError - } - minVeto, okConvert := big.NewInt(0).SetString(string(args.Arguments[2]), conversionBase) - if !okConvert || minVeto.Cmp(zero) < 0 { - g.eei.AddReturnMessage("changeConfig third argument is incorrectly formatted") - return vmcommon.UserError - } - minPass, okConvert := big.NewInt(0).SetString(string(args.Arguments[3]), conversionBase) - if !okConvert || minPass.Cmp(zero) < 0 { - g.eei.AddReturnMessage("changeConfig fourth argument is incorrectly formatted") - return vmcommon.UserError - } - - scConfig, err := g.getConfig() - if err != nil { - g.eei.AddReturnMessage("changeConfig error " + err.Error()) - return vmcommon.UserError - } - - scConfig.MinQuorum = minQuorum - scConfig.MinVetoThreshold = minVeto - scConfig.MinPassThreshold = minPass - scConfig.ProposalFee = proposalFee - - marshaledData, err := g.marshalizer.Marshal(scConfig) - if err != nil { - g.eei.AddReturnMessage("changeConfig error " + err.Error()) - return vmcommon.UserError - } - g.eei.SetStorage([]byte(governanceConfigKey), marshaledData) - - return vmcommon.Ok -} - // closeProposal generates and saves end results for a proposal func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if args.CallValue.Cmp(zero) != 0 { @@ -604,7 +641,8 @@ func (g *governanceContract) getEndNonceForProposal(reference []byte) uint64 { // getGeneralProposal returns a proposal from storage func (g *governanceContract) getGeneralProposal(reference []byte) (*GeneralProposal, error) { - key := append([]byte(proposalPrefix), reference...) + commitHash := g.eei.GetStorage(reference) + key := append([]byte(proposalPrefix), commitHash...) marshaledData := g.eei.GetStorage(key) if len(marshaledData) == 0 { @@ -646,63 +684,24 @@ func (g *governanceContract) getValidProposal(reference []byte) (*GeneralProposa return proposal, nil } -// applyVote takes in a vote and a full VoteSet object and correctly applies the new vote, then returning -// the new full VoteSet object. In the same way applies the vote to the general proposal -func (g *governanceContract) applyVote(vote *VoteDetails, voteData *VoteSet, proposal *GeneralProposal) (*VoteSet, *GeneralProposal, error) { - switch vote.Value { +// addNewVote applies a new vote on a proposal then saves the new information into the storage +func (g *governanceContract) addNewVote(voteValueType VoteValueType, power *big.Int, proposal *GeneralProposal) error { + switch voteValueType { case Yes: - voteData.TotalYes.Add(voteData.TotalYes, vote.Power) - proposal.Yes.Add(proposal.Yes, vote.Power) + proposal.Yes.Add(proposal.Yes, power) case No: - voteData.TotalNo.Add(voteData.TotalNo, vote.Power) - proposal.No.Add(proposal.No, vote.Power) + proposal.No.Add(proposal.No, power) case Veto: - voteData.TotalVeto.Add(voteData.TotalVeto, vote.Power) - proposal.Veto.Add(proposal.Veto, vote.Power) + proposal.Veto.Add(proposal.Veto, power) + case Abstain: + proposal.Abstain.Add(proposal.Abstain, power) default: - return nil, nil, fmt.Errorf("%s: %s", vm.ErrInvalidArgument, "invalid vote type") - } - - voteData.UsedPower.Add(voteData.UsedPower, vote.Power) - voteData.UsedBalance.Add(voteData.UsedBalance, vote.Balance) - voteData.VoteItems = append(voteData.VoteItems, vote) - - return voteData, proposal, nil -} - -// addNewVote applies a new vote on a proposal then saves the new information into the storage -func (g *governanceContract) addNewVote(voterAddress []byte, currentVote *VoteDetails, currentVoteSet *VoteSet, proposal *GeneralProposal) error { - newVoteSet, updatedProposal, err := g.applyVote(currentVote, currentVoteSet, proposal) - if err != nil { - return err - } - - err = g.saveVoteSet(voterAddress, newVoteSet, updatedProposal) - if err != nil { - return err + return fmt.Errorf("%s: %s", vm.ErrInvalidArgument, "invalid vote type") } return g.saveGeneralProposal(proposal.CommitHash, proposal) } -func getVoteItemKey(reference []byte, address []byte) []byte { - proposalKey := append([]byte(proposalPrefix), reference...) - voteItemKey := append(proposalKey, address...) - return voteItemKey -} - -// saveVoteSet first saves the main vote data of the voter, then updates the proposal with the new voter information -func (g *governanceContract) saveVoteSet(voter []byte, voteData *VoteSet, proposal *GeneralProposal) error { - voteItemKey := getVoteItemKey(proposal.CommitHash, voter) - - marshaledVoteItem, err := g.marshalizer.Marshal(voteData) - if err != nil { - return err - } - g.eei.SetStorage(voteItemKey, marshaledVoteItem) - return nil -} - // computeVotingPower returns the voting power for a value. The value can be either a balance or // the staked value for a validator func (g *governanceContract) computeVotingPower(value *big.Int) (*big.Int, error) { @@ -750,40 +749,13 @@ func (g *governanceContract) castVoteType(vote string) (VoteValueType, error) { return No, nil case vetoString: return Veto, nil + case abstainString: + return Abstain, nil default: return 0, fmt.Errorf("%s: %s%s", vm.ErrInvalidArgument, "invalid vote type option: ", vote) } } -// getOrCreateVoteSet returns the vote data from storage for a given proposer/validator pair. -// If no vote data exists, it returns a new instance of VoteSet -func (g *governanceContract) getOrCreateVoteSet(key []byte) (*VoteSet, error) { - marshaledData := g.eei.GetStorage(key) - if len(marshaledData) == 0 { - return g.getEmptyVoteSet(), nil - } - - voteData := &VoteSet{} - err := g.marshalizer.Unmarshal(voteData, marshaledData) - if err != nil { - return nil, err - } - - return voteData, nil -} - -// getEmptyVoteSet returns a new VoteSet instance with its members initialised with their 0 value -func (g *governanceContract) getEmptyVoteSet() *VoteSet { - return &VoteSet{ - UsedPower: big.NewInt(0), - UsedBalance: big.NewInt(0), - TotalYes: big.NewInt(0), - TotalNo: big.NewInt(0), - TotalVeto: big.NewInt(0), - VoteItems: make([]*VoteDetails, 0), - } -} - // computeValidatorVotingPower returns the total voting power of a validator func (g *governanceContract) computeValidatorVotingPower(validatorAddress []byte) (*big.Int, error) { totalStake, err := g.getTotalStake(validatorAddress) @@ -800,8 +772,6 @@ func (g *governanceContract) computeValidatorVotingPower(validatorAddress []byte } // function iterates over all delegation contracts and verifies balances of the given account and makes a sum of it -//TODO: benchmark this, the other solution is to receive in the arguments which delegation contracts should be checked -// and consume gas for each delegation contract to be checked func (g *governanceContract) computeVotingPowerFromTotalStake(address []byte) (*big.Int, error) { totalStake, err := g.getTotalStake(address) if err != nil && err != vm.ErrEmptyStorage { @@ -816,6 +786,11 @@ func (g *governanceContract) computeVotingPowerFromTotalStake(address []byte) (* return nil, err } + err = g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Get * uint64(len(dContractList.Addresses))) + if err != nil { + return nil, err + } + var activeDelegated *big.Int for _, contract := range dContractList.Addresses { activeDelegated, err = g.getActiveFundForDelegator(contract, address) diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index 2abffa079a5..e31e620c059 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -26,6 +26,7 @@ message GeneralProposal { bool Passed = 9 [(gogoproto.jsontag) = "Passed"]; bool Closed = 10 [(gogoproto.jsontag) = "Closed"]; bytes IssuerAddress = 11 [(gogoproto.jsontag) = "IssuerAddress"]; + bytes ProposalCost = 12 [(gogoproto.jsontag) = "ProposalCost", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; } message GovernanceConfig { @@ -37,12 +38,14 @@ message GovernanceConfig { } message GovernanceConfigV2 { - bytes MinQuorum = 1 [(gogoproto.jsontag) = "MinQuorum", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes MinPassThreshold = 2 [(gogoproto.jsontag) = "MinPassThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes MinVetoThreshold = 3 [(gogoproto.jsontag) = "MinVetoThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes ProposalFee = 4 [(gogoproto.jsontag) = "ProposalFee", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes MinQuorum = 1 [(gogoproto.jsontag) = "MinQuorum", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes MinPassThreshold = 2 [(gogoproto.jsontag) = "MinPassThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes MinVetoThreshold = 3 [(gogoproto.jsontag) = "MinVetoThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes ProposalFee = 4 [(gogoproto.jsontag) = "ProposalFee", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + uint64 LastProposalNonce = 5 [(gogoproto.jsontag) = "LastProposalNonce"]; } message OngoingVotedList { - repeated uint64 ProposalNonces = 1 [(gogoproto.jsontag) = "ProposalNonces"]; + repeated uint64 Direct = 1 [(gogoproto.jsontag) = "Direct"]; + repeated uint64 Delegated = 2 [(gogoproto.jsontag) = "Delegated"]; } \ No newline at end of file From af4bda7ccec05ca2b959c6525b1d73a37fb829bc Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 17 Jan 2023 12:01:16 +0200 Subject: [PATCH 125/335] changing stuff, new implementation --- vm/errors.go | 3 + vm/systemSmartContracts/governance.go | 183 +++++++++++++++-------- vm/systemSmartContracts/governance.pb.go | 17 ++- vm/systemSmartContracts/governance.proto | 5 + 4 files changed, 138 insertions(+), 70 deletions(-) diff --git a/vm/errors.go b/vm/errors.go index 887543eeac9..d3b89a28911 100644 --- a/vm/errors.go +++ b/vm/errors.go @@ -137,6 +137,9 @@ var ErrEmptyStorage = errors.New("storage is nil for given key") // ErrVotedForAnExpiredProposal signals that voting was done for an expired proposal var ErrVotedForAnExpiredProposal = errors.New("voting period is over for this proposal") +// ErrDoubleVote signals that user is voting for the second time for the same proposal +var ErrDoubleVote = errors.New("double vote is not allowed") + // ErrVotingNotStartedForProposal signals that voting was done for a proposal that not begins yet var ErrVotingNotStartedForProposal = errors.New("voting has not yet started for this proposal") diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 3eb6023d28c..13cf8831751 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -323,7 +323,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon } // vote casts a vote for a validator/delegation. This function receives 2 parameters and will vote with its full delegation + validator amount -// args.Arguments[0] - nonce - it is smaller than a github commit +// args.Arguments[0] - reference // args.Arguments[1] - vote option (yes, no, veto, abstain) func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if args.CallValue.Cmp(zero) != 0 { @@ -358,80 +358,23 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret return vmcommon.UserError } - err = g.updateUserVotes(voterAddress, big.NewInt(0).SetBytes(proposalToVote).Uint64()) + err = g.addUserVote( + voterAddress, + big.NewInt(0).SetBytes(proposalToVote).Uint64(), + voteOption, + totalVotingPower, + proposal, + true) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } - err = g.addNewVote(voteOption, totalVotingPower, proposal) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - g.lockStake(voterAddress, proposal.EndVoteNonce) - return vmcommon.Ok } -func (g *governanceContract) updateUserVotes(address []byte, nonce uint64) error { - - return nil -} - -func (g *governanceContract) saveUserVotes(address []byte, votedList *OngoingVotedList) error { - marshaledData, err := g.marshalizer.Marshal(votedList) - if err != nil { - return err - } - g.eei.SetStorage(address, marshaledData) - - return nil -} - -func (g *governanceContract) getUserVotes(address []byte) (*OngoingVotedList, error) { - onGoingList := &OngoingVotedList{ - ProposalNonces: make([]uint64, 0), - } - marshaledData := g.eei.GetStorage(address) - if len(marshaledData) == 0 { - return onGoingList, nil - } - - err := g.marshalizer.Unmarshal(onGoingList, marshaledData) - if err != nil { - return nil, err - } - - return onGoingList, nil -} - -func (g *governanceContract) lockStake(address []byte, endNonce uint64) { - stakeLockKey := append([]byte(stakeLockPrefix), address...) - lastData := g.eei.GetStorage(stakeLockKey) - lastEndNonce := uint64(0) - if len(lastData) > 0 { - lastEndNonce = big.NewInt(0).SetBytes(lastData).Uint64() - } - - if lastEndNonce < endNonce { - g.eei.SetStorage(stakeLockKey, big.NewInt(0).SetUint64(endNonce).Bytes()) - } -} - -func isStakeLocked(eei vm.SystemEI, governanceAddress []byte, address []byte) bool { - stakeLockKey := append([]byte(stakeLockPrefix), address...) - lastData := eei.GetStorageFromAddress(governanceAddress, stakeLockKey) - if len(lastData) == 0 { - return false - } - - lastEndNonce := big.NewInt(0).SetBytes(lastData).Uint64() - return eei.BlockChainHook().CurrentNonce() < lastEndNonce -} - // delegateVote casts a vote from a validator run by WASM SC and delegates it to someone else. This function receives 4 parameters: -// args.Arguments[0] - proposal reference (GitHub commit) +// args.Arguments[0] - proposal reference - nonce of proposal // args.Arguments[1] - vote option (yes, no, veto) // args.Arguments[2] - delegatedTo // args.Arguments[3] - balance to vote @@ -511,6 +454,114 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco return vmcommon.Ok } +func (g *governanceContract) getDelegatedContractInfo(scAddress []byte) (*DelegatedSCVoteInfo, error) { + scVoteInfo := &DelegatedSCVoteInfo{ + TotalPower: big.NewInt(0), + UsedPower: big.NewInt(0), + } +} + +func (g *governanceContract) addUserVote( + address []byte, + nonce uint64, + voteOption VoteValueType, + totalVotingPower *big.Int, + proposal *GeneralProposal, + direct bool, +) error { + userVoteList, err := g.getUserVotes(address) + if err != nil { + return err + } + + if direct { + userVoteList.Direct, err = addNewNonce(userVoteList.Direct, nonce) + if err != nil { + return err + } + } else { + userVoteList.Delegated, err = addNewNonce(userVoteList.Delegated, nonce) + if err != nil { + return err + } + } + + err = g.addNewVote(voteOption, totalVotingPower, proposal) + if err != nil { + return err + } + + err = g.saveUserVotes(address, userVoteList) + if err != nil { + return err + } + + g.lockStake(address, proposal.EndVoteNonce) + + return nil +} + +func addNewNonce(nonceList []uint64, newNonce uint64) ([]uint64, error) { + for _, nonce := range nonceList { + if newNonce == nonce { + return nil, vm.ErrDoubleVote + } + } + + return nonceList, nil +} + +func (g *governanceContract) saveUserVotes(address []byte, votedList *OngoingVotedList) error { + marshaledData, err := g.marshalizer.Marshal(votedList) + if err != nil { + return err + } + g.eei.SetStorage(address, marshaledData) + + return nil +} + +func (g *governanceContract) getUserVotes(address []byte) (*OngoingVotedList, error) { + onGoingList := &OngoingVotedList{ + ProposalNonces: make([]uint64, 0), + } + marshaledData := g.eei.GetStorage(address) + if len(marshaledData) == 0 { + return onGoingList, nil + } + + err := g.marshalizer.Unmarshal(onGoingList, marshaledData) + if err != nil { + return nil, err + } + + return onGoingList, nil +} + +func (g *governanceContract) lockStake(address []byte, endNonce uint64) { + stakeLockKey := append([]byte(stakeLockPrefix), address...) + lastData := g.eei.GetStorage(stakeLockKey) + lastEndNonce := uint64(0) + if len(lastData) > 0 { + lastEndNonce = big.NewInt(0).SetBytes(lastData).Uint64() + } + + if lastEndNonce < endNonce { + g.eei.SetStorage(stakeLockKey, big.NewInt(0).SetUint64(endNonce).Bytes()) + } +} + +func isStakeLocked(eei vm.SystemEI, governanceAddress []byte, address []byte) bool { + stakeLockKey := append([]byte(stakeLockPrefix), address...) + lastData := eei.GetStorageFromAddress(governanceAddress, stakeLockKey) + if len(lastData) == 0 { + return false + } + + lastEndNonce := big.NewInt(0).SetBytes(lastData).Uint64() + return eei.BlockChainHook().CurrentNonce() < lastEndNonce +} + func (g *governanceContract) getMinValueToVote() (*big.Int, error) { delegationManagement, err := getDelegationManagement(g.eei, g.marshalizer, g.delegationMgrSCAddress) if err != nil { diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index a24fde62110..182173fcc9e 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -68,6 +68,7 @@ type GeneralProposal struct { Passed bool `protobuf:"varint,9,opt,name=Passed,proto3" json:"Passed"` Closed bool `protobuf:"varint,10,opt,name=Closed,proto3" json:"Closed"` IssuerAddress []byte `protobuf:"bytes,11,opt,name=IssuerAddress,proto3" json:"IssuerAddress"` + ProposalCost *math_big.Int } func (m *GeneralProposal) Reset() { *m = GeneralProposal{} } @@ -246,11 +247,17 @@ func (m *GovernanceConfig) GetProposalFee() *math_big.Int { return nil } +type DelegatedSCVoteInfo struct { + TotalPower *math_big.Int `protobuf:"bytes,1,opt,name=MinQuorum,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinQuorum"` + UsedPower *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` +} + type GovernanceConfigV2 struct { - MinQuorum *math_big.Int `protobuf:"bytes,1,opt,name=MinQuorum,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinQuorum"` - MinPassThreshold *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` - MinVetoThreshold *math_big.Int `protobuf:"bytes,3,opt,name=MinVetoThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinVetoThreshold"` - ProposalFee *math_big.Int `protobuf:"bytes,4,opt,name=ProposalFee,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalFee"` + MinQuorum *math_big.Int `protobuf:"bytes,1,opt,name=MinQuorum,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinQuorum"` + MinPassThreshold *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` + MinVetoThreshold *math_big.Int `protobuf:"bytes,3,opt,name=MinVetoThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinVetoThreshold"` + ProposalFee *math_big.Int `protobuf:"bytes,4,opt,name=ProposalFee,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalFee"` + LastProposalNonce uint64 } func (m *GovernanceConfigV2) Reset() { *m = GovernanceConfigV2{} } @@ -311,6 +318,8 @@ func (m *GovernanceConfigV2) GetProposalFee() *math_big.Int { type OngoingVotedList struct { ProposalNonces []uint64 `protobuf:"varint,1,rep,packed,name=ProposalNonces,proto3" json:"ProposalNonces"` + Direct []uint64 + Delegated []uint64 } func (m *OngoingVotedList) Reset() { *m = OngoingVotedList{} } diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index e31e620c059..12759533b75 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -48,4 +48,9 @@ message GovernanceConfigV2 { message OngoingVotedList { repeated uint64 Direct = 1 [(gogoproto.jsontag) = "Direct"]; repeated uint64 Delegated = 2 [(gogoproto.jsontag) = "Delegated"]; +} + +message DelegatedSCVoteInfo { + bytes TotalPower = 1 [(gogoproto.jsontag) = "TotalPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes UsedPower = 2 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; } \ No newline at end of file From 3fb238ff0dbbb2a4b059ffc55223d054adbd2fd9 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 17 Jan 2023 13:05:41 +0200 Subject: [PATCH 126/335] changing stuff, new implementation --- vm/systemSmartContracts/governance.go | 435 +++++++++++++------------- 1 file changed, 218 insertions(+), 217 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 13cf8831751..2a4eeab1469 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -4,7 +4,6 @@ package systemSmartContracts import ( "bytes" "fmt" - "math" "math/big" "sync" @@ -323,7 +322,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon } // vote casts a vote for a validator/delegation. This function receives 2 parameters and will vote with its full delegation + validator amount -// args.Arguments[0] - reference +// args.Arguments[0] - reference - nonce as string // args.Arguments[1] - vote option (yes, no, veto, abstain) func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if args.CallValue.Cmp(zero) != 0 { @@ -339,19 +338,13 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret g.eei.AddReturnMessage("invalid number of arguments, expected 2") return vmcommon.FunctionWrongSignature } + if core.IsSmartContractAddress(args.CallerAddr) { + g.eei.AddReturnMessage("only SC can call this") + return vmcommon.UserError + } voterAddress := args.CallerAddr proposalToVote := args.Arguments[0] - proposal, err := g.getValidProposal(proposalToVote) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } - voteOption, err := g.castVoteType(string(args.Arguments[1])) - if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } totalVotingPower, err := g.computeVotingPowerFromTotalStake(voterAddress) if err != nil { g.eei.AddReturnMessage(err.Error()) @@ -360,10 +353,10 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret err = g.addUserVote( voterAddress, - big.NewInt(0).SetBytes(proposalToVote).Uint64(), - voteOption, + proposalToVote, + string(args.Arguments[1]), totalVotingPower, - proposal, + proposalToVote, true) if err != nil { g.eei.AddReturnMessage(err.Error()) @@ -396,79 +389,94 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco g.eei.AddReturnMessage("only SC can call this") return vmcommon.UserError } - if len(args.Arguments[3]) != len(args.CallerAddr) { + voter := args.Arguments[3] + if len(voter) != len(args.CallerAddr) { g.eei.AddReturnMessage("invalid delegator address") return vmcommon.UserError } - voterAddress := args.CallerAddr proposalToVote := args.Arguments[0] - proposal, err := g.getValidProposal(proposalToVote) + votePower, err := g.updateDelegatedContractInfo(args.CallerAddr, proposalToVote, args.Arguments[2]) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } - voteOption, err := g.castVoteType(string(args.Arguments[1])) + + err = g.addUserVote( + voter, + proposalToVote, + string(args.Arguments[1]), + votePower, + proposalToVote, + false) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } - votePower, err := g.computeVotingPower(big.NewInt(0).SetBytes(args.Arguments[2])) + return vmcommon.Ok +} + +func (g *governanceContract) updateDelegatedContractInfo(scAddress []byte, reference []byte, balance []byte) (*big.Int, error) { + scVoteInfo, err := g.getDelegatedContractInfo(scAddress, reference) if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError + return nil, err } - delegatedTo := args.Arguments[3] - - currentVote := &VoteDetails{ - Value: voteOption, - Power: votePower, - DelegatedTo: delegatedTo, - Balance: big.NewInt(0), + votePower, err := g.computeVotingPower(big.NewInt(0).SetBytes(balance)) + if err != nil { + return nil, err } - totalVotingPower, err := g.computeValidatorVotingPower(voterAddress) + scVoteInfo.UsedPower.Add(scVoteInfo.UsedPower, votePower) + if scVoteInfo.TotalPower.Cmp(scVoteInfo.UsedPower) < 0 { + return nil, fmt.Errorf("not enough voting power to cast this vote") + } + err = g.saveDelegatedContractInfo(scAddress, scVoteInfo, reference) if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError + return nil, err } - currentVoteSet, err := g.getOrCreateVoteSet(append(proposalToVote, voterAddress...)) + return votePower, nil +} + +func (g *governanceContract) addUserVote( + address []byte, + nonceAsBytes []byte, + vote string, + totalVotingPower *big.Int, + proposalToVote []byte, + direct bool, +) error { + nonce, err := nonceFromBytes(nonceAsBytes) if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.ExecutionFailed + return err } - if totalVotingPower.Cmp(big.NewInt(0).Add(votePower, currentVoteSet.UsedPower)) < 0 { - g.eei.AddReturnMessage("not enough voting power to cast this vote") - return vmcommon.UserError + + err = g.updateUserVoteList(address, nonce.Uint64(), direct) + if err != nil { + return err } - err = g.addNewVote(currentVote, currentVoteSet, proposal) + voteOption, err := g.castVoteType(vote) if err != nil { - g.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError + return err } - g.lockStake(voterAddress, proposal.EndVoteNonce) - return vmcommon.Ok -} + proposal, err := g.getValidProposal(proposalToVote) + if err != nil { + return err + } -func (g *governanceContract) getDelegatedContractInfo(scAddress []byte) (*DelegatedSCVoteInfo, error) { - scVoteInfo := &DelegatedSCVoteInfo{ - TotalPower: big.NewInt(0), - UsedPower: big.NewInt(0), + err = g.addNewVote(voteOption, totalVotingPower, proposal) + if err != nil { + return err } + + g.lockStake(address, proposal.EndVoteNonce) + return g.saveGeneralProposal(proposalToVote, proposal) } -func (g *governanceContract) addUserVote( - address []byte, - nonce uint64, - voteOption VoteValueType, - totalVotingPower *big.Int, - proposal *GeneralProposal, - direct bool, -) error { +func (g *governanceContract) updateUserVoteList(address []byte, nonce uint64, direct bool) error { userVoteList, err := g.getUserVotes(address) if err != nil { return err @@ -486,19 +494,7 @@ func (g *governanceContract) addUserVote( } } - err = g.addNewVote(voteOption, totalVotingPower, proposal) - if err != nil { - return err - } - - err = g.saveUserVotes(address, userVoteList) - if err != nil { - return err - } - - g.lockStake(address, proposal.EndVoteNonce) - - return nil + return g.saveUserVotes(address, userVoteList) } func addNewNonce(nonceList []uint64, newNonce uint64) ([]uint64, error) { @@ -511,33 +507,7 @@ func addNewNonce(nonceList []uint64, newNonce uint64) ([]uint64, error) { return nonceList, nil } -func (g *governanceContract) saveUserVotes(address []byte, votedList *OngoingVotedList) error { - marshaledData, err := g.marshalizer.Marshal(votedList) - if err != nil { - return err - } - g.eei.SetStorage(address, marshaledData) - - return nil -} - -func (g *governanceContract) getUserVotes(address []byte) (*OngoingVotedList, error) { - onGoingList := &OngoingVotedList{ - ProposalNonces: make([]uint64, 0), - } - marshaledData := g.eei.GetStorage(address) - if len(marshaledData) == 0 { - return onGoingList, nil - } - - err := g.marshalizer.Unmarshal(onGoingList, marshaledData) - if err != nil { - return nil, err - } - - return onGoingList, nil -} - +//TODO: I would delete lockStake - if we put a voting period less than 10 epochs, we do not need this. func (g *governanceContract) lockStake(address []byte, endNonce uint64) { stakeLockKey := append([]byte(stakeLockPrefix), address...) lastData := g.eei.GetStorage(stakeLockKey) @@ -617,19 +587,13 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.UserError } - return vmcommon.Ok -} - -// getConfig returns the current system smart contract configuration -func (g *governanceContract) getConfig() (*GovernanceConfigV2, error) { - marshaledData := g.eei.GetStorage([]byte(governanceConfigKey)) - scConfig := &GovernanceConfigV2{} - err := g.marshalizer.Unmarshal(scConfig, marshaledData) + err = g.eei.Transfer(args.RecipientAddr, args.CallerAddr, generalProposal.ProposalCost, nil, 0) if err != nil { - return nil, err + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError } - return scConfig, nil + return vmcommon.Ok } // getValidatorVotingPower returns the total voting power for a validator. Un-staked nodes are not @@ -665,57 +629,6 @@ func (g *governanceContract) getValidatorVotingPower(args *vmcommon.ContractCall return vmcommon.Ok } -// saveGeneralProposal saves a proposal into the storage -func (g *governanceContract) saveGeneralProposal(reference []byte, generalProposal *GeneralProposal) error { - marshaledData, err := g.marshalizer.Marshal(generalProposal) - if err != nil { - return err - } - key := append([]byte(proposalPrefix), reference...) - g.eei.SetStorage(key, marshaledData) - - return nil -} - -func (g *governanceContract) getEndNonceForProposal(reference []byte) uint64 { - proposal, err := g.getGeneralProposal(reference) - if err == vm.ErrProposalNotFound { - return 0 - } - - if err != nil { - return math.MaxUint64 - } - - return proposal.EndVoteNonce -} - -// getGeneralProposal returns a proposal from storage -func (g *governanceContract) getGeneralProposal(reference []byte) (*GeneralProposal, error) { - commitHash := g.eei.GetStorage(reference) - key := append([]byte(proposalPrefix), commitHash...) - marshaledData := g.eei.GetStorage(key) - - if len(marshaledData) == 0 { - return nil, vm.ErrProposalNotFound - } - - generalProposal := &GeneralProposal{} - err := g.marshalizer.Unmarshal(generalProposal, marshaledData) - if err != nil { - return nil, err - } - - return generalProposal, nil -} - -// proposalExists returns true if a proposal already exists -func (g *governanceContract) proposalExists(reference []byte) bool { - key := append([]byte(proposalPrefix), reference...) - marshaledData := g.eei.GetStorage(key) - return len(marshaledData) > 0 -} - // getValidProposal returns a proposal from storage if it exists, or it is still valid/in-progress func (g *governanceContract) getValidProposal(reference []byte) (*GeneralProposal, error) { proposal, err := g.getGeneralProposal(reference) @@ -763,34 +676,6 @@ func (g *governanceContract) computeVotingPower(value *big.Int) (*big.Int, error return big.NewInt(0).Sqrt(value), nil } -// computeAccountLeveledPower takes a value and some voter data and returns the voting power of that value in -// the following way: the power of all votes combined has to be sqrt(sum(allVoteWithFunds)). So, the new -// vote will have a smaller power depending on how much existed previously -func (g *governanceContract) computeAccountLeveledPower(value *big.Int, voteData *VoteSet) (*big.Int, error) { - previousAccountPower, err := g.computeVotingPower(voteData.UsedBalance) - if err != nil { - return nil, err - } - - fullAccountBalance := big.NewInt(0).Add(voteData.UsedBalance, value) - newAccountPower, err := g.computeVotingPower(fullAccountBalance) - if err != nil { - return nil, err - } - - return big.NewInt(0).Sub(newAccountPower, previousAccountPower), nil -} - -// isValidVoteString checks if a certain string represents a valid vote string -func (g *governanceContract) isValidVoteString(vote string) bool { - switch vote { - case yesString, noString, vetoString, abstainString: - return true - default: - return false - } -} - // castVoteType casts a valid string vote passed as an argument to the actual mapped value func (g *governanceContract) castVoteType(vote string) (VoteValueType, error) { switch vote { @@ -860,6 +745,35 @@ func (g *governanceContract) computeVotingPowerFromTotalStake(address []byte) (* return votingPower, nil } +// computeEndResults computes if a proposal has passed or not based on votes accumulated +func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error { + baseConfig, err := g.getConfig() + if err != nil { + return err + } + + totalVotes := big.NewInt(0).Add(proposal.Yes, proposal.No) + totalVotes.Add(totalVotes, proposal.Veto) + + if totalVotes.Cmp(baseConfig.MinQuorum) == -1 { + proposal.Passed = false + return nil + } + + if proposal.Veto.Cmp(baseConfig.MinVetoThreshold) >= 0 { + proposal.Passed = false + return nil + } + + if proposal.Yes.Cmp(baseConfig.MinPassThreshold) >= 0 && proposal.Yes.Cmp(proposal.No) == 1 { + proposal.Passed = true + return nil + } + + proposal.Passed = false + return nil +} + func (g *governanceContract) getActiveFundForDelegator(delegationAddress []byte, address []byte) (*big.Int, error) { dData := &DelegatorData{ UnClaimedRewards: big.NewInt(0), @@ -904,13 +818,129 @@ func (g *governanceContract) getTotalStake(validatorAddress []byte) (*big.Int, e return validatorData.TotalStakeValue, nil } +func (g *governanceContract) saveUserVotes(address []byte, votedList *OngoingVotedList) error { + marshaledData, err := g.marshalizer.Marshal(votedList) + if err != nil { + return err + } + g.eei.SetStorage(address, marshaledData) + + return nil +} + +func (g *governanceContract) getUserVotes(address []byte) (*OngoingVotedList, error) { + onGoingList := &OngoingVotedList{ + ProposalNonces: make([]uint64, 0), + } + marshaledData := g.eei.GetStorage(address) + if len(marshaledData) == 0 { + return onGoingList, nil + } + + err := g.marshalizer.Unmarshal(onGoingList, marshaledData) + if err != nil { + return nil, err + } + + return onGoingList, nil +} + +func (g *governanceContract) getDelegatedContractInfo(scAddress []byte, reference []byte) (*DelegatedSCVoteInfo, error) { + scVoteInfo := &DelegatedSCVoteInfo{ + TotalPower: big.NewInt(0), + UsedPower: big.NewInt(0), + } + + marshalledData := g.eei.GetStorage(append(scAddress, reference...)) + if len(marshalledData) > 0 { + err := g.marshalizer.Unmarshal(scVoteInfo, marshalledData) + if err != nil { + return nil, err + } + + return scVoteInfo, nil + } + + totalVotingPower, err := g.computeVotingPowerFromTotalStake(scAddress) + if err != nil { + return nil, err + } + scVoteInfo.TotalPower.Set(totalVotingPower) + + return scVoteInfo, nil +} + +func (g *governanceContract) saveDelegatedContractInfo( + scAddress []byte, + scVoteInfo *DelegatedSCVoteInfo, + reference []byte, +) error { + marshalledData, err := g.marshalizer.Marshal(scVoteInfo) + if err != nil { + return err + } + + g.eei.SetStorage(append(scAddress, reference...), marshalledData) + return nil +} + +// getConfig returns the current system smart contract configuration +func (g *governanceContract) getConfig() (*GovernanceConfigV2, error) { + marshaledData := g.eei.GetStorage([]byte(governanceConfigKey)) + scConfig := &GovernanceConfigV2{} + err := g.marshalizer.Unmarshal(scConfig, marshaledData) + if err != nil { + return nil, err + } + + return scConfig, nil +} + +// saveGeneralProposal saves a proposal into the storage +func (g *governanceContract) saveGeneralProposal(reference []byte, generalProposal *GeneralProposal) error { + marshaledData, err := g.marshalizer.Marshal(generalProposal) + if err != nil { + return err + } + key := append([]byte(proposalPrefix), reference...) + g.eei.SetStorage(key, marshaledData) + + return nil +} + +// getGeneralProposal returns a proposal from storage +func (g *governanceContract) getGeneralProposal(reference []byte) (*GeneralProposal, error) { + commitHash := g.eei.GetStorage(reference) + key := append([]byte(proposalPrefix), commitHash...) + marshaledData := g.eei.GetStorage(key) + + if len(marshaledData) == 0 { + return nil, vm.ErrProposalNotFound + } + + generalProposal := &GeneralProposal{} + err := g.marshalizer.Unmarshal(generalProposal, marshaledData) + if err != nil { + return nil, err + } + + return generalProposal, nil +} + +// proposalExists returns true if a proposal already exists +func (g *governanceContract) proposalExists(reference []byte) bool { + key := append([]byte(proposalPrefix), reference...) + marshaledData := g.eei.GetStorage(key) + return len(marshaledData) > 0 +} + // startEndNonceFromArguments converts the nonce string arguments to uint64 func (g *governanceContract) startEndNonceFromArguments(argStart []byte, argEnd []byte) (uint64, uint64, error) { - startVoteNonce, err := g.nonceFromBytes(argStart) + startVoteNonce, err := nonceFromBytes(argStart) if err != nil { return 0, 0, err } - endVoteNonce, err := g.nonceFromBytes(argEnd) + endVoteNonce, err := nonceFromBytes(argEnd) if err != nil { return 0, 0, err } @@ -924,7 +954,7 @@ func (g *governanceContract) startEndNonceFromArguments(argStart []byte, argEnd } // nonceFromBytes converts a byte array to a big.Int. Returns ErrInvalidStartEndVoteNonce for invalid values -func (g *governanceContract) nonceFromBytes(nonce []byte) (*big.Int, error) { +func nonceFromBytes(nonce []byte) (*big.Int, error) { voteNonce, okConvert := big.NewInt(0).SetString(string(nonce), conversionBase) if !okConvert { return nil, vm.ErrInvalidStartEndVoteNonce @@ -936,35 +966,6 @@ func (g *governanceContract) nonceFromBytes(nonce []byte) (*big.Int, error) { return voteNonce, nil } -// computeEndResults computes if a proposal has passed or not based on votes accumulated -func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error { - baseConfig, err := g.getConfig() - if err != nil { - return err - } - - totalVotes := big.NewInt(0).Add(proposal.Yes, proposal.No) - totalVotes.Add(totalVotes, proposal.Veto) - - if totalVotes.Cmp(baseConfig.MinQuorum) == -1 { - proposal.Passed = false - return nil - } - - if proposal.Veto.Cmp(baseConfig.MinVetoThreshold) >= 0 { - proposal.Passed = false - return nil - } - - if proposal.Yes.Cmp(baseConfig.MinPassThreshold) >= 0 && proposal.Yes.Cmp(proposal.No) == 1 { - proposal.Passed = true - return nil - } - - proposal.Passed = false - return nil -} - // convertV2Config converts the passed config file to the correct V2 typed GovernanceConfig func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCConfig) (*GovernanceConfigV2, error) { minQuorum, success := big.NewInt(0).SetString(config.Active.MinQuorum, conversionBase) From e4c429ddb295f4401320c1f4663b0bc870c6107b Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 17 Jan 2023 13:10:54 +0200 Subject: [PATCH 127/335] - regenerated proto file --- vm/systemSmartContracts/governance.pb.go | 678 ++++++++++++++++++++--- 1 file changed, 601 insertions(+), 77 deletions(-) diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 182173fcc9e..820346488ba 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -68,7 +68,7 @@ type GeneralProposal struct { Passed bool `protobuf:"varint,9,opt,name=Passed,proto3" json:"Passed"` Closed bool `protobuf:"varint,10,opt,name=Closed,proto3" json:"Closed"` IssuerAddress []byte `protobuf:"bytes,11,opt,name=IssuerAddress,proto3" json:"IssuerAddress"` - ProposalCost *math_big.Int + ProposalCost *math_big.Int `protobuf:"bytes,12,opt,name=ProposalCost,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalCost"` } func (m *GeneralProposal) Reset() { *m = GeneralProposal{} } @@ -176,6 +176,13 @@ func (m *GeneralProposal) GetIssuerAddress() []byte { return nil } +func (m *GeneralProposal) GetProposalCost() *math_big.Int { + if m != nil { + return m.ProposalCost + } + return nil +} + type GovernanceConfig struct { NumNodes int64 `protobuf:"varint,1,opt,name=NumNodes,proto3" json:"NumNodes"` MinQuorum int32 `protobuf:"varint,2,opt,name=MinQuorum,proto3" json:"MinQuorum"` @@ -247,17 +254,12 @@ func (m *GovernanceConfig) GetProposalFee() *math_big.Int { return nil } -type DelegatedSCVoteInfo struct { - TotalPower *math_big.Int `protobuf:"bytes,1,opt,name=MinQuorum,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinQuorum"` - UsedPower *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` -} - type GovernanceConfigV2 struct { MinQuorum *math_big.Int `protobuf:"bytes,1,opt,name=MinQuorum,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinQuorum"` MinPassThreshold *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` MinVetoThreshold *math_big.Int `protobuf:"bytes,3,opt,name=MinVetoThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinVetoThreshold"` ProposalFee *math_big.Int `protobuf:"bytes,4,opt,name=ProposalFee,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalFee"` - LastProposalNonce uint64 + LastProposalNonce uint64 `protobuf:"varint,5,opt,name=LastProposalNonce,proto3" json:"LastProposalNonce"` } func (m *GovernanceConfigV2) Reset() { *m = GovernanceConfigV2{} } @@ -316,10 +318,16 @@ func (m *GovernanceConfigV2) GetProposalFee() *math_big.Int { return nil } +func (m *GovernanceConfigV2) GetLastProposalNonce() uint64 { + if m != nil { + return m.LastProposalNonce + } + return 0 +} + type OngoingVotedList struct { - ProposalNonces []uint64 `protobuf:"varint,1,rep,packed,name=ProposalNonces,proto3" json:"ProposalNonces"` - Direct []uint64 - Delegated []uint64 + Direct []uint64 `protobuf:"varint,1,rep,packed,name=Direct,proto3" json:"Direct"` + Delegated []uint64 `protobuf:"varint,2,rep,packed,name=Delegated,proto3" json:"Delegated"` } func (m *OngoingVotedList) Reset() { *m = OngoingVotedList{} } @@ -350,9 +358,63 @@ func (m *OngoingVotedList) XXX_DiscardUnknown() { var xxx_messageInfo_OngoingVotedList proto.InternalMessageInfo -func (m *OngoingVotedList) GetProposalNonces() []uint64 { +func (m *OngoingVotedList) GetDirect() []uint64 { + if m != nil { + return m.Direct + } + return nil +} + +func (m *OngoingVotedList) GetDelegated() []uint64 { + if m != nil { + return m.Delegated + } + return nil +} + +type DelegatedSCVoteInfo struct { + TotalPower *math_big.Int `protobuf:"bytes,1,opt,name=TotalPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalPower"` + UsedPower *math_big.Int `protobuf:"bytes,2,opt,name=UsedPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` +} + +func (m *DelegatedSCVoteInfo) Reset() { *m = DelegatedSCVoteInfo{} } +func (*DelegatedSCVoteInfo) ProtoMessage() {} +func (*DelegatedSCVoteInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_e18a03da5266c714, []int{4} +} +func (m *DelegatedSCVoteInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DelegatedSCVoteInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *DelegatedSCVoteInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_DelegatedSCVoteInfo.Merge(m, src) +} +func (m *DelegatedSCVoteInfo) XXX_Size() int { + return m.Size() +} +func (m *DelegatedSCVoteInfo) XXX_DiscardUnknown() { + xxx_messageInfo_DelegatedSCVoteInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_DelegatedSCVoteInfo proto.InternalMessageInfo + +func (m *DelegatedSCVoteInfo) GetTotalPower() *math_big.Int { if m != nil { - return m.ProposalNonces + return m.TotalPower + } + return nil +} + +func (m *DelegatedSCVoteInfo) GetUsedPower() *math_big.Int { + if m != nil { + return m.UsedPower } return nil } @@ -363,58 +425,67 @@ func init() { proto.RegisterType((*GovernanceConfig)(nil), "proto.GovernanceConfig") proto.RegisterType((*GovernanceConfigV2)(nil), "proto.GovernanceConfigV2") proto.RegisterType((*OngoingVotedList)(nil), "proto.OngoingVotedList") + proto.RegisterType((*DelegatedSCVoteInfo)(nil), "proto.DelegatedSCVoteInfo") } func init() { proto.RegisterFile("governance.proto", fileDescriptor_e18a03da5266c714) } var fileDescriptor_e18a03da5266c714 = []byte{ - // 734 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xbd, 0x6e, 0xdb, 0x3a, - 0x14, 0x36, 0xfd, 0x17, 0x87, 0xf9, 0xb9, 0xba, 0x44, 0x06, 0xe1, 0x0e, 0x62, 0xe0, 0xc9, 0xb8, - 0x17, 0xb6, 0x81, 0xdb, 0x02, 0x01, 0xda, 0xa5, 0x91, 0x91, 0xa6, 0x01, 0x1a, 0x25, 0x51, 0x02, - 0xa3, 0x2d, 0x50, 0x14, 0xb4, 0xc5, 0xc8, 0x02, 0x2c, 0x32, 0x10, 0xa9, 0x20, 0xe9, 0xd4, 0xb5, - 0x5b, 0x9f, 0xa0, 0x73, 0xd1, 0x27, 0xe9, 0x98, 0x31, 0x93, 0xda, 0x28, 0x4b, 0xab, 0x29, 0x7d, - 0x83, 0x42, 0xf4, 0xaf, 0xec, 0xa0, 0x93, 0xd1, 0x89, 0x3c, 0xdf, 0xa1, 0xbe, 0xf3, 0x89, 0xe7, - 0xf0, 0x1c, 0xa8, 0xb9, 0xfc, 0x9c, 0x06, 0x8c, 0xb0, 0x2e, 0x6d, 0x9c, 0x05, 0x5c, 0x72, 0x54, - 0x52, 0xcb, 0x3f, 0x75, 0xd7, 0x93, 0xbd, 0xb0, 0xd3, 0xe8, 0x72, 0xbf, 0xe9, 0x72, 0x97, 0x37, - 0x15, 0xdc, 0x09, 0x4f, 0x95, 0xa5, 0x0c, 0xb5, 0x1b, 0x7c, 0x55, 0xfd, 0x59, 0x82, 0x7f, 0xed, - 0x52, 0x46, 0x03, 0xd2, 0x3f, 0x0c, 0xf8, 0x19, 0x17, 0xa4, 0x8f, 0x30, 0x2c, 0x59, 0x9c, 0x75, - 0xa9, 0x0e, 0x36, 0x41, 0xad, 0x68, 0x2e, 0x27, 0x11, 0x1e, 0x00, 0xf6, 0x60, 0x41, 0x0d, 0x08, - 0x5b, 0xdc, 0xf7, 0x3d, 0xf9, 0x8c, 0x88, 0x9e, 0x9e, 0xdf, 0x04, 0xb5, 0x55, 0x73, 0x3d, 0x89, - 0xf0, 0x14, 0x6a, 0x4f, 0xed, 0xd1, 0x23, 0xb8, 0x7e, 0x2c, 0x49, 0x20, 0xdb, 0x5c, 0xd2, 0x01, - 0x73, 0x41, 0x31, 0xa3, 0x24, 0xc2, 0x33, 0x1e, 0x7b, 0xc6, 0x46, 0x0f, 0xe1, 0xea, 0x0e, 0x73, - 0x26, 0x5f, 0x16, 0xd5, 0x97, 0x5a, 0x12, 0xe1, 0x0c, 0x6e, 0x67, 0x2c, 0xd4, 0x81, 0x85, 0x97, - 0x54, 0xe8, 0x25, 0x25, 0xed, 0x30, 0x89, 0x70, 0x6a, 0x7e, 0xfe, 0x8a, 0x77, 0x7c, 0x22, 0x7b, - 0xcd, 0x8e, 0xe7, 0x36, 0xf6, 0x98, 0x7c, 0x3c, 0x75, 0x55, 0x7e, 0xd8, 0x97, 0xde, 0x39, 0x0d, - 0xc4, 0x45, 0xd3, 0xbf, 0xa8, 0x77, 0x7b, 0xc4, 0x63, 0xf5, 0x2e, 0x0f, 0x68, 0xdd, 0xe5, 0x4d, - 0x87, 0x48, 0xd2, 0x30, 0x3d, 0x77, 0x8f, 0xc9, 0x16, 0x11, 0x92, 0x06, 0x76, 0xca, 0x86, 0xde, - 0xc0, 0xbc, 0xc5, 0xf5, 0xb2, 0x0a, 0x71, 0x90, 0x44, 0x38, 0x6f, 0xf1, 0xc5, 0x45, 0xc8, 0x5b, - 0x1c, 0x51, 0x58, 0x6c, 0x53, 0xc9, 0xf5, 0x25, 0x15, 0xe2, 0x28, 0x89, 0xb0, 0xb2, 0x17, 0x17, - 0x44, 0xd1, 0x21, 0x06, 0x97, 0xb6, 0x3b, 0x42, 0x12, 0x8f, 0xe9, 0x15, 0x15, 0xe9, 0x24, 0x89, - 0xf0, 0x08, 0x5a, 0x5c, 0xb0, 0x11, 0x23, 0xaa, 0xc2, 0xf2, 0x21, 0x11, 0x82, 0x3a, 0xfa, 0xf2, - 0x26, 0xa8, 0x55, 0x4c, 0x98, 0x44, 0x78, 0x88, 0xd8, 0xc3, 0x35, 0x3d, 0xd3, 0xea, 0xf3, 0xf4, - 0x0c, 0x9c, 0x9c, 0x19, 0x20, 0xf6, 0x70, 0x45, 0x5b, 0x70, 0x6d, 0x4f, 0x88, 0x90, 0x06, 0xdb, - 0x8e, 0x13, 0x50, 0x21, 0xf4, 0x15, 0xa5, 0xfe, 0xef, 0x24, 0xc2, 0x59, 0x87, 0x9d, 0x35, 0xab, - 0x3f, 0xf2, 0x50, 0xdb, 0x1d, 0x3f, 0x9f, 0x16, 0x67, 0xa7, 0x9e, 0x8b, 0x6a, 0xb0, 0x62, 0x85, - 0xbe, 0xc5, 0x1d, 0x2a, 0x54, 0xdd, 0x17, 0xcc, 0xd5, 0x24, 0xc2, 0x63, 0xcc, 0x1e, 0xef, 0xd0, - 0x7f, 0x70, 0x79, 0xdf, 0x63, 0x47, 0x21, 0x0f, 0x42, 0x5f, 0x15, 0x7f, 0xc9, 0x5c, 0x4b, 0x22, - 0x3c, 0x01, 0xed, 0xc9, 0x16, 0x3d, 0x81, 0xda, 0xbe, 0xc7, 0xd2, 0xbf, 0x3a, 0xe9, 0x05, 0x54, - 0xf4, 0x78, 0xdf, 0x51, 0xc5, 0x5f, 0x32, 0x37, 0x92, 0x08, 0xcf, 0xf9, 0xec, 0x39, 0x64, 0xc8, - 0x90, 0x66, 0x6a, 0xc2, 0x50, 0xcc, 0x30, 0x64, 0x7c, 0xf6, 0x1c, 0x82, 0xde, 0xc2, 0x95, 0xd1, - 0xdb, 0x7e, 0x4a, 0xe9, 0xf0, 0x51, 0xbc, 0x48, 0x22, 0x3c, 0x0d, 0x2f, 0x2e, 0xd1, 0xd3, 0xac, - 0xd5, 0x8f, 0x45, 0x88, 0x66, 0xef, 0xba, 0xfd, 0x3f, 0x92, 0xd3, 0x77, 0x08, 0x94, 0xa0, 0x76, - 0xe6, 0x0e, 0x17, 0x27, 0x67, 0x2a, 0x19, 0xef, 0xc1, 0x3d, 0xd9, 0x18, 0xb4, 0xaf, 0xd7, 0xf7, - 0x65, 0x63, 0x71, 0x22, 0xe6, 0xd3, 0x3a, 0xd4, 0x92, 0xcd, 0x6b, 0x21, 0xa3, 0x25, 0xe3, 0x5b, - 0xac, 0x96, 0xdf, 0x16, 0x48, 0xf1, 0x4f, 0x16, 0x88, 0x05, 0xb5, 0x03, 0xe6, 0x72, 0x8f, 0xb9, - 0x69, 0xf7, 0x76, 0x9e, 0x7b, 0x42, 0xa6, 0xf3, 0x62, 0x74, 0x44, 0xb5, 0xf3, 0xf4, 0x45, 0x16, - 0x46, 0xf3, 0x22, 0xeb, 0xb1, 0x67, 0xec, 0x7f, 0xb7, 0xe0, 0x5a, 0x4a, 0xd4, 0x26, 0xfd, 0x90, - 0x9e, 0x5c, 0x9e, 0x51, 0xb4, 0xa4, 0x46, 0x81, 0x96, 0x43, 0xe5, 0xb4, 0x5f, 0x6b, 0x00, 0x55, - 0x06, 0x6d, 0x55, 0xcb, 0xa3, 0x95, 0x71, 0xe7, 0xd3, 0x0a, 0xa6, 0x75, 0x75, 0x63, 0xe4, 0xae, - 0x6f, 0x8c, 0xdc, 0xdd, 0x8d, 0x01, 0xde, 0xc5, 0x06, 0xf8, 0x14, 0x1b, 0xe0, 0x4b, 0x6c, 0x80, - 0xab, 0xd8, 0x00, 0xd7, 0xb1, 0x01, 0xbe, 0xc5, 0x06, 0xf8, 0x1e, 0x1b, 0xb9, 0xbb, 0xd8, 0x00, - 0x1f, 0x6e, 0x8d, 0xdc, 0xd5, 0xad, 0x91, 0xbb, 0xbe, 0x35, 0x72, 0xaf, 0x36, 0xc4, 0xa5, 0x90, - 0xd4, 0x3f, 0xf6, 0x49, 0x20, 0x5b, 0x9c, 0xc9, 0x80, 0x74, 0xa5, 0xe8, 0x94, 0xd5, 0x80, 0x7d, - 0xf0, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x17, 0xda, 0x44, 0xaa, 0x07, 0x00, 0x00, + // 855 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcd, 0x6f, 0x23, 0x35, + 0x14, 0x8f, 0xf3, 0xd5, 0xd6, 0x4d, 0x97, 0x59, 0xb3, 0x48, 0x23, 0x0e, 0xe3, 0x2a, 0xa7, 0x08, + 0xd4, 0x44, 0x02, 0xa4, 0x95, 0xe0, 0xc2, 0x26, 0xbb, 0x2c, 0x95, 0x76, 0xb3, 0xdd, 0x69, 0x09, + 0x2c, 0x12, 0x42, 0x4e, 0xc6, 0x9d, 0x8c, 0x94, 0xb1, 0x2b, 0xdb, 0xd9, 0x0f, 0x24, 0x24, 0x0e, + 0x5c, 0xb8, 0xf1, 0x67, 0x20, 0xfe, 0x12, 0x8e, 0x3d, 0xf6, 0x34, 0xd0, 0xe4, 0x02, 0x73, 0xea, + 0x9f, 0x80, 0xec, 0x99, 0xcc, 0x47, 0xb3, 0xe2, 0x34, 0xe2, 0x64, 0xbf, 0xdf, 0xb3, 0x7f, 0xef, + 0xcd, 0xfb, 0xf0, 0x1b, 0x68, 0xf9, 0xfc, 0x25, 0x15, 0x8c, 0xb0, 0x19, 0xed, 0x5f, 0x08, 0xae, + 0x38, 0x6a, 0x99, 0xe5, 0xfd, 0x23, 0x3f, 0x50, 0xf3, 0xe5, 0xb4, 0x3f, 0xe3, 0xe1, 0xc0, 0xe7, + 0x3e, 0x1f, 0x18, 0x78, 0xba, 0x3c, 0x37, 0x92, 0x11, 0xcc, 0x2e, 0xb9, 0xd5, 0xbd, 0x69, 0xc3, + 0x77, 0x1e, 0x53, 0x46, 0x05, 0x59, 0x9c, 0x08, 0x7e, 0xc1, 0x25, 0x59, 0x20, 0x0c, 0x5b, 0x63, + 0xce, 0x66, 0xd4, 0x06, 0x87, 0xa0, 0xd7, 0x1c, 0xee, 0xc5, 0x11, 0x4e, 0x00, 0x37, 0x59, 0x50, + 0x1f, 0xc2, 0x11, 0x0f, 0xc3, 0x40, 0x7d, 0x49, 0xe4, 0xdc, 0xae, 0x1f, 0x82, 0x5e, 0x67, 0x78, + 0x27, 0x8e, 0x70, 0x01, 0x75, 0x0b, 0x7b, 0xf4, 0x29, 0xbc, 0x73, 0xaa, 0x88, 0x50, 0x13, 0xae, + 0x68, 0xc2, 0xdc, 0x30, 0xcc, 0x28, 0x8e, 0xf0, 0x2d, 0x8d, 0x7b, 0x4b, 0x46, 0x9f, 0xc0, 0xce, + 0x23, 0xe6, 0xe5, 0x37, 0x9b, 0xe6, 0xa6, 0x15, 0x47, 0xb8, 0x84, 0xbb, 0x25, 0x09, 0x4d, 0x61, + 0xe3, 0x05, 0x95, 0x76, 0xcb, 0xb8, 0x76, 0x12, 0x47, 0x58, 0x8b, 0xbf, 0xff, 0x89, 0x1f, 0x85, + 0x44, 0xcd, 0x07, 0xd3, 0xc0, 0xef, 0x1f, 0x33, 0xf5, 0x59, 0x21, 0x54, 0xe1, 0x72, 0xa1, 0x82, + 0x97, 0x54, 0xc8, 0xd7, 0x83, 0xf0, 0xf5, 0xd1, 0x6c, 0x4e, 0x02, 0x76, 0x34, 0xe3, 0x82, 0x1e, + 0xf9, 0x7c, 0xe0, 0x11, 0x45, 0xfa, 0xc3, 0xc0, 0x3f, 0x66, 0x6a, 0x44, 0xa4, 0xa2, 0xc2, 0xd5, + 0x6c, 0xe8, 0x7b, 0x58, 0x1f, 0x73, 0xbb, 0x6d, 0x4c, 0x3c, 0x8b, 0x23, 0x5c, 0x1f, 0xf3, 0xea, + 0x2c, 0xd4, 0xc7, 0x1c, 0x51, 0xd8, 0x9c, 0x50, 0xc5, 0xed, 0x1d, 0x63, 0xe2, 0x79, 0x1c, 0x61, + 0x23, 0x57, 0x67, 0xc4, 0xd0, 0x21, 0x06, 0x77, 0x1e, 0x4c, 0xa5, 0x22, 0x01, 0xb3, 0x77, 0x8d, + 0xa5, 0xb3, 0x38, 0xc2, 0x1b, 0xa8, 0x3a, 0x63, 0x1b, 0x46, 0xd4, 0x85, 0xed, 0x13, 0x22, 0x25, + 0xf5, 0xec, 0xbd, 0x43, 0xd0, 0xdb, 0x1d, 0xc2, 0x38, 0xc2, 0x29, 0xe2, 0xa6, 0xab, 0x3e, 0x33, + 0x5a, 0x70, 0x7d, 0x06, 0xe6, 0x67, 0x12, 0xc4, 0x4d, 0x57, 0x74, 0x1f, 0x1e, 0x1c, 0x4b, 0xb9, + 0xa4, 0xe2, 0x81, 0xe7, 0x09, 0x2a, 0xa5, 0xbd, 0x6f, 0xbc, 0xbf, 0x1b, 0x47, 0xb8, 0xac, 0x70, + 0xcb, 0x22, 0xfa, 0x11, 0x76, 0x36, 0xb5, 0x3e, 0xe2, 0x52, 0xd9, 0x1d, 0x73, 0xef, 0x85, 0x2e, + 0xa9, 0x22, 0x5e, 0xdd, 0xa7, 0x97, 0x68, 0xbb, 0xff, 0xd4, 0xa1, 0xf5, 0x38, 0xeb, 0xde, 0x11, + 0x67, 0xe7, 0x81, 0x8f, 0x7a, 0x70, 0x77, 0xbc, 0x0c, 0xc7, 0xdc, 0xa3, 0xd2, 0xb4, 0x5d, 0x63, + 0xd8, 0x89, 0x23, 0x9c, 0x61, 0x6e, 0xb6, 0x43, 0x1f, 0xc2, 0xbd, 0xa7, 0x01, 0x7b, 0xbe, 0xe4, + 0x62, 0x19, 0x9a, 0xde, 0x6b, 0x0d, 0x0f, 0xe2, 0x08, 0xe7, 0xa0, 0x9b, 0x6f, 0xd1, 0xe7, 0xd0, + 0x7a, 0x1a, 0x30, 0x1d, 0xd4, 0xb3, 0xb9, 0xa0, 0x72, 0xce, 0x17, 0x9e, 0xe9, 0xbd, 0xd6, 0xf0, + 0x5e, 0x1c, 0xe1, 0x2d, 0x9d, 0xbb, 0x85, 0xa4, 0x0c, 0xba, 0x50, 0x72, 0x86, 0x66, 0x89, 0xa1, + 0xa4, 0x73, 0xb7, 0x10, 0xf4, 0x03, 0xdc, 0xdf, 0x7c, 0xff, 0x17, 0x94, 0xa6, 0x3d, 0xf9, 0x4d, + 0x1c, 0xe1, 0x22, 0x5c, 0x5d, 0xb0, 0x8b, 0xac, 0xdd, 0x75, 0x13, 0xa2, 0xdb, 0xb1, 0x9e, 0x7c, + 0x84, 0x54, 0x31, 0x86, 0xc0, 0x38, 0x34, 0x29, 0xc5, 0xb0, 0x3a, 0x77, 0x0a, 0xc9, 0xf8, 0x05, + 0xbc, 0x25, 0x1b, 0xc9, 0xeb, 0xf9, 0xdd, 0xdb, 0xb2, 0x51, 0x9d, 0x13, 0xdb, 0x69, 0x4d, 0x7d, + 0x29, 0xe7, 0xb5, 0x51, 0xf2, 0xa5, 0xa4, 0xab, 0xd6, 0x97, 0xff, 0x2c, 0x90, 0xe6, 0xff, 0x58, + 0x20, 0x68, 0x04, 0xef, 0x3e, 0x21, 0x52, 0x6d, 0xa0, 0x64, 0xc6, 0xb4, 0xcc, 0x8c, 0x79, 0x2f, + 0x8e, 0xf0, 0xb6, 0xd2, 0xdd, 0x86, 0xba, 0x33, 0x68, 0x3d, 0x63, 0x3e, 0x0f, 0x98, 0xaf, 0x27, + 0x90, 0xf7, 0x24, 0x90, 0x4a, 0xbf, 0x60, 0x0f, 0x03, 0x41, 0x67, 0xca, 0x06, 0x87, 0x8d, 0x5e, + 0x33, 0x79, 0xc1, 0x12, 0xc4, 0x4d, 0x57, 0xdd, 0xca, 0x0f, 0xe9, 0x82, 0xfa, 0x44, 0x51, 0x5d, + 0x08, 0xfa, 0x98, 0x69, 0xe5, 0x0c, 0x74, 0xf3, 0x6d, 0xf7, 0xe7, 0x3a, 0x7c, 0x37, 0x93, 0x4e, + 0x47, 0xda, 0xd2, 0x31, 0x3b, 0xe7, 0xe8, 0x15, 0x84, 0x67, 0x5c, 0x91, 0xc5, 0x09, 0x7f, 0x45, + 0x45, 0x5a, 0xcc, 0x5f, 0xeb, 0x61, 0x9c, 0xa3, 0xd5, 0xc5, 0xae, 0x40, 0xaa, 0x9b, 0xe8, 0x2b, + 0x49, 0xbd, 0xc4, 0x6e, 0x3d, 0x6f, 0xa2, 0x0c, 0xac, 0xb0, 0x89, 0x32, 0xce, 0x0f, 0xee, 0xc3, + 0x03, 0xfd, 0xe9, 0x13, 0xb2, 0x58, 0xd2, 0xb3, 0x37, 0x17, 0x14, 0xed, 0x98, 0x51, 0x6f, 0xd5, + 0x50, 0x5b, 0xcf, 0x63, 0x0b, 0xa0, 0xdd, 0x64, 0x6c, 0x5a, 0x75, 0xb4, 0x9f, 0x4d, 0x36, 0xab, + 0x31, 0x1c, 0x5f, 0x5e, 0x3b, 0xb5, 0xab, 0x6b, 0xa7, 0x76, 0x73, 0xed, 0x80, 0x9f, 0x56, 0x0e, + 0xf8, 0x6d, 0xe5, 0x80, 0x3f, 0x56, 0x0e, 0xb8, 0x5c, 0x39, 0xe0, 0x6a, 0xe5, 0x80, 0xbf, 0x56, + 0x0e, 0xf8, 0x7b, 0xe5, 0xd4, 0x6e, 0x56, 0x0e, 0xf8, 0x75, 0xed, 0xd4, 0x2e, 0xd7, 0x4e, 0xed, + 0x6a, 0xed, 0xd4, 0xbe, 0xbd, 0x27, 0xdf, 0x48, 0x45, 0xc3, 0xd3, 0x90, 0x08, 0x35, 0xe2, 0x4c, + 0x09, 0x32, 0x53, 0x72, 0xda, 0x36, 0x3f, 0x50, 0x1f, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc4, + 0x54, 0x31, 0xee, 0x8a, 0x09, 0x00, 0x00, } func (x VoteValueType) String() string { @@ -488,6 +559,12 @@ func (this *GeneralProposal) Equal(that interface{}) bool { if !bytes.Equal(this.IssuerAddress, that1.IssuerAddress) { return false } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if !__caster.Equal(this.ProposalCost, that1.ProposalCost) { + return false + } + } return true } func (this *GovernanceConfig) Equal(that interface{}) bool { @@ -572,6 +649,9 @@ func (this *GovernanceConfigV2) Equal(that interface{}) bool { return false } } + if this.LastProposalNonce != that1.LastProposalNonce { + return false + } return true } func (this *OngoingVotedList) Equal(that interface{}) bool { @@ -593,11 +673,52 @@ func (this *OngoingVotedList) Equal(that interface{}) bool { } else if this == nil { return false } - if len(this.ProposalNonces) != len(that1.ProposalNonces) { + if len(this.Direct) != len(that1.Direct) { return false } - for i := range this.ProposalNonces { - if this.ProposalNonces[i] != that1.ProposalNonces[i] { + for i := range this.Direct { + if this.Direct[i] != that1.Direct[i] { + return false + } + } + if len(this.Delegated) != len(that1.Delegated) { + return false + } + for i := range this.Delegated { + if this.Delegated[i] != that1.Delegated[i] { + return false + } + } + return true +} +func (this *DelegatedSCVoteInfo) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*DelegatedSCVoteInfo) + if !ok { + that2, ok := that.(DelegatedSCVoteInfo) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if !__caster.Equal(this.TotalPower, that1.TotalPower) { + return false + } + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if !__caster.Equal(this.UsedPower, that1.UsedPower) { return false } } @@ -607,7 +728,7 @@ func (this *GeneralProposal) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 15) + s := make([]string, 0, 16) s = append(s, "&systemSmartContracts.GeneralProposal{") s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") s = append(s, "CommitHash: "+fmt.Sprintf("%#v", this.CommitHash)+",\n") @@ -620,6 +741,7 @@ func (this *GeneralProposal) GoString() string { s = append(s, "Passed: "+fmt.Sprintf("%#v", this.Passed)+",\n") s = append(s, "Closed: "+fmt.Sprintf("%#v", this.Closed)+",\n") s = append(s, "IssuerAddress: "+fmt.Sprintf("%#v", this.IssuerAddress)+",\n") + s = append(s, "ProposalCost: "+fmt.Sprintf("%#v", this.ProposalCost)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -641,12 +763,13 @@ func (this *GovernanceConfigV2) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 8) + s := make([]string, 0, 9) s = append(s, "&systemSmartContracts.GovernanceConfigV2{") s = append(s, "MinQuorum: "+fmt.Sprintf("%#v", this.MinQuorum)+",\n") s = append(s, "MinPassThreshold: "+fmt.Sprintf("%#v", this.MinPassThreshold)+",\n") s = append(s, "MinVetoThreshold: "+fmt.Sprintf("%#v", this.MinVetoThreshold)+",\n") s = append(s, "ProposalFee: "+fmt.Sprintf("%#v", this.ProposalFee)+",\n") + s = append(s, "LastProposalNonce: "+fmt.Sprintf("%#v", this.LastProposalNonce)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -654,9 +777,21 @@ func (this *OngoingVotedList) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 5) + s := make([]string, 0, 6) s = append(s, "&systemSmartContracts.OngoingVotedList{") - s = append(s, "ProposalNonces: "+fmt.Sprintf("%#v", this.ProposalNonces)+",\n") + s = append(s, "Direct: "+fmt.Sprintf("%#v", this.Direct)+",\n") + s = append(s, "Delegated: "+fmt.Sprintf("%#v", this.Delegated)+",\n") + s = append(s, "}") + return strings.Join(s, "") +} +func (this *DelegatedSCVoteInfo) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 6) + s = append(s, "&systemSmartContracts.DelegatedSCVoteInfo{") + s = append(s, "TotalPower: "+fmt.Sprintf("%#v", this.TotalPower)+",\n") + s = append(s, "UsedPower: "+fmt.Sprintf("%#v", this.UsedPower)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -688,6 +823,17 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + size := __caster.Size(m.ProposalCost) + i -= size + if _, err := __caster.MarshalTo(m.ProposalCost, dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGovernance(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 if len(m.IssuerAddress) > 0 { i -= len(m.IssuerAddress) copy(dAtA[i:], m.IssuerAddress) @@ -858,6 +1004,11 @@ func (m *GovernanceConfigV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.LastProposalNonce != 0 { + i = encodeVarintGovernance(dAtA, i, uint64(m.LastProposalNonce)) + i-- + dAtA[i] = 0x28 + } { __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} size := __caster.Size(m.ProposalFee) @@ -925,10 +1076,10 @@ func (m *OngoingVotedList) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.ProposalNonces) > 0 { - dAtA2 := make([]byte, len(m.ProposalNonces)*10) + if len(m.Delegated) > 0 { + dAtA2 := make([]byte, len(m.Delegated)*10) var j1 int - for _, num := range m.ProposalNonces { + for _, num := range m.Delegated { for num >= 1<<7 { dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 @@ -941,11 +1092,74 @@ func (m *OngoingVotedList) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], dAtA2[:j1]) i = encodeVarintGovernance(dAtA, i, uint64(j1)) i-- + dAtA[i] = 0x12 + } + if len(m.Direct) > 0 { + dAtA4 := make([]byte, len(m.Direct)*10) + var j3 int + for _, num := range m.Direct { + for num >= 1<<7 { + dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j3++ + } + dAtA4[j3] = uint8(num) + j3++ + } + i -= j3 + copy(dAtA[i:], dAtA4[:j3]) + i = encodeVarintGovernance(dAtA, i, uint64(j3)) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } +func (m *DelegatedSCVoteInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DelegatedSCVoteInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DelegatedSCVoteInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + size := __caster.Size(m.UsedPower) + i -= size + if _, err := __caster.MarshalTo(m.UsedPower, dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGovernance(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + size := __caster.Size(m.TotalPower) + i -= size + if _, err := __caster.MarshalTo(m.TotalPower, dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGovernance(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintGovernance(dAtA []byte, offset int, v uint64) int { offset -= sovGovernance(v) base := offset @@ -1006,6 +1220,11 @@ func (m *GeneralProposal) Size() (n int) { if l > 0 { n += 1 + l + sovGovernance(uint64(l)) } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + l = __caster.Size(m.ProposalCost) + n += 1 + l + sovGovernance(uint64(l)) + } return n } @@ -1061,6 +1280,9 @@ func (m *GovernanceConfigV2) Size() (n int) { l = __caster.Size(m.ProposalFee) n += 1 + l + sovGovernance(uint64(l)) } + if m.LastProposalNonce != 0 { + n += 1 + sovGovernance(uint64(m.LastProposalNonce)) + } return n } @@ -1070,13 +1292,39 @@ func (m *OngoingVotedList) Size() (n int) { } var l int _ = l - if len(m.ProposalNonces) > 0 { + if len(m.Direct) > 0 { l = 0 - for _, e := range m.ProposalNonces { + for _, e := range m.Direct { l += sovGovernance(uint64(e)) } n += 1 + sovGovernance(uint64(l)) + l } + if len(m.Delegated) > 0 { + l = 0 + for _, e := range m.Delegated { + l += sovGovernance(uint64(e)) + } + n += 1 + sovGovernance(uint64(l)) + l + } + return n +} + +func (m *DelegatedSCVoteInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + l = __caster.Size(m.TotalPower) + n += 1 + l + sovGovernance(uint64(l)) + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + l = __caster.Size(m.UsedPower) + n += 1 + l + sovGovernance(uint64(l)) + } return n } @@ -1102,6 +1350,7 @@ func (this *GeneralProposal) String() string { `Passed:` + fmt.Sprintf("%v", this.Passed) + `,`, `Closed:` + fmt.Sprintf("%v", this.Closed) + `,`, `IssuerAddress:` + fmt.Sprintf("%v", this.IssuerAddress) + `,`, + `ProposalCost:` + fmt.Sprintf("%v", this.ProposalCost) + `,`, `}`, }, "") return s @@ -1129,6 +1378,7 @@ func (this *GovernanceConfigV2) String() string { `MinPassThreshold:` + fmt.Sprintf("%v", this.MinPassThreshold) + `,`, `MinVetoThreshold:` + fmt.Sprintf("%v", this.MinVetoThreshold) + `,`, `ProposalFee:` + fmt.Sprintf("%v", this.ProposalFee) + `,`, + `LastProposalNonce:` + fmt.Sprintf("%v", this.LastProposalNonce) + `,`, `}`, }, "") return s @@ -1138,7 +1388,19 @@ func (this *OngoingVotedList) String() string { return "nil" } s := strings.Join([]string{`&OngoingVotedList{`, - `ProposalNonces:` + fmt.Sprintf("%v", this.ProposalNonces) + `,`, + `Direct:` + fmt.Sprintf("%v", this.Direct) + `,`, + `Delegated:` + fmt.Sprintf("%v", this.Delegated) + `,`, + `}`, + }, "") + return s +} +func (this *DelegatedSCVoteInfo) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&DelegatedSCVoteInfo{`, + `TotalPower:` + fmt.Sprintf("%v", this.TotalPower) + `,`, + `UsedPower:` + fmt.Sprintf("%v", this.UsedPower) + `,`, `}`, }, "") return s @@ -1497,6 +1759,44 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { m.IssuerAddress = []byte{} } iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProposalCost", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } else { + m.ProposalCost = tmp + } + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGovernance(dAtA[iNdEx:]) @@ -1869,6 +2169,25 @@ func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { } } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LastProposalNonce", wireType) + } + m.LastProposalNonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LastProposalNonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipGovernance(dAtA[iNdEx:]) @@ -1939,7 +2258,7 @@ func (m *OngoingVotedList) Unmarshal(dAtA []byte) error { break } } - m.ProposalNonces = append(m.ProposalNonces, v) + m.Direct = append(m.Direct, v) } else if wireType == 2 { var packedLen int for shift := uint(0); ; shift += 7 { @@ -1974,8 +2293,8 @@ func (m *OngoingVotedList) Unmarshal(dAtA []byte) error { } } elementCount = count - if elementCount != 0 && len(m.ProposalNonces) == 0 { - m.ProposalNonces = make([]uint64, 0, elementCount) + if elementCount != 0 && len(m.Direct) == 0 { + m.Direct = make([]uint64, 0, elementCount) } for iNdEx < postIndex { var v uint64 @@ -1993,11 +2312,216 @@ func (m *OngoingVotedList) Unmarshal(dAtA []byte) error { break } } - m.ProposalNonces = append(m.ProposalNonces, v) + m.Direct = append(m.Direct, v) } } else { - return fmt.Errorf("proto: wrong wireType = %d for field ProposalNonces", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Direct", wireType) } + case 2: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Delegated = append(m.Delegated, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.Delegated) == 0 { + m.Delegated = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Delegated = append(m.Delegated, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Delegated", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipGovernance(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGovernance + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGovernance + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DelegatedSCVoteInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: DelegatedSCVoteInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DelegatedSCVoteInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalPower", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } else { + m.TotalPower = tmp + } + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UsedPower", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } else { + m.UsedPower = tmp + } + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGovernance(dAtA[iNdEx:]) From f8076bd73cdae29b25746464afa2e6b7260ef518 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 17 Jan 2023 14:31:23 +0200 Subject: [PATCH 128/335] changing stuff, new implementation --- vm/systemSmartContracts/governance.go | 3 +- vm/systemSmartContracts/governance_test.go | 1407 ++------------------ 2 files changed, 89 insertions(+), 1321 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 2a4eeab1469..ef6d6250f9f 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -830,7 +830,8 @@ func (g *governanceContract) saveUserVotes(address []byte, votedList *OngoingVot func (g *governanceContract) getUserVotes(address []byte) (*OngoingVotedList, error) { onGoingList := &OngoingVotedList{ - ProposalNonces: make([]uint64, 0), + Direct: make([]uint64, 0), + Delegated: make([]uint64, 0), } marshaledData := g.eei.GetStorage(address) if len(marshaledData) == 0 { diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 79c2f0d3d2c..1c1b5686a2f 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -43,7 +43,6 @@ func createMockGovernanceArgs() ArgsNewGovernanceContract { EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{ IsGovernanceFlagEnabledField: true, }, - InitialWhiteListedAddresses: [][]byte{vm.GovernanceSCAddress}, } } @@ -147,23 +146,6 @@ func TestNewGovernanceContract_InvalidGovernanceAddress(t *testing.T) { require.True(t, errors.Is(err, vm.ErrInvalidAddress)) } -func TestNewGovernanceContract_InvalidWhiteList(t *testing.T) { - t.Parallel() - - args := createMockGovernanceArgs() - args.InitialWhiteListedAddresses = nil - - gsc, err := NewGovernanceContract(args) - require.Nil(t, gsc) - require.True(t, errors.Is(err, vm.ErrInvalidNumOfInitialWhiteListedAddress)) - - args.InitialWhiteListedAddresses = [][]byte{[]byte("someAddress")} - gsc, err = NewGovernanceContract(args) - require.Nil(t, gsc) - require.NotNil(t, err) - require.True(t, bytes.Contains([]byte(err.Error()), []byte("invalid address length for"))) -} - func TestGovernanceContract_ExecuteNilVMInputShouldErr(t *testing.T) { t.Parallel() @@ -383,181 +365,6 @@ func TestGovernanceContract_ProposalOK(t *testing.T) { require.Equal(t, vmcommon.Ok, retCode) } -func TestGovernanceContract_VoteWithFundsNotEnoughGas(t *testing.T) { - t.Parallel() - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - UseGasCalled: func(_ uint64) error { - return errors.New("not enough gas") - }, - } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), make([][]byte, 0)) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.OutOfGas, retCode) -} - -func TestGovernanceContract_VoteWithFundsInvalidNumOfArguments(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - } - callInput := createVMInput(big.NewInt(500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.FunctionWrongSignature, retCode) -} - -func TestGovernanceContract_VoteWithFundsProposalNotFound(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - } - callInput := createVMInput(big.NewInt(500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) -} - -func TestGovernanceContract_VoteWithFundsInvalidVoteType(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - args.Eei = createMockStorer(vm.GovernanceSCAddress, proposalIdentifier, &GeneralProposal{}) - gsc, _ := NewGovernanceContract(args) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - } - callInput := createVMInput(big.NewInt(500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) -} - -func TestGovernanceContract_VoteWithFundsInvalidCallValue(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - args.Eei = createMockStorer(vm.GovernanceSCAddress, proposalIdentifier, &GeneralProposal{}) - gsc, _ := NewGovernanceContract(args) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - callInput := createVMInput(big.NewInt(-500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) -} - -func TestGovernanceContract_VoteWithFundsAddVoteError(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - defaultMarshalizer := &mock.MarshalizerMock{} - - args := createMockGovernanceArgs() - args.Eei = createMockStorer(vm.GovernanceSCAddress, proposalIdentifier, &GeneralProposal{ - Yes: big.NewInt(0), - No: big.NewInt(0), - }) - args.Marshalizer = &mock.MarshalizerStub{ - UnmarshalCalled: func(obj interface{}, buff []byte) error { - return defaultMarshalizer.Unmarshal(obj, buff) - }, - MarshalCalled: func(obj interface{}) ([]byte, error) { - _, isVoteSetType := obj.(*VoteSet) - if isVoteSetType { - return nil, errors.New("invalid vote set") - } - return defaultMarshalizer.Marshal(obj) - }, - } - gsc, _ := NewGovernanceContract(args) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - callInput := createVMInput(big.NewInt(500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) -} - -func TestGovernanceContract_VoteWithFundsAddSimpleVote(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - args.Eei = createMockStorer(vm.GovernanceSCAddress, proposalIdentifier, &GeneralProposal{ - Yes: big.NewInt(0), - No: big.NewInt(0), - }) - gsc, _ := NewGovernanceContract(args) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - callInput := createVMInput(big.NewInt(500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.Ok, retCode) -} - -func TestGovernanceContract_VoteWithFundsTwiceBadVote(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - isGeneralProposalKey := bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) - if isGeneralProposalKey { - marshaledProposal, _ := args.Marshalizer.Marshal(&GeneralProposal{}) - return marshaledProposal - } - - marshaledVote, _ := args.Marshalizer.Marshal(&VoteSet{VoteItems: []*VoteDetails{{Value: No}}}) - return marshaledVote - }, - AddReturnMessageCalled: func(msg string) { - require.Equal(t, msg, "conflicting votes for same proposal") - }, - GetStorageFromAddressCalled: func(address []byte, key []byte) []byte { - marshalizer := &mock.MarshalizerMock{} - if bytes.Equal(address, vm.DelegationManagerSCAddress) && bytes.Equal(key, []byte(delegationManagementKey)) { - dManagementData := &DelegationManagement{MinDelegationAmount: big.NewInt(10)} - marshaledData, _ := marshalizer.Marshal(dManagementData) - return marshaledData - } - - return nil - }, - } - gsc, _ := NewGovernanceContract(args) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - callInput := createVMInput(big.NewInt(500), "voteWithFunds", vm.GovernanceSCAddress, []byte("addr1"), voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) -} - func TestGovernanceContract_VoteWithBadArgsOrCallValue(t *testing.T) { t.Parallel() @@ -1003,11 +810,8 @@ func TestGovernanceContract_ValidatorVote(t *testing.T) { proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) votePower := big.NewInt(10) proposalKey := append([]byte(proposalPrefix), proposalIdentifier...) - voteItemKey := append(proposalKey, callerAddress...) - finalVoteSet := &VoteSet{} finalProposal := &GeneralProposal{} - args := createMockGovernanceArgs() generalProposal := &GeneralProposal{ @@ -1047,9 +851,6 @@ func TestGovernanceContract_ValidatorVote(t *testing.T) { }, SetStorageCalled: func(key []byte, value []byte) { - if bytes.Equal(key, voteItemKey) { - _ = args.Marshalizer.Unmarshal(finalVoteSet, value) - } if bytes.Equal(key, proposalKey) { _ = args.Marshalizer.Unmarshal(finalProposal, value) } @@ -1060,953 +861,128 @@ func TestGovernanceContract_ValidatorVote(t *testing.T) { return 14 }, } - }, - } - - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.Ok, retCode) - require.Equal(t, votePower, finalProposal.Yes) - require.Equal(t, 1, len(finalProposal.Votes)) - require.Equal(t, votePower, finalVoteSet.TotalYes) - require.Equal(t, votePower, finalVoteSet.UsedPower) - require.Equal(t, big.NewInt(0), finalVoteSet.UsedBalance) -} - -func TestGovernanceContract_ValidatorVoteTwice(t *testing.T) { - t.Parallel() - - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - Yes: big.NewInt(0), - } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - if bytes.Equal(key, append(proposalIdentifier, callerAddress...)) { - voteSetBytes, _ := args.Marshalizer.Marshal(&VoteSet{VoteItems: []*VoteDetails{{Value: 0}}}) - return voteSetBytes - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - require.Equal(t, msg, "vote only once") - }, - } - - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) -} - -func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { - t.Parallel() - - args := createMockGovernanceArgs() - - mockEI := &mock.SystemEIStub{} - args.Eei = mockEI - - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "delegateVote", []byte("address"), vm.GovernanceSCAddress, nil) - - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - - callInput.Arguments = [][]byte{{1}, {2}, {3}, {4}} - callInput.CallValue = big.NewInt(10) - retCode = gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Equal(t, mockEI.ReturnMessage, "function is not payable") - - mockEI.UseGasCalled = func(_ uint64) error { - return vm.ErrNotEnoughGas - } - callInput.CallValue = big.NewInt(0) - args.Eei = mockEI - retCode = gsc.Execute(callInput) - require.Equal(t, vmcommon.OutOfGas, retCode) - - mockEI.AddReturnMessageCalled = func(msg string) { - require.Equal(t, msg, "only SC can call this") - } - mockEI.UseGasCalled = func(gas uint64) error { - return nil - } - args.Eei = mockEI - retCode = gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - - mockEI.AddReturnMessageCalled = func(msg string) { - require.Equal(t, msg, "invalid delegator address") - } - callInput.CallerAddr = vm.ESDTSCAddress - retCode = gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - - mockEI.AddReturnMessageCalled = func(msg string) { - require.Equal(t, msg, vm.ErrProposalNotFound.Error()) - } - args.Eei = mockEI - callInput.Arguments[3] = vm.ESDTSCAddress - retCode = gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - - mockEI.GetStorageCalled = func(key []byte) []byte { - proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{}) - return proposalBytes - } - mockEI.AddReturnMessageCalled = func(msg string) { - require.True(t, bytes.Contains([]byte(msg), []byte("invalid vote type option: "))) - } - args.Eei = mockEI - retCode = gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) -} - -func TestGovernanceContract_ClaimFundsWrongCallValue(t *testing.T) { - t.Parallel() - - returnMessage := "" - expectedErrorSubstr := "invalid callValue" - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(9), "claimFunds", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, returnMessage, expectedErrorSubstr) -} - -func TestGovernanceContract_ClaimFundsWrongNumberOfArguments(t *testing.T) { - t.Parallel() - - returnMessage := "" - expectedErrorSubstr := "invalid number of arguments" - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "claimFunds", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.FunctionWrongSignature, retCode) - require.Contains(t, returnMessage, expectedErrorSubstr) -} - -func TestGovernanceContract_ClaimFundsStillLocked(t *testing.T) { - t.Parallel() - - returnMessage := "" - expectedErrorSubstr := "your funds are still locked" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - GetStorageCalled: func(key []byte) []byte { - expectedKeyPrefix := append([]byte(fundsLockPrefix), proposalIdentifier...) - if bytes.Equal(key, append(expectedKeyPrefix, callerAddress...)) { - voteSetBytes, _ := args.Marshalizer.Marshal(&VoteSet{ - UsedBalance: big.NewInt(100), - }) - return voteSetBytes - } - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalByes, _ := args.Marshalizer.Marshal(&GeneralProposal{EndVoteNonce: 100}) - return proposalByes - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 11 - }, - } - }, - } - claimArgs := [][]byte{ - proposalIdentifier, - } - - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(zero, "claimFunds", callerAddress, vm.GovernanceSCAddress, claimArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, returnMessage, expectedErrorSubstr) -} - -func TestGovernanceContract_ClaimFundsNothingToClaim(t *testing.T) { - t.Parallel() - - returnMessage := "" - expectedErrorSubstr := "no funds to claim for this proposal" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - GetStorageCalled: func(key []byte) []byte { - expectedKeyPrefix := append([]byte(fundsLockPrefix), proposalIdentifier...) - if bytes.Equal(key, append(expectedKeyPrefix, callerAddress...)) { - voteSetBytes, _ := args.Marshalizer.Marshal(&VoteSet{ - UsedBalance: zero, - }) - return voteSetBytes - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 11 - }, - } - }, - } - claimArgs := [][]byte{ - proposalIdentifier, - } - - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(zero, "claimFunds", callerAddress, vm.GovernanceSCAddress, claimArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, returnMessage, expectedErrorSubstr) -} - -func TestGovernanceContract_ClaimFunds(t *testing.T) { - t.Parallel() - - callerAddress := []byte("address") - voteValue := big.NewInt(10) - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - finalVoteSet := &VoteSet{} - transferFrom := make([]byte, 0) - transferTo := make([]byte, 0) - transferValue := big.NewInt(0) - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - expectedKeyPrefix := append([]byte(fundsLockPrefix), proposalIdentifier...) - if bytes.Equal(key, append(expectedKeyPrefix, callerAddress...)) { - voteSetBytes, _ := args.Marshalizer.Marshal(&VoteSet{ - UsedBalance: voteValue, - }) - return voteSetBytes - } - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalByes, _ := args.Marshalizer.Marshal(&GeneralProposal{EndVoteNonce: 100}) - return proposalByes - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 101 - }, - } - }, - SetStorageCalled: func(key []byte, value []byte) { - proposalKey := append([]byte(proposalPrefix), proposalIdentifier...) - if bytes.Equal(key, append(proposalKey, callerAddress...)) { - _ = args.Marshalizer.Unmarshal(finalVoteSet, value) - } - }, - TransferCalled: func(destination []byte, sender []byte, value *big.Int, _ []byte) error { - transferTo = destination - transferFrom = sender - transferValue.Set(value) - - return nil - }, - } - claimArgs := [][]byte{ - proposalIdentifier, - } - - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(zero, "claimFunds", callerAddress, vm.GovernanceSCAddress, claimArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.Ok, retCode) - require.Equal(t, args.GovernanceSCAddress, transferFrom) - require.Equal(t, callerAddress, transferTo) - require.Equal(t, voteValue, transferValue) -} - -func TestGovernanceContract_WhiteListProposal(t *testing.T) { - t.Parallel() - - callerAddress := []byte("address") - finalWhitelistProposal := &WhiteListProposal{} - finalProposal := &GeneralProposal{} - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - SetStorageCalled: func(key []byte, value []byte) { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - _ = args.Marshalizer.Unmarshal(finalWhitelistProposal, value) - } - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - _ = args.Marshalizer.Unmarshal(finalProposal, value) - } - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.Ok, retCode) - require.Equal(t, callerAddress, finalWhitelistProposal.WhiteListAddress) - require.Equal(t, append([]byte(proposalPrefix), callerAddress...), finalWhitelistProposal.ProposalStatus) - require.Equal(t, proposalIdentifier, finalProposal.CommitHash) -} - -func TestGovernanceContract_WhiteListProposalInvalidCallValue(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "invalid callValue" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - } - callInput := createVMInput(big.NewInt(0), "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.OutOfFunds, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_WhiteListProposalNotEnoughGas(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "not enough gas" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - UseGasCalled: func(_ uint64) error { - return errors.New("not enough gas") - }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.OutOfGas, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_WhiteListInvalidArgumentsLength(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "invalid number of arguments" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - []byte("10"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.FunctionWrongSignature, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_WhiteListProposalAlreadyExists(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "cannot re-propose existing proposal" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - return []byte("proposal exists") - } - - return nil - }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_WhiteListAlreadyWhitelisted(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "address is already whitelisted" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted") - } - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return proposalBytes - } - - return nil - }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_WhiteListInvalidProposalLength(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "invalid github commit length" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength-1) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("10"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_WhiteListInvalidNonces(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "invalid start/end vote nonce" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - proposalIdentifier, - []byte("1"), - []byte("invalid"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "whiteList", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_HardForkProposal(t *testing.T) { - t.Parallel() - - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } - - return nil - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - proposalIdentifier, - []byte("5"), - []byte("10"), - } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.Ok, retCode) -} - -func TestGovernanceContract_HardForkProposalInvalidCallValue(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "invalid proposal cost" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - proposalIdentifier, - []byte("5"), - []byte("10"), - } - callInput := createVMInput(big.NewInt(0), "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.OutOfFunds, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_HardForkProposalNotEnoughGas(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "not enough gas" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - UseGasCalled: func(gas uint64) error { - return errors.New("not enough gas") - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - proposalIdentifier, - []byte("5"), - []byte("10"), - } - - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.OutOfGas, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_HardForkInvalidArgumentsLenght(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "invalid number of arguments" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - proposalIdentifier, - []byte("5"), - } - - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.FunctionWrongSignature, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_HardForkProposalNotWhitelisted(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "called address is not whiteListed" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - proposalIdentifier, - []byte("5"), - []byte("10"), - } - - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_HardForkProposalInvalidCommitLength(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "invalid github commit length" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength-1) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } - - return nil - }, - } - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - proposalIdentifier, - []byte("5"), - []byte("10"), + }, } - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) + voteArgs := [][]byte{ + proposalIdentifier, + []byte("yes"), + } + gsc, _ := NewGovernanceContract(args) + callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) + require.Equal(t, vmcommon.Ok, retCode) + require.Equal(t, votePower, finalProposal.Yes) } -func TestGovernanceContract_HardForkProposalProposalAlreadyExists(t *testing.T) { +func TestGovernanceContract_ValidatorVoteTwice(t *testing.T) { t.Parallel() - retMessage := "" - errSubstr := "proposal already exists" callerAddress := []byte("address") proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) + args := createMockGovernanceArgs() + + generalProposal := &GeneralProposal{ + CommitHash: proposalIdentifier, + StartVoteNonce: 10, + EndVoteNonce: 15, + Yes: big.NewInt(0), + } args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - return []byte("proposal exists") + proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) + return proposalBytes } return nil }, + BlockChainHookCalled: func() vm.BlockchainHook { + return &mock.BlockChainHookStub{ + CurrentNonceCalled: func() uint64 { + return 14 + }, + } + }, + AddReturnMessageCalled: func(msg string) { + require.Equal(t, msg, "vote only once") + }, } - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), + voteArgs := [][]byte{ proposalIdentifier, - []byte("5"), - []byte("10"), + []byte("yes"), } - - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) + gsc, _ := NewGovernanceContract(args) + callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) } -func TestGovernanceContract_HardForkProposalInvalidNonce(t *testing.T) { +func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { t.Parallel() - retMessage := "" - errSubstr := "invalid start/end vote nonce" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } - return nil - }, - } + mockEI := &mock.SystemEIStub{} + args.Eei = mockEI gsc, _ := NewGovernanceContract(args) + callInput := createVMInput(big.NewInt(0), "delegateVote", []byte("address"), vm.GovernanceSCAddress, nil) - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - proposalIdentifier, - []byte("5"), - []byte("invalid"), + retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + + callInput.Arguments = [][]byte{{1}, {2}, {3}, {4}} + callInput.CallValue = big.NewInt(10) + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, mockEI.ReturnMessage, "function is not payable") + + mockEI.UseGasCalled = func(_ uint64) error { + return vm.ErrNotEnoughGas } + callInput.CallValue = big.NewInt(0) + args.Eei = mockEI + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.OutOfGas, retCode) - proposalCost, _ := big.NewInt(0).SetString(args.GovernanceConfig.Active.ProposalCost, conversionBase) - callInput := createVMInput(proposalCost, "hardFork", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) + mockEI.AddReturnMessageCalled = func(msg string) { + require.Equal(t, msg, "only SC can call this") + } + mockEI.UseGasCalled = func(gas uint64) error { + return nil + } + args.Eei = mockEI + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + + mockEI.AddReturnMessageCalled = func(msg string) { + require.Equal(t, msg, "invalid delegator address") + } + callInput.CallerAddr = vm.ESDTSCAddress + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + mockEI.AddReturnMessageCalled = func(msg string) { + require.Equal(t, msg, vm.ErrProposalNotFound.Error()) + } + args.Eei = mockEI + callInput.Arguments[3] = vm.ESDTSCAddress + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + + mockEI.GetStorageCalled = func(key []byte) []byte { + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{}) + return proposalBytes + } + mockEI.AddReturnMessageCalled = func(msg string) { + require.True(t, bytes.Contains([]byte(msg), []byte("invalid vote type option: "))) + } + args.Eei = mockEI + retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) } func TestGovernanceContract_ChangeConfig(t *testing.T) { @@ -2236,9 +1212,6 @@ func TestGovernanceContract_CloseProposal(t *testing.T) { } }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, @@ -2342,9 +1315,6 @@ func TestGovernanceContract_CloseProposalWrongArgumentsLength(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, @@ -2377,9 +1347,6 @@ func TestGovernanceContract_CloseProposalNotEnoughGas(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, @@ -2418,9 +1385,6 @@ func TestGovernanceContract_CloseProposalGetProposalErr(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, @@ -2456,9 +1420,6 @@ func TestGovernanceContract_CloseProposalAlreadyClosed(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, @@ -2503,9 +1464,6 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, @@ -2557,9 +1515,6 @@ func TestGovernanceContract_CloseProposalComputeResultsErr(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) { - return []byte("whitelisted caller") - } if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, @@ -3039,179 +1994,6 @@ func TestGovernanceContract_GetValidProposal(t *testing.T) { require.Equal(t, proposalIdentifier, proposal.CommitHash) } -func TestGovernanceContract_IsWhitelistedNotFound(t *testing.T) { - t.Parallel() - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - return nil - }, - } - gsc, _ := NewGovernanceContract(args) - - isWhiteListed := gsc.isWhiteListed([]byte("address")) - require.False(t, isWhiteListed) -} - -func TestGovernanceContract_IsWhitelistedUnmarshalErrorReturnsFalse(t *testing.T) { - t.Parallel() - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - return []byte("invalid proposal") - }, - } - gsc, _ := NewGovernanceContract(args) - - isWhiteListed := gsc.isWhiteListed([]byte("address")) - require.False(t, isWhiteListed) -} - -func TestGovernanceContract_IsWhitelistedProposalNotVoted(t *testing.T) { - t.Parallel() - - address := []byte("address") - generalProposal := &GeneralProposal{ - Passed: false, - } - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), address...)) { - return []byte{1} - } - - if bytes.Equal(key, append([]byte(proposalPrefix), address...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - - return nil - }, - } - gsc, _ := NewGovernanceContract(args) - - isWhiteListed := gsc.isWhiteListed(address) - require.False(t, isWhiteListed) -} - -func TestGovernanceContract_IsWhitelistedProposalVoted(t *testing.T) { - t.Parallel() - - address := []byte("address") - generalProposal := &GeneralProposal{ - Passed: true, - } - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(whiteListPrefix), address...)) { - return []byte{1} - } - - if bytes.Equal(key, append([]byte(proposalPrefix), address...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - return nil - }, - } - gsc, _ := NewGovernanceContract(args) - - isWhiteListed := gsc.isWhiteListed([]byte("address")) - require.True(t, isWhiteListed) -} - -func TestGovernanceContract_ApplyVoteInvalid(t *testing.T) { - t.Parallel() - - voteDetails := &VoteDetails{ - Value: 100, - } - - voteSet := &VoteSet{} - proposal := &GeneralProposal{} - - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - - _, _, err := gsc.applyVote(voteDetails, voteSet, proposal) - require.NotNil(t, err) - require.Contains(t, err.Error(), vm.ErrInvalidArgument.Error()) -} - -func TestGovernanceContract_ApplyVote(t *testing.T) { - t.Parallel() - - voteDetails := &VoteDetails{ - Value: Yes, - Power: big.NewInt(10), - Balance: big.NewInt(100), - } - - voteSet := &VoteSet{ - UsedPower: big.NewInt(5), - UsedBalance: big.NewInt(25), - TotalYes: big.NewInt(5), - VoteItems: []*VoteDetails{ - { - Value: Yes, - Power: big.NewInt(5), - Balance: big.NewInt(25), - }, - }, - } - proposal := &GeneralProposal{ - Yes: big.NewInt(10), - No: big.NewInt(10), - Veto: big.NewInt(0), - } - - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - - voteSetResponse, generalProposalResponse, err := gsc.applyVote(voteDetails, voteSet, proposal) - require.Nil(t, err) - require.Equal(t, big.NewInt(20), generalProposalResponse.Yes) - require.Equal(t, big.NewInt(15), voteSetResponse.TotalYes) -} - -func TestGovernanceContract_ComputeAccountLeveledPower(t *testing.T) { - t.Parallel() - - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - - voteSet := &VoteSet{ - UsedBalance: big.NewInt(0), - } - - for i := 0; i < 10; i++ { - balancedPower, _ := gsc.computeAccountLeveledPower(big.NewInt(100), voteSet) - - powerBefore := big.NewInt(0).Sqrt(voteSet.UsedBalance) - voteSet.UsedBalance.Add(voteSet.UsedBalance, big.NewInt(100)) - powerAfter := big.NewInt(0).Sqrt(voteSet.UsedBalance) - require.Equal(t, big.NewInt(0).Sub(powerAfter, powerBefore), balancedPower) - } -} - -func TestGovernanceContract_IsValidVoteString(t *testing.T) { - t.Parallel() - - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - - require.True(t, gsc.isValidVoteString("yes")) - require.True(t, gsc.isValidVoteString("no")) - require.True(t, gsc.isValidVoteString("veto")) - require.False(t, gsc.isValidVoteString("invalid")) -} - func TestComputeEndResults(t *testing.T) { t.Parallel() @@ -3278,25 +2060,10 @@ func TestComputeEndResults(t *testing.T) { require.True(t, pass.Passed) } -func createMockStorer(callerAddress []byte, proposalIdentifier []byte, proposal *GeneralProposal) *mock.SystemEIStub { +func createMockStorer(_ []byte, proposalIdentifier []byte, proposal *GeneralProposal) *mock.SystemEIStub { return &mock.SystemEIStub{ GetStorageCalled: func(key []byte) []byte { marshalizer := &mock.MarshalizerMock{} - isWhiteListKey := bytes.Equal(key, append([]byte(whiteListPrefix), callerAddress...)) - if isWhiteListKey { - whiteList, _ := marshalizer.Marshal(&WhiteListProposal{ - WhiteListAddress: callerAddress, - ProposalStatus: append([]byte(proposalPrefix), callerAddress...), - }) - return whiteList - } - isWhiteListProposalKey := bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) - if isWhiteListProposalKey { - whiteList, _ := marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whiteList - } isGeneralProposalKey := bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) if isGeneralProposalKey && proposal != nil { From 8c10897142ecc2b0fc8a97209516f037946e8303 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 17 Jan 2023 16:20:42 +0200 Subject: [PATCH 129/335] writing all kinds of tests --- vm/systemSmartContracts/governance.go | 7 +- vm/systemSmartContracts/governance_test.go | 107 ++++++++++++--------- 2 files changed, 66 insertions(+), 48 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index ef6d6250f9f..4780fdb3614 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -887,8 +887,13 @@ func (g *governanceContract) saveDelegatedContractInfo( // getConfig returns the current system smart contract configuration func (g *governanceContract) getConfig() (*GovernanceConfigV2, error) { - marshaledData := g.eei.GetStorage([]byte(governanceConfigKey)) scConfig := &GovernanceConfigV2{} + + marshaledData := g.eei.GetStorage([]byte(governanceConfigKey)) + if len(marshaledData) == 0 { + return nil, vm.ErrElementNotFound + } + err := g.marshalizer.Unmarshal(scConfig, marshaledData) if err != nil { return nil, err diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 1c1b5686a2f..3bf583d8e51 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -3,6 +3,8 @@ package systemSmartContracts import ( "bytes" "errors" + "github.com/multiversx/mx-chain-go/process/smartContract/hooks" + stateMock "github.com/multiversx/mx-chain-go/testscommon/state" "math/big" "testing" @@ -17,8 +19,16 @@ import ( ) func createMockGovernanceArgs() ArgsNewGovernanceContract { + eei := createEEIWithBlockchainHook(&mock.BlockChainHookStub{CurrentEpochCalled: func() uint32 { + return 2 + }}) + + return createArgsWithEEI(eei) +} + +func createArgsWithEEI(eei vm.SystemEI) ArgsNewGovernanceContract { return ArgsNewGovernanceContract{ - Eei: &mock.SystemEIStub{}, + Eei: eei, GasCost: vm.GasCost{}, GovernanceConfig: config.GovernanceSystemSCConfig{ V1: config.GovernanceSystemSCConfigV1{ @@ -46,6 +56,42 @@ func createMockGovernanceArgs() ArgsNewGovernanceContract { } } +func createEEIWithBlockchainHook(blockchainHook vm.BlockchainHook) vm.ContextHandler { + eei, _ := NewVMContext(VMContextArgs{ + BlockChainHook: blockchainHook, + CryptoHook: hooks.NewVMCryptoHook(), + InputParser: &mock.ArgumentParserMock{}, + ValidatorAccountsDB: &stateMock.AccountsStub{}, + ChanceComputer: &mock.RaterMock{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{}, + }) + systemSCContainerStub := &mock.SystemSCContainerStub{GetCalled: func(key []byte) (vm.SystemSmartContract, error) { + return &mock.SystemSCStub{ExecuteCalled: func(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + return vmcommon.Ok + }}, nil + }} + _ = eei.SetSystemSCContainer(systemSCContainerStub) + + return eei +} + +func createContractWithMockArguments() *governanceContract { + args := createMockGovernanceArgs() + gsc, _ := NewGovernanceContract(args) + gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) + return gsc +} + +func createContractBlockChainHookStub() (*governanceContract, *mock.BlockChainHookStub, vm.ContextHandler) { + blockChainHook := &mock.BlockChainHookStub{CurrentEpochCalled: func() uint32 { + return 2 + }} + eei := createEEIWithBlockchainHook(blockChainHook) + gsc, _ := NewGovernanceContract(createArgsWithEEI(eei)) + gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) + return gsc, blockChainHook, eei +} + func createVMInput(callValue *big.Int, funcName string, callerAddr, recipientAddr []byte, arguments [][]byte) *vmcommon.ContractCallInput { return &vmcommon.ContractCallInput{ VMInput: vmcommon.VMInput{ @@ -206,7 +252,7 @@ func TestGovernanceContract_ExecuteInitV2MarshalError(t *testing.T) { gsc, _ := NewGovernanceContract(args) callInput := createVMInput(big.NewInt(0), "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.ExecutionFailed, retCode) + require.Equal(t, vmcommon.UserError, retCode) } func TestGovernanceContract_ExecuteInitV2(t *testing.T) { @@ -233,10 +279,9 @@ func TestGovernanceContract_ProposalWrongCallValue(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() - args.GovernanceConfig.Active.ProposalCost = "10" - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(9), "proposal", vm.GovernanceSCAddress, []byte("addr1"), nil) + gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) + callInput := createVMInput(big.NewInt(9), "proposal", vm.GovernanceSCAddress, []byte("addr1"), [][]byte{{1}, {1}, {1}}) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.OutOfFunds, retCode) } @@ -286,20 +331,6 @@ func TestGovernanceContract_ProposalInvalidReferenceLength(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - return []byte("storage item") - }, - } - args.Marshalizer = &mock.MarshalizerStub{ - UnmarshalCalled: func(obj interface{}, buff []byte) error { - whitelistProposal, proposalOk := obj.(*GeneralProposal) - if proposalOk { - whitelistProposal.Passed = true - } - return nil - }, - } gsc, _ := NewGovernanceContract(args) callInputArgs := [][]byte{ []byte("arg1"), @@ -352,9 +383,8 @@ func TestGovernanceContract_ProposalOK(t *testing.T) { proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = createMockStorer(vm.GovernanceSCAddress, proposalIdentifier, nil) - gsc, _ := NewGovernanceContract(args) + gsc := createContractWithMockArguments() + callInputArgs := [][]byte{ proposalIdentifier, []byte("1"), @@ -398,46 +428,29 @@ func TestGovernanceContract_ValidatorVoteNotEnoughGas(t *testing.T) { func TestGovernanceContract_ValidatorVoteInvalidProposal(t *testing.T) { t.Parallel() - returnMessage := "" callerAddress := []byte("address") proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, StartVoteNonce: 10, EndVoteNonce: 15, } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 16 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - } voteArgs := [][]byte{ proposalIdentifier, []byte("yes"), } - gsc, _ := NewGovernanceContract(args) + gsc, blockchainHook, eei := createContractBlockChainHookStub() + blockchainHook.CurrentNonceCalled = func() uint64 { + return 16 + } + + _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) + callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Equal(t, vm.ErrVotedForAnExpiredProposal.Error(), returnMessage) + require.Equal(t, eei.GetReturnMessage(), vm.ErrVotedForAnExpiredProposal.Error()) } func TestGovernanceContract_ValidatorVoteInvalidVote(t *testing.T) { From bcc6c9a8728a4f933fe636e646e32a312b91e330 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 18 Jan 2023 11:41:24 +0200 Subject: [PATCH 130/335] working on new tests --- vm/systemSmartContracts/eei.go | 3 +- vm/systemSmartContracts/governance.go | 94 +-- vm/systemSmartContracts/governance_test.go | 628 +++++++++------------ 3 files changed, 314 insertions(+), 411 deletions(-) diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 6f03b8487fa..0e396dfc5a8 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -120,6 +120,7 @@ func (host *vmContext) GetContract(address []byte) (vm.SystemSmartContract, erro // GetStorageFromAddress gets the storage from address and key func (host *vmContext) GetStorageFromAddress(address []byte, key []byte) []byte { + log.Warn("get" + string(address) + " " + string(key)) storageAdrMap, exists := host.storageUpdate[string(address)] if exists { if value, isInMap := storageAdrMap[string(key)]; isInMap { @@ -147,7 +148,7 @@ func (host *vmContext) SetStorageForAddress(address []byte, key []byte, value [] if !exists { host.storageUpdate[strAdr] = make(map[string][]byte) } - + log.Warn("set" + string(address) + " " + string(key) + " " + string(value)) length := len(value) host.storageUpdate[strAdr][string(key)] = make([]byte, length) copy(host.storageUpdate[strAdr][string(key)][:length], value[:length]) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 4780fdb3614..7ea6bc10a71 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -165,18 +165,18 @@ func (g *governanceContract) init(args *vmcommon.ContractCallInput) vmcommon.Ret func (g *governanceContract) initV2(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if !bytes.Equal(args.CallerAddr, g.governanceSCAddress) { - log.Error("invalid caller to switch to V2 config") + g.eei.AddReturnMessage("invalid caller to switch to V2 config") return vmcommon.UserError } cfg, err := g.convertV2Config(g.governanceConfig) if err != nil { - log.Error("could not create governance V2 config") + g.eei.AddReturnMessage("could not create governance V2 config") return vmcommon.UserError } err = g.saveConfig(cfg) if err != nil { - log.Error(err.Error()) + g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } @@ -243,16 +243,6 @@ func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmco return vmcommon.Ok } -func (g *governanceContract) saveConfig(cfg *GovernanceConfigV2) error { - marshaledData, err := g.marshalizer.Marshal(cfg) - if err != nil { - return err - } - - g.eei.SetStorage([]byte(governanceConfigKey), marshaledData) - return nil -} - // proposal creates a new proposal from passed arguments func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Proposal) @@ -270,7 +260,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon return vmcommon.UserError } if args.CallValue.Cmp(generalConfig.ProposalFee) != 0 { - g.eei.AddReturnMessage("invalid proposal cost, expected " + g.baseProposalCost.String()) + g.eei.AddReturnMessage("invalid proposal cost, expected " + generalConfig.ProposalFee.String()) return vmcommon.OutOfFunds } @@ -294,7 +284,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon startVoteNonce, endVoteNonce, err := g.startEndNonceFromArguments(args.Arguments[1], args.Arguments[2]) if err != nil { - g.eei.AddReturnMessage("invalid start/end vote nonce " + err.Error()) + g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError } @@ -309,6 +299,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon Abstain: big.NewInt(0), Passed: false, ProposalCost: generalConfig.ProposalFee, + Nonce: nextNonce, } err = g.saveGeneralProposal(commitHash, generalProposal) if err != nil { @@ -339,7 +330,7 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret return vmcommon.FunctionWrongSignature } if core.IsSmartContractAddress(args.CallerAddr) { - g.eei.AddReturnMessage("only SC can call this") + g.eei.AddReturnMessage("only user can call this") return vmcommon.UserError } @@ -356,7 +347,6 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret proposalToVote, string(args.Arguments[1]), totalVotingPower, - proposalToVote, true) if err != nil { g.eei.AddReturnMessage(err.Error()) @@ -407,7 +397,6 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco proposalToVote, string(args.Arguments[1]), votePower, - proposalToVote, false) if err != nil { g.eei.AddReturnMessage(err.Error()) @@ -444,7 +433,6 @@ func (g *governanceContract) addUserVote( nonceAsBytes []byte, vote string, totalVotingPower *big.Int, - proposalToVote []byte, direct bool, ) error { nonce, err := nonceFromBytes(nonceAsBytes) @@ -462,7 +450,7 @@ func (g *governanceContract) addUserVote( return err } - proposal, err := g.getValidProposal(proposalToVote) + proposal, err := g.getValidProposal(nonce) if err != nil { return err } @@ -473,7 +461,7 @@ func (g *governanceContract) addUserVote( } g.lockStake(address, proposal.EndVoteNonce) - return g.saveGeneralProposal(proposalToVote, proposal) + return g.saveGeneralProposal(proposal.CommitHash, proposal) } func (g *governanceContract) updateUserVoteList(address []byte, nonce uint64, direct bool) error { @@ -629,25 +617,6 @@ func (g *governanceContract) getValidatorVotingPower(args *vmcommon.ContractCall return vmcommon.Ok } -// getValidProposal returns a proposal from storage if it exists, or it is still valid/in-progress -func (g *governanceContract) getValidProposal(reference []byte) (*GeneralProposal, error) { - proposal, err := g.getGeneralProposal(reference) - if err != nil { - return nil, err - } - - currentNonce := g.eei.BlockChainHook().CurrentNonce() - if currentNonce < proposal.StartVoteNonce { - return nil, vm.ErrVotingNotStartedForProposal - } - - if currentNonce > proposal.EndVoteNonce { - return nil, vm.ErrVotedForAnExpiredProposal - } - - return proposal, nil -} - // addNewVote applies a new vote on a proposal then saves the new information into the storage func (g *governanceContract) addNewVote(voteValueType VoteValueType, power *big.Int, proposal *GeneralProposal) error { switch voteValueType { @@ -663,16 +632,22 @@ func (g *governanceContract) addNewVote(voteValueType VoteValueType, power *big. return fmt.Errorf("%s: %s", vm.ErrInvalidArgument, "invalid vote type") } - return g.saveGeneralProposal(proposal.CommitHash, proposal) + return nil } // computeVotingPower returns the voting power for a value. The value can be either a balance or // the staked value for a validator func (g *governanceContract) computeVotingPower(value *big.Int) (*big.Int, error) { - if value.Cmp(zero) < 0 { - return nil, fmt.Errorf("cannot compute voting power on a negative value") + minValue, err := g.getMinValueToVote() + if err != nil { + return nil, err + } + + if value.Cmp(minValue) <= 0 { + return nil, fmt.Errorf("not enough stake/delegate to vote") } + //TODO: decide whether quadratic or not return big.NewInt(0).Sqrt(value), nil } @@ -902,6 +877,16 @@ func (g *governanceContract) getConfig() (*GovernanceConfigV2, error) { return scConfig, nil } +func (g *governanceContract) saveConfig(cfg *GovernanceConfigV2) error { + marshaledData, err := g.marshalizer.Marshal(cfg) + if err != nil { + return err + } + + g.eei.SetStorage([]byte(governanceConfigKey), marshaledData) + return nil +} + // saveGeneralProposal saves a proposal into the storage func (g *governanceContract) saveGeneralProposal(reference []byte, generalProposal *GeneralProposal) error { marshaledData, err := g.marshalizer.Marshal(generalProposal) @@ -914,10 +899,29 @@ func (g *governanceContract) saveGeneralProposal(reference []byte, generalPropos return nil } +// getValidProposal returns a proposal from storage if it exists, or it is still valid/in-progress +func (g *governanceContract) getValidProposal(nonce *big.Int) (*GeneralProposal, error) { + commitHash := g.eei.GetStorage(nonce.Bytes()) + proposal, err := g.getGeneralProposal(commitHash) + if err != nil { + return nil, err + } + + currentNonce := g.eei.BlockChainHook().CurrentNonce() + if currentNonce < proposal.StartVoteNonce { + return nil, vm.ErrVotingNotStartedForProposal + } + + if currentNonce > proposal.EndVoteNonce { + return nil, vm.ErrVotedForAnExpiredProposal + } + + return proposal, nil +} + // getGeneralProposal returns a proposal from storage func (g *governanceContract) getGeneralProposal(reference []byte) (*GeneralProposal, error) { - commitHash := g.eei.GetStorage(reference) - key := append([]byte(proposalPrefix), commitHash...) + key := append([]byte(proposalPrefix), reference...) marshaledData := g.eei.GetStorage(key) if len(marshaledData) == 0 { diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 3bf583d8e51..cdef12aca32 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-go/process/smartContract/hooks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" "math/big" + "strings" "testing" "github.com/multiversx/mx-chain-core-go/core" @@ -79,16 +80,25 @@ func createContractWithMockArguments() *governanceContract { args := createMockGovernanceArgs() gsc, _ := NewGovernanceContract(args) gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) + + contractList := &DelegationContractList{} + marshaledData, _ := args.Marshalizer.Marshal(contractList) + gsc.eei.SetStorageForAddress(gsc.delegationMgrSCAddress, []byte(delegationContractsList), marshaledData) + return gsc } -func createContractBlockChainHookStub() (*governanceContract, *mock.BlockChainHookStub, vm.ContextHandler) { +func createGovernanceBlockChainHookStubContextHandler() (*governanceContract, *mock.BlockChainHookStub, vm.ContextHandler) { blockChainHook := &mock.BlockChainHookStub{CurrentEpochCalled: func() uint32 { return 2 }} eei := createEEIWithBlockchainHook(blockChainHook) gsc, _ := NewGovernanceContract(createArgsWithEEI(eei)) gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) + marshaledData, _ := gsc.marshalizer.Marshal(&DelegationContractList{}) + gsc.eei.SetStorageForAddress(gsc.delegationMgrSCAddress, []byte(delegationContractsList), marshaledData) + _ = saveDelegationManagementData(eei, gsc.marshalizer, gsc.delegationMgrSCAddress, &DelegationManagement{MinDelegationAmount: big.NewInt(10)}) + return gsc, blockChainHook, eei } @@ -275,15 +285,216 @@ func TestGovernanceContract_ExecuteInitV2(t *testing.T) { require.Equal(t, gsc.ownerAddress, vm.GovernanceSCAddress) } -func TestGovernanceContract_ProposalWrongCallValue(t *testing.T) { +func TestGovernanceContract_ChangeConfig(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() + args.Eei = &mock.SystemEIStub{ + BlockChainHookCalled: func() vm.BlockchainHook { + return &mock.BlockChainHookStub{ + CurrentNonceCalled: func() uint64 { + return 1 + }, + } + }, + GetStorageCalled: func(key []byte) []byte { + if bytes.Equal(key, []byte(governanceConfigKey)) { + configBytes, _ := args.Marshalizer.Marshal(&GovernanceConfigV2{}) + return configBytes + } + + return nil + }, + } + gsc, _ := NewGovernanceContract(args) - gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) - callInput := createVMInput(big.NewInt(9), "proposal", vm.GovernanceSCAddress, []byte("addr1"), [][]byte{{1}, {1}, {1}}) + + callInputArgs := [][]byte{ + []byte("1"), + []byte("10"), + []byte("10"), + []byte("5"), + } + initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + _ = gsc.Execute(initInput) + callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.OutOfFunds, retCode) + + require.Equal(t, vmcommon.Ok, retCode) +} + +func TestGovernanceContract_ChangeConfigWrongCaller(t *testing.T) { + t.Parallel() + + retMessage := "" + errSubstr := "changeConfig can be called only by owner" + args := createMockGovernanceArgs() + args.Eei = &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + retMessage = msg + }, + } + + gsc, _ := NewGovernanceContract(args) + initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + _ = gsc.Execute(initInput) + callInput := createVMInput(zero, "changeConfig", []byte("wrong caller"), vm.GovernanceSCAddress, nil) + retCode := gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) +} + +func TestGovernanceContract_ChangeConfigWrongCallValue(t *testing.T) { + t.Parallel() + + retMessage := "" + errSubstr := "changeConfig can be called only without callValue" + args := createMockGovernanceArgs() + args.Eei = &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + retMessage = msg + }, + } + + gsc, _ := NewGovernanceContract(args) + + initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + _ = gsc.Execute(initInput) + callInput := createVMInput(big.NewInt(10), "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + retCode := gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) +} + +func TestGovernanceContract_ChangeConfigWrongArgumentsLength(t *testing.T) { + t.Parallel() + + retMessage := "" + errSubstr := "changeConfig needs 4 arguments" + args := createMockGovernanceArgs() + args.Eei = &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + retMessage = msg + }, + } + + gsc, _ := NewGovernanceContract(args) + + initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + _ = gsc.Execute(initInput) + callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + retCode := gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) +} + +func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { + t.Parallel() + + retMessage := "" + errSubstr := "changeConfig first argument is incorrectly formatted" + args := createMockGovernanceArgs() + args.Eei = &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + retMessage = msg + }, + } + + gsc, _ := NewGovernanceContract(args) + + initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + _ = gsc.Execute(initInput) + + callInputArgs := [][]byte{ + []byte("invalid"), + []byte("10"), + []byte("10"), + []byte("5"), + } + callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + retCode := gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) + + errSubstr = "changeConfig second argument is incorrectly formatted" + callInputArgs = [][]byte{ + []byte("1"), + []byte("invalid"), + []byte("10"), + []byte("5"), + } + callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + retCode = gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) + + errSubstr = "changeConfig third argument is incorrectly formatted" + callInputArgs = [][]byte{ + []byte("1"), + []byte("10"), + []byte("invalid"), + []byte("5"), + } + callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + retCode = gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) + + errSubstr = "changeConfig fourth argument is incorrectly formatted" + callInputArgs = [][]byte{ + []byte("1"), + []byte("10"), + []byte("10"), + []byte("invalid"), + } + callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + retCode = gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) +} + +func TestGovernanceContract_ChangeConfigGetConfigErr(t *testing.T) { + t.Parallel() + + retMessage := "" + errSubstr := "changeConfig error" + args := createMockGovernanceArgs() + args.Eei = &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + retMessage = msg + }, + GetStorageCalled: func(key []byte) []byte { + if bytes.Equal(key, []byte(governanceConfigKey)) { + return []byte("invalid config") + } + + return nil + }, + } + + gsc, _ := NewGovernanceContract(args) + + initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + _ = gsc.Execute(initInput) + + callInputArgs := [][]byte{ + []byte("1"), + []byte("10"), + []byte("10"), + []byte("5"), + } + callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + retCode := gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) } func TestGovernanceContract_ProposalNotEnoughGas(t *testing.T) { @@ -302,7 +513,7 @@ func TestGovernanceContract_ProposalNotEnoughGas(t *testing.T) { require.Equal(t, vmcommon.OutOfGas, retCode) } -func TestGovernanceContract_ProposalInvalidArgumentsLenght(t *testing.T) { +func TestGovernanceContract_ProposalInvalidArgumentsLength(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() @@ -312,26 +523,26 @@ func TestGovernanceContract_ProposalInvalidArgumentsLenght(t *testing.T) { require.Equal(t, vmcommon.FunctionWrongSignature, retCode) } -func TestGovernanceContract_ProposalCallerNptWhitelisted(t *testing.T) { +func TestGovernanceContract_ProposalWrongCallValue(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() + gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - []byte("arg1"), - []byte("arg2"), - []byte("arg3"), - } - callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) + + callInput := createVMInput(big.NewInt(9), "proposal", vm.GovernanceSCAddress, []byte("addr1"), [][]byte{{1}, {1}, {1}}) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + + gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.OutOfFunds, retCode) } func TestGovernanceContract_ProposalInvalidReferenceLength(t *testing.T) { t.Parallel() - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) + gsc, _, eei := createGovernanceBlockChainHookStubContextHandler() callInputArgs := [][]byte{ []byte("arg1"), []byte("arg2"), @@ -340,6 +551,7 @@ func TestGovernanceContract_ProposalInvalidReferenceLength(t *testing.T) { callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "invalid github commit")) } func TestGovernanceContract_ProposalAlreadyExists(t *testing.T) { @@ -347,17 +559,18 @@ func TestGovernanceContract_ProposalAlreadyExists(t *testing.T) { proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = createMockStorer(vm.GovernanceSCAddress, proposalIdentifier, &GeneralProposal{}) - gsc, _ := NewGovernanceContract(args) + gsc, _, eei := createGovernanceBlockChainHookStubContextHandler() callInputArgs := [][]byte{ proposalIdentifier, []byte("arg2"), []byte("arg3"), } + + gsc.eei.SetStorage([]byte(proposalPrefix+string(proposalIdentifier)), []byte("1")) callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, eei.GetReturnMessage(), "proposal already exists") } func TestGovernanceContract_ProposalInvalidVoteNonce(t *testing.T) { @@ -365,9 +578,7 @@ func TestGovernanceContract_ProposalInvalidVoteNonce(t *testing.T) { proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = createMockStorer(vm.GovernanceSCAddress, proposalIdentifier, nil) - gsc, _ := NewGovernanceContract(args) + gsc, _, eei := createGovernanceBlockChainHookStubContextHandler() callInputArgs := [][]byte{ proposalIdentifier, []byte("arg2"), @@ -376,6 +587,7 @@ func TestGovernanceContract_ProposalInvalidVoteNonce(t *testing.T) { callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, eei.GetReturnMessage(), vm.ErrInvalidStartEndVoteNonce.Error()) } func TestGovernanceContract_ProposalOK(t *testing.T) { @@ -383,7 +595,7 @@ func TestGovernanceContract_ProposalOK(t *testing.T) { proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - gsc := createContractWithMockArguments() + gsc, _, _ := createGovernanceBlockChainHookStubContextHandler() callInputArgs := [][]byte{ proposalIdentifier, @@ -398,9 +610,7 @@ func TestGovernanceContract_ProposalOK(t *testing.T) { func TestGovernanceContract_VoteWithBadArgsOrCallValue(t *testing.T) { t.Parallel() - args := createMockGovernanceArgs() - - gsc, _ := NewGovernanceContract(args) + gsc, _, eei := createGovernanceBlockChainHookStubContextHandler() callInput := createVMInput(big.NewInt(0), "vote", vm.GovernanceSCAddress, []byte("addr1"), [][]byte{[]byte("bad args")}) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.FunctionWrongSignature, retCode) @@ -408,9 +618,21 @@ func TestGovernanceContract_VoteWithBadArgsOrCallValue(t *testing.T) { callInput.CallValue = big.NewInt(10) retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "function is not payable")) + + callInput.CallValue = big.NewInt(0) + callInput.Arguments = [][]byte{{1}, {2}} + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "only user can call this")) + + callInput.CallerAddr = bytes.Repeat([]byte{1}, 32) + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "not enough stake/delegate to vote")) } -func TestGovernanceContract_ValidatorVoteNotEnoughGas(t *testing.T) { +func TestGovernanceContract_VoteNotEnoughGas(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() @@ -425,11 +647,11 @@ func TestGovernanceContract_ValidatorVoteNotEnoughGas(t *testing.T) { require.Equal(t, vmcommon.OutOfGas, retCode) } -func TestGovernanceContract_ValidatorVoteInvalidProposal(t *testing.T) { +func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { t.Parallel() callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) + proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, StartVoteNonce: 10, @@ -437,14 +659,15 @@ func TestGovernanceContract_ValidatorVoteInvalidProposal(t *testing.T) { } voteArgs := [][]byte{ - proposalIdentifier, + []byte("1"), []byte("yes"), } - gsc, blockchainHook, eei := createContractBlockChainHookStub() + gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() blockchainHook.CurrentNonceCalled = func() uint64 { return 16 } + gsc.eei.SetStorage([]byte("A"), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -453,7 +676,7 @@ func TestGovernanceContract_ValidatorVoteInvalidProposal(t *testing.T) { require.Equal(t, eei.GetReturnMessage(), vm.ErrVotedForAnExpiredProposal.Error()) } -func TestGovernanceContract_ValidatorVoteInvalidVote(t *testing.T) { +func TestGovernanceContract_VoteInvalidVote(t *testing.T) { t.Parallel() returnMessage := "" @@ -998,9 +1221,11 @@ func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) } -func TestGovernanceContract_ChangeConfig(t *testing.T) { +func TestGovernanceContract_CloseProposal(t *testing.T) { t.Parallel() + callerAddress := []byte("address") + proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ BlockChainHookCalled: func() vm.BlockchainHook { @@ -1011,226 +1236,12 @@ func TestGovernanceContract_ChangeConfig(t *testing.T) { } }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, []byte(governanceConfigKey)) { - configBytes, _ := args.Marshalizer.Marshal(&GovernanceConfigV2{}) - return configBytes - } - - return nil - }, - } - - gsc, _ := NewGovernanceContract(args) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - []byte("10"), - []byte("5"), - } - initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - _ = gsc.Execute(initInput) - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.Ok, retCode) -} - -func TestGovernanceContract_ChangeConfigWrongCaller(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "changeConfig can be called only by owner" - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - _ = gsc.Execute(initInput) - callInput := createVMInput(zero, "changeConfig", []byte("wrong caller"), vm.GovernanceSCAddress, nil) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_ChangeConfigWrongCallValue(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "changeConfig can be called only without callValue" - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - _ = gsc.Execute(initInput) - callInput := createVMInput(big.NewInt(10), "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_ChangeConfigWrongArgumentsLength(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "changeConfig needs 4 arguments" - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - _ = gsc.Execute(initInput) - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "changeConfig first argument is incorrectly formatted" - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - - initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - _ = gsc.Execute(initInput) - - callInputArgs := [][]byte{ - []byte("invalid"), - []byte("10"), - []byte("10"), - []byte("5"), - } - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) - - errSubstr = "changeConfig second argument is incorrectly formatted" - callInputArgs = [][]byte{ - []byte("1"), - []byte("invalid"), - []byte("10"), - []byte("5"), - } - callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) - retCode = gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) - - errSubstr = "changeConfig third argument is incorrectly formatted" - callInputArgs = [][]byte{ - []byte("1"), - []byte("10"), - []byte("invalid"), - []byte("5"), - } - callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) - retCode = gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) - - errSubstr = "changeConfig fourth argument is incorrectly formatted" - callInputArgs = [][]byte{ - []byte("1"), - []byte("10"), - []byte("10"), - []byte("invalid"), - } - callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) - retCode = gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_ChangeConfigGetConfigErr(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "changeConfig error" - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, []byte(governanceConfigKey)) { - return []byte("invalid config") - } - - return nil - }, - } - - gsc, _ := NewGovernanceContract(args) - - initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) - _ = gsc.Execute(initInput) - - callInputArgs := [][]byte{ - []byte("1"), - []byte("10"), - []byte("10"), - []byte("5"), - } - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - -func TestGovernanceContract_CloseProposal(t *testing.T) { - t.Parallel() - - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 1 - }, - } - }, - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } + if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { + whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + Passed: true, + }) + return whitelistProposalBytes + } if bytes.Equal(key, []byte(governanceConfigKey)) { configBytes, _ := args.Marshalizer.Marshal(&GovernanceConfigV2{ MinQuorum: big.NewInt(10), @@ -1894,119 +1905,6 @@ func TestGovernanceContract_ProposalExists(t *testing.T) { require.True(t, correctKeyCalled) } -func TestGovernanceContract_GetValidProposalNotFound(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - - proposal, err := gsc.getValidProposal(proposalIdentifier) - require.Nil(t, proposal) - require.Equal(t, vm.ErrProposalNotFound, err) -} - -func TestGovernanceContract_GetValidProposalNotStarted(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - } - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 9 - }, - } - }, - } - gsc, _ := NewGovernanceContract(args) - - proposal, err := gsc.getValidProposal(proposalIdentifier) - require.Nil(t, proposal) - require.Equal(t, vm.ErrVotingNotStartedForProposal, err) -} - -func TestGovernanceContract_GetValidProposalVotingFinished(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - } - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 16 - }, - } - }, - } - gsc, _ := NewGovernanceContract(args) - - proposal, err := gsc.getValidProposal(proposalIdentifier) - require.Nil(t, proposal) - require.Equal(t, vm.ErrVotedForAnExpiredProposal, err) -} - -func TestGovernanceContract_GetValidProposal(t *testing.T) { - t.Parallel() - - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - } - - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 11 - }, - } - }, - } - gsc, _ := NewGovernanceContract(args) - - proposal, err := gsc.getValidProposal(proposalIdentifier) - require.Nil(t, err) - require.Equal(t, proposalIdentifier, proposal.CommitHash) -} - func TestComputeEndResults(t *testing.T) { t.Parallel() From a376b6f962b149f06918ef77a199a1e5a3e7bb8a Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 18 Jan 2023 11:44:57 +0200 Subject: [PATCH 131/335] deleting unused functions --- vm/systemSmartContracts/governance.go | 36 ++++++++------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 7ea6bc10a71..33ee0aa35e7 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -137,8 +137,8 @@ func (g *governanceContract) Execute(args *vmcommon.ContractCallInput) vmcommon. return g.changeConfig(args) case "closeProposal": return g.closeProposal(args) - case "getValidatorVotingPower": - return g.getValidatorVotingPower(args) + case "getVotingPower": + return g.getVotingPower(args) } g.eei.AddReturnMessage("invalid method to call") @@ -584,9 +584,8 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.Ok } -// getValidatorVotingPower returns the total voting power for a validator. Un-staked nodes are not -// taken into consideration -func (g *governanceContract) getValidatorVotingPower(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { +// getVotingPower returns the total voting power +func (g *governanceContract) getVotingPower(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if args.CallValue.Cmp(zero) != 0 { g.eei.AddReturnMessage(vm.TransactionValueMustBeZero) return vmcommon.UserError @@ -597,16 +596,16 @@ func (g *governanceContract) getValidatorVotingPower(args *vmcommon.ContractCall return vmcommon.OutOfGas } if len(args.Arguments) != 1 { - g.eei.AddReturnMessage("function accepts only one argument, the validator address") + g.eei.AddReturnMessage("function accepts only one argument") return vmcommon.FunctionWrongSignature } validatorAddress := args.Arguments[0] if len(validatorAddress) != len(args.CallerAddr) { - g.eei.AddReturnMessage("invalid argument - validator address") + g.eei.AddReturnMessage("invalid address") return vmcommon.UserError } - votingPower, err := g.computeValidatorVotingPower(validatorAddress) + votingPower, err := g.computeVotingPowerFromTotalStake(validatorAddress) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.ExecutionFailed @@ -667,26 +666,11 @@ func (g *governanceContract) castVoteType(vote string) (VoteValueType, error) { } } -// computeValidatorVotingPower returns the total voting power of a validator -func (g *governanceContract) computeValidatorVotingPower(validatorAddress []byte) (*big.Int, error) { - totalStake, err := g.getTotalStake(validatorAddress) - if err != nil { - return nil, fmt.Errorf("could not return total stake for the provided address, thus cannot compute voting power") - } - - votingPower, err := g.computeVotingPower(totalStake) - if err != nil { - return nil, fmt.Errorf("could not return total stake for the provided address, thus cannot compute voting power") - } - - return votingPower, nil -} - // function iterates over all delegation contracts and verifies balances of the given account and makes a sum of it func (g *governanceContract) computeVotingPowerFromTotalStake(address []byte) (*big.Int, error) { totalStake, err := g.getTotalStake(address) - if err != nil && err != vm.ErrEmptyStorage { - return nil, fmt.Errorf("could not return total stake for the provided address, thus cannot compute voting power") + if err != nil { + return nil, err } if totalStake == nil { totalStake = big.NewInt(0) @@ -781,7 +765,7 @@ func (g *governanceContract) getActiveFundForDelegator(delegationAddress []byte, func (g *governanceContract) getTotalStake(validatorAddress []byte) (*big.Int, error) { marshaledData := g.eei.GetStorageFromAddress(g.validatorSCAddress, validatorAddress) if len(marshaledData) == 0 { - return nil, vm.ErrEmptyStorage + return big.NewInt(0), nil } validatorData := &ValidatorDataV2{} From b70579a19d948237fd4d9bdc5fcbb0cabb4aa4aa Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 18 Jan 2023 12:36:00 +0200 Subject: [PATCH 132/335] more and more tests --- vm/systemSmartContracts/governance.go | 9 +- vm/systemSmartContracts/governance_test.go | 505 ++------------------- 2 files changed, 52 insertions(+), 462 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 33ee0aa35e7..cd21548b712 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -492,6 +492,7 @@ func addNewNonce(nonceList []uint64, newNonce uint64) ([]uint64, error) { } } + nonceList = append(nonceList, newNonce) return nonceList, nil } @@ -672,9 +673,6 @@ func (g *governanceContract) computeVotingPowerFromTotalStake(address []byte) (* if err != nil { return nil, err } - if totalStake == nil { - totalStake = big.NewInt(0) - } dContractList, err := getDelegationContractList(g.eei, g.marshalizer, g.delegationMgrSCAddress) if err != nil { @@ -734,15 +732,12 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error } func (g *governanceContract) getActiveFundForDelegator(delegationAddress []byte, address []byte) (*big.Int, error) { - dData := &DelegatorData{ - UnClaimedRewards: big.NewInt(0), - TotalCumulatedRewards: big.NewInt(0), - } marshaledData := g.eei.GetStorageFromAddress(delegationAddress, address) if len(marshaledData) == 0 { return big.NewInt(0), nil } + dData := &DelegatorData{} err := g.marshalizer.Unmarshal(dData, marshaledData) if err != nil { return nil, err diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index cdef12aca32..103f77a1e1c 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -76,18 +76,6 @@ func createEEIWithBlockchainHook(blockchainHook vm.BlockchainHook) vm.ContextHan return eei } -func createContractWithMockArguments() *governanceContract { - args := createMockGovernanceArgs() - gsc, _ := NewGovernanceContract(args) - gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) - - contractList := &DelegationContractList{} - marshaledData, _ := args.Marshalizer.Marshal(contractList) - gsc.eei.SetStorageForAddress(gsc.delegationMgrSCAddress, []byte(delegationContractsList), marshaledData) - - return gsc -} - func createGovernanceBlockChainHookStubContextHandler() (*governanceContract, *mock.BlockChainHookStub, vm.ContextHandler) { blockChainHook := &mock.BlockChainHookStub{CurrentEpochCalled: func() uint32 { return 2 @@ -95,10 +83,28 @@ func createGovernanceBlockChainHookStubContextHandler() (*governanceContract, *m eei := createEEIWithBlockchainHook(blockChainHook) gsc, _ := NewGovernanceContract(createArgsWithEEI(eei)) gsc.initV2(&vmcommon.ContractCallInput{VMInput: vmcommon.VMInput{CallerAddr: gsc.governanceSCAddress}}) - marshaledData, _ := gsc.marshalizer.Marshal(&DelegationContractList{}) + + addressList := [][]byte{vm.FirstDelegationSCAddress, vm.StakingSCAddress} + marshaledData, _ := gsc.marshalizer.Marshal(&DelegationContractList{addressList}) + gsc.eei.SetStorageForAddress(gsc.delegationMgrSCAddress, []byte(delegationContractsList), marshaledData) _ = saveDelegationManagementData(eei, gsc.marshalizer, gsc.delegationMgrSCAddress, &DelegationManagement{MinDelegationAmount: big.NewInt(10)}) + userAddress := bytes.Repeat([]byte{2}, 32) + + marshaledData, _ = gsc.marshalizer.Marshal(&ValidatorDataV2{TotalStakeValue: big.NewInt(100)}) + gsc.eei.SetStorageForAddress(gsc.validatorSCAddress, userAddress, marshaledData) + + for index, delegationAddress := range addressList { + fundKey := append([]byte(fundKeyPrefix), big.NewInt(int64(index)).Bytes()...) + + marshaledData, _ = gsc.marshalizer.Marshal(&DelegatorData{ActiveFund: fundKey}) + gsc.eei.SetStorageForAddress(delegationAddress, userAddress, marshaledData) + + marshaledData, _ = gsc.marshalizer.Marshal(&Fund{Value: big.NewInt(10)}) + gsc.eei.SetStorageForAddress(delegationAddress, fundKey, marshaledData) + } + return gsc, blockChainHook, eei } @@ -650,7 +656,7 @@ func TestGovernanceContract_VoteNotEnoughGas(t *testing.T) { func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { t.Parallel() - callerAddress := []byte("address") + callerAddress := bytes.Repeat([]byte{2}, 32) proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, @@ -667,7 +673,8 @@ func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { return 16 } - gsc.eei.SetStorage([]byte("A"), proposalIdentifier) + nonce, _ := nonceFromBytes(voteArgs[0]) + gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -679,481 +686,69 @@ func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { func TestGovernanceContract_VoteInvalidVote(t *testing.T) { t.Parallel() - returnMessage := "" - errInvalidVoteSubstr := "invalid vote type option" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - + callerAddress := bytes.Repeat([]byte{2}, 32) + proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, StartVoteNonce: 10, EndVoteNonce: 15, } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - } voteArgs := [][]byte{ - proposalIdentifier, - []byte("wrong vote"), - } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, returnMessage, errInvalidVoteSubstr) -} - -func TestGovernanceContract_ValidatorVoteInvalidDelegated(t *testing.T) { - t.Parallel() - - returnMessage := "" - errInvalidVoteSubstr := "invalid delegator address" - callerAddress := vm.FirstDelegationSCAddress - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, + []byte("1"), + []byte("invalid"), } - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - []byte("delegatedToWrongAddress"), - big.NewInt(1000).Bytes(), + gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() + blockchainHook.CurrentNonceCalled = func() uint64 { + return 16 } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, returnMessage, errInvalidVoteSubstr) -} - -func TestGovernanceContract_ValidatorVoteComputePowerError(t *testing.T) { - t.Parallel() - - returnMessage := "" - errInvalidVoteSubstr := "could not return total stake for the provided address" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } + nonce, _ := nonceFromBytes(voteArgs[0]) + gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) - return nil - }, - GetStorageFromAddressCalled: func(_ []byte, _ []byte) []byte { - return []byte("invalid proposal bytes") - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - } - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - gsc, _ := NewGovernanceContract(args) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, returnMessage, errInvalidVoteSubstr) -} - -func TestGovernanceContract_ValidatorVoteInvalidVoteSetError(t *testing.T) { - t.Parallel() - - mockBlsKey := []byte("bls key") - mockValidatorBlsKeys := [][]byte{ - mockBlsKey, - mockBlsKey, - mockBlsKey, - mockBlsKey, - } - - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - votePower := big.NewInt(100).Bytes() - - args := createMockGovernanceArgs() - - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - if bytes.Equal(key, append(proposalIdentifier, callerAddress...)) { - return []byte("invalid vote set") - } - - return nil - }, - GetStorageFromAddressCalled: func(address []byte, key []byte) []byte { - if bytes.Equal(address, args.ValidatorSCAddress) && bytes.Equal(key, callerAddress) { - auctionBytes, _ := args.Marshalizer.Marshal(&ValidatorDataV2{ - BlsPubKeys: mockValidatorBlsKeys, - TotalStakeValue: big.NewInt(0).SetBytes(votePower), - }) - - return auctionBytes - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - } - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.ExecutionFailed, retCode) + require.Equal(t, eei.GetReturnMessage(), "invalid argument: invalid vote type option: invalid") } -func TestGovernanceContract_DelegateVoteVoteNotEnoughPower(t *testing.T) { +func TestGovernanceContract_VoteTwice(t *testing.T) { t.Parallel() - mockBlsKey := []byte("bls key") - returnMessage := "" - errInvalidVoteSubstr := "not enough voting power to cast this vote" - mockValidatorBlsKeys := [][]byte{ - mockBlsKey, - mockBlsKey, - mockBlsKey, - mockBlsKey, - } - - callerAddress := vm.FirstDelegationSCAddress - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - votePower := big.NewInt(100).Bytes() - - args := createMockGovernanceArgs() - - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - - return nil - }, - AddReturnMessageCalled: func(msg string) { - returnMessage = msg - }, - GetStorageFromAddressCalled: func(address []byte, key []byte) []byte { - if bytes.Equal(address, args.ValidatorSCAddress) && bytes.Equal(key, callerAddress) { - auctionBytes, _ := args.Marshalizer.Marshal(&ValidatorDataV2{ - BlsPubKeys: mockValidatorBlsKeys, - TotalStakeValue: big.NewInt(0).SetBytes(votePower), - }) - - return auctionBytes - } - if bytes.Equal(address, vm.DelegationManagerSCAddress) && bytes.Equal(key, []byte(delegationContractsList)) { - contractList := &DelegationContractList{} - marshaledData, _ := args.Marshalizer.Marshal(contractList) - return marshaledData - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - } - - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - big.NewInt(100000).Bytes(), - callerAddress, - } - gsc, _ := NewGovernanceContract(args) - - callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, returnMessage, errInvalidVoteSubstr) -} - -func TestGovernanceContract_DelegateVoteSuccess(t *testing.T) { - t.Parallel() - - mockBlsKey := []byte("bls key") - mockValidatorBlsKeys := [][]byte{ - mockBlsKey, - mockBlsKey, - mockBlsKey, - mockBlsKey, - } - - callerAddress := vm.FirstDelegationSCAddress - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - votePower := big.NewInt(100) - - args := createMockGovernanceArgs() - + callerAddress := bytes.Repeat([]byte{2}, 32) + proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, StartVoteNonce: 10, EndVoteNonce: 15, - Yes: big.NewInt(10), - } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - - return nil - }, - GetStorageFromAddressCalled: func(address []byte, key []byte) []byte { - if bytes.Equal(address, args.ValidatorSCAddress) && bytes.Equal(key, callerAddress) { - auctionBytes, _ := args.Marshalizer.Marshal(&ValidatorDataV2{ - BlsPubKeys: mockValidatorBlsKeys, - TotalStakeValue: big.NewInt(0).Set(votePower), - }) - - return auctionBytes - } - if bytes.Equal(address, vm.DelegationManagerSCAddress) && bytes.Equal(key, []byte(delegationContractsList)) { - contractList := &DelegationContractList{} - marshaledData, _ := args.Marshalizer.Marshal(contractList) - return marshaledData - } - - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, + Yes: big.NewInt(0), + No: big.NewInt(0), + Veto: big.NewInt(0), + Abstain: big.NewInt(0), } voteArgs := [][]byte{ - proposalIdentifier, + []byte("1"), []byte("yes"), - big.NewInt(10).Bytes(), - callerAddress, - } - gsc, _ := NewGovernanceContract(args) - - callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.Ok, retCode) -} - -func TestGovernanceContract_ValidatorVote(t *testing.T) { - t.Parallel() - - mockBlsKey := []byte("bls key") - mockValidatorBlsKeys := [][]byte{ - mockBlsKey, - mockBlsKey, - mockBlsKey, - mockBlsKey, } - - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - votePower := big.NewInt(10) - proposalKey := append([]byte(proposalPrefix), proposalIdentifier...) - - finalProposal := &GeneralProposal{} - args := createMockGovernanceArgs() - - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - Yes: big.NewInt(0), + gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() + blockchainHook.CurrentNonceCalled = func() uint64 { + return 12 } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - if bytes.Equal(key, append([]byte(stakeLockPrefix), callerAddress...)) { - return big.NewInt(10).Bytes() - } - return nil - }, - GetStorageFromAddressCalled: func(address []byte, key []byte) []byte { - if bytes.Equal(address, args.ValidatorSCAddress) && bytes.Equal(key, callerAddress) { - auctionBytes, _ := args.Marshalizer.Marshal(&ValidatorDataV2{ - BlsPubKeys: mockValidatorBlsKeys, - TotalStakeValue: big.NewInt(100), - }) - - return auctionBytes - } - if bytes.Equal(address, vm.DelegationManagerSCAddress) && bytes.Equal(key, []byte(delegationContractsList)) { - contractList := &DelegationContractList{Addresses: [][]byte{vm.FirstDelegationSCAddress}} - marshaledData, _ := args.Marshalizer.Marshal(contractList) - return marshaledData - } - - return nil - }, - - SetStorageCalled: func(key []byte, value []byte) { - if bytes.Equal(key, proposalKey) { - _ = args.Marshalizer.Unmarshal(finalProposal, value) - } - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - } + nonce, _ := nonceFromBytes(voteArgs[0]) + gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - gsc, _ := NewGovernanceContract(args) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.Ok, retCode) - require.Equal(t, votePower, finalProposal.Yes) -} - -func TestGovernanceContract_ValidatorVoteTwice(t *testing.T) { - t.Parallel() - - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - - args := createMockGovernanceArgs() - - generalProposal := &GeneralProposal{ - CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, - Yes: big.NewInt(0), - } - args.Eei = &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - proposalBytes, _ := args.Marshalizer.Marshal(generalProposal) - return proposalBytes - } - return nil - }, - BlockChainHookCalled: func() vm.BlockchainHook { - return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { - return 14 - }, - } - }, - AddReturnMessageCalled: func(msg string) { - require.Equal(t, msg, "vote only once") - }, - } - - voteArgs := [][]byte{ - proposalIdentifier, - []byte("yes"), - } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) - retCode := gsc.Execute(callInput) + voteArgs[1] = []byte("no") + retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, eei.GetReturnMessage(), "double vote is not allowed") } func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { From 0333765ca4b3750f3a0f03f2e83178926f4a2799 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 19 Jan 2023 17:36:45 +0200 Subject: [PATCH 133/335] full unit tests --- vm/errors.go | 13 +- vm/factory/systemSCFactory.go | 24 +- vm/factory/systemSCFactory_test.go | 13 - vm/systemSmartContracts/eei.go | 2 - vm/systemSmartContracts/governance.go | 12 +- vm/systemSmartContracts/governance_test.go | 348 +++++++-------------- 6 files changed, 137 insertions(+), 275 deletions(-) diff --git a/vm/errors.go b/vm/errors.go index d3b89a28911..5aa0dcb5f39 100644 --- a/vm/errors.go +++ b/vm/errors.go @@ -1,6 +1,8 @@ package vm -import "errors" +import ( + "errors" +) // ErrUnknownSystemSmartContract signals that there is no system smart contract on the provided address var ErrUnknownSystemSmartContract = errors.New("missing system smart contract on selected address") @@ -242,8 +244,11 @@ var ErrNilShardCoordinator = errors.New("nil shard coordinator") // ErrProposalNotFound signals that the storage is empty for given key var ErrProposalNotFound = errors.New("proposal was not found in storage") -// ErrInvalidNumOfInitialWhiteListedAddress signals that 0 initial whiteListed addresses were provided to the governance contract -var ErrInvalidNumOfInitialWhiteListedAddress = errors.New("0 initial whiteListed addresses provided to the governance contract") - // ErrNilEnableEpochsHandler signals that a nil enable epochs handler has been provided var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler") + +// ErrNotEnoughStakeToVote signals that the stake/delegation is not enough to vote +var ErrNotEnoughStakeToVote = errors.New("not enough stake/delegate to vote") + +// ErrNotEnoughVotingPower signals that there is not enough voting power to cast the vote +var ErrNotEnoughVotingPower = errors.New("not enough voting power to cast this vote") diff --git a/vm/factory/systemSCFactory.go b/vm/factory/systemSCFactory.go index a37ac4383ec..d9407d6b55f 100644 --- a/vm/factory/systemSCFactory.go +++ b/vm/factory/systemSCFactory.go @@ -219,22 +219,16 @@ func (scf *systemSCFactory) createESDTContract() (vm.SystemSmartContract, error) } func (scf *systemSCFactory) createGovernanceContract() (vm.SystemSmartContract, error) { - firstWhitelistAddress, err := scf.addressPubKeyConverter.Decode(scf.systemSCConfig.GovernanceSystemSCConfig.FirstWhitelistedAddress) - if err != nil { - return nil, fmt.Errorf("%w for GovernanceSystemSCConfig.FirstWhitelistedAddress in systemSCFactory", vm.ErrInvalidAddress) - } - argsGovernance := systemSmartContracts.ArgsNewGovernanceContract{ - Eei: scf.systemEI, - GasCost: scf.gasCost, - GovernanceConfig: scf.systemSCConfig.GovernanceSystemSCConfig, - Marshalizer: scf.marshalizer, - Hasher: scf.hasher, - GovernanceSCAddress: vm.GovernanceSCAddress, - DelegationMgrSCAddress: vm.DelegationManagerSCAddress, - ValidatorSCAddress: vm.ValidatorSCAddress, - EnableEpochsHandler: scf.enableEpochsHandler, - InitialWhiteListedAddresses: [][]byte{firstWhitelistAddress}, + Eei: scf.systemEI, + GasCost: scf.gasCost, + GovernanceConfig: scf.systemSCConfig.GovernanceSystemSCConfig, + Marshalizer: scf.marshalizer, + Hasher: scf.hasher, + GovernanceSCAddress: vm.GovernanceSCAddress, + DelegationMgrSCAddress: vm.DelegationManagerSCAddress, + ValidatorSCAddress: vm.ValidatorSCAddress, + EnableEpochsHandler: scf.enableEpochsHandler, } governance, err := systemSmartContracts.NewGovernanceContract(argsGovernance) return governance, err diff --git a/vm/factory/systemSCFactory_test.go b/vm/factory/systemSCFactory_test.go index 321f2253c8b..653b92121ad 100644 --- a/vm/factory/systemSCFactory_test.go +++ b/vm/factory/systemSCFactory_test.go @@ -238,19 +238,6 @@ func TestSystemSCFactory_CreateWithBadDelegationManagerConfigChangeAddressShould assert.True(t, errors.Is(err, vm.ErrInvalidAddress)) } -func TestSystemSCFactory_CreateWithFirstWhiteListAddressShouldError(t *testing.T) { - t.Parallel() - - arguments := createMockNewSystemScFactoryArgs() - arguments.SystemSCConfig.GovernanceSystemSCConfig.FirstWhitelistedAddress = "not a hex string" - scFactory, _ := NewSystemSCFactory(arguments) - - container, err := scFactory.Create() - - assert.True(t, check.IfNil(container)) - assert.True(t, errors.Is(err, vm.ErrInvalidAddress)) -} - func TestSystemSCFactory_Create(t *testing.T) { t.Parallel() diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 0e396dfc5a8..da63fc9844b 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -120,7 +120,6 @@ func (host *vmContext) GetContract(address []byte) (vm.SystemSmartContract, erro // GetStorageFromAddress gets the storage from address and key func (host *vmContext) GetStorageFromAddress(address []byte, key []byte) []byte { - log.Warn("get" + string(address) + " " + string(key)) storageAdrMap, exists := host.storageUpdate[string(address)] if exists { if value, isInMap := storageAdrMap[string(key)]; isInMap { @@ -148,7 +147,6 @@ func (host *vmContext) SetStorageForAddress(address []byte, key []byte, value [] if !exists { host.storageUpdate[strAdr] = make(map[string][]byte) } - log.Warn("set" + string(address) + " " + string(key) + " " + string(value)) length := len(value) host.storageUpdate[strAdr][string(key)] = make([]byte, length) copy(host.storageUpdate[strAdr][string(key)][:length], value[:length]) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index cd21548b712..50d2c2d745b 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -379,14 +379,14 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco g.eei.AddReturnMessage("only SC can call this") return vmcommon.UserError } - voter := args.Arguments[3] + voter := args.Arguments[2] if len(voter) != len(args.CallerAddr) { g.eei.AddReturnMessage("invalid delegator address") return vmcommon.UserError } proposalToVote := args.Arguments[0] - votePower, err := g.updateDelegatedContractInfo(args.CallerAddr, proposalToVote, args.Arguments[2]) + votePower, err := g.updateDelegatedContractInfo(args.CallerAddr, proposalToVote, args.Arguments[3]) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -418,7 +418,7 @@ func (g *governanceContract) updateDelegatedContractInfo(scAddress []byte, refer scVoteInfo.UsedPower.Add(scVoteInfo.UsedPower, votePower) if scVoteInfo.TotalPower.Cmp(scVoteInfo.UsedPower) < 0 { - return nil, fmt.Errorf("not enough voting power to cast this vote") + return nil, vm.ErrNotEnoughVotingPower } err = g.saveDelegatedContractInfo(scAddress, scVoteInfo, reference) if err != nil { @@ -609,7 +609,7 @@ func (g *governanceContract) getVotingPower(args *vmcommon.ContractCallInput) vm votingPower, err := g.computeVotingPowerFromTotalStake(validatorAddress) if err != nil { g.eei.AddReturnMessage(err.Error()) - return vmcommon.ExecutionFailed + return vmcommon.UserError } g.eei.Finish(votingPower.Bytes()) @@ -643,8 +643,8 @@ func (g *governanceContract) computeVotingPower(value *big.Int) (*big.Int, error return nil, err } - if value.Cmp(minValue) <= 0 { - return nil, fmt.Errorf("not enough stake/delegate to vote") + if value.Cmp(minValue) < 0 { + return nil, vm.ErrNotEnoughStakeToVote } //TODO: decide whether quadratic or not diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 103f77a1e1c..32a0734d50a 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -91,11 +91,18 @@ func createGovernanceBlockChainHookStubContextHandler() (*governanceContract, *m _ = saveDelegationManagementData(eei, gsc.marshalizer, gsc.delegationMgrSCAddress, &DelegationManagement{MinDelegationAmount: big.NewInt(10)}) userAddress := bytes.Repeat([]byte{2}, 32) + addStakeAndDelegationForAddress(gsc, userAddress) - marshaledData, _ = gsc.marshalizer.Marshal(&ValidatorDataV2{TotalStakeValue: big.NewInt(100)}) + return gsc, blockChainHook, eei +} + +func addStakeAndDelegationForAddress(gsc *governanceContract, userAddress []byte) { + marshaledData, _ := gsc.marshalizer.Marshal(&ValidatorDataV2{TotalStakeValue: big.NewInt(100)}) gsc.eei.SetStorageForAddress(gsc.validatorSCAddress, userAddress, marshaledData) - for index, delegationAddress := range addressList { + addressList, _ := getDelegationContractList(gsc.eei, gsc.marshalizer, gsc.delegationMgrSCAddress) + + for index, delegationAddress := range addressList.Addresses { fundKey := append([]byte(fundKeyPrefix), big.NewInt(int64(index)).Bytes()...) marshaledData, _ = gsc.marshalizer.Marshal(&DelegatorData{ActiveFund: fundKey}) @@ -104,8 +111,6 @@ func createGovernanceBlockChainHookStubContextHandler() (*governanceContract, *m marshaledData, _ = gsc.marshalizer.Marshal(&Fund{Value: big.NewInt(10)}) gsc.eei.SetStorageForAddress(delegationAddress, fundKey, marshaledData) } - - return gsc, blockChainHook, eei } func createVMInput(callValue *big.Int, funcName string, callerAddr, recipientAddr []byte, arguments [][]byte) *vmcommon.ContractCallInput { @@ -754,66 +759,109 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { t.Parallel() - args := createMockGovernanceArgs() + gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() + blockchainHook.CurrentNonceCalled = func() uint64 { + return 12 + } - mockEI := &mock.SystemEIStub{} - args.Eei = mockEI + callerAddress := bytes.Repeat([]byte{2}, 32) + proposalIdentifier := []byte("aaaaaaaaa") + generalProposal := &GeneralProposal{ + CommitHash: proposalIdentifier, + StartVoteNonce: 10, + EndVoteNonce: 15, + Yes: big.NewInt(0), + No: big.NewInt(0), + Veto: big.NewInt(0), + Abstain: big.NewInt(0), + } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "delegateVote", []byte("address"), vm.GovernanceSCAddress, nil) + voteArgs := [][]byte{ + []byte("1"), + []byte("yes"), + } + nonce, _ := nonceFromBytes(voteArgs[0]) + gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) + callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, eei.GetReturnMessage(), "invalid number of arguments") - callInput.Arguments = [][]byte{{1}, {2}, {3}, {4}} + callInput.Arguments = append(callInput.Arguments, []byte{1}, []byte{2}) callInput.CallValue = big.NewInt(10) retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Equal(t, mockEI.ReturnMessage, "function is not payable") + require.True(t, strings.Contains(eei.GetReturnMessage(), "function is not payable")) - mockEI.UseGasCalled = func(_ uint64) error { - return vm.ErrNotEnoughGas - } callInput.CallValue = big.NewInt(0) - args.Eei = mockEI + callInput.GasProvided = 0 + gsc.gasCost.MetaChainSystemSCsCost.DelegateVote = 10 retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.OutOfGas, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "not enough gas")) +} + +func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { + t.Parallel() - mockEI.AddReturnMessageCalled = func(msg string) { - require.Equal(t, msg, "only SC can call this") + gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() + blockchainHook.CurrentNonceCalled = func() uint64 { + return 12 } - mockEI.UseGasCalled = func(gas uint64) error { - return nil + + callerAddress := bytes.Repeat([]byte{2}, 32) + proposalIdentifier := []byte("aaaaaaaaa") + generalProposal := &GeneralProposal{ + CommitHash: proposalIdentifier, + StartVoteNonce: 10, + EndVoteNonce: 15, + Yes: big.NewInt(0), + No: big.NewInt(0), + Veto: big.NewInt(0), + Abstain: big.NewInt(0), } - args.Eei = mockEI - retCode = gsc.Execute(callInput) - require.Equal(t, vmcommon.UserError, retCode) - mockEI.AddReturnMessageCalled = func(msg string) { - require.Equal(t, msg, "invalid delegator address") + voteArgs := [][]byte{ + []byte("1"), + []byte("yes"), + {1}, + big.NewInt(10000).Bytes(), } + nonce, _ := nonceFromBytes(voteArgs[0]) + gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) + + callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) + + retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "only SC can call this")) + callInput.CallerAddr = vm.ESDTSCAddress retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "invalid delegator address")) - mockEI.AddReturnMessageCalled = func(msg string) { - require.Equal(t, msg, vm.ErrProposalNotFound.Error()) - } - args.Eei = mockEI - callInput.Arguments[3] = vm.ESDTSCAddress + callInput.Arguments[2] = callerAddress retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "not enough stake/delegate to vote")) + + addStakeAndDelegationForAddress(gsc, callInput.CallerAddr) + + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "not enough voting power to cast this vote")) + + callInput.Arguments[3] = big.NewInt(12).Bytes() + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) - mockEI.GetStorageCalled = func(key []byte) []byte { - proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{}) - return proposalBytes - } - mockEI.AddReturnMessageCalled = func(msg string) { - require.True(t, bytes.Contains([]byte(msg), []byte("invalid vote type option: "))) - } - args.Eei = mockEI retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) + require.True(t, strings.Contains(eei.GetReturnMessage(), "double vote is not allowed")) } func TestGovernanceContract_CloseProposal(t *testing.T) { @@ -896,32 +944,6 @@ func TestGovernanceContract_CloseProposalWrongCallValue(t *testing.T) { require.Contains(t, retMessage, errSubstr) } -func TestGovernanceContract_CloseProposalNotWhitelisted(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "caller is not whitelisted" - callerAddress := []byte("address") - proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - proposalIdentifier, - } - - callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - - require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, errSubstr) -} - func TestGovernanceContract_CloseProposalWrongArgumentsLength(t *testing.T) { t.Parallel() @@ -935,10 +957,10 @@ func TestGovernanceContract_CloseProposalWrongArgumentsLength(t *testing.T) { }, GetStorageCalled: func(key []byte) []byte { if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, }) - return whitelistProposalBytes + return proposalBytes } return nil @@ -967,10 +989,10 @@ func TestGovernanceContract_CloseProposalNotEnoughGas(t *testing.T) { }, GetStorageCalled: func(key []byte) []byte { if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Passed: true, }) - return whitelistProposalBytes + return proposalBytes } return nil @@ -1004,13 +1026,6 @@ func TestGovernanceContract_CloseProposalGetProposalErr(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } - return nil }, } @@ -1039,20 +1054,14 @@ func TestGovernanceContract_CloseProposalAlreadyClosed(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), No: big.NewInt(10), Veto: big.NewInt(10), Closed: true, }) - return whitelistProposalBytes + return proposalBytes } return nil @@ -1083,20 +1092,14 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), No: big.NewInt(10), Veto: big.NewInt(10), EndVoteNonce: 10, }) - return whitelistProposalBytes + return proposalBytes } return nil @@ -1134,19 +1137,13 @@ func TestGovernanceContract_CloseProposalComputeResultsErr(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), No: big.NewInt(10), Veto: big.NewInt(10), }) - return whitelistProposalBytes + return proposalBytes } return nil @@ -1164,50 +1161,24 @@ func TestGovernanceContract_CloseProposalComputeResultsErr(t *testing.T) { require.Contains(t, retMessage, errSubstr) } -func TestGovernanceContract_GetValidatorVotingPower(t *testing.T) { +func TestGovernanceContract_GetVotingPower(t *testing.T) { t.Parallel() - votingPowerResult := make([]byte, 0) - mockBlsKey := []byte("bls key") - mockValidatorBlsKeys := [][]byte{ - mockBlsKey, - mockBlsKey, - mockBlsKey, - mockBlsKey, - } - - callerAddress := []byte("address") - - args := createMockGovernanceArgs() - - args.Eei = &mock.SystemEIStub{ - GetStorageFromAddressCalled: func(address []byte, key []byte) []byte { - if bytes.Equal(address, args.ValidatorSCAddress) && bytes.Equal(key, callerAddress) { - auctionBytes, _ := args.Marshalizer.Marshal(&ValidatorDataV2{ - BlsPubKeys: mockValidatorBlsKeys, - TotalStakeValue: big.NewInt(100), - }) - - return auctionBytes - } - - return nil - }, - FinishCalled: func(value []byte) { - votingPowerResult = value - }, - } + gsc, _, eei := createGovernanceBlockChainHookStubContextHandler() + callerAddress := bytes.Repeat([]byte{2}, 32) callInputArgs := [][]byte{ callerAddress, } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "getValidatorVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + + callInput := createVMInput(big.NewInt(0), "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.Ok, retCode) - require.Equal(t, big.NewInt(10).Bytes(), votingPowerResult) + + vmOutput := eei.CreateVMOutput() + require.Equal(t, big.NewInt(10).Bytes(), vmOutput.ReturnData[0]) } -func TestGovernanceContract_GetValidatorVotingPowerWrongCallValue(t *testing.T) { +func TestGovernanceContract_GetVVotingPowerWrongCallValue(t *testing.T) { t.Parallel() retMessage := "" @@ -1220,17 +1191,17 @@ func TestGovernanceContract_GetValidatorVotingPowerWrongCallValue(t *testing.T) } gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(10), "getValidatorVotingPower", callerAddress, vm.GovernanceSCAddress, nil) + callInput := createVMInput(big.NewInt(10), "getVotingPower", callerAddress, vm.GovernanceSCAddress, nil) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, vm.TransactionValueMustBeZero) } -func TestGovernanceContract_GetValidatorVotingPowerWrongArgumentsLength(t *testing.T) { +func TestGovernanceContract_GetVotingPowerWrongArgumentsLength(t *testing.T) { t.Parallel() retMessage := "" - errSubstr := "function accepts only one argument, the validator address" + errSubstr := "function accepts only one argument" callerAddress := []byte("address") args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ @@ -1244,17 +1215,17 @@ func TestGovernanceContract_GetValidatorVotingPowerWrongArgumentsLength(t *testi callerAddress, callerAddress, } - callInput := createVMInput(zero, "getValidatorVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.FunctionWrongSignature, retCode) require.Contains(t, retMessage, errSubstr) } -func TestGovernanceContract_GetValidatorVotingPowerInvalidArgument(t *testing.T) { +func TestGovernanceContract_GetVotingPowerInvalidArgument(t *testing.T) { t.Parallel() retMessage := "" - errSubstr := "invalid argument - validator address" + errSubstr := "invalid address" callerAddress := []byte("address") args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ @@ -1267,13 +1238,13 @@ func TestGovernanceContract_GetValidatorVotingPowerInvalidArgument(t *testing.T) callInputArgs := [][]byte{ []byte("address_wrong"), } - callInput := createVMInput(zero, "getValidatorVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, errSubstr) } -func TestGovernanceContract_GetValidatorVotingPowerComputeErr(t *testing.T) { +func TestGovernanceContract_GetVotingPowerComputeErr(t *testing.T) { t.Parallel() callerAddress := []byte("address") @@ -1288,75 +1259,9 @@ func TestGovernanceContract_GetValidatorVotingPowerComputeErr(t *testing.T) { callInputArgs := [][]byte{ callerAddress, } - callInput := createVMInput(zero, "getValidatorVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.ExecutionFailed, retCode) -} - -func TestGovernanceContract_GetBalanceVotingPower(t *testing.T) { - t.Parallel() - - votingPowerResult := make([]byte, 0) - - callerAddress := []byte("address") - args := createMockGovernanceArgs() - - args.Eei = &mock.SystemEIStub{ - FinishCalled: func(value []byte) { - votingPowerResult = value - }, - } - callInputArgs := [][]byte{ - big.NewInt(400).Bytes(), - } - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(0), "getBalanceVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.Ok, retCode) - require.Equal(t, big.NewInt(20).Bytes(), votingPowerResult) -} - -func TestGovernanceContract_GetBalanceVotingPowerWrongCallValue(t *testing.T) { - t.Parallel() - - retMessage := "" - callerAddress := []byte("address") - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(10), "getBalanceVotingPower", callerAddress, vm.GovernanceSCAddress, nil) + callInput := createVMInput(zero, "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, vm.TransactionValueMustBeZero) -} - -func TestGovernanceContract_GetBalanceVotingPowerWrongArgumentsLength(t *testing.T) { - t.Parallel() - - retMessage := "" - errSubstr := "function accepts only one argument" - callerAddress := []byte("address") - args := createMockGovernanceArgs() - args.Eei = &mock.SystemEIStub{ - AddReturnMessageCalled: func(msg string) { - retMessage = msg - }, - } - - gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - big.NewInt(400).Bytes(), - big.NewInt(400).Bytes(), - } - callInput := createVMInput(zero, "getBalanceVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) - retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.FunctionWrongSignature, retCode) - require.Contains(t, retMessage, errSubstr) } // ======== Begin testing of helper functions @@ -1565,30 +1470,3 @@ func TestComputeEndResults(t *testing.T) { require.Nil(t, err) require.True(t, pass.Passed) } - -func createMockStorer(_ []byte, proposalIdentifier []byte, proposal *GeneralProposal) *mock.SystemEIStub { - return &mock.SystemEIStub{ - GetStorageCalled: func(key []byte) []byte { - marshalizer := &mock.MarshalizerMock{} - - isGeneralProposalKey := bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) - if isGeneralProposalKey && proposal != nil { - marshaledProposal, _ := marshalizer.Marshal(proposal) - - return marshaledProposal - } - - return nil - }, - GetStorageFromAddressCalled: func(address []byte, key []byte) []byte { - marshalizer := &mock.MarshalizerMock{} - if bytes.Equal(address, vm.DelegationManagerSCAddress) && bytes.Equal(key, []byte(delegationManagementKey)) { - dManagementData := &DelegationManagement{MinDelegationAmount: big.NewInt(10)} - marshaledData, _ := marshalizer.Marshal(dManagementData) - return marshaledData - } - - return nil - }, - } -} From d08bc8db92dc058804f645e966bf8610031ad63f Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 19 Jan 2023 18:00:56 +0200 Subject: [PATCH 134/335] small change --- vm/systemSmartContracts/governance.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 50d2c2d745b..dee716bd87b 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -234,6 +234,7 @@ func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmco scConfig.MinPassThreshold = minPass scConfig.ProposalFee = proposalFee + g.baseProposalCost.Set(proposalFee) err = g.saveConfig(scConfig) if err != nil { g.eei.AddReturnMessage(err.Error()) @@ -260,7 +261,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon return vmcommon.UserError } if args.CallValue.Cmp(generalConfig.ProposalFee) != 0 { - g.eei.AddReturnMessage("invalid proposal cost, expected " + generalConfig.ProposalFee.String()) + g.eei.AddReturnMessage("invalid value provided, expected " + generalConfig.ProposalFee.String()) return vmcommon.OutOfFunds } From 18596f55d9ada55d44bbd4128f4474ff9d3d1413 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 19 Jan 2023 19:18:32 +0200 Subject: [PATCH 135/335] fixes, config change address --- .../config/systemSmartContractsConfig.toml | 2 +- config/systemSmartContractsConfig.go | 6 ++--- epochStart/metachain/systemSCs_test.go | 2 +- genesis/process/genesisBlockCreator_test.go | 2 +- .../multiShard/hardFork/hardFork_test.go | 2 +- integrationTests/testInitializer.go | 4 ++-- integrationTests/testProcessorNode.go | 4 ++-- integrationTests/vm/testInitializer.go | 2 +- .../metachain/vmContainerFactory_test.go | 2 +- testscommon/components/components.go | 2 +- vm/factory/systemSCFactory.go | 7 ++++++ vm/factory/systemSCFactory_test.go | 9 ++++++- vm/systemSmartContracts/governance.go | 17 ++++++++++--- vm/systemSmartContracts/governance_test.go | 24 +++++++++++-------- 14 files changed, 57 insertions(+), 28 deletions(-) diff --git a/cmd/node/config/systemSmartContractsConfig.toml b/cmd/node/config/systemSmartContractsConfig.toml index c5e418a9749..62cdc137d80 100644 --- a/cmd/node/config/systemSmartContractsConfig.toml +++ b/cmd/node/config/systemSmartContractsConfig.toml @@ -17,7 +17,7 @@ OwnerAddress = "erd1fpkcgel4gcmh8zqqdt043yfcn5tyx8373kg6q2qmkxzu4dqamc0swts65c" [GovernanceSystemSCConfig] - FirstWhitelistedAddress = "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80" #should use a multisign contract instead of a wallet address + ChangeConfigAddress = "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80" #should use a multisign contract instead of a wallet address [GovernanceSystemSCConfig.V1] NumNodes = 500 ProposalCost = "5000000000000000000" #5 eGLD diff --git a/config/systemSmartContractsConfig.go b/config/systemSmartContractsConfig.go index 0d2833df91e..d42e25421ab 100644 --- a/config/systemSmartContractsConfig.go +++ b/config/systemSmartContractsConfig.go @@ -52,9 +52,9 @@ type GovernanceSystemSCConfigActive struct { // GovernanceSystemSCConfig defines the set of constants to initialize the governance system smart contract type GovernanceSystemSCConfig struct { - V1 GovernanceSystemSCConfigV1 - Active GovernanceSystemSCConfigActive - FirstWhitelistedAddress string + V1 GovernanceSystemSCConfigV1 + Active GovernanceSystemSCConfigActive + ChangeConfigAddress string } // DelegationManagerSystemSCConfig defines a set of constants to initialize the delegation manager system smart contract diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index 922958d0c49..e55246f26c7 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -994,7 +994,7 @@ func createFullArgumentsForSystemSCProcessing(enableEpochsConfig config.EnableEp MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: "3132333435363738393031323334353637383930313233343536373839303234", + ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index 067412c9aad..97a075ccd5e 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -97,7 +97,7 @@ func createMockArgument( MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: "3132333435363738393031323334353637383930313233343536373839303234", + ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: nodePrice.Text(10), diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index 7caeeca4704..f0323074ec5 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -441,7 +441,7 @@ func hardForkImport( MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: integrationTests.DelegationManagerConfigChangeAddress, + ChangeConfigAddress: integrationTests.DelegationManagerConfigChangeAddress, }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 39b7b9dafbf..5fd72424eaa 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -663,7 +663,7 @@ func CreateFullGenesisBlocks( OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ - FirstWhitelistedAddress: DelegationManagerConfigChangeAddress, + ChangeConfigAddress: DelegationManagerConfigChangeAddress, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", MinQuorum: "50", @@ -774,7 +774,7 @@ func CreateGenesisMetaBlock( MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: DelegationManagerConfigChangeAddress, + ChangeConfigAddress: DelegationManagerConfigChangeAddress, }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index ad9bf5d7c4c..527d0cda7c8 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -804,7 +804,7 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: DelegationManagerConfigChangeAddress, + ChangeConfigAddress: DelegationManagerConfigChangeAddress, }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", @@ -1679,7 +1679,7 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: DelegationManagerConfigChangeAddress, + ChangeConfigAddress: DelegationManagerConfigChangeAddress, }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index e5fb473ac9f..0bc55d0f311 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -682,7 +682,7 @@ func createSystemSCConfig() *config.SystemSmartContractsConfig { MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: "3132333435363738393031323334353637383930313233343536373839303234", + ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "2500000000000000000000", diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index 582ee01a83f..40eb04fabbb 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -305,7 +305,7 @@ func TestVmContainerFactory_Create(t *testing.T) { MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: "3132333435363738393031323334353637383930313233343536373839303234", + ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 1afe538b5b6..1f94edcb53e 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -539,7 +539,7 @@ func GetProcessArgs( MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", + ChangeConfigAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "2500000000000000000000", diff --git a/vm/factory/systemSCFactory.go b/vm/factory/systemSCFactory.go index d9407d6b55f..dc193505e21 100644 --- a/vm/factory/systemSCFactory.go +++ b/vm/factory/systemSCFactory.go @@ -219,6 +219,11 @@ func (scf *systemSCFactory) createESDTContract() (vm.SystemSmartContract, error) } func (scf *systemSCFactory) createGovernanceContract() (vm.SystemSmartContract, error) { + configChangeAddress, err := scf.addressPubKeyConverter.Decode(scf.systemSCConfig.GovernanceSystemSCConfig.ChangeConfigAddress) + if err != nil { + return nil, fmt.Errorf("%w for DelegationManagerSystemSCConfig.ConfigChangeAddress in systemSCFactory", vm.ErrInvalidAddress) + } + argsGovernance := systemSmartContracts.ArgsNewGovernanceContract{ Eei: scf.systemEI, GasCost: scf.gasCost, @@ -229,6 +234,8 @@ func (scf *systemSCFactory) createGovernanceContract() (vm.SystemSmartContract, DelegationMgrSCAddress: vm.DelegationManagerSCAddress, ValidatorSCAddress: vm.ValidatorSCAddress, EnableEpochsHandler: scf.enableEpochsHandler, + UnBondPeriodInEpochs: scf.systemSCConfig.StakingSystemSCConfig.UnBondPeriodInEpochs, + ConfigChangeAddress: configChangeAddress, } governance, err := systemSmartContracts.NewGovernanceContract(argsGovernance) return governance, err diff --git a/vm/factory/systemSCFactory_test.go b/vm/factory/systemSCFactory_test.go index 653b92121ad..e24dfa9ad4c 100644 --- a/vm/factory/systemSCFactory_test.go +++ b/vm/factory/systemSCFactory_test.go @@ -36,13 +36,20 @@ func createMockNewSystemScFactoryArgs() ArgsNewSystemSCFactory { OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + NumNodes: 3, + MinPassThreshold: 1, + MinQuorum: 2, + MinVetoThreshold: 2, + ProposalCost: "100", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", }, - FirstWhitelistedAddress: "3132333435363738393031323334353637383930313233343536373839303234", + ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index dee716bd87b..b1f2beb317f 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -36,6 +36,8 @@ type ArgsNewGovernanceContract struct { GovernanceSCAddress []byte DelegationMgrSCAddress []byte ValidatorSCAddress []byte + ConfigChangeAddress []byte + UnBondPeriodInEpochs uint32 EnableEpochsHandler common.EnableEpochsHandler } @@ -47,9 +49,11 @@ type governanceContract struct { governanceSCAddress []byte delegationMgrSCAddress []byte validatorSCAddress []byte + changeConfigAddress []byte marshalizer marshal.Marshalizer hasher hashing.Hasher governanceConfig config.GovernanceSystemSCConfig + unBondPeriodInEpochs uint32 enableEpochsHandler common.EnableEpochsHandler mutExecution sync.RWMutex } @@ -69,8 +73,7 @@ func NewGovernanceContract(args ArgsNewGovernanceContract) (*governanceContract, return nil, vm.ErrNilEnableEpochsHandler } - activeConfig := args.GovernanceConfig.Active - baseProposalCost, okConvert := big.NewInt(0).SetString(activeConfig.ProposalCost, conversionBase) + baseProposalCost, okConvert := big.NewInt(0).SetString(args.GovernanceConfig.V1.ProposalCost, conversionBase) if !okConvert || baseProposalCost.Cmp(zero) < 0 { return nil, vm.ErrInvalidBaseIssuingCost } @@ -84,6 +87,9 @@ func NewGovernanceContract(args ArgsNewGovernanceContract) (*governanceContract, if len(args.GovernanceSCAddress) < 1 { return nil, fmt.Errorf("%w for governance sc address", vm.ErrInvalidAddress) } + if len(args.ConfigChangeAddress) < 1 { + return nil, fmt.Errorf("%w for change config address", vm.ErrInvalidAddress) + } g := &governanceContract{ eei: args.Eei, @@ -97,6 +103,8 @@ func NewGovernanceContract(args ArgsNewGovernanceContract) (*governanceContract, hasher: args.Hasher, governanceConfig: args.GovernanceConfig, enableEpochsHandler: args.EnableEpochsHandler, + unBondPeriodInEpochs: args.UnBondPeriodInEpochs, + changeConfigAddress: args.ConfigChangeAddress, } return g, nil @@ -189,7 +197,7 @@ func (g *governanceContract) initV2(args *vmcommon.ContractCallInput) vmcommon.R // changeConfig allows the owner to change the configuration for requesting proposals func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if !bytes.Equal(g.ownerAddress, args.CallerAddr) { + if !bytes.Equal(g.changeConfigAddress, args.CallerAddr) { g.eei.AddReturnMessage("changeConfig can be called only by owner") return vmcommon.UserError } @@ -939,6 +947,9 @@ func (g *governanceContract) startEndNonceFromArguments(argStart []byte, argEnd if currentNonce > startVoteNonce.Uint64() || startVoteNonce.Uint64() > endVoteNonce.Uint64() { return 0, 0, vm.ErrInvalidStartEndVoteNonce } + if endVoteNonce.Uint64()-startVoteNonce.Uint64() >= uint64(g.unBondPeriodInEpochs) { + return 0, 0, vm.ErrInvalidStartEndVoteNonce + } return startVoteNonce.Uint64(), endVoteNonce.Uint64(), nil } diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 32a0734d50a..6f23b961337 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -37,7 +37,7 @@ func createArgsWithEEI(eei vm.SystemEI) ArgsNewGovernanceContract { MinPassThreshold: 1, MinQuorum: 2, MinVetoThreshold: 2, - ProposalCost: "100", + ProposalCost: "500", }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", @@ -45,12 +45,15 @@ func createArgsWithEEI(eei vm.SystemEI) ArgsNewGovernanceContract { MinPassThreshold: "50", MinVetoThreshold: "50", }, + ChangeConfigAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", }, Marshalizer: &mock.MarshalizerMock{}, Hasher: &hashingMocks.HasherMock{}, GovernanceSCAddress: vm.GovernanceSCAddress, DelegationMgrSCAddress: vm.DelegationManagerSCAddress, ValidatorSCAddress: vm.ValidatorSCAddress, + ConfigChangeAddress: bytes.Repeat([]byte{1}, 32), + UnBondPeriodInEpochs: 10, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{ IsGovernanceFlagEnabledField: true, }, @@ -173,7 +176,7 @@ func TestNewGovernanceContract_ZeroBaseProposerCostShouldErr(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() - args.GovernanceConfig.Active.ProposalCost = "" + args.GovernanceConfig.V1.ProposalCost = "" gsc, err := NewGovernanceContract(args) require.Nil(t, gsc) @@ -328,7 +331,7 @@ func TestGovernanceContract_ChangeConfig(t *testing.T) { } initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) _ = gsc.Execute(initInput) - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.Ok, retCode) @@ -372,7 +375,7 @@ func TestGovernanceContract_ChangeConfigWrongCallValue(t *testing.T) { initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) _ = gsc.Execute(initInput) - callInput := createVMInput(big.NewInt(10), "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + callInput := createVMInput(big.NewInt(10), "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, nil) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) @@ -395,7 +398,7 @@ func TestGovernanceContract_ChangeConfigWrongArgumentsLength(t *testing.T) { initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) _ = gsc.Execute(initInput) - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) + callInput := createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, nil) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) @@ -425,7 +428,7 @@ func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { []byte("10"), []byte("5"), } - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) @@ -438,7 +441,7 @@ func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { []byte("10"), []byte("5"), } - callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + callInput = createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, callInputArgs) retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) @@ -451,7 +454,7 @@ func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { []byte("invalid"), []byte("5"), } - callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + callInput = createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, callInputArgs) retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) @@ -464,7 +467,7 @@ func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { []byte("10"), []byte("invalid"), } - callInput = createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + callInput = createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, callInputArgs) retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) @@ -501,7 +504,7 @@ func TestGovernanceContract_ChangeConfigGetConfigErr(t *testing.T) { []byte("10"), []byte("5"), } - callInput := createVMInput(zero, "changeConfig", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) @@ -615,6 +618,7 @@ func TestGovernanceContract_ProposalOK(t *testing.T) { } callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) } From c73f00bddcdf6cb68ccf31987d831a1e84394de3 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 19 Jan 2023 19:40:56 +0200 Subject: [PATCH 136/335] adding min proposal fund --- cmd/node/config/systemSmartContractsConfig.toml | 3 ++- config/systemSmartContractsConfig.go | 1 + epochStart/metachain/systemSCs_test.go | 4 ++++ genesis/process/genesisBlockCreator_test.go | 4 ++++ .../multiShard/hardFork/hardFork_test.go | 4 ++++ integrationTests/testInitializer.go | 8 ++++++++ integrationTests/testProcessorNode.go | 5 +++++ integrationTests/vm/testInitializer.go | 1 + .../factory/metachain/vmContainerFactory_test.go | 10 +++++++++- testscommon/components/components.go | 1 + vm/errors.go | 3 +++ vm/factory/systemSCFactory_test.go | 1 + vm/systemSmartContracts/governance.go | 14 ++++++++++++++ vm/systemSmartContracts/governance.pb.go | 3 ++- vm/systemSmartContracts/governance_test.go | 1 + 15 files changed, 60 insertions(+), 3 deletions(-) diff --git a/cmd/node/config/systemSmartContractsConfig.toml b/cmd/node/config/systemSmartContractsConfig.toml index 62cdc137d80..8e0df5ca2b1 100644 --- a/cmd/node/config/systemSmartContractsConfig.toml +++ b/cmd/node/config/systemSmartContractsConfig.toml @@ -25,7 +25,8 @@ MinPassThreshold = 300 MinVetoThreshold = 50 [GovernanceSystemSCConfig.Active] - ProposalCost = "5000000000000000000" #5 eGLD + ProposalCost = "1000000000000000000000" #1000 eGLD + MinProposalFund = "10000000000000000000" #10 eGLD MinQuorum = "500000000000" # MinQuorum is equal to 10*sqrt(NodePrice) MinPassThreshold = "251000000000" MinVetoThreshold = "249000000000" diff --git a/config/systemSmartContractsConfig.go b/config/systemSmartContractsConfig.go index d42e25421ab..51402cf364b 100644 --- a/config/systemSmartContractsConfig.go +++ b/config/systemSmartContractsConfig.go @@ -45,6 +45,7 @@ type GovernanceSystemSCConfigV1 struct { // system smart contract once it activates type GovernanceSystemSCConfigActive struct { ProposalCost string + MinProposalFund string MinQuorum string MinPassThreshold string MinVetoThreshold string diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index e55246f26c7..d459713df32 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -988,8 +988,12 @@ func createFullArgumentsForSystemSCProcessing(enableEpochsConfig config.EnableEp OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index 97a075ccd5e..6bd0ca59aa7 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -91,8 +91,12 @@ func createMockArgument( OwnerAddress: "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index f0323074ec5..d6b68a3a9c2 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -435,8 +435,12 @@ func hardForkImport( OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 5fd72424eaa..9a9c4427cf3 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -664,8 +664,12 @@ func CreateFullGenesisBlocks( }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ ChangeConfigAddress: DelegationManagerConfigChangeAddress, + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", @@ -768,8 +772,12 @@ func CreateGenesisMetaBlock( OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 527d0cda7c8..c3b28de8151 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -800,6 +800,7 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", @@ -1673,8 +1674,12 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 0bc55d0f311..b5bab83f819 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -678,6 +678,7 @@ func createSystemSCConfig() *config.SystemSmartContractsConfig { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index 40eb04fabbb..090e01428a5 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -39,8 +39,12 @@ func createVmContainerMockArgument(gasSchedule core.GasScheduleNotifier) ArgsNew OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", @@ -299,13 +303,17 @@ func TestVmContainerFactory_Create(t *testing.T) { OwnerAddress: "aaaaaa", }, GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", }, - ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", + ChangeConfigAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 1f94edcb53e..44af5b1afa4 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -535,6 +535,7 @@ func GetProcessArgs( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/vm/errors.go b/vm/errors.go index 5aa0dcb5f39..6e155b60ca3 100644 --- a/vm/errors.go +++ b/vm/errors.go @@ -252,3 +252,6 @@ var ErrNotEnoughStakeToVote = errors.New("not enough stake/delegate to vote") // ErrNotEnoughVotingPower signals that there is not enough voting power to cast the vote var ErrNotEnoughVotingPower = errors.New("not enough voting power to cast this vote") + +// ErrProposalWasNotFunded signals that proposal was not funded +var ErrProposalWasNotFunded = errors.New("proposal was not funded") diff --git a/vm/factory/systemSCFactory_test.go b/vm/factory/systemSCFactory_test.go index e24dfa9ad4c..b2e7d0bce58 100644 --- a/vm/factory/systemSCFactory_test.go +++ b/vm/factory/systemSCFactory_test.go @@ -45,6 +45,7 @@ func createMockNewSystemScFactoryArgs() ArgsNewSystemSCFactory { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index b1f2beb317f..7a6f41979aa 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -904,6 +904,15 @@ func (g *governanceContract) getValidProposal(nonce *big.Int) (*GeneralProposal, return nil, vm.ErrVotedForAnExpiredProposal } + generalConfig, err := g.getConfig() + if err != nil { + return nil, err + } + + if proposal.ProposalCost.Cmp(generalConfig.ProposalFee) < 0 { + return nil, vm.ErrProposalWasNotFunded + } + return proposal, nil } @@ -985,12 +994,17 @@ func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCCon if !success { return nil, vm.ErrIncorrectConfig } + minProposalFund, success := big.NewInt(0).SetString(config.Active.MinProposalFund, conversionBase) + if !success { + return nil, vm.ErrIncorrectConfig + } return &GovernanceConfigV2{ MinQuorum: minQuorum, MinPassThreshold: minPass, MinVetoThreshold: minVeto, ProposalFee: proposalFee, + MinProposalFund: minProposalFund, }, nil } diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 820346488ba..37c145fd5ca 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -259,7 +259,8 @@ type GovernanceConfigV2 struct { MinPassThreshold *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` MinVetoThreshold *math_big.Int `protobuf:"bytes,3,opt,name=MinVetoThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinVetoThreshold"` ProposalFee *math_big.Int `protobuf:"bytes,4,opt,name=ProposalFee,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalFee"` - LastProposalNonce uint64 `protobuf:"varint,5,opt,name=LastProposalNonce,proto3" json:"LastProposalNonce"` + MinProposalFund *math_big.Int + LastProposalNonce uint64 `protobuf:"varint,5,opt,name=LastProposalNonce,proto3" json:"LastProposalNonce"` } func (m *GovernanceConfigV2) Reset() { *m = GovernanceConfigV2{} } diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 6f23b961337..dc00202c757 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -41,6 +41,7 @@ func createArgsWithEEI(eei vm.SystemEI) ArgsNewGovernanceContract { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", + MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", From 2a4e4cbc4bd1d2066bf3998a8b6480eb758dbfe9 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 19 Jan 2023 19:52:31 +0200 Subject: [PATCH 137/335] remove min proposal fund - fixes. --- cmd/node/config/systemSmartContractsConfig.toml | 1 - config/systemSmartContractsConfig.go | 1 - epochStart/metachain/systemSCs_test.go | 1 - genesis/process/genesisBlockCreator_test.go | 1 - .../multiShard/hardFork/hardFork_test.go | 1 - integrationTests/testInitializer.go | 2 -- integrationTests/testProcessorNode.go | 2 -- integrationTests/vm/testInitializer.go | 1 - .../factory/metachain/vmContainerFactory_test.go | 2 -- testscommon/components/components.go | 1 - vm/factory/systemSCFactory_test.go | 1 - vm/systemSmartContracts/governance.go | 14 -------------- vm/systemSmartContracts/governance.pb.go | 3 +-- vm/systemSmartContracts/governance_test.go | 12 +++++++----- 14 files changed, 8 insertions(+), 35 deletions(-) diff --git a/cmd/node/config/systemSmartContractsConfig.toml b/cmd/node/config/systemSmartContractsConfig.toml index 8e0df5ca2b1..89124da8893 100644 --- a/cmd/node/config/systemSmartContractsConfig.toml +++ b/cmd/node/config/systemSmartContractsConfig.toml @@ -26,7 +26,6 @@ MinVetoThreshold = 50 [GovernanceSystemSCConfig.Active] ProposalCost = "1000000000000000000000" #1000 eGLD - MinProposalFund = "10000000000000000000" #10 eGLD MinQuorum = "500000000000" # MinQuorum is equal to 10*sqrt(NodePrice) MinPassThreshold = "251000000000" MinVetoThreshold = "249000000000" diff --git a/config/systemSmartContractsConfig.go b/config/systemSmartContractsConfig.go index 51402cf364b..d42e25421ab 100644 --- a/config/systemSmartContractsConfig.go +++ b/config/systemSmartContractsConfig.go @@ -45,7 +45,6 @@ type GovernanceSystemSCConfigV1 struct { // system smart contract once it activates type GovernanceSystemSCConfigActive struct { ProposalCost string - MinProposalFund string MinQuorum string MinPassThreshold string MinVetoThreshold string diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index d459713df32..8a178d6124f 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -993,7 +993,6 @@ func createFullArgumentsForSystemSCProcessing(enableEpochsConfig config.EnableEp }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index 6bd0ca59aa7..4a40fd59f37 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -96,7 +96,6 @@ func createMockArgument( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index d6b68a3a9c2..91338fc293c 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -440,7 +440,6 @@ func hardForkImport( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 9a9c4427cf3..201e96e6f7c 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -669,7 +669,6 @@ func CreateFullGenesisBlocks( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", @@ -777,7 +776,6 @@ func CreateGenesisMetaBlock( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index c3b28de8151..b7d9ced0e82 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -800,7 +800,6 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", @@ -1679,7 +1678,6 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index b5bab83f819..0bc55d0f311 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -678,7 +678,6 @@ func createSystemSCConfig() *config.SystemSmartContractsConfig { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index 090e01428a5..63b1d9b03b8 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -44,7 +44,6 @@ func createVmContainerMockArgument(gasSchedule core.GasScheduleNotifier) ArgsNew }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", @@ -308,7 +307,6 @@ func TestVmContainerFactory_Create(t *testing.T) { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 44af5b1afa4..1f94edcb53e 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -535,7 +535,6 @@ func GetProcessArgs( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/vm/factory/systemSCFactory_test.go b/vm/factory/systemSCFactory_test.go index b2e7d0bce58..e24dfa9ad4c 100644 --- a/vm/factory/systemSCFactory_test.go +++ b/vm/factory/systemSCFactory_test.go @@ -45,7 +45,6 @@ func createMockNewSystemScFactoryArgs() ArgsNewSystemSCFactory { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 7a6f41979aa..b1f2beb317f 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -904,15 +904,6 @@ func (g *governanceContract) getValidProposal(nonce *big.Int) (*GeneralProposal, return nil, vm.ErrVotedForAnExpiredProposal } - generalConfig, err := g.getConfig() - if err != nil { - return nil, err - } - - if proposal.ProposalCost.Cmp(generalConfig.ProposalFee) < 0 { - return nil, vm.ErrProposalWasNotFunded - } - return proposal, nil } @@ -994,17 +985,12 @@ func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCCon if !success { return nil, vm.ErrIncorrectConfig } - minProposalFund, success := big.NewInt(0).SetString(config.Active.MinProposalFund, conversionBase) - if !success { - return nil, vm.ErrIncorrectConfig - } return &GovernanceConfigV2{ MinQuorum: minQuorum, MinPassThreshold: minPass, MinVetoThreshold: minVeto, ProposalFee: proposalFee, - MinProposalFund: minProposalFund, }, nil } diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 37c145fd5ca..820346488ba 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -259,8 +259,7 @@ type GovernanceConfigV2 struct { MinPassThreshold *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` MinVetoThreshold *math_big.Int `protobuf:"bytes,3,opt,name=MinVetoThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinVetoThreshold"` ProposalFee *math_big.Int `protobuf:"bytes,4,opt,name=ProposalFee,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalFee"` - MinProposalFund *math_big.Int - LastProposalNonce uint64 `protobuf:"varint,5,opt,name=LastProposalNonce,proto3" json:"LastProposalNonce"` + LastProposalNonce uint64 `protobuf:"varint,5,opt,name=LastProposalNonce,proto3" json:"LastProposalNonce"` } func (m *GovernanceConfigV2) Reset() { *m = GovernanceConfigV2{} } diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index dc00202c757..5fc1a42910b 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -41,7 +41,6 @@ func createArgsWithEEI(eei vm.SystemEI) ArgsNewGovernanceContract { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinProposalFund: "50", MinQuorum: "50", MinPassThreshold: "50", MinVetoThreshold: "50", @@ -726,9 +725,15 @@ func TestGovernanceContract_VoteInvalidVote(t *testing.T) { func TestGovernanceContract_VoteTwice(t *testing.T) { t.Parallel() + gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() + blockchainHook.CurrentNonceCalled = func() uint64 { + return 12 + } + callerAddress := bytes.Repeat([]byte{2}, 32) proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ + ProposalCost: gsc.baseProposalCost, CommitHash: proposalIdentifier, StartVoteNonce: 10, EndVoteNonce: 15, @@ -742,10 +747,6 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { []byte("1"), []byte("yes"), } - gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() - blockchainHook.CurrentNonceCalled = func() uint64 { - return 12 - } nonce, _ := nonceFromBytes(voteArgs[0]) gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) @@ -819,6 +820,7 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { callerAddress := bytes.Repeat([]byte{2}, 32) proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ + ProposalCost: gsc.baseProposalCost, CommitHash: proposalIdentifier, StartVoteNonce: 10, EndVoteNonce: 15, From 0f5d8ab68539ada4eac1b171d1fa77a01218f43a Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 20 Jan 2023 09:12:59 +0200 Subject: [PATCH 138/335] test fixes --- process/factory/metachain/vmContainerFactory_test.go | 2 +- vm/factory/systemSCFactory.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index 63b1d9b03b8..ab10b9fda23 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -311,7 +311,7 @@ func TestVmContainerFactory_Create(t *testing.T) { MinPassThreshold: "50", MinVetoThreshold: "50", }, - ChangeConfigAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", + ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "1000", diff --git a/vm/factory/systemSCFactory.go b/vm/factory/systemSCFactory.go index dc193505e21..d5272aed81a 100644 --- a/vm/factory/systemSCFactory.go +++ b/vm/factory/systemSCFactory.go @@ -221,7 +221,7 @@ func (scf *systemSCFactory) createESDTContract() (vm.SystemSmartContract, error) func (scf *systemSCFactory) createGovernanceContract() (vm.SystemSmartContract, error) { configChangeAddress, err := scf.addressPubKeyConverter.Decode(scf.systemSCConfig.GovernanceSystemSCConfig.ChangeConfigAddress) if err != nil { - return nil, fmt.Errorf("%w for DelegationManagerSystemSCConfig.ConfigChangeAddress in systemSCFactory", vm.ErrInvalidAddress) + return nil, fmt.Errorf("%w for GovernanceSystemSCConfig.ChangeConfigAddress in systemSCFactory", vm.ErrInvalidAddress) } argsGovernance := systemSmartContracts.ArgsNewGovernanceContract{ From 7eefdc48ad9b772ca463df8a8cc9c40cc13b9b3b Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 20 Jan 2023 11:01:03 +0200 Subject: [PATCH 139/335] delete state lock fix --- vm/systemSmartContracts/delegation.go | 5 --- vm/systemSmartContracts/delegation_test.go | 35 ------------------ vm/systemSmartContracts/governance.go | 28 --------------- vm/systemSmartContracts/validator.go | 9 ----- vm/systemSmartContracts/validator_test.go | 42 ---------------------- 5 files changed, 119 deletions(-) diff --git a/vm/systemSmartContracts/delegation.go b/vm/systemSmartContracts/delegation.go index 3df76f9f28c..bf99fb85841 100644 --- a/vm/systemSmartContracts/delegation.go +++ b/vm/systemSmartContracts/delegation.go @@ -1685,11 +1685,6 @@ func (d *delegation) unDelegate(args *vmcommon.ContractCallInput) vmcommon.Retur return vmcommon.UserError } - if isStakeLocked(d.eei, d.governanceSCAddr, args.CallerAddr) { - d.eei.AddReturnMessage("stake is locked for voting") - return vmcommon.UserError - } - delegationManagement, err := getDelegationManagement(d.eei, d.marshalizer, d.delegationMgrSCAddress) if err != nil { d.eei.AddReturnMessage("error getting minimum delegation amount " + err.Error()) diff --git a/vm/systemSmartContracts/delegation_test.go b/vm/systemSmartContracts/delegation_test.go index 29821fcf027..acf9254a74f 100644 --- a/vm/systemSmartContracts/delegation_test.go +++ b/vm/systemSmartContracts/delegation_test.go @@ -1723,41 +1723,6 @@ func TestDelegationSystemSC_ExecuteUnDelegatePartOfFunds(t *testing.T) { assert.Equal(t, eei.output[3], []byte{50}) } -func TestDelegationSystemSC_ExecuteUnDelegateFailsAsLockedForVoting(t *testing.T) { - t.Parallel() - - fundKey := append([]byte(fundKeyPrefix), []byte{1}...) - args := createMockArgumentsForDelegation() - eei := createDefaultEei() - args.Eei = eei - addValidatorAndStakingScToVmContext(eei) - createDelegationManagerConfig(eei, args.Marshalizer, big.NewInt(10)) - - vmInput := getDefaultVmInputForFunc("unDelegate", [][]byte{{100}}) - d, _ := NewDelegationSystemSC(args) - - _ = d.saveDelegatorData(vmInput.CallerAddr, &DelegatorData{ - ActiveFund: fundKey, - UnStakedFunds: [][]byte{}, - UnClaimedRewards: big.NewInt(0), - TotalCumulatedRewards: big.NewInt(0), - }) - _ = d.saveFund(fundKey, &Fund{ - Value: big.NewInt(100), - }) - _ = d.saveGlobalFundData(&GlobalFundData{ - TotalActive: big.NewInt(100), - TotalUnStaked: big.NewInt(0), - }) - d.eei.SetStorage([]byte(lastFundKey), fundKey) - stakeLockKey := append([]byte(stakeLockPrefix), vmInput.CallerAddr...) - eei.SetStorageForAddress(d.governanceSCAddr, stakeLockKey, big.NewInt(0).SetUint64(10000).Bytes()) - - output := d.Execute(vmInput) - assert.Equal(t, vmcommon.UserError, output) - assert.Equal(t, eei.returnMessage, "stake is locked for voting") -} - func TestDelegationSystemSC_ExecuteUnDelegateAllFunds(t *testing.T) { t.Parallel() diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index b1f2beb317f..6fb175809be 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -19,7 +19,6 @@ import ( const governanceConfigKey = "governanceConfig" const proposalPrefix = "p_" -const stakeLockPrefix = "s_" const yesString = "yes" const noString = "no" const vetoString = "veto" @@ -469,7 +468,6 @@ func (g *governanceContract) addUserVote( return err } - g.lockStake(address, proposal.EndVoteNonce) return g.saveGeneralProposal(proposal.CommitHash, proposal) } @@ -505,31 +503,6 @@ func addNewNonce(nonceList []uint64, newNonce uint64) ([]uint64, error) { return nonceList, nil } -//TODO: I would delete lockStake - if we put a voting period less than 10 epochs, we do not need this. -func (g *governanceContract) lockStake(address []byte, endNonce uint64) { - stakeLockKey := append([]byte(stakeLockPrefix), address...) - lastData := g.eei.GetStorage(stakeLockKey) - lastEndNonce := uint64(0) - if len(lastData) > 0 { - lastEndNonce = big.NewInt(0).SetBytes(lastData).Uint64() - } - - if lastEndNonce < endNonce { - g.eei.SetStorage(stakeLockKey, big.NewInt(0).SetUint64(endNonce).Bytes()) - } -} - -func isStakeLocked(eei vm.SystemEI, governanceAddress []byte, address []byte) bool { - stakeLockKey := append([]byte(stakeLockPrefix), address...) - lastData := eei.GetStorageFromAddress(governanceAddress, stakeLockKey) - if len(lastData) == 0 { - return false - } - - lastEndNonce := big.NewInt(0).SetBytes(lastData).Uint64() - return eei.BlockChainHook().CurrentNonce() < lastEndNonce -} - func (g *governanceContract) getMinValueToVote() (*big.Int, error) { delegationManagement, err := getDelegationManagement(g.eei, g.marshalizer, g.delegationMgrSCAddress) if err != nil { @@ -656,7 +629,6 @@ func (g *governanceContract) computeVotingPower(value *big.Int) (*big.Int, error return nil, vm.ErrNotEnoughStakeToVote } - //TODO: decide whether quadratic or not return big.NewInt(0).Sqrt(value), nil } diff --git a/vm/systemSmartContracts/validator.go b/vm/systemSmartContracts/validator.go index 5f73941ae28..e25f3035fcc 100644 --- a/vm/systemSmartContracts/validator.go +++ b/vm/systemSmartContracts/validator.go @@ -1222,11 +1222,6 @@ func (v *validatorSC) unStake(args *vmcommon.ContractCallInput) vmcommon.ReturnC return vmcommon.UserError } - if isStakeLocked(v.eei, v.governanceSCAddress, args.CallerAddr) { - v.eei.AddReturnMessage("stake is locked for voting") - return vmcommon.UserError - } - // continue by unstaking tokens as well validatorConfig := v.getConfig(v.eei.BlockChainHook().CurrentEpoch()) returnCode = v.processUnStakeTokensFromNodes(registrationData, validatorConfig, numSuccessFromWaiting, 0) @@ -1541,10 +1536,6 @@ func (v *validatorSC) unStakeTokens(args *vmcommon.ContractCallInput) vmcommon.R v.eei.AddReturnMessage("should have specified one argument containing the unstake value") return vmcommon.UserError } - if isStakeLocked(v.eei, v.governanceSCAddress, args.CallerAddr) { - v.eei.AddReturnMessage("stake is locked for voting") - return vmcommon.UserError - } unStakeValue := big.NewInt(0).SetBytes(args.Arguments[0]) unStakedEpoch := v.eei.BlockChainHook().CurrentEpoch() diff --git a/vm/systemSmartContracts/validator_test.go b/vm/systemSmartContracts/validator_test.go index 328414510c6..4c71b72753b 100644 --- a/vm/systemSmartContracts/validator_test.go +++ b/vm/systemSmartContracts/validator_test.go @@ -3416,48 +3416,6 @@ func TestStakingValidatorSC_UnstakeAllTokensWithActiveNodesShouldError(t *testin assert.True(t, strings.Contains(vmOutput.ReturnMessage, "cannot unStake tokens, the validator would remain without min deposit, nodes are still active")) } -func TestStakingValidatorSC_UnstakeTokensWithLockedFundsShouldError(t *testing.T) { - t.Parallel() - - minStakeValue := big.NewInt(1000) - unbondPeriod := uint64(10) - startEpoch := uint32(56) - epoch := startEpoch - blockChainHook := &mock.BlockChainHookStub{ - CurrentEpochCalled: func() uint32 { - epoch++ - return epoch - }, - } - args := createMockArgumentsForValidatorSC() - enableEpochsHandler, _ := args.EnableEpochsHandler.(*testscommon.EnableEpochsHandlerStub) - enableEpochsHandler.IsStakingV2FlagEnabledField = true - eei := createVmContextWithStakingSc(minStakeValue, unbondPeriod, blockChainHook) - args.Eei = eei - caller := []byte("caller") - sc, _ := NewValidatorSmartContract(args) - _ = sc.saveRegistrationData( - caller, - &ValidatorDataV2{ - RegisterNonce: 0, - Epoch: 0, - RewardAddress: caller, - TotalStakeValue: big.NewInt(1010), - LockedStake: big.NewInt(1000), - MaxStakePerNode: big.NewInt(0), - BlsPubKeys: [][]byte{[]byte("key")}, - NumRegistered: 1, - UnstakedInfo: nil, - TotalUnstaked: nil, - }, - ) - - stakeLockKey := append([]byte(stakeLockPrefix), caller...) - eei.SetStorageForAddress(sc.governanceSCAddress, stakeLockKey, big.NewInt(0).SetUint64(10000).Bytes()) - callFunctionAndCheckResult(t, "unStakeTokens", sc, caller, [][]byte{big.NewInt(1).Bytes()}, zero, vmcommon.UserError) - assert.Equal(t, eei.returnMessage, "stake is locked for voting") -} - func TestStakingValidatorSC_UnstakeTokensShouldWork(t *testing.T) { t.Parallel() From 88b484f7a80d5a4b1f36b1e806fe64389c7f3288 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 20 Jan 2023 11:57:32 +0200 Subject: [PATCH 140/335] updated to percentage - one thing remained - compute close proposal results with percentages --- .../config/systemSmartContractsConfig.toml | 6 +- config/systemSmartContractsConfig.go | 6 +- epochStart/metachain/systemSCs_test.go | 6 +- genesis/process/genesisBlockCreator_test.go | 6 +- .../multiShard/hardFork/hardFork_test.go | 6 +- integrationTests/testInitializer.go | 12 +-- integrationTests/testProcessorNode.go | 12 +-- integrationTests/vm/testInitializer.go | 6 +- .../metachain/vmContainerFactory_test.go | 12 +-- testscommon/components/components.go | 6 +- vm/factory/systemSCFactory_test.go | 6 +- vm/systemSmartContracts/governance.go | 91 ++++++++++++------- vm/systemSmartContracts/governance.pb.go | 30 ++---- vm/systemSmartContracts/governance.proto | 17 ++-- vm/systemSmartContracts/governance_test.go | 20 ++-- 15 files changed, 128 insertions(+), 114 deletions(-) diff --git a/cmd/node/config/systemSmartContractsConfig.toml b/cmd/node/config/systemSmartContractsConfig.toml index 89124da8893..256dc292171 100644 --- a/cmd/node/config/systemSmartContractsConfig.toml +++ b/cmd/node/config/systemSmartContractsConfig.toml @@ -26,9 +26,9 @@ MinVetoThreshold = 50 [GovernanceSystemSCConfig.Active] ProposalCost = "1000000000000000000000" #1000 eGLD - MinQuorum = "500000000000" # MinQuorum is equal to 10*sqrt(NodePrice) - MinPassThreshold = "251000000000" - MinVetoThreshold = "249000000000" + MinQuorum = 0.5 #fraction of value 0.5 - 50% + MinPassThreshold = 0.5 #fraction of value 0.5 - 50% + MinVetoThreshold = 0.33 #fraction of value 0.33 - 33% [DelegationManagerSystemSCConfig] MinCreationDeposit = "1250000000000000000000" #1.25K eGLD diff --git a/config/systemSmartContractsConfig.go b/config/systemSmartContractsConfig.go index d42e25421ab..895aea97c8b 100644 --- a/config/systemSmartContractsConfig.go +++ b/config/systemSmartContractsConfig.go @@ -45,9 +45,9 @@ type GovernanceSystemSCConfigV1 struct { // system smart contract once it activates type GovernanceSystemSCConfigActive struct { ProposalCost string - MinQuorum string - MinPassThreshold string - MinVetoThreshold string + MinQuorum float64 + MinPassThreshold float64 + MinVetoThreshold float64 } // GovernanceSystemSCConfig defines the set of constants to initialize the governance system smart contract diff --git a/epochStart/metachain/systemSCs_test.go b/epochStart/metachain/systemSCs_test.go index 8a178d6124f..69eb13ce149 100644 --- a/epochStart/metachain/systemSCs_test.go +++ b/epochStart/metachain/systemSCs_test.go @@ -993,9 +993,9 @@ func createFullArgumentsForSystemSCProcessing(enableEpochsConfig config.EnableEp }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index 4a40fd59f37..e17108aa214 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -96,9 +96,9 @@ func createMockArgument( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, diff --git a/integrationTests/multiShard/hardFork/hardFork_test.go b/integrationTests/multiShard/hardFork/hardFork_test.go index 91338fc293c..929d6afc1b9 100644 --- a/integrationTests/multiShard/hardFork/hardFork_test.go +++ b/integrationTests/multiShard/hardFork/hardFork_test.go @@ -440,9 +440,9 @@ func hardForkImport( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: integrationTests.DelegationManagerConfigChangeAddress, }, diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index 201e96e6f7c..065e563d9c1 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -669,9 +669,9 @@ func CreateFullGenesisBlocks( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, }, StakingSystemSCConfig: config.StakingSystemSCConfig{ @@ -776,9 +776,9 @@ func CreateGenesisMetaBlock( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: DelegationManagerConfigChangeAddress, }, diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index b7d9ced0e82..01792c3dd54 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -800,9 +800,9 @@ func (tpn *TestProcessorNode) createFullSCQueryService(gasMap map[string]map[str }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: DelegationManagerConfigChangeAddress, }, @@ -1678,9 +1678,9 @@ func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[stri }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: DelegationManagerConfigChangeAddress, }, diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 0bc55d0f311..51f774156e2 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -678,9 +678,9 @@ func createSystemSCConfig() *config.SystemSmartContractsConfig { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index ab10b9fda23..a821ff1b1f7 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -44,9 +44,9 @@ func createVmContainerMockArgument(gasSchedule core.GasScheduleNotifier) ArgsNew }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, }, StakingSystemSCConfig: config.StakingSystemSCConfig{ @@ -307,9 +307,9 @@ func TestVmContainerFactory_Create(t *testing.T) { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 1f94edcb53e..471a8f4285d 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -535,9 +535,9 @@ func GetProcessArgs( }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", }, diff --git a/vm/factory/systemSCFactory_test.go b/vm/factory/systemSCFactory_test.go index e24dfa9ad4c..d2aed224c0c 100644 --- a/vm/factory/systemSCFactory_test.go +++ b/vm/factory/systemSCFactory_test.go @@ -45,9 +45,9 @@ func createMockNewSystemScFactoryArgs() ArgsNewSystemSCFactory { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: "3132333435363738393031323334353637383930313233343536373839303234", }, diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 6fb175809be..5de38bddf1d 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -305,6 +305,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon No: big.NewInt(0), Veto: big.NewInt(0), Abstain: big.NewInt(0), + QuorumStake: big.NewInt(0), Passed: false, ProposalCost: generalConfig.ProposalFee, Nonce: nextNonce, @@ -344,7 +345,7 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret voterAddress := args.CallerAddr proposalToVote := args.Arguments[0] - totalVotingPower, err := g.computeVotingPowerFromTotalStake(voterAddress) + totalStake, totalVotingPower, err := g.computeTotalStakeAndVotingPower(voterAddress) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -355,6 +356,7 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret proposalToVote, string(args.Arguments[1]), totalVotingPower, + totalStake, true) if err != nil { g.eei.AddReturnMessage(err.Error()) @@ -394,7 +396,15 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco } proposalToVote := args.Arguments[0] - votePower, err := g.updateDelegatedContractInfo(args.CallerAddr, proposalToVote, args.Arguments[3]) + userStake := big.NewInt(0).SetBytes(args.Arguments[3]) + + scDelegatedVoteInfo, votePower, err := g.computeDelegatedVotePower(args.CallerAddr, proposalToVote, userStake) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + err = g.updateDelegatedContractInfo(args.CallerAddr, proposalToVote, scDelegatedVoteInfo, userStake, votePower) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -405,6 +415,7 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco proposalToVote, string(args.Arguments[1]), votePower, + userStake, false) if err != nil { g.eei.AddReturnMessage(err.Error()) @@ -414,26 +425,40 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco return vmcommon.Ok } -func (g *governanceContract) updateDelegatedContractInfo(scAddress []byte, reference []byte, balance []byte) (*big.Int, error) { +func (g *governanceContract) computeDelegatedVotePower( + scAddress []byte, + reference []byte, + balance *big.Int, +) (*DelegatedSCVoteInfo, *big.Int, error) { scVoteInfo, err := g.getDelegatedContractInfo(scAddress, reference) if err != nil { - return nil, err - } - votePower, err := g.computeVotingPower(big.NewInt(0).SetBytes(balance)) - if err != nil { - return nil, err + return nil, nil, err } + totalPower := big.NewInt(0).Set(scVoteInfo.TotalPower) + votePower := big.NewInt(0).Mul(totalPower, balance) + votePower.Div(votePower, scVoteInfo.TotalStake) + return scVoteInfo, votePower, nil +} + +func (g *governanceContract) updateDelegatedContractInfo( + scAddress []byte, + reference []byte, + scVoteInfo *DelegatedSCVoteInfo, + balance *big.Int, + votePower *big.Int, +) error { scVoteInfo.UsedPower.Add(scVoteInfo.UsedPower, votePower) if scVoteInfo.TotalPower.Cmp(scVoteInfo.UsedPower) < 0 { - return nil, vm.ErrNotEnoughVotingPower + return vm.ErrNotEnoughVotingPower } - err = g.saveDelegatedContractInfo(scAddress, scVoteInfo, reference) - if err != nil { - return nil, err + + scVoteInfo.UsedStake.Add(scVoteInfo.UsedStake, balance) + if scVoteInfo.TotalStake.Cmp(scVoteInfo.TotalStake) < 0 { + return vm.ErrNotEnoughVotingPower } - return votePower, nil + return g.saveDelegatedContractInfo(scAddress, scVoteInfo, reference) } func (g *governanceContract) addUserVote( @@ -441,6 +466,7 @@ func (g *governanceContract) addUserVote( nonceAsBytes []byte, vote string, totalVotingPower *big.Int, + totalStake *big.Int, direct bool, ) error { nonce, err := nonceFromBytes(nonceAsBytes) @@ -468,6 +494,7 @@ func (g *governanceContract) addUserVote( return err } + proposal.QuorumStake.Add(proposal.QuorumStake, totalStake) return g.saveGeneralProposal(proposal.CommitHash, proposal) } @@ -588,7 +615,7 @@ func (g *governanceContract) getVotingPower(args *vmcommon.ContractCallInput) vm return vmcommon.UserError } - votingPower, err := g.computeVotingPowerFromTotalStake(validatorAddress) + _, votingPower, err := g.computeTotalStakeAndVotingPower(validatorAddress) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -649,27 +676,27 @@ func (g *governanceContract) castVoteType(vote string) (VoteValueType, error) { } // function iterates over all delegation contracts and verifies balances of the given account and makes a sum of it -func (g *governanceContract) computeVotingPowerFromTotalStake(address []byte) (*big.Int, error) { +func (g *governanceContract) computeTotalStakeAndVotingPower(address []byte) (*big.Int, *big.Int, error) { totalStake, err := g.getTotalStake(address) if err != nil { - return nil, err + return nil, nil, err } dContractList, err := getDelegationContractList(g.eei, g.marshalizer, g.delegationMgrSCAddress) if err != nil { - return nil, err + return nil, nil, err } err = g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Get * uint64(len(dContractList.Addresses))) if err != nil { - return nil, err + return nil, nil, err } var activeDelegated *big.Int for _, contract := range dContractList.Addresses { activeDelegated, err = g.getActiveFundForDelegator(contract, address) if err != nil { - return nil, err + return nil, nil, err } totalStake.Add(totalStake, activeDelegated) @@ -677,10 +704,10 @@ func (g *governanceContract) computeVotingPowerFromTotalStake(address []byte) (* votingPower, err := g.computeVotingPower(totalStake) if err != nil { - return nil, err + return nil, nil, err } - return votingPower, nil + return totalStake, votingPower, nil } // computeEndResults computes if a proposal has passed or not based on votes accumulated @@ -690,6 +717,8 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error return err } + // core.GetIntTrimmedPercentageOfValue(totalRewards, e.rewardsHandler.ProtocolSustainabilityPercentage()) + totalVotes := big.NewInt(0).Add(proposal.Yes, proposal.No) totalVotes.Add(totalVotes, proposal.Veto) @@ -785,6 +814,8 @@ func (g *governanceContract) getDelegatedContractInfo(scAddress []byte, referenc scVoteInfo := &DelegatedSCVoteInfo{ TotalPower: big.NewInt(0), UsedPower: big.NewInt(0), + TotalStake: big.NewInt(0), + UsedStake: big.NewInt(0), } marshalledData := g.eei.GetStorage(append(scAddress, reference...)) @@ -797,11 +828,12 @@ func (g *governanceContract) getDelegatedContractInfo(scAddress []byte, referenc return scVoteInfo, nil } - totalVotingPower, err := g.computeVotingPowerFromTotalStake(scAddress) + totalStake, totalVotingPower, err := g.computeTotalStakeAndVotingPower(scAddress) if err != nil { return nil, err } scVoteInfo.TotalPower.Set(totalVotingPower) + scVoteInfo.TotalStake.Set(totalStake) return scVoteInfo, nil } @@ -941,16 +973,13 @@ func nonceFromBytes(nonce []byte) (*big.Int, error) { // convertV2Config converts the passed config file to the correct V2 typed GovernanceConfig func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCConfig) (*GovernanceConfigV2, error) { - minQuorum, success := big.NewInt(0).SetString(config.Active.MinQuorum, conversionBase) - if !success { + if config.Active.MinQuorum <= 0.01 { return nil, vm.ErrIncorrectConfig } - minPass, success := big.NewInt(0).SetString(config.Active.MinPassThreshold, conversionBase) - if !success { + if config.Active.MinPassThreshold <= 0.01 { return nil, vm.ErrIncorrectConfig } - minVeto, success := big.NewInt(0).SetString(config.Active.MinVetoThreshold, conversionBase) - if !success { + if config.Active.MinVetoThreshold <= 0.01 { return nil, vm.ErrIncorrectConfig } proposalFee, success := big.NewInt(0).SetString(config.Active.ProposalCost, conversionBase) @@ -959,9 +988,9 @@ func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCCon } return &GovernanceConfigV2{ - MinQuorum: minQuorum, - MinPassThreshold: minPass, - MinVetoThreshold: minVeto, + MinQuorum: config.Active.MinQuorum, + MinPassThreshold: config.Active.MinPassThreshold, + MinVetoThreshold: config.Active.MinVetoThreshold, ProposalFee: proposalFee, }, nil } diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 820346488ba..33d8d62acd6 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -65,6 +65,7 @@ type GeneralProposal struct { No *math_big.Int `protobuf:"bytes,6,opt,name=No,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"No"` Veto *math_big.Int `protobuf:"bytes,7,opt,name=Veto,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Veto"` Abstain *math_big.Int `protobuf:"bytes,8,opt,name=Abstain,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Abstain"` + QuorumStake *math_big.Int Passed bool `protobuf:"varint,9,opt,name=Passed,proto3" json:"Passed"` Closed bool `protobuf:"varint,10,opt,name=Closed,proto3" json:"Closed"` IssuerAddress []byte `protobuf:"bytes,11,opt,name=IssuerAddress,proto3" json:"IssuerAddress"` @@ -255,9 +256,9 @@ func (m *GovernanceConfig) GetProposalFee() *math_big.Int { } type GovernanceConfigV2 struct { - MinQuorum *math_big.Int `protobuf:"bytes,1,opt,name=MinQuorum,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinQuorum"` - MinPassThreshold *math_big.Int `protobuf:"bytes,2,opt,name=MinPassThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinPassThreshold"` - MinVetoThreshold *math_big.Int `protobuf:"bytes,3,opt,name=MinVetoThreshold,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"MinVetoThreshold"` + MinQuorum float64 + MinPassThreshold float64 + MinVetoThreshold float64 ProposalFee *math_big.Int `protobuf:"bytes,4,opt,name=ProposalFee,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalFee"` LastProposalNonce uint64 `protobuf:"varint,5,opt,name=LastProposalNonce,proto3" json:"LastProposalNonce"` } @@ -290,27 +291,6 @@ func (m *GovernanceConfigV2) XXX_DiscardUnknown() { var xxx_messageInfo_GovernanceConfigV2 proto.InternalMessageInfo -func (m *GovernanceConfigV2) GetMinQuorum() *math_big.Int { - if m != nil { - return m.MinQuorum - } - return nil -} - -func (m *GovernanceConfigV2) GetMinPassThreshold() *math_big.Int { - if m != nil { - return m.MinPassThreshold - } - return nil -} - -func (m *GovernanceConfigV2) GetMinVetoThreshold() *math_big.Int { - if m != nil { - return m.MinVetoThreshold - } - return nil -} - func (m *GovernanceConfigV2) GetProposalFee() *math_big.Int { if m != nil { return m.ProposalFee @@ -375,6 +355,8 @@ func (m *OngoingVotedList) GetDelegated() []uint64 { type DelegatedSCVoteInfo struct { TotalPower *math_big.Int `protobuf:"bytes,1,opt,name=TotalPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalPower"` UsedPower *math_big.Int `protobuf:"bytes,2,opt,name=UsedPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` + TotalStake *math_big.Int + UsedStake *math_big.Int } func (m *DelegatedSCVoteInfo) Reset() { *m = DelegatedSCVoteInfo{} } diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index 12759533b75..ebf099cddc8 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -23,10 +23,11 @@ message GeneralProposal { bytes No = 6 [(gogoproto.jsontag) = "No", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes Veto = 7 [(gogoproto.jsontag) = "Veto", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes Abstain = 8 [(gogoproto.jsontag) = "Abstain", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bool Passed = 9 [(gogoproto.jsontag) = "Passed"]; - bool Closed = 10 [(gogoproto.jsontag) = "Closed"]; - bytes IssuerAddress = 11 [(gogoproto.jsontag) = "IssuerAddress"]; - bytes ProposalCost = 12 [(gogoproto.jsontag) = "ProposalCost", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes QuorumStake = 9 [(gogoproto.jsontag) = "QuorumStake", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bool Passed = 10 [(gogoproto.jsontag) = "Passed"]; + bool Closed = 11 [(gogoproto.jsontag) = "Closed"]; + bytes IssuerAddress = 12 [(gogoproto.jsontag) = "IssuerAddress"]; + bytes ProposalCost = 13 [(gogoproto.jsontag) = "ProposalCost", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; } message GovernanceConfig { @@ -38,9 +39,9 @@ message GovernanceConfig { } message GovernanceConfigV2 { - bytes MinQuorum = 1 [(gogoproto.jsontag) = "MinQuorum", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes MinPassThreshold = 2 [(gogoproto.jsontag) = "MinPassThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes MinVetoThreshold = 3 [(gogoproto.jsontag) = "MinVetoThreshold", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + float MinQuorum = 1 [(gogoproto.jsontag) = "MinQuorum"]; + float MinPassThreshold = 2 [(gogoproto.jsontag) = "MinPassThreshold"]; + float MinVetoThreshold = 3 [(gogoproto.jsontag) = "MinVetoThreshold"]; bytes ProposalFee = 4 [(gogoproto.jsontag) = "ProposalFee", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; uint64 LastProposalNonce = 5 [(gogoproto.jsontag) = "LastProposalNonce"]; } @@ -53,4 +54,6 @@ message OngoingVotedList { message DelegatedSCVoteInfo { bytes TotalPower = 1 [(gogoproto.jsontag) = "TotalPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes UsedPower = 2 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes TotalStake = 3 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes UsedStake = 4 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; } \ No newline at end of file diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 5fc1a42910b..e1eccd1af09 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -41,9 +41,9 @@ func createArgsWithEEI(eei vm.SystemEI) ArgsNewGovernanceContract { }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, ChangeConfigAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", }, @@ -259,7 +259,7 @@ func TestGovernanceContract_ExecuteInitV2InvalidConfig(t *testing.T) { t.Parallel() args := createMockGovernanceArgs() - args.GovernanceConfig.Active.MinQuorum = "" + args.GovernanceConfig.Active.MinQuorum = 0.0 gsc, _ := NewGovernanceContract(args) callInput := createVMInput(big.NewInt(0), "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) retCode := gsc.Execute(callInput) @@ -894,9 +894,9 @@ func TestGovernanceContract_CloseProposal(t *testing.T) { } if bytes.Equal(key, []byte(governanceConfigKey)) { configBytes, _ := args.Marshalizer.Marshal(&GovernanceConfigV2{ - MinQuorum: big.NewInt(10), - MinVetoThreshold: big.NewInt(10), - MinPassThreshold: big.NewInt(10), + MinQuorum: 0.1, + MinVetoThreshold: 0.1, + MinPassThreshold: 0.1, }) return configBytes } @@ -1420,9 +1420,9 @@ func TestComputeEndResults(t *testing.T) { GetStorageCalled: func(key []byte) []byte { if bytes.Equal(key, []byte(governanceConfigKey)) { configBytes, _ := args.Marshalizer.Marshal(&GovernanceConfigV2{ - MinQuorum: big.NewInt(100), - MinPassThreshold: big.NewInt(51), - MinVetoThreshold: big.NewInt(30), + MinQuorum: 0.4, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.3, }) return configBytes } From bec37f69b9078ed772986e0926d802eda043f80e Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 23 Jan 2023 11:35:19 +0200 Subject: [PATCH 141/335] updated to percentage - one thing remained - compute close proposal results with percentages --- vm/systemSmartContracts/governance.go | 52 ++++++++++++++++++++------- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 5de38bddf1d..bf0ab021838 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -24,6 +24,7 @@ const noString = "no" const vetoString = "veto" const abstainString = "abstain" const commitHashLength = 40 +const maxPercentage = float64(10000.0) // ArgsNewGovernanceContract defines the arguments needed for the on-chain governance contract type ArgsNewGovernanceContract struct { @@ -195,6 +196,10 @@ func (g *governanceContract) initV2(args *vmcommon.ContractCallInput) vmcommon.R } // changeConfig allows the owner to change the configuration for requesting proposals +// args.Arguments[0] - proposalFee - as string +// args.Arguments[1] - minQuorum - 0-10000 - represents percentage +// args.Arguments[1] - minVeto - 0-10000 - represents percentage +// args.Arguments[1] - minPass - 0-10000 - represents percentage func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if !bytes.Equal(g.changeConfigAddress, args.CallerAddr) { g.eei.AddReturnMessage("changeConfig can be called only by owner") @@ -214,19 +219,19 @@ func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmco g.eei.AddReturnMessage("changeConfig first argument is incorrectly formatted") return vmcommon.UserError } - minQuorum, okConvert := big.NewInt(0).SetString(string(args.Arguments[1]), conversionBase) - if !okConvert || minQuorum.Cmp(zero) < 0 { - g.eei.AddReturnMessage("changeConfig second argument is incorrectly formatted") + minQuorum, err := convertDecimalToPercentage(args.Arguments[0]) + if err != nil { + g.eei.AddReturnMessage(err.Error() + " minQuorum") return vmcommon.UserError } - minVeto, okConvert := big.NewInt(0).SetString(string(args.Arguments[2]), conversionBase) - if !okConvert || minVeto.Cmp(zero) < 0 { - g.eei.AddReturnMessage("changeConfig third argument is incorrectly formatted") + minVeto, err := convertDecimalToPercentage(args.Arguments[0]) + if err != nil { + g.eei.AddReturnMessage(err.Error() + " minVeto") return vmcommon.UserError } - minPass, okConvert := big.NewInt(0).SetString(string(args.Arguments[3]), conversionBase) - if !okConvert || minPass.Cmp(zero) < 0 { - g.eei.AddReturnMessage("changeConfig fourth argument is incorrectly formatted") + minPass, err := convertDecimalToPercentage(args.Arguments[0]) + if err != nil { + g.eei.AddReturnMessage(err.Error() + " minPass") return vmcommon.UserError } @@ -710,6 +715,10 @@ func (g *governanceContract) computeTotalStakeAndVotingPower(address []byte) (*b return totalStake, votingPower, nil } +func (g *governanceContract) getTotalStakeInSystem() *big.Int { + return big.NewInt(100) +} + // computeEndResults computes if a proposal has passed or not based on votes accumulated func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error { baseConfig, err := g.getConfig() @@ -721,18 +730,24 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error totalVotes := big.NewInt(0).Add(proposal.Yes, proposal.No) totalVotes.Add(totalVotes, proposal.Veto) + totalVotes.Add(totalVotes, proposal.Abstain) + + totalStake := g.getTotalStakeInSystem() + minQuorumOutOfStake := core.GetIntTrimmedPercentageOfValue(totalStake, baseConfig.MinQuorum) - if totalVotes.Cmp(baseConfig.MinQuorum) == -1 { + if totalVotes.Cmp(minQuorumOutOfStake) == -1 { proposal.Passed = false return nil } - if proposal.Veto.Cmp(baseConfig.MinVetoThreshold) >= 0 { + minVetoOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, baseConfig.MinVetoThreshold) + if proposal.Veto.Cmp(minVetoOfTotalVotes) >= 0 { proposal.Passed = false return nil } - if proposal.Yes.Cmp(baseConfig.MinPassThreshold) >= 0 && proposal.Yes.Cmp(proposal.No) == 1 { + minPassOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, baseConfig.MinPassThreshold) + if proposal.Yes.Cmp(minPassOfTotalVotes) >= 0 && proposal.Yes.Cmp(proposal.No) > 0 { proposal.Passed = true return nil } @@ -995,6 +1010,19 @@ func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCCon }, nil } +func convertDecimalToPercentage(arg []byte) (float64, error) { + value, okConvert := big.NewInt(0).SetString(string(arg), conversionBase) + if !okConvert { + return 0.0, vm.ErrIncorrectConfig + } + + valAsFloat := float64(value.Uint64()) / maxPercentage + if valAsFloat < 0.001 || valAsFloat > 1.0 { + return 0.0, vm.ErrIncorrectConfig + } + return valAsFloat, nil +} + // CanUseContract returns true if contract is enabled func (g *governanceContract) CanUseContract() bool { return true From ac8655b810cafd279b5cbb34c65999fbcc542ec8 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 23 Jan 2023 11:52:58 +0200 Subject: [PATCH 142/335] proto file --- vm/systemSmartContracts/governance.pb.go | 586 ++++++++++++++--------- 1 file changed, 353 insertions(+), 233 deletions(-) diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 33d8d62acd6..e8915ee225f 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -5,10 +5,8 @@ package systemSmartContracts import ( bytes "bytes" + encoding_binary "encoding/binary" fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_multiversx_mx_chain_core_go_data "github.com/multiversx/mx-chain-core-go/data" io "io" math "math" math_big "math/big" @@ -16,6 +14,10 @@ import ( reflect "reflect" strconv "strconv" strings "strings" + + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + github_com_multiversx_mx_chain_core_go_data "github.com/multiversx/mx-chain-core-go/data" ) // Reference imports to suppress errors if they are not otherwise used. @@ -65,11 +67,11 @@ type GeneralProposal struct { No *math_big.Int `protobuf:"bytes,6,opt,name=No,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"No"` Veto *math_big.Int `protobuf:"bytes,7,opt,name=Veto,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Veto"` Abstain *math_big.Int `protobuf:"bytes,8,opt,name=Abstain,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Abstain"` - QuorumStake *math_big.Int - Passed bool `protobuf:"varint,9,opt,name=Passed,proto3" json:"Passed"` - Closed bool `protobuf:"varint,10,opt,name=Closed,proto3" json:"Closed"` - IssuerAddress []byte `protobuf:"bytes,11,opt,name=IssuerAddress,proto3" json:"IssuerAddress"` - ProposalCost *math_big.Int `protobuf:"bytes,12,opt,name=ProposalCost,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalCost"` + QuorumStake *math_big.Int `protobuf:"bytes,9,opt,name=QuorumStake,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"QuorumStake"` + Passed bool `protobuf:"varint,10,opt,name=Passed,proto3" json:"Passed"` + Closed bool `protobuf:"varint,11,opt,name=Closed,proto3" json:"Closed"` + IssuerAddress []byte `protobuf:"bytes,12,opt,name=IssuerAddress,proto3" json:"IssuerAddress"` + ProposalCost *math_big.Int `protobuf:"bytes,13,opt,name=ProposalCost,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalCost"` } func (m *GeneralProposal) Reset() { *m = GeneralProposal{} } @@ -156,6 +158,13 @@ func (m *GeneralProposal) GetAbstain() *math_big.Int { return nil } +func (m *GeneralProposal) GetQuorumStake() *math_big.Int { + if m != nil { + return m.QuorumStake + } + return nil +} + func (m *GeneralProposal) GetPassed() bool { if m != nil { return m.Passed @@ -256,9 +265,9 @@ func (m *GovernanceConfig) GetProposalFee() *math_big.Int { } type GovernanceConfigV2 struct { - MinQuorum float64 - MinPassThreshold float64 - MinVetoThreshold float64 + MinQuorum float32 `protobuf:"fixed32,1,opt,name=MinQuorum,proto3" json:"MinQuorum"` + MinPassThreshold float32 `protobuf:"fixed32,2,opt,name=MinPassThreshold,proto3" json:"MinPassThreshold"` + MinVetoThreshold float32 `protobuf:"fixed32,3,opt,name=MinVetoThreshold,proto3" json:"MinVetoThreshold"` ProposalFee *math_big.Int `protobuf:"bytes,4,opt,name=ProposalFee,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"ProposalFee"` LastProposalNonce uint64 `protobuf:"varint,5,opt,name=LastProposalNonce,proto3" json:"LastProposalNonce"` } @@ -291,6 +300,27 @@ func (m *GovernanceConfigV2) XXX_DiscardUnknown() { var xxx_messageInfo_GovernanceConfigV2 proto.InternalMessageInfo +func (m *GovernanceConfigV2) GetMinQuorum() float32 { + if m != nil { + return m.MinQuorum + } + return 0 +} + +func (m *GovernanceConfigV2) GetMinPassThreshold() float32 { + if m != nil { + return m.MinPassThreshold + } + return 0 +} + +func (m *GovernanceConfigV2) GetMinVetoThreshold() float32 { + if m != nil { + return m.MinVetoThreshold + } + return 0 +} + func (m *GovernanceConfigV2) GetProposalFee() *math_big.Int { if m != nil { return m.ProposalFee @@ -355,8 +385,8 @@ func (m *OngoingVotedList) GetDelegated() []uint64 { type DelegatedSCVoteInfo struct { TotalPower *math_big.Int `protobuf:"bytes,1,opt,name=TotalPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalPower"` UsedPower *math_big.Int `protobuf:"bytes,2,opt,name=UsedPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` - TotalStake *math_big.Int - UsedStake *math_big.Int + TotalStake *math_big.Int `protobuf:"bytes,3,opt,name=TotalStake,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` + UsedStake *math_big.Int `protobuf:"bytes,4,opt,name=UsedStake,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` } func (m *DelegatedSCVoteInfo) Reset() { *m = DelegatedSCVoteInfo{} } @@ -401,6 +431,20 @@ func (m *DelegatedSCVoteInfo) GetUsedPower() *math_big.Int { return nil } +func (m *DelegatedSCVoteInfo) GetTotalStake() *math_big.Int { + if m != nil { + return m.TotalStake + } + return nil +} + +func (m *DelegatedSCVoteInfo) GetUsedStake() *math_big.Int { + if m != nil { + return m.UsedStake + } + return nil +} + func init() { proto.RegisterEnum("proto.VoteValueType", VoteValueType_name, VoteValueType_value) proto.RegisterType((*GeneralProposal)(nil), "proto.GeneralProposal") @@ -413,61 +457,62 @@ func init() { func init() { proto.RegisterFile("governance.proto", fileDescriptor_e18a03da5266c714) } var fileDescriptor_e18a03da5266c714 = []byte{ - // 855 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcd, 0x6f, 0x23, 0x35, - 0x14, 0x8f, 0xf3, 0xd5, 0xd6, 0x4d, 0x97, 0x59, 0xb3, 0x48, 0x23, 0x0e, 0xe3, 0x2a, 0xa7, 0x08, - 0xd4, 0x44, 0x02, 0xa4, 0x95, 0xe0, 0xc2, 0x26, 0xbb, 0x2c, 0x95, 0x76, 0xb3, 0xdd, 0x69, 0x09, - 0x2c, 0x12, 0x42, 0x4e, 0xc6, 0x9d, 0x8c, 0x94, 0xb1, 0x2b, 0xdb, 0xd9, 0x0f, 0x24, 0x24, 0x0e, - 0x5c, 0xb8, 0xf1, 0x67, 0x20, 0xfe, 0x12, 0x8e, 0x3d, 0xf6, 0x34, 0xd0, 0xe4, 0x02, 0x73, 0xea, - 0x9f, 0x80, 0xec, 0x99, 0xcc, 0x47, 0xb3, 0xe2, 0x34, 0xe2, 0x64, 0xbf, 0xdf, 0xb3, 0x7f, 0xef, - 0xcd, 0xfb, 0xf0, 0x1b, 0x68, 0xf9, 0xfc, 0x25, 0x15, 0x8c, 0xb0, 0x19, 0xed, 0x5f, 0x08, 0xae, - 0x38, 0x6a, 0x99, 0xe5, 0xfd, 0x23, 0x3f, 0x50, 0xf3, 0xe5, 0xb4, 0x3f, 0xe3, 0xe1, 0xc0, 0xe7, - 0x3e, 0x1f, 0x18, 0x78, 0xba, 0x3c, 0x37, 0x92, 0x11, 0xcc, 0x2e, 0xb9, 0xd5, 0xbd, 0x69, 0xc3, - 0x77, 0x1e, 0x53, 0x46, 0x05, 0x59, 0x9c, 0x08, 0x7e, 0xc1, 0x25, 0x59, 0x20, 0x0c, 0x5b, 0x63, - 0xce, 0x66, 0xd4, 0x06, 0x87, 0xa0, 0xd7, 0x1c, 0xee, 0xc5, 0x11, 0x4e, 0x00, 0x37, 0x59, 0x50, - 0x1f, 0xc2, 0x11, 0x0f, 0xc3, 0x40, 0x7d, 0x49, 0xe4, 0xdc, 0xae, 0x1f, 0x82, 0x5e, 0x67, 0x78, - 0x27, 0x8e, 0x70, 0x01, 0x75, 0x0b, 0x7b, 0xf4, 0x29, 0xbc, 0x73, 0xaa, 0x88, 0x50, 0x13, 0xae, - 0x68, 0xc2, 0xdc, 0x30, 0xcc, 0x28, 0x8e, 0xf0, 0x2d, 0x8d, 0x7b, 0x4b, 0x46, 0x9f, 0xc0, 0xce, - 0x23, 0xe6, 0xe5, 0x37, 0x9b, 0xe6, 0xa6, 0x15, 0x47, 0xb8, 0x84, 0xbb, 0x25, 0x09, 0x4d, 0x61, - 0xe3, 0x05, 0x95, 0x76, 0xcb, 0xb8, 0x76, 0x12, 0x47, 0x58, 0x8b, 0xbf, 0xff, 0x89, 0x1f, 0x85, - 0x44, 0xcd, 0x07, 0xd3, 0xc0, 0xef, 0x1f, 0x33, 0xf5, 0x59, 0x21, 0x54, 0xe1, 0x72, 0xa1, 0x82, - 0x97, 0x54, 0xc8, 0xd7, 0x83, 0xf0, 0xf5, 0xd1, 0x6c, 0x4e, 0x02, 0x76, 0x34, 0xe3, 0x82, 0x1e, - 0xf9, 0x7c, 0xe0, 0x11, 0x45, 0xfa, 0xc3, 0xc0, 0x3f, 0x66, 0x6a, 0x44, 0xa4, 0xa2, 0xc2, 0xd5, - 0x6c, 0xe8, 0x7b, 0x58, 0x1f, 0x73, 0xbb, 0x6d, 0x4c, 0x3c, 0x8b, 0x23, 0x5c, 0x1f, 0xf3, 0xea, - 0x2c, 0xd4, 0xc7, 0x1c, 0x51, 0xd8, 0x9c, 0x50, 0xc5, 0xed, 0x1d, 0x63, 0xe2, 0x79, 0x1c, 0x61, - 0x23, 0x57, 0x67, 0xc4, 0xd0, 0x21, 0x06, 0x77, 0x1e, 0x4c, 0xa5, 0x22, 0x01, 0xb3, 0x77, 0x8d, - 0xa5, 0xb3, 0x38, 0xc2, 0x1b, 0xa8, 0x3a, 0x63, 0x1b, 0x46, 0xd4, 0x85, 0xed, 0x13, 0x22, 0x25, - 0xf5, 0xec, 0xbd, 0x43, 0xd0, 0xdb, 0x1d, 0xc2, 0x38, 0xc2, 0x29, 0xe2, 0xa6, 0xab, 0x3e, 0x33, - 0x5a, 0x70, 0x7d, 0x06, 0xe6, 0x67, 0x12, 0xc4, 0x4d, 0x57, 0x74, 0x1f, 0x1e, 0x1c, 0x4b, 0xb9, - 0xa4, 0xe2, 0x81, 0xe7, 0x09, 0x2a, 0xa5, 0xbd, 0x6f, 0xbc, 0xbf, 0x1b, 0x47, 0xb8, 0xac, 0x70, - 0xcb, 0x22, 0xfa, 0x11, 0x76, 0x36, 0xb5, 0x3e, 0xe2, 0x52, 0xd9, 0x1d, 0x73, 0xef, 0x85, 0x2e, - 0xa9, 0x22, 0x5e, 0xdd, 0xa7, 0x97, 0x68, 0xbb, 0xff, 0xd4, 0xa1, 0xf5, 0x38, 0xeb, 0xde, 0x11, - 0x67, 0xe7, 0x81, 0x8f, 0x7a, 0x70, 0x77, 0xbc, 0x0c, 0xc7, 0xdc, 0xa3, 0xd2, 0xb4, 0x5d, 0x63, - 0xd8, 0x89, 0x23, 0x9c, 0x61, 0x6e, 0xb6, 0x43, 0x1f, 0xc2, 0xbd, 0xa7, 0x01, 0x7b, 0xbe, 0xe4, - 0x62, 0x19, 0x9a, 0xde, 0x6b, 0x0d, 0x0f, 0xe2, 0x08, 0xe7, 0xa0, 0x9b, 0x6f, 0xd1, 0xe7, 0xd0, - 0x7a, 0x1a, 0x30, 0x1d, 0xd4, 0xb3, 0xb9, 0xa0, 0x72, 0xce, 0x17, 0x9e, 0xe9, 0xbd, 0xd6, 0xf0, - 0x5e, 0x1c, 0xe1, 0x2d, 0x9d, 0xbb, 0x85, 0xa4, 0x0c, 0xba, 0x50, 0x72, 0x86, 0x66, 0x89, 0xa1, - 0xa4, 0x73, 0xb7, 0x10, 0xf4, 0x03, 0xdc, 0xdf, 0x7c, 0xff, 0x17, 0x94, 0xa6, 0x3d, 0xf9, 0x4d, - 0x1c, 0xe1, 0x22, 0x5c, 0x5d, 0xb0, 0x8b, 0xac, 0xdd, 0x75, 0x13, 0xa2, 0xdb, 0xb1, 0x9e, 0x7c, - 0x84, 0x54, 0x31, 0x86, 0xc0, 0x38, 0x34, 0x29, 0xc5, 0xb0, 0x3a, 0x77, 0x0a, 0xc9, 0xf8, 0x05, - 0xbc, 0x25, 0x1b, 0xc9, 0xeb, 0xf9, 0xdd, 0xdb, 0xb2, 0x51, 0x9d, 0x13, 0xdb, 0x69, 0x4d, 0x7d, - 0x29, 0xe7, 0xb5, 0x51, 0xf2, 0xa5, 0xa4, 0xab, 0xd6, 0x97, 0xff, 0x2c, 0x90, 0xe6, 0xff, 0x58, - 0x20, 0x68, 0x04, 0xef, 0x3e, 0x21, 0x52, 0x6d, 0xa0, 0x64, 0xc6, 0xb4, 0xcc, 0x8c, 0x79, 0x2f, - 0x8e, 0xf0, 0xb6, 0xd2, 0xdd, 0x86, 0xba, 0x33, 0x68, 0x3d, 0x63, 0x3e, 0x0f, 0x98, 0xaf, 0x27, - 0x90, 0xf7, 0x24, 0x90, 0x4a, 0xbf, 0x60, 0x0f, 0x03, 0x41, 0x67, 0xca, 0x06, 0x87, 0x8d, 0x5e, - 0x33, 0x79, 0xc1, 0x12, 0xc4, 0x4d, 0x57, 0xdd, 0xca, 0x0f, 0xe9, 0x82, 0xfa, 0x44, 0x51, 0x5d, - 0x08, 0xfa, 0x98, 0x69, 0xe5, 0x0c, 0x74, 0xf3, 0x6d, 0xf7, 0xe7, 0x3a, 0x7c, 0x37, 0x93, 0x4e, - 0x47, 0xda, 0xd2, 0x31, 0x3b, 0xe7, 0xe8, 0x15, 0x84, 0x67, 0x5c, 0x91, 0xc5, 0x09, 0x7f, 0x45, - 0x45, 0x5a, 0xcc, 0x5f, 0xeb, 0x61, 0x9c, 0xa3, 0xd5, 0xc5, 0xae, 0x40, 0xaa, 0x9b, 0xe8, 0x2b, - 0x49, 0xbd, 0xc4, 0x6e, 0x3d, 0x6f, 0xa2, 0x0c, 0xac, 0xb0, 0x89, 0x32, 0xce, 0x0f, 0xee, 0xc3, - 0x03, 0xfd, 0xe9, 0x13, 0xb2, 0x58, 0xd2, 0xb3, 0x37, 0x17, 0x14, 0xed, 0x98, 0x51, 0x6f, 0xd5, - 0x50, 0x5b, 0xcf, 0x63, 0x0b, 0xa0, 0xdd, 0x64, 0x6c, 0x5a, 0x75, 0xb4, 0x9f, 0x4d, 0x36, 0xab, - 0x31, 0x1c, 0x5f, 0x5e, 0x3b, 0xb5, 0xab, 0x6b, 0xa7, 0x76, 0x73, 0xed, 0x80, 0x9f, 0x56, 0x0e, - 0xf8, 0x6d, 0xe5, 0x80, 0x3f, 0x56, 0x0e, 0xb8, 0x5c, 0x39, 0xe0, 0x6a, 0xe5, 0x80, 0xbf, 0x56, - 0x0e, 0xf8, 0x7b, 0xe5, 0xd4, 0x6e, 0x56, 0x0e, 0xf8, 0x75, 0xed, 0xd4, 0x2e, 0xd7, 0x4e, 0xed, - 0x6a, 0xed, 0xd4, 0xbe, 0xbd, 0x27, 0xdf, 0x48, 0x45, 0xc3, 0xd3, 0x90, 0x08, 0x35, 0xe2, 0x4c, - 0x09, 0x32, 0x53, 0x72, 0xda, 0x36, 0x3f, 0x50, 0x1f, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xc4, - 0x54, 0x31, 0xee, 0x8a, 0x09, 0x00, 0x00, + // 876 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x8f, 0xe3, 0x34, + 0x1c, 0x6d, 0x9a, 0x76, 0xfe, 0x78, 0x3a, 0x4b, 0xd6, 0x2c, 0x52, 0xc4, 0x21, 0x1e, 0xf5, 0x54, + 0x81, 0xa6, 0x95, 0x00, 0x69, 0x25, 0xb8, 0xb0, 0xe9, 0x2e, 0xcb, 0x48, 0xbb, 0xdd, 0xd9, 0x4c, + 0x29, 0x2c, 0x17, 0xe4, 0x36, 0x9e, 0x34, 0xa2, 0xb1, 0x47, 0xb6, 0x33, 0xbb, 0x8b, 0x84, 0xc4, + 0x89, 0x33, 0x1f, 0x03, 0xf1, 0x49, 0x38, 0xce, 0x71, 0x4e, 0x81, 0xc9, 0x5c, 0x20, 0xe2, 0xb0, + 0xe2, 0x13, 0x20, 0x3b, 0x6d, 0x93, 0x4c, 0x4f, 0x2b, 0xb2, 0x7b, 0xb2, 0x7f, 0xcf, 0xf6, 0x7b, + 0xf1, 0xb3, 0x7f, 0xf9, 0x19, 0x58, 0x01, 0x3b, 0x27, 0x9c, 0x62, 0x3a, 0x23, 0xfd, 0x33, 0xce, + 0x24, 0x83, 0x6d, 0xdd, 0xbc, 0x7f, 0x18, 0x84, 0x72, 0x1e, 0x4f, 0xfb, 0x33, 0x16, 0x0d, 0x02, + 0x16, 0xb0, 0x81, 0x86, 0xa7, 0xf1, 0xa9, 0x8e, 0x74, 0xa0, 0x7b, 0xf9, 0xaa, 0xee, 0x3f, 0xdb, + 0xe0, 0x9d, 0x87, 0x84, 0x12, 0x8e, 0x17, 0xc7, 0x9c, 0x9d, 0x31, 0x81, 0x17, 0x10, 0x81, 0xf6, + 0x88, 0xd1, 0x19, 0xb1, 0x8d, 0x03, 0xa3, 0xd7, 0x72, 0x77, 0xb3, 0x04, 0xe5, 0x80, 0x97, 0x37, + 0xb0, 0x0f, 0xc0, 0x90, 0x45, 0x51, 0x28, 0xbf, 0xc4, 0x62, 0x6e, 0x37, 0x0f, 0x8c, 0x5e, 0xc7, + 0xbd, 0x95, 0x25, 0xa8, 0x84, 0x7a, 0xa5, 0x3e, 0xfc, 0x14, 0xdc, 0x3a, 0x91, 0x98, 0xcb, 0x09, + 0x93, 0x24, 0x67, 0x36, 0x35, 0x33, 0xcc, 0x12, 0x74, 0x63, 0xc4, 0xbb, 0x11, 0xc3, 0x4f, 0x40, + 0xe7, 0x01, 0xf5, 0x8b, 0x95, 0x2d, 0xbd, 0xd2, 0xca, 0x12, 0x54, 0xc1, 0xbd, 0x4a, 0x04, 0xa7, + 0xc0, 0x7c, 0x46, 0x84, 0xdd, 0xd6, 0x9f, 0x76, 0x9c, 0x25, 0x48, 0x85, 0xbf, 0xfd, 0x81, 0x1e, + 0x44, 0x58, 0xce, 0x07, 0xd3, 0x30, 0xe8, 0x1f, 0x51, 0xf9, 0x59, 0xc9, 0xaa, 0x28, 0x5e, 0xc8, + 0xf0, 0x9c, 0x70, 0xf1, 0x62, 0x10, 0xbd, 0x38, 0x9c, 0xcd, 0x71, 0x48, 0x0f, 0x67, 0x8c, 0x93, + 0xc3, 0x80, 0x0d, 0x7c, 0x2c, 0x71, 0xdf, 0x0d, 0x83, 0x23, 0x2a, 0x87, 0x58, 0x48, 0xc2, 0x3d, + 0xc5, 0x06, 0xbf, 0x03, 0xcd, 0x11, 0xb3, 0xb7, 0xb4, 0xc4, 0x93, 0x2c, 0x41, 0xcd, 0x11, 0xab, + 0x4f, 0xa1, 0x39, 0x62, 0x90, 0x80, 0xd6, 0x84, 0x48, 0x66, 0x6f, 0x6b, 0x89, 0xa7, 0x59, 0x82, + 0x74, 0x5c, 0x9f, 0x88, 0xa6, 0x83, 0x14, 0x6c, 0xdf, 0x9b, 0x0a, 0x89, 0x43, 0x6a, 0xef, 0x68, + 0xa5, 0x71, 0x96, 0xa0, 0x15, 0x54, 0x9f, 0xd8, 0x8a, 0x11, 0xfe, 0x00, 0xf6, 0x9e, 0xc6, 0x8c, + 0xc7, 0xd1, 0x89, 0xc4, 0xdf, 0x13, 0x7b, 0x57, 0x6b, 0x7e, 0x93, 0x25, 0xa8, 0x0c, 0xd7, 0xa7, + 0x5b, 0x66, 0x85, 0x5d, 0xb0, 0x75, 0x8c, 0x85, 0x20, 0xbe, 0x0d, 0x0e, 0x8c, 0xde, 0x8e, 0x0b, + 0xb2, 0x04, 0x2d, 0x11, 0x6f, 0xd9, 0xaa, 0x39, 0xc3, 0x05, 0x53, 0x73, 0xf6, 0x8a, 0x39, 0x39, + 0xe2, 0x2d, 0x5b, 0x78, 0x17, 0xec, 0x1f, 0x09, 0x11, 0x13, 0x7e, 0xcf, 0xf7, 0x39, 0x11, 0xc2, + 0xee, 0xe8, 0x5d, 0xdc, 0xce, 0x12, 0x54, 0x1d, 0xf0, 0xaa, 0x21, 0xfc, 0x11, 0x74, 0x56, 0x79, + 0x36, 0x64, 0x42, 0xda, 0xfb, 0x7a, 0xdd, 0x33, 0x75, 0x9d, 0xcb, 0x78, 0x7d, 0xdb, 0xaf, 0xd0, + 0x76, 0xff, 0x6e, 0x02, 0xeb, 0xe1, 0xfa, 0xcf, 0x31, 0x64, 0xf4, 0x34, 0x0c, 0x60, 0x0f, 0xec, + 0x8c, 0xe2, 0x68, 0xc4, 0x7c, 0x22, 0x74, 0xca, 0x9b, 0x6e, 0x27, 0x4b, 0xd0, 0x1a, 0xf3, 0xd6, + 0x3d, 0xf8, 0x21, 0xd8, 0x7d, 0x1c, 0xd2, 0xdc, 0x50, 0x9d, 0xf7, 0x6d, 0x77, 0x3f, 0x4b, 0x50, + 0x01, 0x7a, 0x45, 0x17, 0x7e, 0x0e, 0xac, 0xc7, 0x21, 0x55, 0xa6, 0x8e, 0xe7, 0x9c, 0x88, 0x39, + 0x5b, 0xf8, 0x3a, 0xef, 0xdb, 0xee, 0x9d, 0x2c, 0x41, 0x1b, 0x63, 0xde, 0x06, 0xb2, 0x64, 0x50, + 0x97, 0xb4, 0x60, 0x68, 0x55, 0x18, 0x2a, 0x63, 0xde, 0x06, 0xa2, 0xee, 0xda, 0x6a, 0xff, 0x5f, + 0x10, 0xb2, 0xfc, 0x1f, 0xe8, 0xbb, 0x56, 0x82, 0x6b, 0xbc, 0x6b, 0x25, 0xd6, 0xee, 0xcf, 0x26, + 0x80, 0x37, 0xbd, 0x9e, 0x7c, 0x54, 0xf5, 0x50, 0xd9, 0xdd, 0x7c, 0x4d, 0x0f, 0x9b, 0x7a, 0xcd, + 0xff, 0xf1, 0xd0, 0xac, 0x30, 0xbc, 0xa6, 0x87, 0xad, 0xb7, 0xe8, 0x21, 0x1c, 0x82, 0xdb, 0x8f, + 0xb0, 0x90, 0x2b, 0x28, 0x2f, 0x01, 0x6d, 0x5d, 0x02, 0xde, 0xcb, 0x12, 0xb4, 0x39, 0xe8, 0x6d, + 0x42, 0xdd, 0x19, 0xb0, 0x9e, 0xd0, 0x80, 0x85, 0x34, 0x50, 0x05, 0xc2, 0x7f, 0x14, 0x0a, 0xa9, + 0x92, 0xfc, 0x7e, 0xc8, 0xc9, 0x4c, 0xda, 0xc6, 0x81, 0xd9, 0x6b, 0xe5, 0x49, 0x9e, 0x23, 0xde, + 0xb2, 0x55, 0x27, 0x75, 0x9f, 0x2c, 0x48, 0x80, 0x25, 0x51, 0xae, 0xab, 0x69, 0xfa, 0xa4, 0xd6, + 0xa0, 0x57, 0x74, 0xbb, 0xff, 0x9a, 0xe0, 0xdd, 0x75, 0x74, 0x32, 0x54, 0x4a, 0x47, 0xf4, 0x94, + 0xc1, 0xe7, 0x00, 0x8c, 0x99, 0xc4, 0x8b, 0x63, 0xf6, 0x9c, 0x70, 0x7d, 0xde, 0x1d, 0xf7, 0x6b, + 0x55, 0x2b, 0x0b, 0xb4, 0x3e, 0xef, 0x4a, 0xa4, 0x50, 0x82, 0xdd, 0xaf, 0x04, 0xf1, 0x73, 0xdd, + 0xbc, 0x46, 0x4f, 0xd4, 0xd7, 0xaf, 0xc1, 0xfa, 0x64, 0x0b, 0x4e, 0x78, 0xbe, 0xdc, 0x6e, 0xfe, + 0x6f, 0x37, 0xdf, 0xa8, 0x6c, 0x49, 0x69, 0xb5, 0xdb, 0x5c, 0xb6, 0xf5, 0xe6, 0x77, 0xab, 0x85, + 0x3e, 0xb8, 0x0b, 0xf6, 0xd5, 0x41, 0x4f, 0xf0, 0x22, 0x26, 0xe3, 0x97, 0x67, 0x04, 0x6e, 0xeb, + 0x77, 0x87, 0xd5, 0x80, 0x5b, 0xea, 0x71, 0x60, 0x19, 0x70, 0x27, 0xaf, 0xe1, 0x56, 0x13, 0xee, + 0xad, 0xcb, 0xac, 0x65, 0xba, 0xa3, 0x8b, 0x2b, 0xa7, 0x71, 0x79, 0xe5, 0x34, 0x5e, 0x5d, 0x39, + 0xc6, 0x4f, 0xa9, 0x63, 0xfc, 0x9a, 0x3a, 0xc6, 0xef, 0xa9, 0x63, 0x5c, 0xa4, 0x8e, 0x71, 0x99, + 0x3a, 0xc6, 0x9f, 0xa9, 0x63, 0xfc, 0x95, 0x3a, 0x8d, 0x57, 0xa9, 0x63, 0xfc, 0x72, 0xed, 0x34, + 0x2e, 0xae, 0x9d, 0xc6, 0xe5, 0xb5, 0xd3, 0xf8, 0xf6, 0x8e, 0x78, 0x29, 0x24, 0x89, 0x4e, 0x22, + 0xcc, 0xe5, 0x90, 0x51, 0xc9, 0xf1, 0x4c, 0x8a, 0xe9, 0x96, 0x7e, 0xcd, 0x7d, 0xfc, 0x5f, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xc9, 0x44, 0x3e, 0xaf, 0x17, 0x0a, 0x00, 0x00, } func (x VoteValueType) String() string { @@ -532,6 +577,12 @@ func (this *GeneralProposal) Equal(that interface{}) bool { return false } } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if !__caster.Equal(this.QuorumStake, that1.QuorumStake) { + return false + } + } if this.Passed != that1.Passed { return false } @@ -607,23 +658,14 @@ func (this *GovernanceConfigV2) Equal(that interface{}) bool { } else if this == nil { return false } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.MinQuorum, that1.MinQuorum) { - return false - } + if this.MinQuorum != that1.MinQuorum { + return false } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.MinPassThreshold, that1.MinPassThreshold) { - return false - } + if this.MinPassThreshold != that1.MinPassThreshold { + return false } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if !__caster.Equal(this.MinVetoThreshold, that1.MinVetoThreshold) { - return false - } + if this.MinVetoThreshold != that1.MinVetoThreshold { + return false } { __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} @@ -704,13 +746,25 @@ func (this *DelegatedSCVoteInfo) Equal(that interface{}) bool { return false } } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if !__caster.Equal(this.TotalStake, that1.TotalStake) { + return false + } + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if !__caster.Equal(this.UsedStake, that1.UsedStake) { + return false + } + } return true } func (this *GeneralProposal) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 16) + s := make([]string, 0, 17) s = append(s, "&systemSmartContracts.GeneralProposal{") s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") s = append(s, "CommitHash: "+fmt.Sprintf("%#v", this.CommitHash)+",\n") @@ -720,6 +774,7 @@ func (this *GeneralProposal) GoString() string { s = append(s, "No: "+fmt.Sprintf("%#v", this.No)+",\n") s = append(s, "Veto: "+fmt.Sprintf("%#v", this.Veto)+",\n") s = append(s, "Abstain: "+fmt.Sprintf("%#v", this.Abstain)+",\n") + s = append(s, "QuorumStake: "+fmt.Sprintf("%#v", this.QuorumStake)+",\n") s = append(s, "Passed: "+fmt.Sprintf("%#v", this.Passed)+",\n") s = append(s, "Closed: "+fmt.Sprintf("%#v", this.Closed)+",\n") s = append(s, "IssuerAddress: "+fmt.Sprintf("%#v", this.IssuerAddress)+",\n") @@ -770,10 +825,12 @@ func (this *DelegatedSCVoteInfo) GoString() string { if this == nil { return "nil" } - s := make([]string, 0, 6) + s := make([]string, 0, 8) s = append(s, "&systemSmartContracts.DelegatedSCVoteInfo{") s = append(s, "TotalPower: "+fmt.Sprintf("%#v", this.TotalPower)+",\n") s = append(s, "UsedPower: "+fmt.Sprintf("%#v", this.UsedPower)+",\n") + s = append(s, "TotalStake: "+fmt.Sprintf("%#v", this.TotalStake)+",\n") + s = append(s, "UsedStake: "+fmt.Sprintf("%#v", this.UsedStake)+",\n") s = append(s, "}") return strings.Join(s, "") } @@ -815,13 +872,13 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintGovernance(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x62 + dAtA[i] = 0x6a if len(m.IssuerAddress) > 0 { i -= len(m.IssuerAddress) copy(dAtA[i:], m.IssuerAddress) i = encodeVarintGovernance(dAtA, i, uint64(len(m.IssuerAddress))) i-- - dAtA[i] = 0x5a + dAtA[i] = 0x62 } if m.Closed { i-- @@ -831,7 +888,7 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x50 + dAtA[i] = 0x58 } if m.Passed { i-- @@ -841,8 +898,19 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x48 + dAtA[i] = 0x50 } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + size := __caster.Size(m.QuorumStake) + i -= size + if _, err := __caster.MarshalTo(m.QuorumStake, dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGovernance(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a { __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} size := __caster.Size(m.Abstain) @@ -1002,39 +1070,24 @@ func (m *GovernanceConfigV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x22 - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.MinVetoThreshold) - i -= size - if _, err := __caster.MarshalTo(m.MinVetoThreshold, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) + if m.MinVetoThreshold != 0 { + i -= 4 + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.MinVetoThreshold)))) + i-- + dAtA[i] = 0x1d } - i-- - dAtA[i] = 0x1a - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.MinPassThreshold) - i -= size - if _, err := __caster.MarshalTo(m.MinPassThreshold, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) + if m.MinPassThreshold != 0 { + i -= 4 + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.MinPassThreshold)))) + i-- + dAtA[i] = 0x15 } - i-- - dAtA[i] = 0x12 - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - size := __caster.Size(m.MinQuorum) - i -= size - if _, err := __caster.MarshalTo(m.MinQuorum, dAtA[i:]); err != nil { - return 0, err - } - i = encodeVarintGovernance(dAtA, i, uint64(size)) + if m.MinQuorum != 0 { + i -= 4 + encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.MinQuorum)))) + i-- + dAtA[i] = 0xd } - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -1117,6 +1170,28 @@ func (m *DelegatedSCVoteInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + size := __caster.Size(m.UsedStake) + i -= size + if _, err := __caster.MarshalTo(m.UsedStake, dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGovernance(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + size := __caster.Size(m.TotalStake) + i -= size + if _, err := __caster.MarshalTo(m.TotalStake, dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintGovernance(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a { __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} size := __caster.Size(m.UsedPower) @@ -1192,6 +1267,11 @@ func (m *GeneralProposal) Size() (n int) { l = __caster.Size(m.Abstain) n += 1 + l + sovGovernance(uint64(l)) } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + l = __caster.Size(m.QuorumStake) + n += 1 + l + sovGovernance(uint64(l)) + } if m.Passed { n += 2 } @@ -1242,20 +1322,14 @@ func (m *GovernanceConfigV2) Size() (n int) { } var l int _ = l - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.MinQuorum) - n += 1 + l + sovGovernance(uint64(l)) + if m.MinQuorum != 0 { + n += 5 } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.MinPassThreshold) - n += 1 + l + sovGovernance(uint64(l)) + if m.MinPassThreshold != 0 { + n += 5 } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - l = __caster.Size(m.MinVetoThreshold) - n += 1 + l + sovGovernance(uint64(l)) + if m.MinVetoThreshold != 0 { + n += 5 } { __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} @@ -1307,6 +1381,16 @@ func (m *DelegatedSCVoteInfo) Size() (n int) { l = __caster.Size(m.UsedPower) n += 1 + l + sovGovernance(uint64(l)) } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + l = __caster.Size(m.TotalStake) + n += 1 + l + sovGovernance(uint64(l)) + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + l = __caster.Size(m.UsedStake) + n += 1 + l + sovGovernance(uint64(l)) + } return n } @@ -1329,6 +1413,7 @@ func (this *GeneralProposal) String() string { `No:` + fmt.Sprintf("%v", this.No) + `,`, `Veto:` + fmt.Sprintf("%v", this.Veto) + `,`, `Abstain:` + fmt.Sprintf("%v", this.Abstain) + `,`, + `QuorumStake:` + fmt.Sprintf("%v", this.QuorumStake) + `,`, `Passed:` + fmt.Sprintf("%v", this.Passed) + `,`, `Closed:` + fmt.Sprintf("%v", this.Closed) + `,`, `IssuerAddress:` + fmt.Sprintf("%v", this.IssuerAddress) + `,`, @@ -1383,6 +1468,8 @@ func (this *DelegatedSCVoteInfo) String() string { s := strings.Join([]string{`&DelegatedSCVoteInfo{`, `TotalPower:` + fmt.Sprintf("%v", this.TotalPower) + `,`, `UsedPower:` + fmt.Sprintf("%v", this.UsedPower) + `,`, + `TotalStake:` + fmt.Sprintf("%v", this.TotalStake) + `,`, + `UsedStake:` + fmt.Sprintf("%v", this.UsedStake) + `,`, `}`, }, "") return s @@ -1668,6 +1755,44 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field QuorumStake", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } else { + m.QuorumStake = tmp + } + } + iNdEx = postIndex + case 10: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Passed", wireType) } @@ -1687,7 +1812,7 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { } } m.Passed = bool(v != 0) - case 10: + case 11: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Closed", wireType) } @@ -1707,7 +1832,7 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { } } m.Closed = bool(v != 0) - case 11: + case 12: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field IssuerAddress", wireType) } @@ -1741,7 +1866,7 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { m.IssuerAddress = []byte{} } iNdEx = postIndex - case 12: + case 13: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ProposalCost", wireType) } @@ -2000,119 +2125,38 @@ func (m *GovernanceConfigV2) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 2 { + if wireType != 5 { return fmt.Errorf("proto: wrong wireType = %d for field MinQuorum", wireType) } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { + var v uint32 + if (iNdEx + 4) > l { return io.ErrUnexpectedEOF } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.MinQuorum = tmp - } - } - iNdEx = postIndex + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + m.MinQuorum = float32(math.Float32frombits(v)) case 2: - if wireType != 2 { + if wireType != 5 { return fmt.Errorf("proto: wrong wireType = %d for field MinPassThreshold", wireType) } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { + var v uint32 + if (iNdEx + 4) > l { return io.ErrUnexpectedEOF } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.MinPassThreshold = tmp - } - } - iNdEx = postIndex + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + m.MinPassThreshold = float32(math.Float32frombits(v)) case 3: - if wireType != 2 { + if wireType != 5 { return fmt.Errorf("proto: wrong wireType = %d for field MinVetoThreshold", wireType) } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGovernance - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthGovernance - } - postIndex := iNdEx + byteLen - if postIndex < 0 { - return ErrInvalidLengthGovernance - } - if postIndex > l { + var v uint32 + if (iNdEx + 4) > l { return io.ErrUnexpectedEOF } - { - __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} - if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } else { - m.MinVetoThreshold = tmp - } - } - iNdEx = postIndex + v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) + iNdEx += 4 + m.MinVetoThreshold = float32(math.Float32frombits(v)) case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ProposalFee", wireType) @@ -2504,6 +2548,82 @@ func (m *DelegatedSCVoteInfo) Unmarshal(dAtA []byte) error { } } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalStake", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } else { + m.TotalStake = tmp + } + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UsedStake", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGovernance + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthGovernance + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthGovernance + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + { + __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} + if tmp, err := __caster.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } else { + m.UsedStake = tmp + } + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGovernance(dAtA[iNdEx:]) From 8b3823bf56a6abe920d5e398674a17508969f870 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 23 Jan 2023 12:21:08 +0200 Subject: [PATCH 143/335] updated to percentage - one thing remained - compute close proposal results with percentages --- vm/systemSmartContracts/eei.go | 3 ++ vm/systemSmartContracts/governance.go | 19 +++---- vm/systemSmartContracts/governance.proto | 4 +- vm/systemSmartContracts/governance_test.go | 58 ++++++++++++---------- 4 files changed, 47 insertions(+), 37 deletions(-) diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index da63fc9844b..731f0dbe7d2 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -120,6 +120,7 @@ func (host *vmContext) GetContract(address []byte) (vm.SystemSmartContract, erro // GetStorageFromAddress gets the storage from address and key func (host *vmContext) GetStorageFromAddress(address []byte, key []byte) []byte { + log.Error(string(address) + " " + string(key)) storageAdrMap, exists := host.storageUpdate[string(address)] if exists { if value, isInMap := storageAdrMap[string(key)]; isInMap { @@ -150,6 +151,8 @@ func (host *vmContext) SetStorageForAddress(address []byte, key []byte, value [] length := len(value) host.storageUpdate[strAdr][string(key)] = make([]byte, length) copy(host.storageUpdate[strAdr][string(key)][:length], value[:length]) + + log.Warn(strAdr + " " + string(key) + " " + string(value)) } // SetStorage saves the key value storage under the address diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index bf0ab021838..1e52bab6428 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -459,7 +459,7 @@ func (g *governanceContract) updateDelegatedContractInfo( } scVoteInfo.UsedStake.Add(scVoteInfo.UsedStake, balance) - if scVoteInfo.TotalStake.Cmp(scVoteInfo.TotalStake) < 0 { + if scVoteInfo.TotalStake.Cmp(scVoteInfo.UsedStake) < 0 { return vm.ErrNotEnoughVotingPower } @@ -733,20 +733,20 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error totalVotes.Add(totalVotes, proposal.Abstain) totalStake := g.getTotalStakeInSystem() - minQuorumOutOfStake := core.GetIntTrimmedPercentageOfValue(totalStake, baseConfig.MinQuorum) + minQuorumOutOfStake := core.GetIntTrimmedPercentageOfValue(totalStake, float64(baseConfig.MinQuorum)) if totalVotes.Cmp(minQuorumOutOfStake) == -1 { proposal.Passed = false return nil } - minVetoOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, baseConfig.MinVetoThreshold) + minVetoOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, float64(baseConfig.MinVetoThreshold)) if proposal.Veto.Cmp(minVetoOfTotalVotes) >= 0 { proposal.Passed = false return nil } - minPassOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, baseConfig.MinPassThreshold) + minPassOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, float64(baseConfig.MinPassThreshold)) if proposal.Yes.Cmp(minPassOfTotalVotes) >= 0 && proposal.Yes.Cmp(proposal.No) > 0 { proposal.Passed = true return nil @@ -847,6 +847,7 @@ func (g *governanceContract) getDelegatedContractInfo(scAddress []byte, referenc if err != nil { return nil, err } + log.Error("total stake" + " " + totalStake.String()) scVoteInfo.TotalPower.Set(totalVotingPower) scVoteInfo.TotalStake.Set(totalStake) @@ -1003,14 +1004,14 @@ func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCCon } return &GovernanceConfigV2{ - MinQuorum: config.Active.MinQuorum, - MinPassThreshold: config.Active.MinPassThreshold, - MinVetoThreshold: config.Active.MinVetoThreshold, + MinQuorum: float32(config.Active.MinQuorum), + MinPassThreshold: float32(config.Active.MinPassThreshold), + MinVetoThreshold: float32(config.Active.MinVetoThreshold), ProposalFee: proposalFee, }, nil } -func convertDecimalToPercentage(arg []byte) (float64, error) { +func convertDecimalToPercentage(arg []byte) (float32, error) { value, okConvert := big.NewInt(0).SetString(string(arg), conversionBase) if !okConvert { return 0.0, vm.ErrIncorrectConfig @@ -1020,7 +1021,7 @@ func convertDecimalToPercentage(arg []byte) (float64, error) { if valAsFloat < 0.001 || valAsFloat > 1.0 { return 0.0, vm.ErrIncorrectConfig } - return valAsFloat, nil + return float32(valAsFloat), nil } // CanUseContract returns true if contract is enabled diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index ebf099cddc8..54395d6b093 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -54,6 +54,6 @@ message OngoingVotedList { message DelegatedSCVoteInfo { bytes TotalPower = 1 [(gogoproto.jsontag) = "TotalPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes UsedPower = 2 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes TotalStake = 3 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; - bytes UsedStake = 4 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes TotalStake = 3 [(gogoproto.jsontag) = "TotalStake", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; + bytes UsedStake = 4 [(gogoproto.jsontag) = "UsedStake", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; } \ No newline at end of file diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index e1eccd1af09..fa1db785b11 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -3,6 +3,7 @@ package systemSmartContracts import ( "bytes" "errors" + "fmt" "github.com/multiversx/mx-chain-go/process/smartContract/hooks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" "math/big" @@ -741,6 +742,7 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { No: big.NewInt(0), Veto: big.NewInt(0), Abstain: big.NewInt(0), + QuorumStake: big.NewInt(0), } voteArgs := [][]byte{ @@ -828,6 +830,7 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { No: big.NewInt(0), Veto: big.NewInt(0), Abstain: big.NewInt(0), + QuorumStake: big.NewInt(0), } voteArgs := [][]byte{ @@ -862,10 +865,12 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) require.True(t, strings.Contains(eei.GetReturnMessage(), "not enough voting power to cast this vote")) + fmt.Println("should work") callInput.Arguments[3] = big.NewInt(12).Bytes() retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.Ok, retCode) + fmt.Println("next run") retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) require.True(t, strings.Contains(eei.GetReturnMessage(), "double vote is not allowed")) @@ -886,12 +891,6 @@ func TestGovernanceContract_CloseProposal(t *testing.T) { } }, GetStorageCalled: func(key []byte) []byte { - if bytes.Equal(key, append([]byte(proposalPrefix), callerAddress...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Passed: true, - }) - return whitelistProposalBytes - } if bytes.Equal(key, []byte(governanceConfigKey)) { configBytes, _ := args.Marshalizer.Marshal(&GovernanceConfigV2{ MinQuorum: 0.1, @@ -901,12 +900,13 @@ func TestGovernanceContract_CloseProposal(t *testing.T) { return configBytes } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { - whitelistProposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Yes: big.NewInt(10), - No: big.NewInt(10), - Veto: big.NewInt(10), + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + Yes: big.NewInt(10), + No: big.NewInt(10), + Veto: big.NewInt(10), + Abstain: big.NewInt(10), }) - return whitelistProposalBytes + return proposalBytes } return nil @@ -1423,6 +1423,7 @@ func TestComputeEndResults(t *testing.T) { MinQuorum: 0.4, MinPassThreshold: 0.5, MinVetoThreshold: 0.3, + ProposalFee: big.NewInt(10), }) return configBytes } @@ -1433,45 +1434,50 @@ func TestComputeEndResults(t *testing.T) { gsc, _ := NewGovernanceContract(args) didNotPassQuorum := &GeneralProposal{ - Yes: big.NewInt(50), - No: big.NewInt(0), - Veto: big.NewInt(0), + Yes: big.NewInt(50), + No: big.NewInt(0), + Veto: big.NewInt(0), + Abstain: big.NewInt(10), } err := gsc.computeEndResults(didNotPassQuorum) require.Nil(t, err) require.False(t, didNotPassQuorum.Passed) didNotPassVotes := &GeneralProposal{ - Yes: big.NewInt(50), - No: big.NewInt(50), - Veto: big.NewInt(0), + Yes: big.NewInt(50), + No: big.NewInt(50), + Veto: big.NewInt(0), + Abstain: big.NewInt(10), } err = gsc.computeEndResults(didNotPassVotes) require.Nil(t, err) require.False(t, didNotPassVotes.Passed) didNotPassVotes2 := &GeneralProposal{ - Yes: big.NewInt(50), - No: big.NewInt(51), - Veto: big.NewInt(0), + Yes: big.NewInt(50), + No: big.NewInt(51), + Veto: big.NewInt(0), + Abstain: big.NewInt(10), } err = gsc.computeEndResults(didNotPassVotes2) require.Nil(t, err) require.False(t, didNotPassVotes2.Passed) didNotPassVeto := &GeneralProposal{ - Yes: big.NewInt(51), - No: big.NewInt(50), - Veto: big.NewInt(30), + Yes: big.NewInt(51), + No: big.NewInt(50), + Veto: big.NewInt(30), + Abstain: big.NewInt(10), } err = gsc.computeEndResults(didNotPassVeto) require.Nil(t, err) require.False(t, didNotPassVeto.Passed) pass := &GeneralProposal{ - Yes: big.NewInt(51), - No: big.NewInt(50), - Veto: big.NewInt(29), + Yes: big.NewInt(51), + No: big.NewInt(50), + Veto: big.NewInt(29), + Abstain: big.NewInt(10), } err = gsc.computeEndResults(pass) require.Nil(t, err) From 61d5d77ecfa54a3bb7f967594f8ee8b44753e14e Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 23 Jan 2023 12:22:47 +0200 Subject: [PATCH 144/335] regenerate proto file --- vm/systemSmartContracts/governance.pb.go | 123 +++++++++++------------ 1 file changed, 61 insertions(+), 62 deletions(-) diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index e8915ee225f..6e6009fc1ea 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -7,6 +7,9 @@ import ( bytes "bytes" encoding_binary "encoding/binary" fmt "fmt" + _ "github.com/gogo/protobuf/gogoproto" + proto "github.com/gogo/protobuf/proto" + github_com_multiversx_mx_chain_core_go_data "github.com/multiversx/mx-chain-core-go/data" io "io" math "math" math_big "math/big" @@ -14,10 +17,6 @@ import ( reflect "reflect" strconv "strconv" strings "strings" - - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_multiversx_mx_chain_core_go_data "github.com/multiversx/mx-chain-core-go/data" ) // Reference imports to suppress errors if they are not otherwise used. @@ -385,8 +384,8 @@ func (m *OngoingVotedList) GetDelegated() []uint64 { type DelegatedSCVoteInfo struct { TotalPower *math_big.Int `protobuf:"bytes,1,opt,name=TotalPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalPower"` UsedPower *math_big.Int `protobuf:"bytes,2,opt,name=UsedPower,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` - TotalStake *math_big.Int `protobuf:"bytes,3,opt,name=TotalStake,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` - UsedStake *math_big.Int `protobuf:"bytes,4,opt,name=UsedStake,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedPower"` + TotalStake *math_big.Int `protobuf:"bytes,3,opt,name=TotalStake,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"TotalStake"` + UsedStake *math_big.Int `protobuf:"bytes,4,opt,name=UsedStake,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"UsedStake"` } func (m *DelegatedSCVoteInfo) Reset() { *m = DelegatedSCVoteInfo{} } @@ -457,62 +456,62 @@ func init() { func init() { proto.RegisterFile("governance.proto", fileDescriptor_e18a03da5266c714) } var fileDescriptor_e18a03da5266c714 = []byte{ - // 876 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4f, 0x8f, 0xe3, 0x34, - 0x1c, 0x6d, 0x9a, 0x76, 0xfe, 0x78, 0x3a, 0x4b, 0xd6, 0x2c, 0x52, 0xc4, 0x21, 0x1e, 0xf5, 0x54, - 0x81, 0xa6, 0x95, 0x00, 0x69, 0x25, 0xb8, 0xb0, 0xe9, 0x2e, 0xcb, 0x48, 0xbb, 0xdd, 0xd9, 0x4c, - 0x29, 0x2c, 0x17, 0xe4, 0x36, 0x9e, 0x34, 0xa2, 0xb1, 0x47, 0xb6, 0x33, 0xbb, 0x8b, 0x84, 0xc4, - 0x89, 0x33, 0x1f, 0x03, 0xf1, 0x49, 0x38, 0xce, 0x71, 0x4e, 0x81, 0xc9, 0x5c, 0x20, 0xe2, 0xb0, - 0xe2, 0x13, 0x20, 0x3b, 0x6d, 0x93, 0x4c, 0x4f, 0x2b, 0xb2, 0x7b, 0xb2, 0x7f, 0xcf, 0xf6, 0x7b, - 0xf1, 0xb3, 0x7f, 0xf9, 0x19, 0x58, 0x01, 0x3b, 0x27, 0x9c, 0x62, 0x3a, 0x23, 0xfd, 0x33, 0xce, - 0x24, 0x83, 0x6d, 0xdd, 0xbc, 0x7f, 0x18, 0x84, 0x72, 0x1e, 0x4f, 0xfb, 0x33, 0x16, 0x0d, 0x02, - 0x16, 0xb0, 0x81, 0x86, 0xa7, 0xf1, 0xa9, 0x8e, 0x74, 0xa0, 0x7b, 0xf9, 0xaa, 0xee, 0x3f, 0xdb, - 0xe0, 0x9d, 0x87, 0x84, 0x12, 0x8e, 0x17, 0xc7, 0x9c, 0x9d, 0x31, 0x81, 0x17, 0x10, 0x81, 0xf6, - 0x88, 0xd1, 0x19, 0xb1, 0x8d, 0x03, 0xa3, 0xd7, 0x72, 0x77, 0xb3, 0x04, 0xe5, 0x80, 0x97, 0x37, - 0xb0, 0x0f, 0xc0, 0x90, 0x45, 0x51, 0x28, 0xbf, 0xc4, 0x62, 0x6e, 0x37, 0x0f, 0x8c, 0x5e, 0xc7, - 0xbd, 0x95, 0x25, 0xa8, 0x84, 0x7a, 0xa5, 0x3e, 0xfc, 0x14, 0xdc, 0x3a, 0x91, 0x98, 0xcb, 0x09, - 0x93, 0x24, 0x67, 0x36, 0x35, 0x33, 0xcc, 0x12, 0x74, 0x63, 0xc4, 0xbb, 0x11, 0xc3, 0x4f, 0x40, - 0xe7, 0x01, 0xf5, 0x8b, 0x95, 0x2d, 0xbd, 0xd2, 0xca, 0x12, 0x54, 0xc1, 0xbd, 0x4a, 0x04, 0xa7, - 0xc0, 0x7c, 0x46, 0x84, 0xdd, 0xd6, 0x9f, 0x76, 0x9c, 0x25, 0x48, 0x85, 0xbf, 0xfd, 0x81, 0x1e, - 0x44, 0x58, 0xce, 0x07, 0xd3, 0x30, 0xe8, 0x1f, 0x51, 0xf9, 0x59, 0xc9, 0xaa, 0x28, 0x5e, 0xc8, - 0xf0, 0x9c, 0x70, 0xf1, 0x62, 0x10, 0xbd, 0x38, 0x9c, 0xcd, 0x71, 0x48, 0x0f, 0x67, 0x8c, 0x93, - 0xc3, 0x80, 0x0d, 0x7c, 0x2c, 0x71, 0xdf, 0x0d, 0x83, 0x23, 0x2a, 0x87, 0x58, 0x48, 0xc2, 0x3d, - 0xc5, 0x06, 0xbf, 0x03, 0xcd, 0x11, 0xb3, 0xb7, 0xb4, 0xc4, 0x93, 0x2c, 0x41, 0xcd, 0x11, 0xab, - 0x4f, 0xa1, 0x39, 0x62, 0x90, 0x80, 0xd6, 0x84, 0x48, 0x66, 0x6f, 0x6b, 0x89, 0xa7, 0x59, 0x82, - 0x74, 0x5c, 0x9f, 0x88, 0xa6, 0x83, 0x14, 0x6c, 0xdf, 0x9b, 0x0a, 0x89, 0x43, 0x6a, 0xef, 0x68, - 0xa5, 0x71, 0x96, 0xa0, 0x15, 0x54, 0x9f, 0xd8, 0x8a, 0x11, 0xfe, 0x00, 0xf6, 0x9e, 0xc6, 0x8c, - 0xc7, 0xd1, 0x89, 0xc4, 0xdf, 0x13, 0x7b, 0x57, 0x6b, 0x7e, 0x93, 0x25, 0xa8, 0x0c, 0xd7, 0xa7, - 0x5b, 0x66, 0x85, 0x5d, 0xb0, 0x75, 0x8c, 0x85, 0x20, 0xbe, 0x0d, 0x0e, 0x8c, 0xde, 0x8e, 0x0b, - 0xb2, 0x04, 0x2d, 0x11, 0x6f, 0xd9, 0xaa, 0x39, 0xc3, 0x05, 0x53, 0x73, 0xf6, 0x8a, 0x39, 0x39, - 0xe2, 0x2d, 0x5b, 0x78, 0x17, 0xec, 0x1f, 0x09, 0x11, 0x13, 0x7e, 0xcf, 0xf7, 0x39, 0x11, 0xc2, - 0xee, 0xe8, 0x5d, 0xdc, 0xce, 0x12, 0x54, 0x1d, 0xf0, 0xaa, 0x21, 0xfc, 0x11, 0x74, 0x56, 0x79, - 0x36, 0x64, 0x42, 0xda, 0xfb, 0x7a, 0xdd, 0x33, 0x75, 0x9d, 0xcb, 0x78, 0x7d, 0xdb, 0xaf, 0xd0, - 0x76, 0xff, 0x6e, 0x02, 0xeb, 0xe1, 0xfa, 0xcf, 0x31, 0x64, 0xf4, 0x34, 0x0c, 0x60, 0x0f, 0xec, - 0x8c, 0xe2, 0x68, 0xc4, 0x7c, 0x22, 0x74, 0xca, 0x9b, 0x6e, 0x27, 0x4b, 0xd0, 0x1a, 0xf3, 0xd6, - 0x3d, 0xf8, 0x21, 0xd8, 0x7d, 0x1c, 0xd2, 0xdc, 0x50, 0x9d, 0xf7, 0x6d, 0x77, 0x3f, 0x4b, 0x50, - 0x01, 0x7a, 0x45, 0x17, 0x7e, 0x0e, 0xac, 0xc7, 0x21, 0x55, 0xa6, 0x8e, 0xe7, 0x9c, 0x88, 0x39, - 0x5b, 0xf8, 0x3a, 0xef, 0xdb, 0xee, 0x9d, 0x2c, 0x41, 0x1b, 0x63, 0xde, 0x06, 0xb2, 0x64, 0x50, - 0x97, 0xb4, 0x60, 0x68, 0x55, 0x18, 0x2a, 0x63, 0xde, 0x06, 0xa2, 0xee, 0xda, 0x6a, 0xff, 0x5f, - 0x10, 0xb2, 0xfc, 0x1f, 0xe8, 0xbb, 0x56, 0x82, 0x6b, 0xbc, 0x6b, 0x25, 0xd6, 0xee, 0xcf, 0x26, - 0x80, 0x37, 0xbd, 0x9e, 0x7c, 0x54, 0xf5, 0x50, 0xd9, 0xdd, 0x7c, 0x4d, 0x0f, 0x9b, 0x7a, 0xcd, - 0xff, 0xf1, 0xd0, 0xac, 0x30, 0xbc, 0xa6, 0x87, 0xad, 0xb7, 0xe8, 0x21, 0x1c, 0x82, 0xdb, 0x8f, - 0xb0, 0x90, 0x2b, 0x28, 0x2f, 0x01, 0x6d, 0x5d, 0x02, 0xde, 0xcb, 0x12, 0xb4, 0x39, 0xe8, 0x6d, - 0x42, 0xdd, 0x19, 0xb0, 0x9e, 0xd0, 0x80, 0x85, 0x34, 0x50, 0x05, 0xc2, 0x7f, 0x14, 0x0a, 0xa9, - 0x92, 0xfc, 0x7e, 0xc8, 0xc9, 0x4c, 0xda, 0xc6, 0x81, 0xd9, 0x6b, 0xe5, 0x49, 0x9e, 0x23, 0xde, - 0xb2, 0x55, 0x27, 0x75, 0x9f, 0x2c, 0x48, 0x80, 0x25, 0x51, 0xae, 0xab, 0x69, 0xfa, 0xa4, 0xd6, - 0xa0, 0x57, 0x74, 0xbb, 0xff, 0x9a, 0xe0, 0xdd, 0x75, 0x74, 0x32, 0x54, 0x4a, 0x47, 0xf4, 0x94, - 0xc1, 0xe7, 0x00, 0x8c, 0x99, 0xc4, 0x8b, 0x63, 0xf6, 0x9c, 0x70, 0x7d, 0xde, 0x1d, 0xf7, 0x6b, - 0x55, 0x2b, 0x0b, 0xb4, 0x3e, 0xef, 0x4a, 0xa4, 0x50, 0x82, 0xdd, 0xaf, 0x04, 0xf1, 0x73, 0xdd, - 0xbc, 0x46, 0x4f, 0xd4, 0xd7, 0xaf, 0xc1, 0xfa, 0x64, 0x0b, 0x4e, 0x78, 0xbe, 0xdc, 0x6e, 0xfe, - 0x6f, 0x37, 0xdf, 0xa8, 0x6c, 0x49, 0x69, 0xb5, 0xdb, 0x5c, 0xb6, 0xf5, 0xe6, 0x77, 0xab, 0x85, - 0x3e, 0xb8, 0x0b, 0xf6, 0xd5, 0x41, 0x4f, 0xf0, 0x22, 0x26, 0xe3, 0x97, 0x67, 0x04, 0x6e, 0xeb, - 0x77, 0x87, 0xd5, 0x80, 0x5b, 0xea, 0x71, 0x60, 0x19, 0x70, 0x27, 0xaf, 0xe1, 0x56, 0x13, 0xee, - 0xad, 0xcb, 0xac, 0x65, 0xba, 0xa3, 0x8b, 0x2b, 0xa7, 0x71, 0x79, 0xe5, 0x34, 0x5e, 0x5d, 0x39, - 0xc6, 0x4f, 0xa9, 0x63, 0xfc, 0x9a, 0x3a, 0xc6, 0xef, 0xa9, 0x63, 0x5c, 0xa4, 0x8e, 0x71, 0x99, - 0x3a, 0xc6, 0x9f, 0xa9, 0x63, 0xfc, 0x95, 0x3a, 0x8d, 0x57, 0xa9, 0x63, 0xfc, 0x72, 0xed, 0x34, - 0x2e, 0xae, 0x9d, 0xc6, 0xe5, 0xb5, 0xd3, 0xf8, 0xf6, 0x8e, 0x78, 0x29, 0x24, 0x89, 0x4e, 0x22, - 0xcc, 0xe5, 0x90, 0x51, 0xc9, 0xf1, 0x4c, 0x8a, 0xe9, 0x96, 0x7e, 0xcd, 0x7d, 0xfc, 0x5f, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xc9, 0x44, 0x3e, 0xaf, 0x17, 0x0a, 0x00, 0x00, + // 878 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4d, 0x8f, 0xe3, 0x34, + 0x18, 0x6e, 0x9a, 0x76, 0x3e, 0x3c, 0x9d, 0x25, 0x6b, 0x16, 0x29, 0xe2, 0x10, 0x8f, 0x7a, 0xaa, + 0x40, 0xd3, 0x4a, 0x80, 0xb4, 0x12, 0x5c, 0xd8, 0x74, 0x97, 0x65, 0xa4, 0xdd, 0xee, 0x6c, 0x66, + 0x28, 0x2c, 0x17, 0xe4, 0x36, 0x9e, 0x34, 0xa2, 0xb1, 0x47, 0xb6, 0xb3, 0x1f, 0x48, 0x48, 0x9c, + 0x38, 0xf3, 0x33, 0x10, 0xbf, 0x84, 0xe3, 0x1c, 0xe7, 0x14, 0x98, 0xcc, 0x05, 0x22, 0x0e, 0x2b, + 0xf1, 0x07, 0x90, 0x9d, 0x36, 0x1f, 0xd3, 0xd3, 0x8a, 0x68, 0x4f, 0xf6, 0xfb, 0xd8, 0x7e, 0x9e, + 0xbc, 0x8f, 0x3f, 0xde, 0x00, 0x2b, 0x60, 0xcf, 0x09, 0xa7, 0x98, 0xce, 0xc9, 0xf0, 0x9c, 0x33, + 0xc9, 0x60, 0x57, 0x37, 0xef, 0x1f, 0x06, 0xa1, 0x5c, 0xc4, 0xb3, 0xe1, 0x9c, 0x45, 0xa3, 0x80, + 0x05, 0x6c, 0xa4, 0xe1, 0x59, 0x7c, 0xa6, 0x23, 0x1d, 0xe8, 0x5e, 0xbe, 0xaa, 0xff, 0xcf, 0x36, + 0x78, 0xe7, 0x21, 0xa1, 0x84, 0xe3, 0xe5, 0x31, 0x67, 0xe7, 0x4c, 0xe0, 0x25, 0x44, 0xa0, 0x3b, + 0x61, 0x74, 0x4e, 0x6c, 0xe3, 0xc0, 0x18, 0x74, 0xdc, 0xdd, 0x2c, 0x41, 0x39, 0xe0, 0xe5, 0x0d, + 0x1c, 0x02, 0x30, 0x66, 0x51, 0x14, 0xca, 0x2f, 0xb1, 0x58, 0xd8, 0xed, 0x03, 0x63, 0xd0, 0x73, + 0x6f, 0x65, 0x09, 0xaa, 0xa0, 0x5e, 0xa5, 0x0f, 0x3f, 0x05, 0xb7, 0x4e, 0x24, 0xe6, 0x72, 0xca, + 0x24, 0xc9, 0x99, 0x4d, 0xcd, 0x0c, 0xb3, 0x04, 0xdd, 0x18, 0xf1, 0x6e, 0xc4, 0xf0, 0x13, 0xd0, + 0x7b, 0x40, 0xfd, 0x72, 0x65, 0x47, 0xaf, 0xb4, 0xb2, 0x04, 0xd5, 0x70, 0xaf, 0x16, 0xc1, 0x19, + 0x30, 0x9f, 0x11, 0x61, 0x77, 0xf5, 0xa7, 0x1d, 0x67, 0x09, 0x52, 0xe1, 0x6f, 0x7f, 0xa0, 0x07, + 0x11, 0x96, 0x8b, 0xd1, 0x2c, 0x0c, 0x86, 0x47, 0x54, 0x7e, 0x56, 0xb1, 0x2a, 0x8a, 0x97, 0x32, + 0x7c, 0x4e, 0xb8, 0x78, 0x39, 0x8a, 0x5e, 0x1e, 0xce, 0x17, 0x38, 0xa4, 0x87, 0x73, 0xc6, 0xc9, + 0x61, 0xc0, 0x46, 0x3e, 0x96, 0x78, 0xe8, 0x86, 0xc1, 0x11, 0x95, 0x63, 0x2c, 0x24, 0xe1, 0x9e, + 0x62, 0x83, 0xdf, 0x81, 0xf6, 0x84, 0xd9, 0x5b, 0x5a, 0xe2, 0x49, 0x96, 0xa0, 0xf6, 0x84, 0x35, + 0xa7, 0xd0, 0x9e, 0x30, 0x48, 0x40, 0x67, 0x4a, 0x24, 0xb3, 0xb7, 0xb5, 0xc4, 0xd3, 0x2c, 0x41, + 0x3a, 0x6e, 0x4e, 0x44, 0xd3, 0x41, 0x0a, 0xb6, 0xef, 0xcd, 0x84, 0xc4, 0x21, 0xb5, 0x77, 0xb4, + 0xd2, 0x69, 0x96, 0xa0, 0x35, 0xd4, 0x9c, 0xd8, 0x9a, 0x11, 0xfe, 0x00, 0xf6, 0x9e, 0xc6, 0x8c, + 0xc7, 0xd1, 0x89, 0xc4, 0xdf, 0x13, 0x7b, 0x57, 0x6b, 0x7e, 0x93, 0x25, 0xa8, 0x0a, 0x37, 0xa7, + 0x5b, 0x65, 0x85, 0x7d, 0xb0, 0x75, 0x8c, 0x85, 0x20, 0xbe, 0x0d, 0x0e, 0x8c, 0xc1, 0x8e, 0x0b, + 0xb2, 0x04, 0xad, 0x10, 0x6f, 0xd5, 0xaa, 0x39, 0xe3, 0x25, 0x53, 0x73, 0xf6, 0xca, 0x39, 0x39, + 0xe2, 0xad, 0x5a, 0x78, 0x17, 0xec, 0x1f, 0x09, 0x11, 0x13, 0x7e, 0xcf, 0xf7, 0x39, 0x11, 0xc2, + 0xee, 0xe9, 0x2c, 0x6e, 0x67, 0x09, 0xaa, 0x0f, 0x78, 0xf5, 0x10, 0xfe, 0x08, 0x7a, 0xeb, 0x7b, + 0x36, 0x66, 0x42, 0xda, 0xfb, 0x7a, 0xdd, 0x33, 0x75, 0x9c, 0xab, 0x78, 0x73, 0xe9, 0xd7, 0x68, + 0xfb, 0x7f, 0xb7, 0x81, 0xf5, 0xb0, 0x78, 0x39, 0xc6, 0x8c, 0x9e, 0x85, 0x01, 0x1c, 0x80, 0x9d, + 0x49, 0x1c, 0x4d, 0x98, 0x4f, 0x84, 0xbe, 0xf2, 0xa6, 0xdb, 0xcb, 0x12, 0x54, 0x60, 0x5e, 0xd1, + 0x83, 0x1f, 0x82, 0xdd, 0xc7, 0x21, 0xcd, 0x0d, 0xd5, 0xf7, 0xbe, 0xeb, 0xee, 0x67, 0x09, 0x2a, + 0x41, 0xaf, 0xec, 0xc2, 0xcf, 0x81, 0xf5, 0x38, 0xa4, 0xca, 0xd4, 0xd3, 0x05, 0x27, 0x62, 0xc1, + 0x96, 0xbe, 0xbe, 0xf7, 0x5d, 0xf7, 0x4e, 0x96, 0xa0, 0x8d, 0x31, 0x6f, 0x03, 0x59, 0x31, 0xa8, + 0x43, 0x5a, 0x32, 0x74, 0x6a, 0x0c, 0xb5, 0x31, 0x6f, 0x03, 0x51, 0x67, 0x6d, 0x9d, 0xff, 0x17, + 0x84, 0xac, 0xde, 0x03, 0x7d, 0xd6, 0x2a, 0x70, 0x83, 0x67, 0xad, 0xc2, 0xda, 0xff, 0xd9, 0x04, + 0xf0, 0xa6, 0xd7, 0xd3, 0x8f, 0xea, 0x1e, 0x2a, 0xbb, 0xdb, 0x6f, 0xe8, 0x61, 0x5b, 0xaf, 0xf9, + 0x3f, 0x1e, 0x9a, 0x35, 0x86, 0x37, 0xf4, 0xb0, 0xf3, 0x16, 0x3d, 0x84, 0x63, 0x70, 0xfb, 0x11, + 0x16, 0x72, 0x0d, 0xe5, 0x25, 0xa0, 0xab, 0x4b, 0xc0, 0x7b, 0x59, 0x82, 0x36, 0x07, 0xbd, 0x4d, + 0xa8, 0x3f, 0x07, 0xd6, 0x13, 0x1a, 0xb0, 0x90, 0x06, 0xaa, 0x40, 0xf8, 0x8f, 0x42, 0x21, 0xd5, + 0x25, 0xbf, 0x1f, 0x72, 0x32, 0x97, 0xb6, 0x71, 0x60, 0x0e, 0x3a, 0xf9, 0x25, 0xcf, 0x11, 0x6f, + 0xd5, 0xaa, 0x9d, 0xba, 0x4f, 0x96, 0x24, 0xc0, 0x92, 0x28, 0xd7, 0xd5, 0x34, 0xbd, 0x53, 0x05, + 0xe8, 0x95, 0xdd, 0xfe, 0xbf, 0x26, 0x78, 0xb7, 0x88, 0x4e, 0xc6, 0x4a, 0xe9, 0x88, 0x9e, 0x31, + 0xf8, 0x02, 0x80, 0x53, 0x26, 0xf1, 0xf2, 0x98, 0xbd, 0x20, 0x5c, 0xef, 0x77, 0xcf, 0xfd, 0x5a, + 0xd5, 0xca, 0x12, 0x6d, 0xce, 0xbb, 0x0a, 0x29, 0x94, 0x60, 0xf7, 0x2b, 0x41, 0xfc, 0x5c, 0x37, + 0xaf, 0xd1, 0x53, 0xf5, 0xf5, 0x05, 0xd8, 0x9c, 0x6c, 0xc9, 0x59, 0xa4, 0x9b, 0xbf, 0xed, 0xe6, + 0x8d, 0x74, 0x1b, 0x7e, 0xda, 0x2b, 0xa4, 0xeb, 0x74, 0x73, 0xdd, 0x4e, 0x3d, 0xdd, 0x86, 0x65, + 0x4b, 0xce, 0x0f, 0xee, 0x82, 0x7d, 0xb5, 0xd3, 0x53, 0xbc, 0x8c, 0xc9, 0xe9, 0xab, 0x73, 0x02, + 0xb7, 0xf5, 0x8f, 0x87, 0xd5, 0x82, 0x5b, 0xea, 0xef, 0xc0, 0x32, 0xe0, 0x4e, 0x5e, 0xc4, 0xad, + 0x36, 0xdc, 0x2b, 0xea, 0xac, 0x65, 0xba, 0x93, 0x8b, 0x2b, 0xa7, 0x75, 0x79, 0xe5, 0xb4, 0x5e, + 0x5f, 0x39, 0xc6, 0x4f, 0xa9, 0x63, 0xfc, 0x9a, 0x3a, 0xc6, 0xef, 0xa9, 0x63, 0x5c, 0xa4, 0x8e, + 0x71, 0x99, 0x3a, 0xc6, 0x9f, 0xa9, 0x63, 0xfc, 0x95, 0x3a, 0xad, 0xd7, 0xa9, 0x63, 0xfc, 0x72, + 0xed, 0xb4, 0x2e, 0xae, 0x9d, 0xd6, 0xe5, 0xb5, 0xd3, 0xfa, 0xf6, 0x8e, 0x78, 0x25, 0x24, 0x89, + 0x4e, 0x22, 0xcc, 0xe5, 0x98, 0x51, 0xc9, 0xf1, 0x5c, 0x8a, 0xd9, 0x96, 0xfe, 0x9d, 0xfb, 0xf8, + 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x61, 0x13, 0x65, 0x18, 0x0a, 0x00, 0x00, } func (x VoteValueType) String() string { From 17c033235a1771c2f2b037dc3d933d5b02f74646 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 23 Jan 2023 13:00:36 +0200 Subject: [PATCH 145/335] added gas cost --- cmd/node/config/gasSchedules/gasScheduleV1.toml | 1 + cmd/node/config/gasSchedules/gasScheduleV2.toml | 1 + cmd/node/config/gasSchedules/gasScheduleV3.toml | 1 + cmd/node/config/gasSchedules/gasScheduleV4.toml | 1 + cmd/node/config/gasSchedules/gasScheduleV5.toml | 1 + cmd/node/config/gasSchedules/gasScheduleV6.toml | 1 + cmd/node/config/gasSchedules/gasScheduleV7.toml | 3 ++- process/factory/metachain/vmContainerFactory_test.go | 1 + testscommon/components/components.go | 1 + vm/gasCost.go | 1 + vm/systemSmartContracts/defaults/gasMap.go | 1 + vm/systemSmartContracts/eei.go | 3 --- vm/systemSmartContracts/governance.go | 8 ++++---- vm/systemSmartContracts/governance_test.go | 10 +++++----- 14 files changed, 21 insertions(+), 13 deletions(-) diff --git a/cmd/node/config/gasSchedules/gasScheduleV1.toml b/cmd/node/config/gasSchedules/gasScheduleV1.toml index 6553ceb9269..2d3e1b1d367 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV1.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV1.toml @@ -36,6 +36,7 @@ UnstakeTokens = 5000000 UnbondTokens = 5000000 DelegationMgrOps = 50000000 + GetActiveFund = 50000 ValidatorToDelegation = 500000000 GetAllNodeStates = 100000000 FixWaitingListSize = 500000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV2.toml b/cmd/node/config/gasSchedules/gasScheduleV2.toml index 4f9da0c70ce..ff8c077f833 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV2.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV2.toml @@ -35,6 +35,7 @@ DelegationOps = 1000000 UnstakeTokens = 5000000 UnbondTokens = 5000000 + GetActiveFund = 50000 DelegationMgrOps = 50000000 ValidatorToDelegation = 500000000 GetAllNodeStates = 100000000 diff --git a/cmd/node/config/gasSchedules/gasScheduleV3.toml b/cmd/node/config/gasSchedules/gasScheduleV3.toml index 9571bddb584..9be43b47597 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV3.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV3.toml @@ -38,6 +38,7 @@ GetAllNodeStates = 20000000 UnstakeTokens = 5000000 UnbondTokens = 5000000 + GetActiveFund = 50000 FixWaitingListSize = 500000000 [BaseOperationCost] diff --git a/cmd/node/config/gasSchedules/gasScheduleV4.toml b/cmd/node/config/gasSchedules/gasScheduleV4.toml index dadcd264502..50c01ea1648 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV4.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV4.toml @@ -38,6 +38,7 @@ GetAllNodeStates = 20000000 UnstakeTokens = 5000000 UnbondTokens = 5000000 + GetActiveFund = 50000 FixWaitingListSize = 500000000 [BaseOperationCost] diff --git a/cmd/node/config/gasSchedules/gasScheduleV5.toml b/cmd/node/config/gasSchedules/gasScheduleV5.toml index 6ba7ed70af0..5c883610f50 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV5.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV5.toml @@ -38,6 +38,7 @@ GetAllNodeStates = 20000000 UnstakeTokens = 5000000 UnbondTokens = 5000000 + GetActiveFund = 50000 FixWaitingListSize = 500000000 [BaseOperationCost] diff --git a/cmd/node/config/gasSchedules/gasScheduleV6.toml b/cmd/node/config/gasSchedules/gasScheduleV6.toml index cc69a1bc1e9..79bd2edffcf 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV6.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV6.toml @@ -38,6 +38,7 @@ GetAllNodeStates = 20000000 UnstakeTokens = 5000000 UnbondTokens = 5000000 + GetActiveFund = 50000 FixWaitingListSize = 500000000 [BaseOperationCost] diff --git a/cmd/node/config/gasSchedules/gasScheduleV7.toml b/cmd/node/config/gasSchedules/gasScheduleV7.toml index 9f395424c19..f22e0e282e0 100644 --- a/cmd/node/config/gasSchedules/gasScheduleV7.toml +++ b/cmd/node/config/gasSchedules/gasScheduleV7.toml @@ -32,13 +32,14 @@ ESDTIssue = 50000000 ESDTOperations = 50000000 Proposal = 50000000 - Vote = 50000000 + Vote = 5000000 DelegateVote = 50000000 RevokeVote = 50000000 CloseProposal = 50000000 GetAllNodeStates = 20000000 UnstakeTokens = 5000000 UnbondTokens = 5000000 + GetActiveFund = 50000 FixWaitingListSize = 500000000 [BaseOperationCost] diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index a821ff1b1f7..ddb56982655 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -411,6 +411,7 @@ func FillGasMapMetaChainSystemSCsCosts(value uint64) map[string]uint64 { gasMap["DelegationMgrOps"] = value gasMap["GetAllNodeStates"] = value gasMap["ValidatorToDelegation"] = value + gasMap["GetActiveFund"] = value gasMap["FixWaitingListSize"] = value return gasMap diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 471a8f4285d..041c28648b5 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -809,6 +809,7 @@ func FillGasMapMetaChainSystemSCsCosts(value uint64) map[string]uint64 { gasMap["DelegationMgrOps"] = value gasMap["GetAllNodeStates"] = value gasMap["ValidatorToDelegation"] = value + gasMap["GetActiveFund"] = value gasMap["FixWaitingListSize"] = value return gasMap diff --git a/vm/gasCost.go b/vm/gasCost.go index 57762655960..33254a1a204 100644 --- a/vm/gasCost.go +++ b/vm/gasCost.go @@ -34,6 +34,7 @@ type MetaChainSystemSCsCost struct { DelegationMgrOps uint64 ValidatorToDelegation uint64 GetAllNodeStates uint64 + GetActiveFund uint64 FixWaitingListSize uint64 } diff --git a/vm/systemSmartContracts/defaults/gasMap.go b/vm/systemSmartContracts/defaults/gasMap.go index 9137f03cc35..62298a9d6ca 100644 --- a/vm/systemSmartContracts/defaults/gasMap.go +++ b/vm/systemSmartContracts/defaults/gasMap.go @@ -75,6 +75,7 @@ func FillGasMapMetaChainSystemSCsCosts(value uint64) map[string]uint64 { gasMap["DelegationMgrOps"] = value gasMap["GetAllNodeStates"] = value gasMap["ValidatorToDelegation"] = value + gasMap["GetActiveFund"] = value gasMap["FixWaitingListSize"] = value return gasMap diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 731f0dbe7d2..da63fc9844b 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -120,7 +120,6 @@ func (host *vmContext) GetContract(address []byte) (vm.SystemSmartContract, erro // GetStorageFromAddress gets the storage from address and key func (host *vmContext) GetStorageFromAddress(address []byte, key []byte) []byte { - log.Error(string(address) + " " + string(key)) storageAdrMap, exists := host.storageUpdate[string(address)] if exists { if value, isInMap := storageAdrMap[string(key)]; isInMap { @@ -151,8 +150,6 @@ func (host *vmContext) SetStorageForAddress(address []byte, key []byte, value [] length := len(value) host.storageUpdate[strAdr][string(key)] = make([]byte, length) copy(host.storageUpdate[strAdr][string(key)][:length], value[:length]) - - log.Warn(strAdr + " " + string(key) + " " + string(value)) } // SetStorage saves the key value storage under the address diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 1e52bab6428..0e76fcfe50e 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -219,17 +219,17 @@ func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmco g.eei.AddReturnMessage("changeConfig first argument is incorrectly formatted") return vmcommon.UserError } - minQuorum, err := convertDecimalToPercentage(args.Arguments[0]) + minQuorum, err := convertDecimalToPercentage(args.Arguments[1]) if err != nil { g.eei.AddReturnMessage(err.Error() + " minQuorum") return vmcommon.UserError } - minVeto, err := convertDecimalToPercentage(args.Arguments[0]) + minVeto, err := convertDecimalToPercentage(args.Arguments[2]) if err != nil { g.eei.AddReturnMessage(err.Error() + " minVeto") return vmcommon.UserError } - minPass, err := convertDecimalToPercentage(args.Arguments[0]) + minPass, err := convertDecimalToPercentage(args.Arguments[3]) if err != nil { g.eei.AddReturnMessage(err.Error() + " minPass") return vmcommon.UserError @@ -692,7 +692,7 @@ func (g *governanceContract) computeTotalStakeAndVotingPower(address []byte) (*b return nil, nil, err } - err = g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Get * uint64(len(dContractList.Addresses))) + err = g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.GetActiveFund * uint64(len(dContractList.Addresses))) if err != nil { return nil, nil, err } diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index fa1db785b11..6d65ca154dc 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -328,7 +328,7 @@ func TestGovernanceContract_ChangeConfig(t *testing.T) { []byte("1"), []byte("10"), []byte("10"), - []byte("5"), + []byte("15"), } initInput := createVMInput(zero, "initV2", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) _ = gsc.Execute(initInput) @@ -435,7 +435,7 @@ func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, errSubstr) - errSubstr = "changeConfig second argument is incorrectly formatted" + errSubstr = "config incorrect minQuorum" callInputArgs = [][]byte{ []byte("1"), []byte("invalid"), @@ -448,7 +448,7 @@ func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, errSubstr) - errSubstr = "changeConfig third argument is incorrectly formatted" + errSubstr = "config incorrect minVeto" callInputArgs = [][]byte{ []byte("1"), []byte("10"), @@ -461,7 +461,7 @@ func TestGovernanceContract_ChangeConfigInvalidParams(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, errSubstr) - errSubstr = "changeConfig fourth argument is incorrectly formatted" + errSubstr = "config incorrect minPass" callInputArgs = [][]byte{ []byte("1"), []byte("10"), @@ -503,7 +503,7 @@ func TestGovernanceContract_ChangeConfigGetConfigErr(t *testing.T) { []byte("1"), []byte("10"), []byte("10"), - []byte("5"), + []byte("10"), } callInput := createVMInput(zero, "changeConfig", args.ConfigChangeAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) From f8070136c5b46a9fdbae1e55449dcdb269e1045e Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 23 Jan 2023 13:20:13 +0200 Subject: [PATCH 146/335] added gas cost --- vm/systemSmartContracts/eei.go | 10 +--------- vm/systemSmartContracts/governance.go | 8 +++++--- vm/systemSmartContracts/governance_test.go | 20 ++++++++++++++++---- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index da63fc9844b..b6ef17b6d63 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -167,18 +167,10 @@ func (host *vmContext) GetBalance(addr []byte) *big.Int { } account, err := host.blockChainHook.GetUserAccount(addr) - if err == state.ErrAccNotFound { - return big.NewInt(0) - } if err != nil { - return nil + return big.NewInt(0) } - host.outputAccounts[strAdr] = &vmcommon.OutputAccount{ - Balance: big.NewInt(0).Set(account.GetBalance()), - BalanceDelta: big.NewInt(0), - Address: addr} - return account.GetBalance() } diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 0e76fcfe50e..a911acff21f 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -716,7 +716,7 @@ func (g *governanceContract) computeTotalStakeAndVotingPower(address []byte) (*b } func (g *governanceContract) getTotalStakeInSystem() *big.Int { - return big.NewInt(100) + return g.eei.GetBalance(g.validatorSCAddress) } // computeEndResults computes if a proposal has passed or not based on votes accumulated @@ -726,8 +726,6 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error return err } - // core.GetIntTrimmedPercentageOfValue(totalRewards, e.rewardsHandler.ProtocolSustainabilityPercentage()) - totalVotes := big.NewInt(0).Add(proposal.Yes, proposal.No) totalVotes.Add(totalVotes, proposal.Veto) totalVotes.Add(totalVotes, proposal.Abstain) @@ -736,6 +734,7 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error minQuorumOutOfStake := core.GetIntTrimmedPercentageOfValue(totalStake, float64(baseConfig.MinQuorum)) if totalVotes.Cmp(minQuorumOutOfStake) == -1 { + g.eei.AddReturnMessage("Proposal did not reach minQuorum") proposal.Passed = false return nil } @@ -743,15 +742,18 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error minVetoOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, float64(baseConfig.MinVetoThreshold)) if proposal.Veto.Cmp(minVetoOfTotalVotes) >= 0 { proposal.Passed = false + g.eei.AddReturnMessage("Proposal vetoed") return nil } minPassOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, float64(baseConfig.MinPassThreshold)) if proposal.Yes.Cmp(minPassOfTotalVotes) >= 0 && proposal.Yes.Cmp(proposal.No) > 0 { + g.eei.AddReturnMessage("Proposal passed") proposal.Passed = true return nil } + g.eei.AddReturnMessage("Proposal rejected") proposal.Passed = false return nil } diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 6d65ca154dc..184c0f249a9 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -1415,6 +1415,7 @@ func TestGovernanceContract_ProposalExists(t *testing.T) { func TestComputeEndResults(t *testing.T) { t.Parallel() + retMessage := "" args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ GetStorageCalled: func(key []byte) []byte { @@ -1430,17 +1431,24 @@ func TestComputeEndResults(t *testing.T) { return nil }, + GetBalanceCalled: func(_ []byte) *big.Int { + return big.NewInt(100) + }, + AddReturnMessageCalled: func(msg string) { + retMessage = msg + }, } gsc, _ := NewGovernanceContract(args) didNotPassQuorum := &GeneralProposal{ - Yes: big.NewInt(50), + Yes: big.NewInt(20), No: big.NewInt(0), Veto: big.NewInt(0), Abstain: big.NewInt(10), } err := gsc.computeEndResults(didNotPassQuorum) require.Nil(t, err) + require.Equal(t, "Proposal did not reach minQuorum", retMessage) require.False(t, didNotPassQuorum.Passed) didNotPassVotes := &GeneralProposal{ @@ -1451,6 +1459,7 @@ func TestComputeEndResults(t *testing.T) { } err = gsc.computeEndResults(didNotPassVotes) require.Nil(t, err) + require.Equal(t, "Proposal rejected", retMessage) require.False(t, didNotPassVotes.Passed) didNotPassVotes2 := &GeneralProposal{ @@ -1461,25 +1470,28 @@ func TestComputeEndResults(t *testing.T) { } err = gsc.computeEndResults(didNotPassVotes2) require.Nil(t, err) + require.Equal(t, "Proposal rejected", retMessage) require.False(t, didNotPassVotes2.Passed) didNotPassVeto := &GeneralProposal{ Yes: big.NewInt(51), No: big.NewInt(50), - Veto: big.NewInt(30), + Veto: big.NewInt(70), Abstain: big.NewInt(10), } err = gsc.computeEndResults(didNotPassVeto) require.Nil(t, err) + require.Equal(t, "Proposal vetoed", retMessage) require.False(t, didNotPassVeto.Passed) pass := &GeneralProposal{ - Yes: big.NewInt(51), + Yes: big.NewInt(70), No: big.NewInt(50), - Veto: big.NewInt(29), + Veto: big.NewInt(10), Abstain: big.NewInt(10), } err = gsc.computeEndResults(pass) require.Nil(t, err) + require.Equal(t, "Proposal passed", retMessage) require.True(t, pass.Passed) } From 6fbbc902fbbcf50bdd90aa5546dfc570ce3e377b Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 25 Jan 2023 17:06:35 +0200 Subject: [PATCH 147/335] fix after review --- vm/errors.go | 4 +- vm/systemSmartContracts/governance.go | 75 +++++++++++++--------- vm/systemSmartContracts/governance.proto | 6 +- vm/systemSmartContracts/governance_test.go | 12 ++-- 4 files changed, 54 insertions(+), 43 deletions(-) diff --git a/vm/errors.go b/vm/errors.go index 6e155b60ca3..3de4f0ce131 100644 --- a/vm/errors.go +++ b/vm/errors.go @@ -130,8 +130,8 @@ var ErrNilSystemSCConfig = errors.New("nil system sc config") // ErrNilValidatorAccountsDB signals that nil validator accounts DB was provided var ErrNilValidatorAccountsDB = errors.New("nil validator accounts DB") -// ErrInvalidStartEndVoteNonce signals that invalid arguments where passed for start or end vote nonce -var ErrInvalidStartEndVoteNonce = errors.New("invalid start/end vote nonce") +// ErrInvalidStartEndVoteEpoch signals that invalid arguments where passed for start or end vote nonce +var ErrInvalidStartEndVoteEpoch = errors.New("invalid start/end vote nonce") // ErrEmptyStorage signals that the storage is empty for given key var ErrEmptyStorage = errors.New("storage is nil for given key") diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index a911acff21f..621b06d65c7 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -18,6 +18,7 @@ import ( ) const governanceConfigKey = "governanceConfig" +const noncePrefix = "n_" const proposalPrefix = "p_" const yesString = "yes" const noString = "no" @@ -198,8 +199,8 @@ func (g *governanceContract) initV2(args *vmcommon.ContractCallInput) vmcommon.R // changeConfig allows the owner to change the configuration for requesting proposals // args.Arguments[0] - proposalFee - as string // args.Arguments[1] - minQuorum - 0-10000 - represents percentage -// args.Arguments[1] - minVeto - 0-10000 - represents percentage -// args.Arguments[1] - minPass - 0-10000 - represents percentage +// args.Arguments[2] - minVeto - 0-10000 - represents percentage +// args.Arguments[3] - minPass - 0-10000 - represents percentage func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { if !bytes.Equal(g.changeConfigAddress, args.CallerAddr) { g.eei.AddReturnMessage("changeConfig can be called only by owner") @@ -215,7 +216,7 @@ func (g *governanceContract) changeConfig(args *vmcommon.ContractCallInput) vmco } proposalFee, okConvert := big.NewInt(0).SetString(string(args.Arguments[0]), conversionBase) - if !okConvert || proposalFee.Cmp(zero) < 0 { + if !okConvert || proposalFee.Cmp(zero) <= 0 { g.eei.AddReturnMessage("changeConfig first argument is incorrectly formatted") return vmcommon.UserError } @@ -295,7 +296,7 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon return vmcommon.UserError } - startVoteNonce, endVoteNonce, err := g.startEndNonceFromArguments(args.Arguments[1], args.Arguments[2]) + startVoteEpoch, endVoteEpoch, err := g.startEndEpochFromArguments(args.Arguments[1], args.Arguments[2]) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -304,8 +305,8 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon generalProposal := &GeneralProposal{ IssuerAddress: args.CallerAddr, CommitHash: commitHash, - StartVoteNonce: startVoteNonce, - EndVoteNonce: endVoteNonce, + startVoteEpoch: startVoteEpoch, + endVoteEpoch: endVoteEpoch, Yes: big.NewInt(0), No: big.NewInt(0), Veto: big.NewInt(0), @@ -321,7 +322,8 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon return vmcommon.UserError } - g.eei.SetStorage(big.NewInt(0).SetUint64(nextNonce).Bytes(), commitHash) + nonceKey := append([]byte(noncePrefix), big.NewInt(0).SetUint64(nextNonce).Bytes()...) + g.eei.SetStorage(nonceKey, commitHash) return vmcommon.Ok } @@ -474,7 +476,7 @@ func (g *governanceContract) addUserVote( totalStake *big.Int, direct bool, ) error { - nonce, err := nonceFromBytes(nonceAsBytes) + nonce, err := uint64FromBytes(nonceAsBytes) if err != nil { return err } @@ -571,22 +573,22 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.Ok } - currentNonce := g.eei.BlockChainHook().CurrentNonce() - if currentNonce < generalProposal.EndVoteNonce { - g.eei.AddReturnMessage(fmt.Sprintf("proposal can be closed only after nonce %d", generalProposal.EndVoteNonce)) + currentEpoch := g.eei.BlockChainHook().CurrentEpoch() + if currentEpoch < generalProposal.EndVoteEpoch { + g.eei.AddReturnMessage(fmt.Sprintf("proposal can be closed only after epoch %d", generalProposal.EndVoteEpoch)) return vmcommon.UserError } generalProposal.Closed = true err = g.computeEndResults(generalProposal) if err != nil { - g.eei.AddReturnMessage("computeEndResults error" + err.Error()) + g.eei.AddReturnMessage("computeEndResults error " + err.Error()) return vmcommon.UserError } err = g.saveGeneralProposal(proposal, generalProposal) if err != nil { - g.eei.AddReturnMessage("saveGeneralProposal error" + err.Error()) + g.eei.AddReturnMessage("saveGeneralProposal error " + err.Error()) return vmcommon.UserError } @@ -775,12 +777,16 @@ func (g *governanceContract) getActiveFundForDelegator(delegationAddress []byte, } marshaledData = g.eei.GetStorageFromAddress(delegationAddress, dData.ActiveFund) - activeFund := &Fund{Value: big.NewInt(0)} + activeFund := &Fund{} err = g.marshalizer.Unmarshal(activeFund, marshaledData) if err != nil { return nil, err } + if activeFund.Value == nil { + activeFund.Value = big.NewInt(0) + } + return activeFund.Value, nil } @@ -796,6 +802,10 @@ func (g *governanceContract) getTotalStake(validatorAddress []byte) (*big.Int, e return nil, err } + if validatorData.TotalStakeValue == nil { + validatorData.TotalStakeValue = big.NewInt(0) + } + return validatorData.TotalStakeValue, nil } @@ -911,18 +921,19 @@ func (g *governanceContract) saveGeneralProposal(reference []byte, generalPropos // getValidProposal returns a proposal from storage if it exists, or it is still valid/in-progress func (g *governanceContract) getValidProposal(nonce *big.Int) (*GeneralProposal, error) { - commitHash := g.eei.GetStorage(nonce.Bytes()) + nonceKey := append([]byte(noncePrefix), nonce.Bytes()...) + commitHash := g.eei.GetStorage(nonceKey) proposal, err := g.getGeneralProposal(commitHash) if err != nil { return nil, err } - currentNonce := g.eei.BlockChainHook().CurrentNonce() - if currentNonce < proposal.StartVoteNonce { + currentEpoch := g.eei.BlockChainHook().CurrentEpoch() + if currentEpoch < proposal.StartVoteEpoch { return nil, vm.ErrVotingNotStartedForProposal } - if currentNonce > proposal.EndVoteNonce { + if currentEpoch > proposal.EndVoteEpoch { return nil, vm.ErrVotedForAnExpiredProposal } @@ -954,36 +965,36 @@ func (g *governanceContract) proposalExists(reference []byte) bool { return len(marshaledData) > 0 } -// startEndNonceFromArguments converts the nonce string arguments to uint64 -func (g *governanceContract) startEndNonceFromArguments(argStart []byte, argEnd []byte) (uint64, uint64, error) { - startVoteNonce, err := nonceFromBytes(argStart) +// startEndEpochFromArguments converts the nonce string arguments to uint64 +func (g *governanceContract) startEndEpochFromArguments(argStart []byte, argEnd []byte) (uint64, uint64, error) { + startVoteEpoch, err := uint64FromBytes(argStart) if err != nil { return 0, 0, err } - endVoteNonce, err := nonceFromBytes(argEnd) + endVoteEpoch, err := uint64FromBytes(argEnd) if err != nil { return 0, 0, err } - currentNonce := g.eei.BlockChainHook().CurrentNonce() - if currentNonce > startVoteNonce.Uint64() || startVoteNonce.Uint64() > endVoteNonce.Uint64() { - return 0, 0, vm.ErrInvalidStartEndVoteNonce + currentEpoch := uint64(g.eei.BlockChainHook().CurrentEpoch()) + if currentEpoch > startVoteEpoch.Uint64() || startVoteEpoch.Uint64() > endVoteEpoch.Uint64() { + return 0, 0, vm.ErrInvalidStartEndVoteEpoch } - if endVoteNonce.Uint64()-startVoteNonce.Uint64() >= uint64(g.unBondPeriodInEpochs) { - return 0, 0, vm.ErrInvalidStartEndVoteNonce + if endVoteEpoch.Uint64()-startVoteEpoch.Uint64() >= uint64(g.unBondPeriodInEpochs) { + return 0, 0, vm.ErrInvalidStartEndVoteEpoch } - return startVoteNonce.Uint64(), endVoteNonce.Uint64(), nil + return startVoteEpoch.Uint64(), endVoteEpoch.Uint64(), nil } -// nonceFromBytes converts a byte array to a big.Int. Returns ErrInvalidStartEndVoteNonce for invalid values -func nonceFromBytes(nonce []byte) (*big.Int, error) { +// uint64FromBytes converts a byte array to a big.Int return error for invalid values +func uint64FromBytes(nonce []byte) (*big.Int, error) { voteNonce, okConvert := big.NewInt(0).SetString(string(nonce), conversionBase) if !okConvert { - return nil, vm.ErrInvalidStartEndVoteNonce + return nil, vm.ErrInvalidStartEndVoteEpoch } if !voteNonce.IsUint64() { - return nil, vm.ErrInvalidStartEndVoteNonce + return nil, vm.ErrInvalidStartEndVoteEpoch } return voteNonce, nil diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index 54395d6b093..2aad162228d 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -17,8 +17,8 @@ enum VoteValueType { message GeneralProposal { uint64 Nonce = 1 [(gogoproto.jsontag) = "Nonce"]; bytes CommitHash = 2 [(gogoproto.jsontag) = "CommitHash"]; - uint64 StartVoteNonce = 3 [(gogoproto.jsontag) = "StartVoteNonce"]; - uint64 EndVoteNonce = 4 [(gogoproto.jsontag) = "EndVoteNonce"]; + uint64 StartVoteEpoch = 3 [(gogoproto.jsontag) = "StartVoteNonce"]; + uint64 EndVoteEpoch = 4 [(gogoproto.jsontag) = "EndVoteNonce"]; bytes Yes = 5 [(gogoproto.jsontag) = "Yes", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes No = 6 [(gogoproto.jsontag) = "No", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes Veto = 7 [(gogoproto.jsontag) = "Veto", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; @@ -56,4 +56,4 @@ message DelegatedSCVoteInfo { bytes UsedPower = 2 [(gogoproto.jsontag) = "UsedPower", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes TotalStake = 3 [(gogoproto.jsontag) = "TotalStake", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes UsedStake = 4 [(gogoproto.jsontag) = "UsedStake", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; -} \ No newline at end of file +} diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 184c0f249a9..8a7a4692b55 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -602,7 +602,7 @@ func TestGovernanceContract_ProposalInvalidVoteNonce(t *testing.T) { callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Equal(t, eei.GetReturnMessage(), vm.ErrInvalidStartEndVoteNonce.Error()) + require.Equal(t, eei.GetReturnMessage(), vm.ErrInvalidStartEndVoteEpoch.Error()) } func TestGovernanceContract_ProposalOK(t *testing.T) { @@ -683,7 +683,7 @@ func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { return 16 } - nonce, _ := nonceFromBytes(voteArgs[0]) + nonce, _ := uint64FromBytes(voteArgs[0]) gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) @@ -713,7 +713,7 @@ func TestGovernanceContract_VoteInvalidVote(t *testing.T) { return 16 } - nonce, _ := nonceFromBytes(voteArgs[0]) + nonce, _ := uint64FromBytes(voteArgs[0]) gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) @@ -750,7 +750,7 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { []byte("yes"), } - nonce, _ := nonceFromBytes(voteArgs[0]) + nonce, _ := uint64FromBytes(voteArgs[0]) gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) @@ -788,7 +788,7 @@ func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { []byte("1"), []byte("yes"), } - nonce, _ := nonceFromBytes(voteArgs[0]) + nonce, _ := uint64FromBytes(voteArgs[0]) gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) @@ -839,7 +839,7 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { {1}, big.NewInt(10000).Bytes(), } - nonce, _ := nonceFromBytes(voteArgs[0]) + nonce, _ := uint64FromBytes(voteArgs[0]) gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) From 75d3ef1d76d836a5789c1b7920d48a485f28d957 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 25 Jan 2023 17:09:42 +0200 Subject: [PATCH 148/335] - regenerated gogo protobuf struct --- vm/systemSmartContracts/governance.pb.go | 161 ++++++++++++----------- 1 file changed, 81 insertions(+), 80 deletions(-) diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 6e6009fc1ea..07c67f0bd8d 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -60,8 +60,8 @@ func (VoteValueType) EnumDescriptor() ([]byte, []int) { type GeneralProposal struct { Nonce uint64 `protobuf:"varint,1,opt,name=Nonce,proto3" json:"Nonce"` CommitHash []byte `protobuf:"bytes,2,opt,name=CommitHash,proto3" json:"CommitHash"` - StartVoteNonce uint64 `protobuf:"varint,3,opt,name=StartVoteNonce,proto3" json:"StartVoteNonce"` - EndVoteNonce uint64 `protobuf:"varint,4,opt,name=EndVoteNonce,proto3" json:"EndVoteNonce"` + StartVoteEpoch uint64 `protobuf:"varint,3,opt,name=StartVoteEpoch,proto3" json:"StartVoteNonce"` + EndVoteEpoch uint64 `protobuf:"varint,4,opt,name=EndVoteEpoch,proto3" json:"EndVoteNonce"` Yes *math_big.Int `protobuf:"bytes,5,opt,name=Yes,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Yes"` No *math_big.Int `protobuf:"bytes,6,opt,name=No,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"No"` Veto *math_big.Int `protobuf:"bytes,7,opt,name=Veto,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Veto"` @@ -115,16 +115,16 @@ func (m *GeneralProposal) GetCommitHash() []byte { return nil } -func (m *GeneralProposal) GetStartVoteNonce() uint64 { +func (m *GeneralProposal) GetStartVoteEpoch() uint64 { if m != nil { - return m.StartVoteNonce + return m.StartVoteEpoch } return 0 } -func (m *GeneralProposal) GetEndVoteNonce() uint64 { +func (m *GeneralProposal) GetEndVoteEpoch() uint64 { if m != nil { - return m.EndVoteNonce + return m.EndVoteEpoch } return 0 } @@ -456,62 +456,63 @@ func init() { func init() { proto.RegisterFile("governance.proto", fileDescriptor_e18a03da5266c714) } var fileDescriptor_e18a03da5266c714 = []byte{ - // 878 bytes of a gzipped FileDescriptorProto + // 883 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4d, 0x8f, 0xe3, 0x34, 0x18, 0x6e, 0x9a, 0x76, 0x3e, 0x3c, 0x9d, 0x25, 0x6b, 0x16, 0x29, 0xe2, 0x10, 0x8f, 0x7a, 0xaa, - 0x40, 0xd3, 0x4a, 0x80, 0xb4, 0x12, 0x5c, 0xd8, 0x74, 0x97, 0x65, 0xa4, 0xdd, 0xee, 0x6c, 0x66, - 0x28, 0x2c, 0x17, 0xe4, 0x36, 0x9e, 0x34, 0xa2, 0xb1, 0x47, 0xb6, 0xb3, 0x1f, 0x48, 0x48, 0x9c, - 0x38, 0xf3, 0x33, 0x10, 0xbf, 0x84, 0xe3, 0x1c, 0xe7, 0x14, 0x98, 0xcc, 0x05, 0x22, 0x0e, 0x2b, - 0xf1, 0x07, 0x90, 0x9d, 0x36, 0x1f, 0xd3, 0xd3, 0x8a, 0x68, 0x4f, 0xf6, 0xfb, 0xd8, 0x7e, 0x9e, - 0xbc, 0x8f, 0x3f, 0xde, 0x00, 0x2b, 0x60, 0xcf, 0x09, 0xa7, 0x98, 0xce, 0xc9, 0xf0, 0x9c, 0x33, - 0xc9, 0x60, 0x57, 0x37, 0xef, 0x1f, 0x06, 0xa1, 0x5c, 0xc4, 0xb3, 0xe1, 0x9c, 0x45, 0xa3, 0x80, - 0x05, 0x6c, 0xa4, 0xe1, 0x59, 0x7c, 0xa6, 0x23, 0x1d, 0xe8, 0x5e, 0xbe, 0xaa, 0xff, 0xcf, 0x36, - 0x78, 0xe7, 0x21, 0xa1, 0x84, 0xe3, 0xe5, 0x31, 0x67, 0xe7, 0x4c, 0xe0, 0x25, 0x44, 0xa0, 0x3b, - 0x61, 0x74, 0x4e, 0x6c, 0xe3, 0xc0, 0x18, 0x74, 0xdc, 0xdd, 0x2c, 0x41, 0x39, 0xe0, 0xe5, 0x0d, - 0x1c, 0x02, 0x30, 0x66, 0x51, 0x14, 0xca, 0x2f, 0xb1, 0x58, 0xd8, 0xed, 0x03, 0x63, 0xd0, 0x73, - 0x6f, 0x65, 0x09, 0xaa, 0xa0, 0x5e, 0xa5, 0x0f, 0x3f, 0x05, 0xb7, 0x4e, 0x24, 0xe6, 0x72, 0xca, - 0x24, 0xc9, 0x99, 0x4d, 0xcd, 0x0c, 0xb3, 0x04, 0xdd, 0x18, 0xf1, 0x6e, 0xc4, 0xf0, 0x13, 0xd0, - 0x7b, 0x40, 0xfd, 0x72, 0x65, 0x47, 0xaf, 0xb4, 0xb2, 0x04, 0xd5, 0x70, 0xaf, 0x16, 0xc1, 0x19, - 0x30, 0x9f, 0x11, 0x61, 0x77, 0xf5, 0xa7, 0x1d, 0x67, 0x09, 0x52, 0xe1, 0x6f, 0x7f, 0xa0, 0x07, - 0x11, 0x96, 0x8b, 0xd1, 0x2c, 0x0c, 0x86, 0x47, 0x54, 0x7e, 0x56, 0xb1, 0x2a, 0x8a, 0x97, 0x32, - 0x7c, 0x4e, 0xb8, 0x78, 0x39, 0x8a, 0x5e, 0x1e, 0xce, 0x17, 0x38, 0xa4, 0x87, 0x73, 0xc6, 0xc9, - 0x61, 0xc0, 0x46, 0x3e, 0x96, 0x78, 0xe8, 0x86, 0xc1, 0x11, 0x95, 0x63, 0x2c, 0x24, 0xe1, 0x9e, - 0x62, 0x83, 0xdf, 0x81, 0xf6, 0x84, 0xd9, 0x5b, 0x5a, 0xe2, 0x49, 0x96, 0xa0, 0xf6, 0x84, 0x35, - 0xa7, 0xd0, 0x9e, 0x30, 0x48, 0x40, 0x67, 0x4a, 0x24, 0xb3, 0xb7, 0xb5, 0xc4, 0xd3, 0x2c, 0x41, - 0x3a, 0x6e, 0x4e, 0x44, 0xd3, 0x41, 0x0a, 0xb6, 0xef, 0xcd, 0x84, 0xc4, 0x21, 0xb5, 0x77, 0xb4, - 0xd2, 0x69, 0x96, 0xa0, 0x35, 0xd4, 0x9c, 0xd8, 0x9a, 0x11, 0xfe, 0x00, 0xf6, 0x9e, 0xc6, 0x8c, - 0xc7, 0xd1, 0x89, 0xc4, 0xdf, 0x13, 0x7b, 0x57, 0x6b, 0x7e, 0x93, 0x25, 0xa8, 0x0a, 0x37, 0xa7, - 0x5b, 0x65, 0x85, 0x7d, 0xb0, 0x75, 0x8c, 0x85, 0x20, 0xbe, 0x0d, 0x0e, 0x8c, 0xc1, 0x8e, 0x0b, - 0xb2, 0x04, 0xad, 0x10, 0x6f, 0xd5, 0xaa, 0x39, 0xe3, 0x25, 0x53, 0x73, 0xf6, 0xca, 0x39, 0x39, - 0xe2, 0xad, 0x5a, 0x78, 0x17, 0xec, 0x1f, 0x09, 0x11, 0x13, 0x7e, 0xcf, 0xf7, 0x39, 0x11, 0xc2, - 0xee, 0xe9, 0x2c, 0x6e, 0x67, 0x09, 0xaa, 0x0f, 0x78, 0xf5, 0x10, 0xfe, 0x08, 0x7a, 0xeb, 0x7b, - 0x36, 0x66, 0x42, 0xda, 0xfb, 0x7a, 0xdd, 0x33, 0x75, 0x9c, 0xab, 0x78, 0x73, 0xe9, 0xd7, 0x68, - 0xfb, 0x7f, 0xb7, 0x81, 0xf5, 0xb0, 0x78, 0x39, 0xc6, 0x8c, 0x9e, 0x85, 0x01, 0x1c, 0x80, 0x9d, - 0x49, 0x1c, 0x4d, 0x98, 0x4f, 0x84, 0xbe, 0xf2, 0xa6, 0xdb, 0xcb, 0x12, 0x54, 0x60, 0x5e, 0xd1, - 0x83, 0x1f, 0x82, 0xdd, 0xc7, 0x21, 0xcd, 0x0d, 0xd5, 0xf7, 0xbe, 0xeb, 0xee, 0x67, 0x09, 0x2a, - 0x41, 0xaf, 0xec, 0xc2, 0xcf, 0x81, 0xf5, 0x38, 0xa4, 0xca, 0xd4, 0xd3, 0x05, 0x27, 0x62, 0xc1, - 0x96, 0xbe, 0xbe, 0xf7, 0x5d, 0xf7, 0x4e, 0x96, 0xa0, 0x8d, 0x31, 0x6f, 0x03, 0x59, 0x31, 0xa8, - 0x43, 0x5a, 0x32, 0x74, 0x6a, 0x0c, 0xb5, 0x31, 0x6f, 0x03, 0x51, 0x67, 0x6d, 0x9d, 0xff, 0x17, - 0x84, 0xac, 0xde, 0x03, 0x7d, 0xd6, 0x2a, 0x70, 0x83, 0x67, 0xad, 0xc2, 0xda, 0xff, 0xd9, 0x04, - 0xf0, 0xa6, 0xd7, 0xd3, 0x8f, 0xea, 0x1e, 0x2a, 0xbb, 0xdb, 0x6f, 0xe8, 0x61, 0x5b, 0xaf, 0xf9, - 0x3f, 0x1e, 0x9a, 0x35, 0x86, 0x37, 0xf4, 0xb0, 0xf3, 0x16, 0x3d, 0x84, 0x63, 0x70, 0xfb, 0x11, - 0x16, 0x72, 0x0d, 0xe5, 0x25, 0xa0, 0xab, 0x4b, 0xc0, 0x7b, 0x59, 0x82, 0x36, 0x07, 0xbd, 0x4d, - 0xa8, 0x3f, 0x07, 0xd6, 0x13, 0x1a, 0xb0, 0x90, 0x06, 0xaa, 0x40, 0xf8, 0x8f, 0x42, 0x21, 0xd5, - 0x25, 0xbf, 0x1f, 0x72, 0x32, 0x97, 0xb6, 0x71, 0x60, 0x0e, 0x3a, 0xf9, 0x25, 0xcf, 0x11, 0x6f, - 0xd5, 0xaa, 0x9d, 0xba, 0x4f, 0x96, 0x24, 0xc0, 0x92, 0x28, 0xd7, 0xd5, 0x34, 0xbd, 0x53, 0x05, - 0xe8, 0x95, 0xdd, 0xfe, 0xbf, 0x26, 0x78, 0xb7, 0x88, 0x4e, 0xc6, 0x4a, 0xe9, 0x88, 0x9e, 0x31, - 0xf8, 0x02, 0x80, 0x53, 0x26, 0xf1, 0xf2, 0x98, 0xbd, 0x20, 0x5c, 0xef, 0x77, 0xcf, 0xfd, 0x5a, - 0xd5, 0xca, 0x12, 0x6d, 0xce, 0xbb, 0x0a, 0x29, 0x94, 0x60, 0xf7, 0x2b, 0x41, 0xfc, 0x5c, 0x37, - 0xaf, 0xd1, 0x53, 0xf5, 0xf5, 0x05, 0xd8, 0x9c, 0x6c, 0xc9, 0x59, 0xa4, 0x9b, 0xbf, 0xed, 0xe6, - 0x8d, 0x74, 0x1b, 0x7e, 0xda, 0x2b, 0xa4, 0xeb, 0x74, 0x73, 0xdd, 0x4e, 0x3d, 0xdd, 0x86, 0x65, - 0x4b, 0xce, 0x0f, 0xee, 0x82, 0x7d, 0xb5, 0xd3, 0x53, 0xbc, 0x8c, 0xc9, 0xe9, 0xab, 0x73, 0x02, - 0xb7, 0xf5, 0x8f, 0x87, 0xd5, 0x82, 0x5b, 0xea, 0xef, 0xc0, 0x32, 0xe0, 0x4e, 0x5e, 0xc4, 0xad, - 0x36, 0xdc, 0x2b, 0xea, 0xac, 0x65, 0xba, 0x93, 0x8b, 0x2b, 0xa7, 0x75, 0x79, 0xe5, 0xb4, 0x5e, - 0x5f, 0x39, 0xc6, 0x4f, 0xa9, 0x63, 0xfc, 0x9a, 0x3a, 0xc6, 0xef, 0xa9, 0x63, 0x5c, 0xa4, 0x8e, - 0x71, 0x99, 0x3a, 0xc6, 0x9f, 0xa9, 0x63, 0xfc, 0x95, 0x3a, 0xad, 0xd7, 0xa9, 0x63, 0xfc, 0x72, - 0xed, 0xb4, 0x2e, 0xae, 0x9d, 0xd6, 0xe5, 0xb5, 0xd3, 0xfa, 0xf6, 0x8e, 0x78, 0x25, 0x24, 0x89, - 0x4e, 0x22, 0xcc, 0xe5, 0x98, 0x51, 0xc9, 0xf1, 0x5c, 0x8a, 0xd9, 0x96, 0xfe, 0x9d, 0xfb, 0xf8, - 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x61, 0x13, 0x65, 0x18, 0x0a, 0x00, 0x00, + 0x40, 0xd3, 0x4a, 0x80, 0xb4, 0x12, 0x5c, 0xd8, 0x74, 0x87, 0x65, 0xa4, 0xdd, 0xee, 0x6c, 0x66, + 0x28, 0x2c, 0x17, 0xe4, 0x26, 0x9e, 0x34, 0xa2, 0xb1, 0x2b, 0xdb, 0xdd, 0x0f, 0x24, 0x24, 0x4e, + 0x9c, 0xf9, 0x19, 0x88, 0x5f, 0xc2, 0x71, 0x8e, 0x73, 0x0a, 0x4c, 0xe7, 0x02, 0x11, 0x87, 0x95, + 0xf8, 0x03, 0xc8, 0x4e, 0x9b, 0x8f, 0xe9, 0x69, 0x44, 0xb4, 0x27, 0xdb, 0x8f, 0xed, 0xe7, 0xc9, + 0xfb, 0xd8, 0xaf, 0xdf, 0x00, 0x2b, 0x64, 0x2f, 0x08, 0xa7, 0x98, 0xfa, 0xa4, 0x3f, 0xe7, 0x4c, + 0x32, 0xd8, 0xd6, 0xcd, 0xfb, 0x87, 0x61, 0x24, 0xa7, 0x8b, 0x49, 0xdf, 0x67, 0xf1, 0x20, 0x64, + 0x21, 0x1b, 0x68, 0x78, 0xb2, 0x38, 0xd7, 0x23, 0x3d, 0xd0, 0xbd, 0x6c, 0x57, 0xf7, 0x9f, 0x6d, + 0xf0, 0xce, 0x23, 0x42, 0x09, 0xc7, 0xb3, 0x13, 0xce, 0xe6, 0x4c, 0xe0, 0x19, 0x44, 0xa0, 0x3d, + 0x62, 0xd4, 0x27, 0xb6, 0x71, 0x60, 0xf4, 0x5a, 0xee, 0x6e, 0x9a, 0xa0, 0x0c, 0xf0, 0xb2, 0x06, + 0xf6, 0x01, 0x18, 0xb2, 0x38, 0x8e, 0xe4, 0x97, 0x58, 0x4c, 0xed, 0xe6, 0x81, 0xd1, 0xeb, 0xb8, + 0x77, 0xd2, 0x04, 0x95, 0x50, 0xaf, 0xd4, 0x87, 0x9f, 0x82, 0x3b, 0xa7, 0x12, 0x73, 0x39, 0x66, + 0x92, 0x1c, 0xcd, 0x99, 0x3f, 0xb5, 0x4d, 0xcd, 0x0c, 0xd3, 0x04, 0x15, 0x33, 0x99, 0xc4, 0x8d, + 0x95, 0xf0, 0x13, 0xd0, 0x39, 0xa2, 0x41, 0xb1, 0xb3, 0xa5, 0x77, 0x5a, 0x69, 0x82, 0xd6, 0x78, + 0xb6, 0xaf, 0xb2, 0x0a, 0x4e, 0x80, 0xf9, 0x9c, 0x08, 0xbb, 0xad, 0x3f, 0xed, 0x24, 0x4d, 0x90, + 0x1a, 0xfe, 0xf6, 0x07, 0x3a, 0x8a, 0xb1, 0x9c, 0x0e, 0x26, 0x51, 0xd8, 0x3f, 0xa6, 0xf2, 0xb3, + 0x92, 0x55, 0xf1, 0x62, 0x26, 0xa3, 0x17, 0x84, 0x8b, 0x57, 0x83, 0xf8, 0xd5, 0xa1, 0x3f, 0xc5, + 0x11, 0x3d, 0xf4, 0x19, 0x27, 0x87, 0x21, 0x1b, 0x04, 0x58, 0xe2, 0xbe, 0x1b, 0x85, 0xc7, 0x54, + 0x0e, 0xb1, 0x90, 0x84, 0x7b, 0x8a, 0x0d, 0x7e, 0x07, 0x9a, 0x23, 0x66, 0x6f, 0x69, 0x89, 0xa7, + 0x69, 0x82, 0x9a, 0x23, 0x56, 0x9f, 0x42, 0x73, 0xc4, 0x20, 0x01, 0xad, 0x31, 0x91, 0xcc, 0xde, + 0xd6, 0x12, 0xcf, 0xd2, 0x04, 0xe9, 0x71, 0x7d, 0x22, 0x9a, 0x0e, 0x52, 0xb0, 0xfd, 0x60, 0x22, + 0x24, 0x8e, 0xa8, 0xbd, 0xa3, 0x95, 0xce, 0xd2, 0x04, 0xad, 0xa1, 0xfa, 0xc4, 0xd6, 0x8c, 0xf0, + 0x07, 0xb0, 0xf7, 0x6c, 0xc1, 0xf8, 0x22, 0x3e, 0x95, 0xf8, 0x7b, 0x62, 0xef, 0x6a, 0xcd, 0x6f, + 0xd2, 0x04, 0x95, 0xe1, 0xfa, 0x74, 0xcb, 0xac, 0xb0, 0x0b, 0xb6, 0x4e, 0xb0, 0x10, 0x24, 0xb0, + 0xc1, 0x81, 0xd1, 0xdb, 0x71, 0x41, 0x9a, 0xa0, 0x15, 0xe2, 0xad, 0x5a, 0xb5, 0x66, 0x38, 0x63, + 0x6a, 0xcd, 0x5e, 0xb1, 0x26, 0x43, 0xbc, 0x55, 0x0b, 0xef, 0x83, 0xfd, 0x63, 0x21, 0x16, 0x84, + 0x3f, 0x08, 0x02, 0x4e, 0x84, 0xb0, 0x3b, 0x3a, 0x8a, 0xbb, 0x69, 0x82, 0xaa, 0x13, 0x5e, 0x75, + 0x08, 0x7f, 0x04, 0x9d, 0x75, 0x9e, 0x0d, 0x99, 0x90, 0xf6, 0xbe, 0xde, 0xf7, 0x5c, 0x5d, 0xe7, + 0x32, 0x5e, 0x5f, 0xf8, 0x15, 0xda, 0xee, 0xdf, 0x4d, 0x60, 0x3d, 0xca, 0x5f, 0x8e, 0x21, 0xa3, + 0xe7, 0x51, 0x08, 0x7b, 0x60, 0x67, 0xb4, 0x88, 0x47, 0x2c, 0x20, 0x42, 0xa7, 0xbc, 0xe9, 0x76, + 0xd2, 0x04, 0xe5, 0x98, 0x97, 0xf7, 0xe0, 0x87, 0x60, 0xf7, 0x49, 0x44, 0x33, 0x43, 0x75, 0xde, + 0xb7, 0xdd, 0xfd, 0x34, 0x41, 0x05, 0xe8, 0x15, 0x5d, 0xf8, 0x39, 0xb0, 0x9e, 0x44, 0x54, 0x99, + 0x7a, 0x36, 0xe5, 0x44, 0x4c, 0xd9, 0x2c, 0xd0, 0x79, 0xdf, 0x76, 0xef, 0xa5, 0x09, 0xda, 0x98, + 0xf3, 0x36, 0x90, 0x15, 0x83, 0xba, 0xa4, 0x05, 0x43, 0xab, 0xc2, 0x50, 0x99, 0xf3, 0x36, 0x10, + 0x75, 0xd7, 0xd6, 0xf1, 0x7f, 0x41, 0xc8, 0xea, 0x3d, 0xd0, 0x77, 0xad, 0x04, 0xd7, 0x78, 0xd7, + 0x4a, 0xac, 0xdd, 0x9f, 0x4d, 0x00, 0x6f, 0x7a, 0x3d, 0xfe, 0xa8, 0xea, 0xa1, 0xb2, 0xbb, 0x79, + 0x4b, 0x0f, 0x9b, 0x7a, 0xcf, 0xff, 0xf1, 0xd0, 0xac, 0x30, 0xdc, 0xd2, 0xc3, 0xd6, 0x5b, 0xf4, + 0x10, 0x0e, 0xc1, 0xdd, 0xc7, 0x58, 0xc8, 0x35, 0x94, 0x95, 0xa5, 0xb6, 0x2e, 0x01, 0xef, 0xa5, + 0x09, 0xda, 0x9c, 0xf4, 0x36, 0xa1, 0xae, 0x0f, 0xac, 0xa7, 0x34, 0x64, 0x11, 0x0d, 0x55, 0x81, + 0x08, 0x1e, 0x47, 0x42, 0xaa, 0x24, 0x7f, 0x18, 0x71, 0xe2, 0x4b, 0xdb, 0x38, 0x30, 0x7b, 0xad, + 0x2c, 0xc9, 0x33, 0xc4, 0x5b, 0xb5, 0xea, 0xa4, 0x1e, 0x92, 0x19, 0x09, 0xb1, 0x24, 0xca, 0x75, + 0xb5, 0x4c, 0x9f, 0x54, 0x0e, 0x7a, 0x45, 0xb7, 0xfb, 0xaf, 0x09, 0xde, 0xcd, 0x47, 0xa7, 0x43, + 0xa5, 0x74, 0x4c, 0xcf, 0x19, 0x7c, 0x09, 0xc0, 0x19, 0x93, 0x78, 0x76, 0xc2, 0x5e, 0x12, 0xae, + 0xcf, 0xbb, 0xe3, 0x7e, 0xad, 0x6a, 0x65, 0x81, 0xd6, 0xe7, 0x5d, 0x89, 0x14, 0x4a, 0xb0, 0xfb, + 0x95, 0x20, 0x41, 0xa6, 0x9b, 0xd5, 0xe8, 0xb1, 0xfa, 0xfa, 0x1c, 0xac, 0x4f, 0xb6, 0xe0, 0xcc, + 0xc3, 0xcd, 0xde, 0x76, 0xf3, 0x46, 0xb8, 0x35, 0x3f, 0xed, 0x25, 0xd2, 0x75, 0xb8, 0x99, 0x6e, + 0xab, 0x1a, 0x6e, 0xcd, 0xb2, 0x05, 0xe7, 0x07, 0xf7, 0xc1, 0xbe, 0x3a, 0xe9, 0x31, 0x9e, 0x2d, + 0xc8, 0xd9, 0xeb, 0x39, 0x81, 0xdb, 0xfa, 0xc7, 0xc3, 0x6a, 0xc0, 0x2d, 0xf5, 0x77, 0x60, 0x19, + 0x70, 0x27, 0x2b, 0xe2, 0x56, 0x13, 0xee, 0xe5, 0x75, 0xd6, 0x32, 0xdd, 0xd1, 0xc5, 0x95, 0xd3, + 0xb8, 0xbc, 0x72, 0x1a, 0x6f, 0xae, 0x1c, 0xe3, 0xa7, 0xa5, 0x63, 0xfc, 0xba, 0x74, 0x8c, 0xdf, + 0x97, 0x8e, 0x71, 0xb1, 0x74, 0x8c, 0xcb, 0xa5, 0x63, 0xfc, 0xb9, 0x74, 0x8c, 0xbf, 0x96, 0x4e, + 0xe3, 0xcd, 0xd2, 0x31, 0x7e, 0xb9, 0x76, 0x1a, 0x17, 0xd7, 0x4e, 0xe3, 0xf2, 0xda, 0x69, 0x7c, + 0x7b, 0x4f, 0xbc, 0x16, 0x92, 0xc4, 0xa7, 0x31, 0xe6, 0x72, 0xc8, 0xa8, 0xe4, 0xd8, 0x97, 0x62, + 0xb2, 0xa5, 0x7f, 0xe7, 0x3e, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x52, 0x6e, 0xfa, 0xb5, 0x18, + 0x0a, 0x00, 0x00, } func (x VoteValueType) String() string { @@ -546,10 +547,10 @@ func (this *GeneralProposal) Equal(that interface{}) bool { if !bytes.Equal(this.CommitHash, that1.CommitHash) { return false } - if this.StartVoteNonce != that1.StartVoteNonce { + if this.StartVoteEpoch != that1.StartVoteEpoch { return false } - if this.EndVoteNonce != that1.EndVoteNonce { + if this.EndVoteEpoch != that1.EndVoteEpoch { return false } { @@ -767,8 +768,8 @@ func (this *GeneralProposal) GoString() string { s = append(s, "&systemSmartContracts.GeneralProposal{") s = append(s, "Nonce: "+fmt.Sprintf("%#v", this.Nonce)+",\n") s = append(s, "CommitHash: "+fmt.Sprintf("%#v", this.CommitHash)+",\n") - s = append(s, "StartVoteNonce: "+fmt.Sprintf("%#v", this.StartVoteNonce)+",\n") - s = append(s, "EndVoteNonce: "+fmt.Sprintf("%#v", this.EndVoteNonce)+",\n") + s = append(s, "StartVoteEpoch: "+fmt.Sprintf("%#v", this.StartVoteEpoch)+",\n") + s = append(s, "EndVoteEpoch: "+fmt.Sprintf("%#v", this.EndVoteEpoch)+",\n") s = append(s, "Yes: "+fmt.Sprintf("%#v", this.Yes)+",\n") s = append(s, "No: "+fmt.Sprintf("%#v", this.No)+",\n") s = append(s, "Veto: "+fmt.Sprintf("%#v", this.Veto)+",\n") @@ -954,13 +955,13 @@ func (m *GeneralProposal) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x2a - if m.EndVoteNonce != 0 { - i = encodeVarintGovernance(dAtA, i, uint64(m.EndVoteNonce)) + if m.EndVoteEpoch != 0 { + i = encodeVarintGovernance(dAtA, i, uint64(m.EndVoteEpoch)) i-- dAtA[i] = 0x20 } - if m.StartVoteNonce != 0 { - i = encodeVarintGovernance(dAtA, i, uint64(m.StartVoteNonce)) + if m.StartVoteEpoch != 0 { + i = encodeVarintGovernance(dAtA, i, uint64(m.StartVoteEpoch)) i-- dAtA[i] = 0x18 } @@ -1240,11 +1241,11 @@ func (m *GeneralProposal) Size() (n int) { if l > 0 { n += 1 + l + sovGovernance(uint64(l)) } - if m.StartVoteNonce != 0 { - n += 1 + sovGovernance(uint64(m.StartVoteNonce)) + if m.StartVoteEpoch != 0 { + n += 1 + sovGovernance(uint64(m.StartVoteEpoch)) } - if m.EndVoteNonce != 0 { - n += 1 + sovGovernance(uint64(m.EndVoteNonce)) + if m.EndVoteEpoch != 0 { + n += 1 + sovGovernance(uint64(m.EndVoteEpoch)) } { __caster := &github_com_multiversx_mx_chain_core_go_data.BigIntCaster{} @@ -1406,8 +1407,8 @@ func (this *GeneralProposal) String() string { s := strings.Join([]string{`&GeneralProposal{`, `Nonce:` + fmt.Sprintf("%v", this.Nonce) + `,`, `CommitHash:` + fmt.Sprintf("%v", this.CommitHash) + `,`, - `StartVoteNonce:` + fmt.Sprintf("%v", this.StartVoteNonce) + `,`, - `EndVoteNonce:` + fmt.Sprintf("%v", this.EndVoteNonce) + `,`, + `StartVoteEpoch:` + fmt.Sprintf("%v", this.StartVoteEpoch) + `,`, + `EndVoteEpoch:` + fmt.Sprintf("%v", this.EndVoteEpoch) + `,`, `Yes:` + fmt.Sprintf("%v", this.Yes) + `,`, `No:` + fmt.Sprintf("%v", this.No) + `,`, `Veto:` + fmt.Sprintf("%v", this.Veto) + `,`, @@ -1565,9 +1566,9 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field StartVoteNonce", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StartVoteEpoch", wireType) } - m.StartVoteNonce = 0 + m.StartVoteEpoch = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGovernance @@ -1577,16 +1578,16 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.StartVoteNonce |= uint64(b&0x7F) << shift + m.StartVoteEpoch |= uint64(b&0x7F) << shift if b < 0x80 { break } } case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EndVoteNonce", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EndVoteEpoch", wireType) } - m.EndVoteNonce = 0 + m.EndVoteEpoch = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGovernance @@ -1596,7 +1597,7 @@ func (m *GeneralProposal) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.EndVoteNonce |= uint64(b&0x7F) << shift + m.EndVoteEpoch |= uint64(b&0x7F) << shift if b < 0x80 { break } From c0fc5c248c98c588da78989f1e145e3a51cdea85 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 25 Jan 2023 17:22:51 +0200 Subject: [PATCH 149/335] fix after review --- vm/errors.go | 7 ++-- vm/systemSmartContracts/governance.go | 8 ++--- vm/systemSmartContracts/governance.pb.go | 4 +-- vm/systemSmartContracts/governance.proto | 4 +-- vm/systemSmartContracts/governance_test.go | 40 +++++++++++----------- 5 files changed, 30 insertions(+), 33 deletions(-) diff --git a/vm/errors.go b/vm/errors.go index 3de4f0ce131..5d54eda1e5d 100644 --- a/vm/errors.go +++ b/vm/errors.go @@ -130,8 +130,8 @@ var ErrNilSystemSCConfig = errors.New("nil system sc config") // ErrNilValidatorAccountsDB signals that nil validator accounts DB was provided var ErrNilValidatorAccountsDB = errors.New("nil validator accounts DB") -// ErrInvalidStartEndVoteEpoch signals that invalid arguments where passed for start or end vote nonce -var ErrInvalidStartEndVoteEpoch = errors.New("invalid start/end vote nonce") +// ErrInvalidStartEndVoteEpoch signals that invalid arguments where passed for start or end vote epoch +var ErrInvalidStartEndVoteEpoch = errors.New("invalid start/end vote epoch") // ErrEmptyStorage signals that the storage is empty for given key var ErrEmptyStorage = errors.New("storage is nil for given key") @@ -252,6 +252,3 @@ var ErrNotEnoughStakeToVote = errors.New("not enough stake/delegate to vote") // ErrNotEnoughVotingPower signals that there is not enough voting power to cast the vote var ErrNotEnoughVotingPower = errors.New("not enough voting power to cast this vote") - -// ErrProposalWasNotFunded signals that proposal was not funded -var ErrProposalWasNotFunded = errors.New("proposal was not funded") diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 621b06d65c7..b3a49242011 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -305,8 +305,8 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon generalProposal := &GeneralProposal{ IssuerAddress: args.CallerAddr, CommitHash: commitHash, - startVoteEpoch: startVoteEpoch, - endVoteEpoch: endVoteEpoch, + StartVoteEpoch: startVoteEpoch, + EndVoteEpoch: endVoteEpoch, Yes: big.NewInt(0), No: big.NewInt(0), Veto: big.NewInt(0), @@ -574,7 +574,7 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc } currentEpoch := g.eei.BlockChainHook().CurrentEpoch() - if currentEpoch < generalProposal.EndVoteEpoch { + if uint64(currentEpoch) < generalProposal.EndVoteEpoch { g.eei.AddReturnMessage(fmt.Sprintf("proposal can be closed only after epoch %d", generalProposal.EndVoteEpoch)) return vmcommon.UserError } @@ -928,7 +928,7 @@ func (g *governanceContract) getValidProposal(nonce *big.Int) (*GeneralProposal, return nil, err } - currentEpoch := g.eei.BlockChainHook().CurrentEpoch() + currentEpoch := uint64(g.eei.BlockChainHook().CurrentEpoch()) if currentEpoch < proposal.StartVoteEpoch { return nil, vm.ErrVotingNotStartedForProposal } diff --git a/vm/systemSmartContracts/governance.pb.go b/vm/systemSmartContracts/governance.pb.go index 07c67f0bd8d..2f7e55df5c3 100644 --- a/vm/systemSmartContracts/governance.pb.go +++ b/vm/systemSmartContracts/governance.pb.go @@ -60,8 +60,8 @@ func (VoteValueType) EnumDescriptor() ([]byte, []int) { type GeneralProposal struct { Nonce uint64 `protobuf:"varint,1,opt,name=Nonce,proto3" json:"Nonce"` CommitHash []byte `protobuf:"bytes,2,opt,name=CommitHash,proto3" json:"CommitHash"` - StartVoteEpoch uint64 `protobuf:"varint,3,opt,name=StartVoteEpoch,proto3" json:"StartVoteNonce"` - EndVoteEpoch uint64 `protobuf:"varint,4,opt,name=EndVoteEpoch,proto3" json:"EndVoteNonce"` + StartVoteEpoch uint64 `protobuf:"varint,3,opt,name=StartVoteEpoch,proto3" json:"StartVoteEpoch"` + EndVoteEpoch uint64 `protobuf:"varint,4,opt,name=EndVoteEpoch,proto3" json:"EndVoteEpoch"` Yes *math_big.Int `protobuf:"bytes,5,opt,name=Yes,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Yes"` No *math_big.Int `protobuf:"bytes,6,opt,name=No,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"No"` Veto *math_big.Int `protobuf:"bytes,7,opt,name=Veto,proto3,casttypewith=math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster" json:"Veto"` diff --git a/vm/systemSmartContracts/governance.proto b/vm/systemSmartContracts/governance.proto index 2aad162228d..a60fee5b126 100644 --- a/vm/systemSmartContracts/governance.proto +++ b/vm/systemSmartContracts/governance.proto @@ -17,8 +17,8 @@ enum VoteValueType { message GeneralProposal { uint64 Nonce = 1 [(gogoproto.jsontag) = "Nonce"]; bytes CommitHash = 2 [(gogoproto.jsontag) = "CommitHash"]; - uint64 StartVoteEpoch = 3 [(gogoproto.jsontag) = "StartVoteNonce"]; - uint64 EndVoteEpoch = 4 [(gogoproto.jsontag) = "EndVoteNonce"]; + uint64 StartVoteEpoch = 3 [(gogoproto.jsontag) = "StartVoteEpoch"]; + uint64 EndVoteEpoch = 4 [(gogoproto.jsontag) = "EndVoteEpoch"]; bytes Yes = 5 [(gogoproto.jsontag) = "Yes", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes No = 6 [(gogoproto.jsontag) = "No", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; bytes Veto = 7 [(gogoproto.jsontag) = "Veto", (gogoproto.casttypewith) = "math/big.Int;github.com/multiversx/mx-chain-core-go/data.BigIntCaster"]; diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 8a7a4692b55..aa07396f15d 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -614,7 +614,7 @@ func TestGovernanceContract_ProposalOK(t *testing.T) { callInputArgs := [][]byte{ proposalIdentifier, - []byte("1"), + []byte("5"), []byte("10"), } callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) @@ -670,8 +670,8 @@ func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, + StartVoteEpoch: 10, + EndVoteEpoch: 15, } voteArgs := [][]byte{ @@ -679,12 +679,12 @@ func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { []byte("yes"), } gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() - blockchainHook.CurrentNonceCalled = func() uint64 { + blockchainHook.CurrentEpochCalled = func() uint32 { return 16 } nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -700,8 +700,8 @@ func TestGovernanceContract_VoteInvalidVote(t *testing.T) { proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, + StartVoteEpoch: 10, + EndVoteEpoch: 15, } voteArgs := [][]byte{ @@ -727,7 +727,7 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { t.Parallel() gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() - blockchainHook.CurrentNonceCalled = func() uint64 { + blockchainHook.CurrentEpochCalled = func() uint32 { return 12 } @@ -736,8 +736,8 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { generalProposal := &GeneralProposal{ ProposalCost: gsc.baseProposalCost, CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, + StartVoteEpoch: 10, + EndVoteEpoch: 15, Yes: big.NewInt(0), No: big.NewInt(0), Veto: big.NewInt(0), @@ -751,7 +751,7 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { } nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -776,8 +776,8 @@ func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { proposalIdentifier := []byte("aaaaaaaaa") generalProposal := &GeneralProposal{ CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, + StartVoteEpoch: 10, + EndVoteEpoch: 15, Yes: big.NewInt(0), No: big.NewInt(0), Veto: big.NewInt(0), @@ -815,7 +815,7 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { t.Parallel() gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() - blockchainHook.CurrentNonceCalled = func() uint64 { + blockchainHook.CurrentEpochCalled = func() uint32 { return 12 } @@ -824,8 +824,8 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { generalProposal := &GeneralProposal{ ProposalCost: gsc.baseProposalCost, CommitHash: proposalIdentifier, - StartVoteNonce: 10, - EndVoteNonce: 15, + StartVoteEpoch: 10, + EndVoteEpoch: 15, Yes: big.NewInt(0), No: big.NewInt(0), Veto: big.NewInt(0), @@ -840,7 +840,7 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { big.NewInt(10000).Bytes(), } nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -1090,7 +1090,7 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { t.Parallel() retMessage := "" - errSubstr := "proposal can be closed only after nonce" + errSubstr := "proposal can be closed only after epoch" callerAddress := []byte("address") proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) args := createMockGovernanceArgs() @@ -1104,7 +1104,7 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { Yes: big.NewInt(10), No: big.NewInt(10), Veto: big.NewInt(10), - EndVoteNonce: 10, + EndVoteEpoch: 10, }) return proposalBytes } @@ -1113,7 +1113,7 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { }, BlockChainHookCalled: func() vm.BlockchainHook { return &mock.BlockChainHookStub{ - CurrentNonceCalled: func() uint64 { + CurrentEpochCalled: func() uint32 { return 1 }, } From 27df1d1005f6087a4fcec4b2c247be670df1eee2 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 26 Jan 2023 11:17:20 +0200 Subject: [PATCH 150/335] added new view functions --- vm/systemSmartContracts/governance.go | 130 ++++++++++++++++++--- vm/systemSmartContracts/governance_test.go | 10 +- 2 files changed, 120 insertions(+), 20 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index b3a49242011..2390d7933ef 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -146,8 +146,14 @@ func (g *governanceContract) Execute(args *vmcommon.ContractCallInput) vmcommon. return g.changeConfig(args) case "closeProposal": return g.closeProposal(args) - case "getVotingPower": - return g.getVotingPower(args) + case "viewVotingPower": + return g.viewVotingPower(args) + case "getConfig": + return g.viewConfig(args) + case "getUserVoteHistory": + return g.viewUserVoteHistory(args) + case "viewProposal": + return g.viewProposal(args) } g.eei.AddReturnMessage("invalid method to call") @@ -601,20 +607,12 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.Ok } -// getVotingPower returns the total voting power -func (g *governanceContract) getVotingPower(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - if args.CallValue.Cmp(zero) != 0 { - g.eei.AddReturnMessage(vm.TransactionValueMustBeZero) - return vmcommon.UserError - } - err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Vote) +// viewVotingPower returns the total voting power +func (g *governanceContract) viewVotingPower(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + err := g.checkViewFuncArguments(args, 0) if err != nil { - g.eei.AddReturnMessage("not enough gas") - return vmcommon.OutOfGas - } - if len(args.Arguments) != 1 { - g.eei.AddReturnMessage("function accepts only one argument") - return vmcommon.FunctionWrongSignature + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError } validatorAddress := args.Arguments[0] if len(validatorAddress) != len(args.CallerAddr) { @@ -633,6 +631,108 @@ func (g *governanceContract) getVotingPower(args *vmcommon.ContractCallInput) vm return vmcommon.Ok } +func (g *governanceContract) viewConfig(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + err := g.checkViewFuncArguments(args, 0) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + gConfig, err := g.getConfig() + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + g.eei.Finish([]byte(gConfig.ProposalFee.String())) + g.eei.Finish([]byte(big.NewFloat(float64(gConfig.MinQuorum)).String())) + g.eei.Finish([]byte(big.NewFloat(float64(gConfig.MinPassThreshold)).String())) + g.eei.Finish([]byte(big.NewFloat(float64(gConfig.MinVetoThreshold)).String())) + g.eei.Finish([]byte(big.NewInt(int64(gConfig.LastProposalNonce)).String())) + + return vmcommon.Ok +} + +func (g *governanceContract) viewUserVoteHistory(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + err := g.checkViewFuncArguments(args, 1) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + userVotes, err := g.getUserVotes(args.Arguments[0]) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + g.eei.Finish([]byte(userVotes.String())) + + return vmcommon.Ok +} + +func (g *governanceContract) viewProposal(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + err := g.checkViewFuncArguments(args, 0) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + reference := args.Arguments[0] + if len(reference) < commitHashLength { + reference = g.eei.GetStorage(append([]byte(noncePrefix), reference...)) + } + proposal, err := g.getGeneralProposal(args.Arguments[0]) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + g.eei.Finish(proposal.ProposalCost.Bytes()) + g.eei.Finish(proposal.CommitHash) + g.eei.Finish(big.NewInt(0).SetUint64(proposal.Nonce).Bytes()) + g.eei.Finish(proposal.IssuerAddress) + g.eei.Finish(big.NewInt(0).SetUint64(proposal.StartVoteEpoch).Bytes()) + g.eei.Finish(big.NewInt(0).SetUint64(proposal.EndVoteEpoch).Bytes()) + g.eei.Finish(proposal.QuorumStake.Bytes()) + g.eei.Finish(proposal.Yes.Bytes()) + g.eei.Finish(proposal.No.Bytes()) + g.eei.Finish(proposal.Veto.Bytes()) + g.eei.Finish(proposal.Abstain.Bytes()) + g.eei.Finish([]byte(boolToString(proposal.Closed))) + g.eei.Finish([]byte(boolToString(proposal.Passed))) + + return vmcommon.Ok +} + +func boolToString(val bool) string { + if val { + return "yes" + } + return "no" +} + +func (g *governanceContract) checkViewFuncArguments( + args *vmcommon.ContractCallInput, + numArgs int, +) error { + if !bytes.Equal(args.CallerAddr, args.RecipientAddr) { + return vm.ErrInvalidCaller + } + if args.CallValue.Cmp(zero) != 0 { + return vm.ErrCallValueMustBeZero + } + err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Vote) + if err != nil { + return vm.ErrNotEnoughGas + } + if len(args.Arguments) != numArgs { + return vm.ErrInvalidNumOfArguments + } + + return nil +} + // addNewVote applies a new vote on a proposal then saves the new information into the storage func (g *governanceContract) addNewVote(voteValueType VoteValueType, power *big.Int, proposal *GeneralProposal) error { switch voteValueType { diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index aa07396f15d..ad909033543 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -1177,7 +1177,7 @@ func TestGovernanceContract_GetVotingPower(t *testing.T) { callerAddress, } - callInput := createVMInput(big.NewInt(0), "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(big.NewInt(0), "viewVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.Ok, retCode) @@ -1198,7 +1198,7 @@ func TestGovernanceContract_GetVVotingPowerWrongCallValue(t *testing.T) { } gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(10), "getVotingPower", callerAddress, vm.GovernanceSCAddress, nil) + callInput := createVMInput(big.NewInt(10), "viewVotingPower", callerAddress, vm.GovernanceSCAddress, nil) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, vm.TransactionValueMustBeZero) @@ -1222,7 +1222,7 @@ func TestGovernanceContract_GetVotingPowerWrongArgumentsLength(t *testing.T) { callerAddress, callerAddress, } - callInput := createVMInput(zero, "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "viewVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.FunctionWrongSignature, retCode) require.Contains(t, retMessage, errSubstr) @@ -1245,7 +1245,7 @@ func TestGovernanceContract_GetVotingPowerInvalidArgument(t *testing.T) { callInputArgs := [][]byte{ []byte("address_wrong"), } - callInput := createVMInput(zero, "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "viewVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, errSubstr) @@ -1266,7 +1266,7 @@ func TestGovernanceContract_GetVotingPowerComputeErr(t *testing.T) { callInputArgs := [][]byte{ callerAddress, } - callInput := createVMInput(zero, "getVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "viewVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) } From 0d6e1818476450fc689a80638a70586e7b2ac5be Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 26 Jan 2023 13:18:35 +0200 Subject: [PATCH 151/335] added new view functions --- vm/systemSmartContracts/governance.go | 46 ++++++++++++++++------ vm/systemSmartContracts/governance_test.go | 18 ++++----- 2 files changed, 43 insertions(+), 21 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 2390d7933ef..19c74b9714d 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -328,9 +328,17 @@ func (g *governanceContract) proposal(args *vmcommon.ContractCallInput) vmcommon return vmcommon.UserError } - nonceKey := append([]byte(noncePrefix), big.NewInt(0).SetUint64(nextNonce).Bytes()...) + nonceAsBytes := big.NewInt(0).SetUint64(nextNonce).Bytes() + nonceKey := append([]byte(noncePrefix), nonceAsBytes...) g.eei.SetStorage(nonceKey, commitHash) + logEntry := &vmcommon.LogEntry{ + Identifier: []byte(args.Function), + Address: args.CallerAddr, + Topics: [][]byte{nonceAsBytes, commitHash, args.Arguments[1], args.Arguments[1], args.Arguments[2]}, + } + g.eei.AddLogEntry(logEntry) + return vmcommon.Ok } @@ -376,6 +384,13 @@ func (g *governanceContract) vote(args *vmcommon.ContractCallInput) vmcommon.Ret return vmcommon.UserError } + logEntry := &vmcommon.LogEntry{ + Identifier: []byte(args.Function), + Address: args.CallerAddr, + Topics: [][]byte{proposalToVote, args.Arguments[1], totalStake.Bytes(), totalVotingPower.Bytes()}, + } + g.eei.AddLogEntry(logEntry) + return vmcommon.Ok } @@ -435,6 +450,13 @@ func (g *governanceContract) delegateVote(args *vmcommon.ContractCallInput) vmco return vmcommon.UserError } + logEntry := &vmcommon.LogEntry{ + Identifier: []byte(args.Function), + Address: args.CallerAddr, + Topics: [][]byte{proposalToVote, args.Arguments[1], voter, userStake.Bytes(), votePower.Bytes()}, + } + g.eei.AddLogEntry(logEntry) + return vmcommon.Ok } @@ -604,12 +626,19 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.UserError } + logEntry := &vmcommon.LogEntry{ + Identifier: []byte(args.Function), + Address: args.CallerAddr, + Topics: [][]byte{proposal, boolToSlice(generalProposal.Passed)}, + } + g.eei.AddLogEntry(logEntry) + return vmcommon.Ok } // viewVotingPower returns the total voting power func (g *governanceContract) viewVotingPower(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - err := g.checkViewFuncArguments(args, 0) + err := g.checkViewFuncArguments(args, 1) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -672,7 +701,7 @@ func (g *governanceContract) viewUserVoteHistory(args *vmcommon.ContractCallInpu } func (g *governanceContract) viewProposal(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - err := g.checkViewFuncArguments(args, 0) + err := g.checkViewFuncArguments(args, 1) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -699,19 +728,12 @@ func (g *governanceContract) viewProposal(args *vmcommon.ContractCallInput) vmco g.eei.Finish(proposal.No.Bytes()) g.eei.Finish(proposal.Veto.Bytes()) g.eei.Finish(proposal.Abstain.Bytes()) - g.eei.Finish([]byte(boolToString(proposal.Closed))) - g.eei.Finish([]byte(boolToString(proposal.Passed))) + g.eei.Finish(boolToSlice(proposal.Closed)) + g.eei.Finish(boolToSlice(proposal.Passed)) return vmcommon.Ok } -func boolToString(val bool) string { - if val { - return "yes" - } - return "no" -} - func (g *governanceContract) checkViewFuncArguments( args *vmcommon.ContractCallInput, numArgs int, diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index ad909033543..453af562189 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -1177,8 +1177,9 @@ func TestGovernanceContract_GetVotingPower(t *testing.T) { callerAddress, } - callInput := createVMInput(big.NewInt(0), "viewVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(big.NewInt(0), "viewVotingPower", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) + fmt.Println(eei.GetReturnMessage()) require.Equal(t, vmcommon.Ok, retCode) vmOutput := eei.CreateVMOutput() @@ -1189,7 +1190,6 @@ func TestGovernanceContract_GetVVotingPowerWrongCallValue(t *testing.T) { t.Parallel() retMessage := "" - callerAddress := []byte("address") args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ AddReturnMessageCalled: func(msg string) { @@ -1198,17 +1198,17 @@ func TestGovernanceContract_GetVVotingPowerWrongCallValue(t *testing.T) { } gsc, _ := NewGovernanceContract(args) - callInput := createVMInput(big.NewInt(10), "viewVotingPower", callerAddress, vm.GovernanceSCAddress, nil) + callInput := createVMInput(big.NewInt(10), "viewVotingPower", vm.GovernanceSCAddress, vm.GovernanceSCAddress, nil) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Contains(t, retMessage, vm.TransactionValueMustBeZero) + require.Contains(t, retMessage, vm.ErrCallValueMustBeZero.Error()) } func TestGovernanceContract_GetVotingPowerWrongArgumentsLength(t *testing.T) { t.Parallel() retMessage := "" - errSubstr := "function accepts only one argument" + errSubstr := vm.ErrInvalidNumOfArguments.Error() callerAddress := []byte("address") args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ @@ -1222,17 +1222,17 @@ func TestGovernanceContract_GetVotingPowerWrongArgumentsLength(t *testing.T) { callerAddress, callerAddress, } - callInput := createVMInput(zero, "viewVotingPower", callerAddress, vm.GovernanceSCAddress, callInputArgs) + callInput := createVMInput(zero, "viewVotingPower", vm.GovernanceSCAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.FunctionWrongSignature, retCode) + require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, errSubstr) } -func TestGovernanceContract_GetVotingPowerInvalidArgument(t *testing.T) { +func TestGovernanceContract_GetVotingPowerInvalidCaller(t *testing.T) { t.Parallel() retMessage := "" - errSubstr := "invalid address" + errSubstr := vm.ErrInvalidCaller.Error() callerAddress := []byte("address") args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ From f70da6c06ac1c32671cb2638fb0ed18101965113 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 26 Jan 2023 14:08:43 +0200 Subject: [PATCH 152/335] logs, new functions, code coverage --- vm/systemSmartContracts/governance.go | 62 +++--- vm/systemSmartContracts/governance_test.go | 222 ++++++++++++++++++++- 2 files changed, 250 insertions(+), 34 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 19c74b9714d..c013a583202 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -148,10 +148,12 @@ func (g *governanceContract) Execute(args *vmcommon.ContractCallInput) vmcommon. return g.closeProposal(args) case "viewVotingPower": return g.viewVotingPower(args) - case "getConfig": + case "viewConfig": return g.viewConfig(args) - case "getUserVoteHistory": + case "viewUserVoteHistory": return g.viewUserVoteHistory(args) + case "viewDelegatedVoteInfo": + return g.viewDelegatedVoteInfo(args) case "viewProposal": return g.viewProposal(args) } @@ -514,17 +516,12 @@ func (g *governanceContract) addUserVote( return err } - voteOption, err := g.castVoteType(vote) - if err != nil { - return err - } - proposal, err := g.getValidProposal(nonce) if err != nil { return err } - err = g.addNewVote(voteOption, totalVotingPower, proposal) + err = g.addNewVote(vote, totalVotingPower, proposal) if err != nil { return err } @@ -734,6 +731,27 @@ func (g *governanceContract) viewProposal(args *vmcommon.ContractCallInput) vmco return vmcommon.Ok } +func (g *governanceContract) viewDelegatedVoteInfo(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + err := g.checkViewFuncArguments(args, 2) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + scDelegatedInfo, err := g.getDelegatedContractInfo(args.Arguments[0], args.Arguments[1]) + if err != nil { + g.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + g.eei.Finish(scDelegatedInfo.UsedStake.Bytes()) + g.eei.Finish(scDelegatedInfo.UsedPower.Bytes()) + g.eei.Finish(scDelegatedInfo.TotalStake.Bytes()) + g.eei.Finish(scDelegatedInfo.TotalPower.Bytes()) + + return vmcommon.Ok +} + func (g *governanceContract) checkViewFuncArguments( args *vmcommon.ContractCallInput, numArgs int, @@ -756,15 +774,15 @@ func (g *governanceContract) checkViewFuncArguments( } // addNewVote applies a new vote on a proposal then saves the new information into the storage -func (g *governanceContract) addNewVote(voteValueType VoteValueType, power *big.Int, proposal *GeneralProposal) error { - switch voteValueType { - case Yes: +func (g *governanceContract) addNewVote(vote string, power *big.Int, proposal *GeneralProposal) error { + switch vote { + case yesString: proposal.Yes.Add(proposal.Yes, power) - case No: + case noString: proposal.No.Add(proposal.No, power) - case Veto: + case vetoString: proposal.Veto.Add(proposal.Veto, power) - case Abstain: + case abstainString: proposal.Abstain.Add(proposal.Abstain, power) default: return fmt.Errorf("%s: %s", vm.ErrInvalidArgument, "invalid vote type") @@ -788,22 +806,6 @@ func (g *governanceContract) computeVotingPower(value *big.Int) (*big.Int, error return big.NewInt(0).Sqrt(value), nil } -// castVoteType casts a valid string vote passed as an argument to the actual mapped value -func (g *governanceContract) castVoteType(vote string) (VoteValueType, error) { - switch vote { - case yesString: - return Yes, nil - case noString: - return No, nil - case vetoString: - return Veto, nil - case abstainString: - return Abstain, nil - default: - return 0, fmt.Errorf("%s: %s%s", vm.ErrInvalidArgument, "invalid vote type option: ", vote) - } -} - // function iterates over all delegation contracts and verifies balances of the given account and makes a sum of it func (g *governanceContract) computeTotalStakeAndVotingPower(address []byte) (*big.Int, *big.Int, error) { totalStake, err := g.getTotalStake(address) diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 453af562189..5c0a9497cd9 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/multiversx/mx-chain-go/process/smartContract/hooks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" + "github.com/stretchr/testify/assert" "math/big" "strings" "testing" @@ -217,6 +218,19 @@ func TestNewGovernanceContract_InvalidGovernanceAddress(t *testing.T) { require.True(t, errors.Is(err, vm.ErrInvalidAddress)) } +func TestGovernanceContract_SetNewGasCost(t *testing.T) { + args := createMockGovernanceArgs() + + gsc, _ := NewGovernanceContract(args) + require.False(t, gsc.IsInterfaceNil()) + require.True(t, gsc.CanUseContract()) + + gasCost := vm.GasCost{MetaChainSystemSCsCost: vm.MetaChainSystemSCsCost{Vote: 1000000}} + gsc.SetNewGasCost(gasCost) + + assert.Equal(t, gsc.gasCost.MetaChainSystemSCsCost.Vote, gasCost.MetaChainSystemSCsCost.Vote) +} + func TestGovernanceContract_ExecuteNilVMInputShouldErr(t *testing.T) { t.Parallel() @@ -709,18 +723,18 @@ func TestGovernanceContract_VoteInvalidVote(t *testing.T) { []byte("invalid"), } gsc, blockchainHook, eei := createGovernanceBlockChainHookStubContextHandler() - blockchainHook.CurrentNonceCalled = func() uint64 { - return 16 + blockchainHook.CurrentEpochCalled = func() uint32 { + return 14 } nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) retCode := gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) - require.Equal(t, eei.GetReturnMessage(), "invalid argument: invalid vote type option: invalid") + require.Equal(t, eei.GetReturnMessage(), "invalid argument: invalid vote type") } func TestGovernanceContract_VoteTwice(t *testing.T) { @@ -1271,6 +1285,180 @@ func TestGovernanceContract_GetVotingPowerComputeErr(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) } +func TestGovernanceContract_ViewConfig(t *testing.T) { + t.Parallel() + + callerAddress := []byte("address") + args := createMockGovernanceArgs() + returnMessage := "" + mockEEI := &mock.SystemEIStub{ + GetStorageFromAddressCalled: func(_ []byte, _ []byte) []byte { + return []byte("invalid data") + }, + AddReturnMessageCalled: func(msg string) { + returnMessage = msg + }, + } + args.Eei = mockEEI + + gsc, _ := NewGovernanceContract(args) + callInputArgs := [][]byte{ + callerAddress, + } + callInput := createVMInput(zero, "viewConfig", callerAddress, vm.GovernanceSCAddress, callInputArgs) + retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, returnMessage, vm.ErrInvalidCaller.Error()) + + callInput.CallerAddr = callInput.RecipientAddr + callInput.Arguments = [][]byte{} + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, returnMessage, "element was not found") + + mockEEI.GetStorageCalled = func(key []byte) []byte { + proposalBytes, _ := args.Marshalizer.Marshal(&GovernanceConfigV2{ + ProposalFee: big.NewInt(10), + LastProposalNonce: 10, + MinQuorum: 0.4, + MinPassThreshold: 0.4, + MinVetoThreshold: 0.4, + }) + return proposalBytes + } + + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) +} + +func TestGovernanceContract_ViewUserHistory(t *testing.T) { + t.Parallel() + + callerAddress := []byte("address") + args := createMockGovernanceArgs() + returnMessage := "" + mockEEI := &mock.SystemEIStub{ + GetStorageFromAddressCalled: func(_ []byte, _ []byte) []byte { + return []byte("invalid data") + }, + AddReturnMessageCalled: func(msg string) { + returnMessage = msg + }, + } + args.Eei = mockEEI + + gsc, _ := NewGovernanceContract(args) + callInputArgs := [][]byte{ + callerAddress, + } + callInput := createVMInput(zero, "viewUserVoteHistory", callerAddress, vm.GovernanceSCAddress, callInputArgs) + retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, returnMessage, vm.ErrInvalidCaller.Error()) + + callInput.CallerAddr = callInput.RecipientAddr + callInput.Arguments = [][]byte{callerAddress} + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) + + mockEEI.GetStorageCalled = func(key []byte) []byte { + proposalBytes, _ := args.Marshalizer.Marshal(&OngoingVotedList{ + Delegated: []uint64{1, 2}, + Direct: []uint64{1, 2}, + }) + return proposalBytes + } + + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) +} + +func TestGovernanceContract_ViewProposal(t *testing.T) { + t.Parallel() + + callerAddress := []byte("address") + args := createMockGovernanceArgs() + returnMessage := "" + mockEEI := &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + returnMessage = msg + }, + } + args.Eei = mockEEI + + gsc, _ := NewGovernanceContract(args) + + callInput := createVMInput(zero, "viewProposal", callerAddress, vm.GovernanceSCAddress, [][]byte{}) + retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, returnMessage, vm.ErrInvalidCaller.Error()) + + callInput.CallerAddr = callInput.RecipientAddr + callInput.Arguments = [][]byte{callerAddress} + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, returnMessage, vm.ErrProposalNotFound.Error()) + + mockEEI.GetStorageCalled = func(key []byte) []byte { + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + Yes: big.NewInt(10), + No: big.NewInt(10), + Veto: big.NewInt(10), + Abstain: big.NewInt(10), + ProposalCost: big.NewInt(10), + QuorumStake: big.NewInt(10), + Closed: true, + }) + return proposalBytes + } + + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) +} + +func TestGovernanceContract_ViewDelegatedVoteInfo(t *testing.T) { + t.Parallel() + + callerAddress := []byte("address") + args := createMockGovernanceArgs() + returnMessage := "" + mockEEI := &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + returnMessage = msg + }, + } + args.Eei = mockEEI + + gsc, _ := NewGovernanceContract(args) + + callInput := createVMInput(zero, "viewDelegatedVoteInfo", callerAddress, vm.GovernanceSCAddress, [][]byte{}) + retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, returnMessage, vm.ErrInvalidCaller.Error()) + + callInput.CallerAddr = callInput.RecipientAddr + callInput.Arguments = [][]byte{callerAddress} + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.UserError, retCode) + require.Equal(t, returnMessage, vm.ErrInvalidNumOfArguments.Error()) + + callInput.Arguments = [][]byte{callerAddress, callerAddress} + + mockEEI.GetStorageCalled = func(key []byte) []byte { + delegatedVoteInfo, _ := args.Marshalizer.Marshal(&DelegatedSCVoteInfo{ + UsedPower: big.NewInt(10), + UsedStake: big.NewInt(100), + TotalPower: big.NewInt(1000), + TotalStake: big.NewInt(10000), + }) + return delegatedVoteInfo + } + + retCode = gsc.Execute(callInput) + fmt.Println(returnMessage) + require.Equal(t, vmcommon.Ok, retCode) +} + // ======== Begin testing of helper functions func TestGovernanceContract_GetGeneralProposalNotFound(t *testing.T) { @@ -1412,6 +1600,32 @@ func TestGovernanceContract_ProposalExists(t *testing.T) { require.True(t, correctKeyCalled) } +func TestGovernanceContract_addNewVote(t *testing.T) { + t.Parallel() + + args := createMockGovernanceArgs() + gsc, _ := NewGovernanceContract(args) + + proposal := &GeneralProposal{ + Yes: big.NewInt(0), + No: big.NewInt(0), + Abstain: big.NewInt(0), + Veto: big.NewInt(0), + } + + _ = gsc.addNewVote(yesString, big.NewInt(9), proposal) + require.Equal(t, proposal.Yes, big.NewInt(9)) + + _ = gsc.addNewVote(noString, big.NewInt(99), proposal) + require.Equal(t, proposal.No, big.NewInt(99)) + + _ = gsc.addNewVote(vetoString, big.NewInt(999), proposal) + require.Equal(t, proposal.Veto, big.NewInt(999)) + + _ = gsc.addNewVote(abstainString, big.NewInt(9999), proposal) + require.Equal(t, proposal.Abstain, big.NewInt(9999)) +} + func TestComputeEndResults(t *testing.T) { t.Parallel() From 4095a482f8fe5ba54e37b5b2e6b0629f776484cf Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 26 Jan 2023 14:40:07 +0200 Subject: [PATCH 153/335] fix after review --- vm/systemSmartContracts/governance.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index c013a583202..1138a6d61a6 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -762,10 +762,6 @@ func (g *governanceContract) checkViewFuncArguments( if args.CallValue.Cmp(zero) != 0 { return vm.ErrCallValueMustBeZero } - err := g.eei.UseGas(g.gasCost.MetaChainSystemSCsCost.Vote) - if err != nil { - return vm.ErrNotEnoughGas - } if len(args.Arguments) != numArgs { return vm.ErrInvalidNumOfArguments } From 0605efed521d1646b9fbc6572f0cefef62bfc4ef Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 26 Jan 2023 15:09:23 +0200 Subject: [PATCH 154/335] governance enable --- 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 4b452afd5a2..06b858ecd8b 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -62,7 +62,7 @@ ESDTEnableEpoch = 1 # GovernanceEnableEpoch represents the epoch when governance is enabled - GovernanceEnableEpoch = 1000000 + GovernanceEnableEpoch = 5 # DelegationManagerEnableEpoch represents the epoch when the delegation manager is enabled # epoch should not be 0 From ffa5b02e8c4bd75a13777b2d99e8e309b7f7d8b7 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 26 Jan 2023 15:48:10 +0200 Subject: [PATCH 155/335] linter fixes --- node/node.go | 4 ++-- vm/systemSmartContracts/governance.go | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/node/node.go b/node/node.go index a299bbf413d..e5e9944a246 100644 --- a/node/node.go +++ b/node/node.go @@ -344,7 +344,7 @@ func (n *Node) GetValueForKey(address string, key string, options api.AccountQue // GetESDTData returns the esdt balance and properties from a given account func (n *Node) GetESDTData(address, tokenID string, nonce uint64, options api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { - userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) + userAccount, _, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { return nil, api.BlockInfo{}, err } @@ -508,7 +508,7 @@ func bigToString(bigValue *big.Int) string { // GetAllESDTTokens returns all the ESDTs that the given address interacted with func (n *Node) GetAllESDTTokens(address string, options api.AccountQueryOptions, ctx context.Context) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) { - userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) + userAccount, _, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { return nil, api.BlockInfo{}, err } diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 1138a6d61a6..41fe0bbf5fb 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -708,7 +708,8 @@ func (g *governanceContract) viewProposal(args *vmcommon.ContractCallInput) vmco if len(reference) < commitHashLength { reference = g.eei.GetStorage(append([]byte(noncePrefix), reference...)) } - proposal, err := g.getGeneralProposal(args.Arguments[0]) + + proposal, err := g.getGeneralProposal(reference) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -1107,7 +1108,7 @@ func (g *governanceContract) startEndEpochFromArguments(argStart []byte, argEnd return startVoteEpoch.Uint64(), endVoteEpoch.Uint64(), nil } -// uint64FromBytes converts a byte array to a big.Int return error for invalid values +// uint64FromBytes converts a byte array to a big.Int, returns error for invalid values func uint64FromBytes(nonce []byte) (*big.Int, error) { voteNonce, okConvert := big.NewInt(0).SetString(string(nonce), conversionBase) if !okConvert { From 5070fc4da979b20fd9a1e4a2409b51e62195852d Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 30 Jan 2023 16:28:31 +0200 Subject: [PATCH 156/335] claim multi and redelegate multi --- cmd/node/config/enableEpochs.toml | 3 + common/enablers/enableEpochsHandler.go | 1 + common/enablers/enableEpochsHandler_test.go | 2 + common/enablers/epochFlags.go | 7 +++ config/epochConfig.go | 1 + config/tomlConfig_test.go | 4 ++ vm/interface.go | 1 + vm/mock/systemEIStub.go | 5 ++ vm/systemSmartContracts/delegationManager.go | 62 ++++++++++++++++++++ vm/systemSmartContracts/eei.go | 15 +++++ 10 files changed, 101 insertions(+) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 4b452afd5a2..f01348820ba 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -239,6 +239,9 @@ # AlwaysSaveTokenMetaDataEnableEpoch represents the epoch when the token metadata is always saved AlwaysSaveTokenMetaDataEnableEpoch = 2 + # MultiClaimOnDelegationEnableEpoch represents the epoch when the multi claim on delegation is enabled + MultiClaimOnDelegationEnableEpoch = 3 + # BLSMultiSignerEnableEpoch represents the activation epoch for different types of BLS multi-signers BLSMultiSignerEnableEpoch = [ { EnableEpoch = 0, Type = "no-KOSK"}, diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index 85a9e115056..fccb168aa26 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -117,6 +117,7 @@ func (handler *enableEpochsHandler) EpochConfirmed(epoch uint32, _ uint64) { handler.setFlagValue(epoch >= handler.enableEpochsConfig.MaxBlockchainHookCountersEnableEpoch, handler.maxBlockchainHookCountersFlag, "maxBlockchainHookCountersFlag") handler.setFlagValue(epoch >= handler.enableEpochsConfig.WipeSingleNFTLiquidityDecreaseEnableEpoch, handler.wipeSingleNFTLiquidityDecreaseFlag, "wipeSingleNFTLiquidityDecreaseFlag") handler.setFlagValue(epoch >= handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch, handler.alwaysSaveTokenMetaDataFlag, "alwaysSaveTokenMetaDataFlag") + handler.setFlagValue(epoch >= handler.enableEpochsConfig.MultiClaimOnDelegationEnableEpoch, handler.multiClaimOnDelegationFlag, "multiClaimOnDelegationFlag") } func (handler *enableEpochsHandler) setFlagValue(value bool, flag *atomic.Flag, flagName string) { diff --git a/common/enablers/enableEpochsHandler_test.go b/common/enablers/enableEpochsHandler_test.go index c4721025939..9e15cbac60d 100644 --- a/common/enablers/enableEpochsHandler_test.go +++ b/common/enablers/enableEpochsHandler_test.go @@ -90,6 +90,7 @@ func createEnableEpochsConfig() config.EnableEpochs { MaxBlockchainHookCountersEnableEpoch: 74, WipeSingleNFTLiquidityDecreaseEnableEpoch: 75, AlwaysSaveTokenMetaDataEnableEpoch: 76, + MultiClaimOnDelegationEnableEpoch: 77, } } @@ -211,6 +212,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.True(t, handler.IsRuntimeMemStoreLimitEnabled()) assert.True(t, handler.IsMaxBlockchainHookCountersFlagEnabled()) assert.True(t, handler.IsAlwaysSaveTokenMetaDataEnabled()) + assert.True(t, handler.IsAlwaysSaveTokenMetaDataEnabled()) }) t.Run("flags with == condition should be set, along with all >=", func(t *testing.T) { t.Parallel() diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index eaa720cafe7..3afed099826 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -89,6 +89,7 @@ type epochFlagsHolder struct { maxBlockchainHookCountersFlag *atomic.Flag wipeSingleNFTLiquidityDecreaseFlag *atomic.Flag alwaysSaveTokenMetaDataFlag *atomic.Flag + multiClaimOnDelegationFlag *atomic.Flag } func newEpochFlagsHolder() *epochFlagsHolder { @@ -177,6 +178,7 @@ func newEpochFlagsHolder() *epochFlagsHolder { maxBlockchainHookCountersFlag: &atomic.Flag{}, wipeSingleNFTLiquidityDecreaseFlag: &atomic.Flag{}, alwaysSaveTokenMetaDataFlag: &atomic.Flag{}, + multiClaimOnDelegationFlag: &atomic.Flag{}, } } @@ -652,3 +654,8 @@ func (holder *epochFlagsHolder) IsWipeSingleNFTLiquidityDecreaseEnabled() bool { func (holder *epochFlagsHolder) IsAlwaysSaveTokenMetaDataEnabled() bool { return holder.alwaysSaveTokenMetaDataFlag.IsSet() } + +// IsMultiClaimOnDelegationDataEnabled returns true if multi claim on delegation is enabled +func (holder *epochFlagsHolder) IsMultiClaimOnDelegationDataEnabled() bool { + return holder.multiClaimOnDelegationFlag.IsSet() +} diff --git a/config/epochConfig.go b/config/epochConfig.go index 9d24ff990d3..ffb74ad4660 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -92,6 +92,7 @@ type EnableEpochs struct { MaxBlockchainHookCountersEnableEpoch uint32 WipeSingleNFTLiquidityDecreaseEnableEpoch uint32 AlwaysSaveTokenMetaDataEnableEpoch uint32 + MultiClaimOnDelegationEnableEpoch uint32 BLSMultiSignerEnableEpoch []MultiSignerConfig } diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 92802c97d02..bde91bd8811 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -678,6 +678,9 @@ func TestEnableEpochConfig(t *testing.T) { # AlwaysSaveTokenMetaDataEnableEpoch represents the epoch when the token metadata is always saved AlwaysSaveTokenMetaDataEnableEpoch = 61 + # MultiClaimOnDelegationEnableEpoch represents the epoch when the multi claim on delegation function is enabled + MultiClaimOnDelegationEnableEpoch = 62 + # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ { EpochEnable = 44, MaxNumNodes = 2169, NodesToShufflePerShard = 80 }, @@ -771,6 +774,7 @@ func TestEnableEpochConfig(t *testing.T) { MaxBlockchainHookCountersEnableEpoch: 59, WipeSingleNFTLiquidityDecreaseEnableEpoch: 60, AlwaysSaveTokenMetaDataEnableEpoch: 61, + MultiClaimOnDelegationEnableEpoch: 62, BLSMultiSignerEnableEpoch: []MultiSignerConfig{ { EnableEpoch: 0, diff --git a/vm/interface.go b/vm/interface.go index 64891d642ec..02a504bbb3c 100644 --- a/vm/interface.go +++ b/vm/interface.go @@ -56,6 +56,7 @@ type SystemEI interface { CanUnJail(blsKey []byte) bool IsBadRating(blsKey []byte) bool CleanStorageUpdates() + GetTotalSentToUser(dest []byte) *big.Int IsInterfaceNil() bool } diff --git a/vm/mock/systemEIStub.go b/vm/mock/systemEIStub.go index ab4e953845b..9b58804fd01 100644 --- a/vm/mock/systemEIStub.go +++ b/vm/mock/systemEIStub.go @@ -104,6 +104,11 @@ func (s *SystemEIStub) UseGas(gas uint64) error { return nil } +// GetTotalSentToUser - +func (s *SystemEIStub) GetTotalSentToUser(_ []byte) *big.Int { + return big.NewInt(0) +} + // SetGasProvided - func (s *SystemEIStub) SetGasProvided(_ uint64) { } diff --git a/vm/systemSmartContracts/delegationManager.go b/vm/systemSmartContracts/delegationManager.go index cc453d36792..63400ea6436 100644 --- a/vm/systemSmartContracts/delegationManager.go +++ b/vm/systemSmartContracts/delegationManager.go @@ -144,6 +144,10 @@ func (d *delegationManager) Execute(args *vmcommon.ContractCallInput) vmcommon.R return d.mergeValidatorToDelegation(args, d.checkCallerIsOwnerOfContract) case "mergeValidatorToDelegationWithWhitelist": return d.mergeValidatorToDelegation(args, d.isAddressWhiteListedForMerge) + case "claimMulti": + return d.claimMultipleDelegation(args) + case "reDelegateMulti": + return d.reDelegateMulti(args) } d.eei.AddReturnMessage("invalid function to call") @@ -495,6 +499,64 @@ func (d *delegationManager) getContractConfig(args *vmcommon.ContractCallInput) return vmcommon.Ok } +func (d *delegationManager) claimMultipleDelegation(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + returnCode := d.executeFuncOnListAddresses(args, "claimRewards") + if returnCode != vmcommon.Ok { + return returnCode + } + totalSent := d.eei.GetTotalSentToUser(args.CallerAddr) + d.eei.Finish(totalSent.Bytes()) + + return vmcommon.Ok +} + +func (d *delegationManager) reDelegateMulti(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + returnCode := d.executeFuncOnListAddresses(args, "reDelegateRewards") + if returnCode != vmcommon.Ok { + return returnCode + } + err := d.eei.GetLogs() + if err != nil { + d.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + return vmcommon.Ok +} + +func (d *delegationManager) executeFuncOnListAddresses( + args *vmcommon.ContractCallInput, + funcName string) vmcommon.ReturnCode { + if len(args.Arguments) < 1 { + d.eei.AddReturnMessage(vm.ErrInvalidNumOfArguments.Error()) + return vmcommon.UserError + } + err := d.eei.UseGas(d.gasCost.MetaChainSystemSCsCost.DelegationOps) + if err != nil { + d.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + for _, address := range args.Arguments { + if len(address) != len(args.CallerAddr) { + d.eei.AddReturnMessage(vm.ErrInvalidArgument.Error()) + return vmcommon.UserError + } + + vmOutput, err := d.eei.ExecuteOnDestContext(address, args.CallerAddr, big.NewInt(0), []byte(funcName)) + if err != nil { + d.eei.AddReturnMessage(err.Error()) + return vmcommon.UserError + } + + if vmOutput.ReturnCode != vmcommon.Ok { + return vmOutput.ReturnCode + } + } + + return vmcommon.Ok +} + func createNewAddress(lastAddress []byte) []byte { i := 0 for ; i < len(lastAddress) && lastAddress[i] == 0; i++ { diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 6f03b8487fa..7e81c536f93 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -257,6 +257,21 @@ func (host *vmContext) Transfer( return nil } +// GetLogs returns the logs +func (host *vmContext) GetLogs() []*vmcommon.LogEntry { + return host.logs +} + +// GetTotalSentToUser returns the total sent to the specified address +func (host *vmContext) GetTotalSentToUser(dest []byte) *big.Int { + destination, exists := host.outputAccounts[string(dest)] + if !exists { + return big.NewInt(0) + } + + return destination.BalanceDelta +} + func (host *vmContext) copyToNewContext() *vmContext { newContext := vmContext{ storageUpdate: host.storageUpdate, From c1dd6bd7c6985f0765e3e71205edcd8b6e819401 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 30 Jan 2023 17:32:45 +0200 Subject: [PATCH 157/335] claim multi and redelegate multi --- common/enablers/epochFlags.go | 4 +-- common/interface.go | 1 + sharding/mock/enableEpochsHandlerMock.go | 5 +++ testscommon/enableEpochsHandlerStub.go | 9 ++++++ vm/interface.go | 1 + vm/mock/systemEIStub.go | 5 +++ vm/systemSmartContracts/delegationManager.go | 32 ++++++++++++++++---- 7 files changed, 49 insertions(+), 8 deletions(-) diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index 3afed099826..ff0e57995bd 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -655,7 +655,7 @@ func (holder *epochFlagsHolder) IsAlwaysSaveTokenMetaDataEnabled() bool { return holder.alwaysSaveTokenMetaDataFlag.IsSet() } -// IsMultiClaimOnDelegationDataEnabled returns true if multi claim on delegation is enabled -func (holder *epochFlagsHolder) IsMultiClaimOnDelegationDataEnabled() bool { +// IsMultiClaimOnDelegationEnabled returns true if multi claim on delegation is enabled +func (holder *epochFlagsHolder) IsMultiClaimOnDelegationEnabled() bool { return holder.multiClaimOnDelegationFlag.IsSet() } diff --git a/common/interface.go b/common/interface.go index 597359d4209..1ec80ef4289 100644 --- a/common/interface.go +++ b/common/interface.go @@ -336,6 +336,7 @@ type EnableEpochsHandler interface { IsMaxBlockchainHookCountersFlagEnabled() bool IsWipeSingleNFTLiquidityDecreaseEnabled() bool IsAlwaysSaveTokenMetaDataEnabled() bool + IsMultiClaimOnDelegationEnabled() bool IsInterfaceNil() bool } diff --git a/sharding/mock/enableEpochsHandlerMock.go b/sharding/mock/enableEpochsHandlerMock.go index a1c15518988..7128127f139 100644 --- a/sharding/mock/enableEpochsHandlerMock.go +++ b/sharding/mock/enableEpochsHandlerMock.go @@ -561,6 +561,11 @@ func (mock *EnableEpochsHandlerMock) IsAlwaysSaveTokenMetaDataEnabled() bool { return false } +// IsMultiClaimOnDelegationEnabled - +func (mock *EnableEpochsHandlerMock) IsMultiClaimOnDelegationEnabled() bool { + return false +} + // IsInterfaceNil returns true if there is no value under the interface func (mock *EnableEpochsHandlerMock) IsInterfaceNil() bool { return mock == nil diff --git a/testscommon/enableEpochsHandlerStub.go b/testscommon/enableEpochsHandlerStub.go index 5fa9c87a3a4..881bdd8f638 100644 --- a/testscommon/enableEpochsHandlerStub.go +++ b/testscommon/enableEpochsHandlerStub.go @@ -116,6 +116,7 @@ type EnableEpochsHandlerStub struct { IsMaxBlockchainHookCountersFlagEnabledField bool IsWipeSingleNFTLiquidityDecreaseEnabledField bool IsAlwaysSaveTokenMetaDataEnabledField bool + IsMultiClaimOnDelegationEnabledField bool } // ResetPenalizedTooMuchGasFlag - @@ -1005,6 +1006,14 @@ func (stub *EnableEpochsHandlerStub) IsAlwaysSaveTokenMetaDataEnabled() bool { return stub.IsAlwaysSaveTokenMetaDataEnabledField } +// IsMultiClaimOnDelegationEnabled - +func (stub *EnableEpochsHandlerStub) IsMultiClaimOnDelegationEnabled() bool { + stub.RLock() + defer stub.RUnlock() + + return stub.IsMultiClaimOnDelegationEnabledField +} + // IsInterfaceNil - func (stub *EnableEpochsHandlerStub) IsInterfaceNil() bool { return stub == nil diff --git a/vm/interface.go b/vm/interface.go index 02a504bbb3c..4436f1e1986 100644 --- a/vm/interface.go +++ b/vm/interface.go @@ -57,6 +57,7 @@ type SystemEI interface { IsBadRating(blsKey []byte) bool CleanStorageUpdates() GetTotalSentToUser(dest []byte) *big.Int + GetLogs() []*vmcommon.LogEntry IsInterfaceNil() bool } diff --git a/vm/mock/systemEIStub.go b/vm/mock/systemEIStub.go index 9b58804fd01..271e36214e3 100644 --- a/vm/mock/systemEIStub.go +++ b/vm/mock/systemEIStub.go @@ -109,6 +109,11 @@ func (s *SystemEIStub) GetTotalSentToUser(_ []byte) *big.Int { return big.NewInt(0) } +// GetLogs - +func (s *SystemEIStub) GetLogs() []*vmcommon.LogEntry { + return make([]*vmcommon.LogEntry, 0) +} + // SetGasProvided - func (s *SystemEIStub) SetGasProvided(_ uint64) { } diff --git a/vm/systemSmartContracts/delegationManager.go b/vm/systemSmartContracts/delegationManager.go index 63400ea6436..a49c8f14ab1 100644 --- a/vm/systemSmartContracts/delegationManager.go +++ b/vm/systemSmartContracts/delegationManager.go @@ -515,18 +515,38 @@ func (d *delegationManager) reDelegateMulti(args *vmcommon.ContractCallInput) vm if returnCode != vmcommon.Ok { return returnCode } - err := d.eei.GetLogs() - if err != nil { - d.eei.AddReturnMessage(err.Error()) - return vmcommon.UserError - } + logs := d.eei.GetLogs() + totalReDelegated := getTotalReDelegatedFromLogs(logs) + d.eei.Finish(totalReDelegated.Bytes()) return vmcommon.Ok } +func getTotalReDelegatedFromLogs(logs []*vmcommon.LogEntry) *big.Int { + totalReDelegated := big.NewInt(0) + for _, reDelegateLog := range logs { + if len(reDelegateLog.Topics) < 1 { + continue + } + if !bytes.Equal(reDelegateLog.Identifier, []byte("delegate")) { + continue + } + valueFromFirstTopic := big.NewInt(0).SetBytes(reDelegateLog.Topics[0]) + totalReDelegated.Add(totalReDelegated, valueFromFirstTopic) + } + + return totalReDelegated +} + func (d *delegationManager) executeFuncOnListAddresses( args *vmcommon.ContractCallInput, - funcName string) vmcommon.ReturnCode { + funcName string, +) vmcommon.ReturnCode { + if !d.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { + d.eei.AddReturnMessage("invalid function to call") + return vmcommon.UserError + } + if len(args.Arguments) < 1 { d.eei.AddReturnMessage(vm.ErrInvalidNumOfArguments.Error()) return vmcommon.UserError From 774df731ecb8d855530e46ec0e223671d23fec17 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 31 Jan 2023 09:44:09 +0200 Subject: [PATCH 158/335] claim multi and redelegate multi --- vm/systemSmartContracts/delegationManager.go | 4 +- .../delegationManager_test.go | 68 +++++++++++++++++++ 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/vm/systemSmartContracts/delegationManager.go b/vm/systemSmartContracts/delegationManager.go index a49c8f14ab1..914ee3432c5 100644 --- a/vm/systemSmartContracts/delegationManager.go +++ b/vm/systemSmartContracts/delegationManager.go @@ -546,7 +546,6 @@ func (d *delegationManager) executeFuncOnListAddresses( d.eei.AddReturnMessage("invalid function to call") return vmcommon.UserError } - if len(args.Arguments) < 1 { d.eei.AddReturnMessage(vm.ErrInvalidNumOfArguments.Error()) return vmcommon.UserError @@ -557,13 +556,14 @@ func (d *delegationManager) executeFuncOnListAddresses( return vmcommon.UserError } + var vmOutput *vmcommon.VMOutput for _, address := range args.Arguments { if len(address) != len(args.CallerAddr) { d.eei.AddReturnMessage(vm.ErrInvalidArgument.Error()) return vmcommon.UserError } - vmOutput, err := d.eei.ExecuteOnDestContext(address, args.CallerAddr, big.NewInt(0), []byte(funcName)) + vmOutput, err = d.eei.ExecuteOnDestContext(address, args.CallerAddr, big.NewInt(0), []byte(funcName)) if err != nil { d.eei.AddReturnMessage(err.Error()) return vmcommon.UserError diff --git a/vm/systemSmartContracts/delegationManager_test.go b/vm/systemSmartContracts/delegationManager_test.go index 363199dda18..97b72776210 100644 --- a/vm/systemSmartContracts/delegationManager_test.go +++ b/vm/systemSmartContracts/delegationManager_test.go @@ -1085,3 +1085,71 @@ func TestDelegationManagerSystemSC_MakeNewContractFromValidatorDataCallerAlready assert.Equal(t, vmcommon.UserError, returnCode) assert.Equal(t, eei.returnMessage, "caller already deployed a delegation sc") } + +func TestDelegationManagerSystemSC_ClaimMultipleDelegationFails(t *testing.T) { + t.Parallel() + + args := createMockArgumentsForDelegationManager() + eei := createDefaultEei() + _ = eei.SetSystemSCContainer( + createSystemSCContainer(eei), + ) + + enableHandlerStub := &testscommon.EnableEpochsHandlerStub{ + IsMultiClaimOnDelegationEnabledField: false, + IsDelegationManagerFlagEnabledField: true, + } + args.EnableEpochsHandler = enableHandlerStub + args.Eei = eei + createDelegationManagerConfig(eei, args.Marshalizer, big.NewInt(20)) + + dm, _ := NewDelegationManagerSystemSC(args) + eei.SetSCAddress(dm.delegationMgrSCAddress) + + vmInput := getDefaultVmInputForDelegationManager("claimMulti", [][]byte{}) + returnCode := dm.Execute(vmInput) + assert.Equal(t, returnCode, vmcommon.UserError) + assert.Equal(t, eei.GetReturnMessage(), "invalid function to call") + + eei.returnMessage = "" + enableHandlerStub.IsMultiClaimOnDelegationEnabledField = true + returnCode = dm.Execute(vmInput) + assert.Equal(t, returnCode, vmcommon.UserError) + assert.Equal(t, eei.GetReturnMessage(), vm.ErrInvalidNumOfArguments.Error()) + + dm.gasCost.MetaChainSystemSCsCost.DelegationOps = 10 + eei.returnMessage = "" + eei.gasRemaining = 5 + vmInput.Arguments = [][]byte{{1}} + returnCode = dm.Execute(vmInput) + assert.Equal(t, returnCode, vmcommon.UserError) + assert.Equal(t, eei.GetReturnMessage(), vm.ErrNotEnoughGas.Error()) + + eei.returnMessage = "" + eei.gasRemaining = 20 + returnCode = dm.Execute(vmInput) + assert.Equal(t, returnCode, vmcommon.UserError) + assert.Equal(t, eei.GetReturnMessage(), vm.ErrInvalidArgument.Error()) + + eei.returnMessage = "" + eei.gasRemaining = 20 + vmInput.Arguments[0] = vmInput.CallerAddr + returnCode = dm.Execute(vmInput) + assert.Equal(t, returnCode, vmcommon.UserError) + assert.Equal(t, eei.GetReturnMessage(), "missing system smart contract on selected address") + + vmInput.CallerAddr = bytes.Repeat([]byte{1}, 32) + vmInput.Arguments[0] = vm.FirstDelegationSCAddress + eei.returnMessage = "" + eei.gasRemaining = 20 + returnCode = dm.Execute(vmInput) + assert.Equal(t, returnCode, vmcommon.UserError) + assert.Equal(t, eei.GetReturnMessage(), "first delegation sc address cannot be called") + + vmInput.Function = "reDelegateMulti" + eei.returnMessage = "" + eei.gasRemaining = 20 + returnCode = dm.Execute(vmInput) + assert.Equal(t, returnCode, vmcommon.UserError) + assert.Equal(t, eei.GetReturnMessage(), "first delegation sc address cannot be called") +} From fd30cf07eae3576daf5031ce1bc3e20a4337ebb5 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 31 Jan 2023 11:14:31 +0200 Subject: [PATCH 159/335] claim multi and redelegate multi --- vm/systemSmartContracts/delegationManager.go | 6 ++ .../delegationManager_test.go | 87 +++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/vm/systemSmartContracts/delegationManager.go b/vm/systemSmartContracts/delegationManager.go index 914ee3432c5..fcfea05e9e7 100644 --- a/vm/systemSmartContracts/delegationManager.go +++ b/vm/systemSmartContracts/delegationManager.go @@ -556,13 +556,19 @@ func (d *delegationManager) executeFuncOnListAddresses( return vmcommon.UserError } + mapAddresses := make(map[string]struct{}) var vmOutput *vmcommon.VMOutput for _, address := range args.Arguments { if len(address) != len(args.CallerAddr) { d.eei.AddReturnMessage(vm.ErrInvalidArgument.Error()) return vmcommon.UserError } + if _, ok := mapAddresses[string(address)]; ok { + d.eei.AddReturnMessage("duplicated input") + return vmcommon.UserError + } + mapAddresses[string(address)] = struct{}{} vmOutput, err = d.eei.ExecuteOnDestContext(address, args.CallerAddr, big.NewInt(0), []byte(funcName)) if err != nil { d.eei.AddReturnMessage(err.Error()) diff --git a/vm/systemSmartContracts/delegationManager_test.go b/vm/systemSmartContracts/delegationManager_test.go index 97b72776210..90671bf6ac3 100644 --- a/vm/systemSmartContracts/delegationManager_test.go +++ b/vm/systemSmartContracts/delegationManager_test.go @@ -40,6 +40,7 @@ func createMockArgumentsForDelegationManager() ArgsNewDelegationManager { EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{ IsDelegationManagerFlagEnabledField: true, IsValidatorToDelegationFlagEnabledField: true, + IsMultiClaimOnDelegationEnabledField: true, }, } } @@ -1153,3 +1154,89 @@ func TestDelegationManagerSystemSC_ClaimMultipleDelegationFails(t *testing.T) { assert.Equal(t, returnCode, vmcommon.UserError) assert.Equal(t, eei.GetReturnMessage(), "first delegation sc address cannot be called") } + +func TestDelegationManagerSystemSC_ClaimMultipleDelegationDuplicatedInput(t *testing.T) { + t.Parallel() + + d, eei := createTestEEIAndDelegationFormMergeValidator() + _ = prepareVmInputContextAndDelegationManager(d, eei) + + _ = eei.SetSystemSCContainer( + &mock.SystemSCContainerStub{ + GetCalled: func(key []byte) (vm.SystemSmartContract, error) { + return &mock.SystemSCStub{ + ExecuteCalled: func(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + _ = d.eei.Transfer(args.RecipientAddr, args.CallerAddr, big.NewInt(10), nil, 0) + return vmcommon.Ok + }, + }, nil + }}) + + vmInput := getDefaultVmInputForDelegationManager("claimMulti", [][]byte{}) + vmInput.CallerAddr = bytes.Repeat([]byte{1}, 32) + vmInput.RecipientAddr = vm.DelegationManagerSCAddress + vmInput.Arguments = [][]byte{bytes.Repeat([]byte{2}, 32), bytes.Repeat([]byte{2}, 32)} + returnCode := d.Execute(vmInput) + assert.Equal(t, vmcommon.UserError, returnCode) + assert.Equal(t, eei.GetReturnMessage(), "duplicated input") +} + +func TestDelegationManagerSystemSC_ClaimMultipleDelegation(t *testing.T) { + t.Parallel() + + d, eei := createTestEEIAndDelegationFormMergeValidator() + _ = prepareVmInputContextAndDelegationManager(d, eei) + + _ = eei.SetSystemSCContainer( + &mock.SystemSCContainerStub{ + GetCalled: func(key []byte) (vm.SystemSmartContract, error) { + return &mock.SystemSCStub{ + ExecuteCalled: func(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + _ = d.eei.Transfer(args.RecipientAddr, args.CallerAddr, big.NewInt(10), nil, 0) + return vmcommon.Ok + }, + }, nil + }}) + + vmInput := getDefaultVmInputForDelegationManager("claimMulti", [][]byte{}) + vmInput.CallerAddr = bytes.Repeat([]byte{1}, 32) + vmInput.RecipientAddr = vm.DelegationManagerSCAddress + vmInput.Arguments = [][]byte{bytes.Repeat([]byte{2}, 32), bytes.Repeat([]byte{3}, 32)} + returnCode := d.Execute(vmInput) + require.Equal(t, vmcommon.Ok, returnCode) + require.Equal(t, len(eei.output), 1) + require.Equal(t, eei.output[0], big.NewInt(20).Bytes()) +} + +func TestDelegationManagerSystemSC_ReDelegateMulti(t *testing.T) { + t.Parallel() + + d, eei := createTestEEIAndDelegationFormMergeValidator() + _ = prepareVmInputContextAndDelegationManager(d, eei) + + _ = eei.SetSystemSCContainer( + &mock.SystemSCContainerStub{ + GetCalled: func(key []byte) (vm.SystemSmartContract, error) { + return &mock.SystemSCStub{ + ExecuteCalled: func(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + entry := &vmcommon.LogEntry{ + Identifier: []byte("delegate"), + Address: args.CallerAddr, + Topics: [][]byte{big.NewInt(10).Bytes()}, + Data: nil, + } + d.eei.AddLogEntry(entry) + return vmcommon.Ok + }, + }, nil + }}) + + vmInput := getDefaultVmInputForDelegationManager("reDelegateMulti", [][]byte{}) + vmInput.CallerAddr = bytes.Repeat([]byte{1}, 32) + vmInput.RecipientAddr = vm.DelegationManagerSCAddress + vmInput.Arguments = [][]byte{bytes.Repeat([]byte{2}, 32), bytes.Repeat([]byte{3}, 32)} + returnCode := d.Execute(vmInput) + require.Equal(t, vmcommon.Ok, returnCode) + require.Equal(t, len(eei.output), 1) + require.Equal(t, eei.output[0], big.NewInt(20).Bytes()) +} From 64184c262fe4a4a511ecbe9cc16c67ec9df427d9 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 31 Jan 2023 11:18:56 +0200 Subject: [PATCH 160/335] code coverage unit tests --- vm/systemSmartContracts/delegationManager_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/vm/systemSmartContracts/delegationManager_test.go b/vm/systemSmartContracts/delegationManager_test.go index 90671bf6ac3..75ceb982ad0 100644 --- a/vm/systemSmartContracts/delegationManager_test.go +++ b/vm/systemSmartContracts/delegationManager_test.go @@ -1226,6 +1226,14 @@ func TestDelegationManagerSystemSC_ReDelegateMulti(t *testing.T) { Data: nil, } d.eei.AddLogEntry(entry) + + wrongEntry := &vmcommon.LogEntry{} + d.eei.AddLogEntry(wrongEntry) + + wrongEntry2 := &vmcommon.LogEntry{ + Topics: [][]byte{big.NewInt(10).Bytes()}, + } + d.eei.AddLogEntry(wrongEntry2) return vmcommon.Ok }, }, nil From 5fd51ff5b70a913e01513f80e7f79e857a738162 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 31 Jan 2023 11:55:49 +0200 Subject: [PATCH 161/335] added integration tests --- .../vm/delegation/delegationMulti_test.go | 243 ++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 integrationTests/vm/delegation/delegationMulti_test.go diff --git a/integrationTests/vm/delegation/delegationMulti_test.go b/integrationTests/vm/delegation/delegationMulti_test.go new file mode 100644 index 00000000000..f09449d42d7 --- /dev/null +++ b/integrationTests/vm/delegation/delegationMulti_test.go @@ -0,0 +1,243 @@ +package delegation + +import ( + "encoding/hex" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/block" + "github.com/multiversx/mx-chain-go/integrationTests" + "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/vm" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "math/big" + "testing" +) + +func TestDelegationSystemClaimMulti(t *testing.T) { + tpn := integrationTests.NewTestProcessorNode(integrationTests.ArgTestProcessorNode{ + MaxShards: 1, + NodeShardId: core.MetachainShardId, + TxSignPrivKeyShardId: 0, + }) + tpn.InitDelegationManager() + maxDelegationCap := big.NewInt(5000) + serviceFee := big.NewInt(10000) // 10% + numContracts := 2 + totalNumNodes := 5 + numDelegators := 4 + delegationVal := int64(1000) + tpn.EpochNotifier.CheckEpoch(&testscommon.HeaderHandlerStub{ + EpochField: integrationTests.UnreachableEpoch + 1, + }) + tpn.BlockchainHook.SetCurrentHeader(&block.MetaBlock{Nonce: 1}) + + ownerAddresses := getAddresses(numContracts) + + delegators := getAddresses(numDelegators) + delegationScAddresses := make([][]byte, numContracts) + + firstTwoDelegators := delegators[:2] + lastTwoDelegators := delegators[2:] + halfDelegationVal := delegationVal / 2 + + for i := range delegationScAddresses { + delegationScAddresses[i] = deployNewSc(t, tpn, maxDelegationCap, serviceFee, big.NewInt(2000), ownerAddresses[i]) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", [][]byte{ownerAddresses[i]}, delegationScAddresses[i], big.NewInt(2000)) + + blsKeys, sigs := getBlsKeysAndSignatures(delegationScAddresses[i], totalNumNodes) + txData := addNodesTxData(blsKeys, sigs) + returnedCode, err := processTransaction(tpn, ownerAddresses[i], delegationScAddresses[i], txData, big.NewInt(0)) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnedCode) + + processMultipleTransactions(t, tpn, firstTwoDelegators, delegationScAddresses[i], "delegate", big.NewInt(delegationVal)) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", firstTwoDelegators, delegationScAddresses[i], big.NewInt(delegationVal)) + + processMultipleTransactions(t, tpn, lastTwoDelegators, delegationScAddresses[i], "delegate", big.NewInt(halfDelegationVal)) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", lastTwoDelegators, delegationScAddresses[i], big.NewInt(halfDelegationVal)) + + txData = txDataForFunc("stakeNodes", blsKeys) + returnedCode, err = processTransaction(tpn, ownerAddresses[i], delegationScAddresses[i], txData, big.NewInt(0)) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnedCode) + } + + for i := range delegationScAddresses { + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(1000), 1, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(2000), 2, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(3000), 3, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(4000), 4, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(5000), 5, 1) + } + + for i := range delegationScAddresses { + checkRewardData(t, tpn, delegationScAddresses[i], 1, 1000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 2, 2000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 3, 3000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 4, 4000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 5, 5000, 5000, serviceFee) + } + + for i := range delegationScAddresses { + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[0], 2700) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[1], 2700) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[2], 1350) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[3], 1350) + checkDelegatorReward(t, tpn, delegationScAddresses[i], ownerAddresses[i], 6900) + } + + txData := "claimMulti" + listAddresses := make([][]byte, 0) + for _, address := range delegationScAddresses { + txData += "@" + hex.EncodeToString(address) + listAddresses = append(listAddresses, address) + } + + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[0], "claimMulti", listAddresses, 5400) + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[1], "claimMulti", listAddresses, 5400) + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[2], "claimMulti", listAddresses, 2700) + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[3], "claimMulti", listAddresses, 2700) + + for _, delegator := range delegators { + returnedCode, err := processTransaction(tpn, delegator, vm.DelegationManagerSCAddress, txData, big.NewInt(0)) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnedCode) + } + + for i := range delegationScAddresses { + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[0], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[1], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[2], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[3], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], ownerAddresses[i], 6900) + } +} + +func TestDelegationSystemRedelegateMulti(t *testing.T) { + tpn := integrationTests.NewTestProcessorNode(integrationTests.ArgTestProcessorNode{ + MaxShards: 1, + NodeShardId: core.MetachainShardId, + TxSignPrivKeyShardId: 0, + }) + tpn.InitDelegationManager() + maxDelegationCap := big.NewInt(5000000) + serviceFee := big.NewInt(10000) // 10% + numContracts := 2 + totalNumNodes := 5 + numDelegators := 4 + delegationVal := int64(1000) + tpn.EpochNotifier.CheckEpoch(&testscommon.HeaderHandlerStub{ + EpochField: integrationTests.UnreachableEpoch + 1, + }) + tpn.BlockchainHook.SetCurrentHeader(&block.MetaBlock{Nonce: 1}) + + ownerAddresses := getAddresses(numContracts) + + delegators := getAddresses(numDelegators) + delegationScAddresses := make([][]byte, numContracts) + + firstTwoDelegators := delegators[:2] + lastTwoDelegators := delegators[2:] + halfDelegationVal := delegationVal / 2 + + for i := range delegationScAddresses { + delegationScAddresses[i] = deployNewSc(t, tpn, maxDelegationCap, serviceFee, big.NewInt(2000), ownerAddresses[i]) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", [][]byte{ownerAddresses[i]}, delegationScAddresses[i], big.NewInt(2000)) + + blsKeys, sigs := getBlsKeysAndSignatures(delegationScAddresses[i], totalNumNodes) + txData := addNodesTxData(blsKeys, sigs) + returnedCode, err := processTransaction(tpn, ownerAddresses[i], delegationScAddresses[i], txData, big.NewInt(0)) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnedCode) + + processMultipleTransactions(t, tpn, firstTwoDelegators, delegationScAddresses[i], "delegate", big.NewInt(delegationVal)) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", firstTwoDelegators, delegationScAddresses[i], big.NewInt(delegationVal)) + + processMultipleTransactions(t, tpn, lastTwoDelegators, delegationScAddresses[i], "delegate", big.NewInt(halfDelegationVal)) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", lastTwoDelegators, delegationScAddresses[i], big.NewInt(halfDelegationVal)) + + txData = txDataForFunc("stakeNodes", blsKeys) + returnedCode, err = processTransaction(tpn, ownerAddresses[i], delegationScAddresses[i], txData, big.NewInt(0)) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnedCode) + } + + for i := range delegationScAddresses { + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(1000), 1, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(2000), 2, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(3000), 3, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(4000), 4, 1) + addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(5000), 5, 1) + } + + for i := range delegationScAddresses { + checkRewardData(t, tpn, delegationScAddresses[i], 1, 1000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 2, 2000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 3, 3000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 4, 4000, 5000, serviceFee) + checkRewardData(t, tpn, delegationScAddresses[i], 5, 5000, 5000, serviceFee) + } + + for i := range delegationScAddresses { + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[0], 2700) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[1], 2700) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[2], 1350) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[3], 1350) + checkDelegatorReward(t, tpn, delegationScAddresses[i], ownerAddresses[i], 6900) + } + + txData := "reDelegateMulti" + listAddresses := make([][]byte, 0) + for _, address := range delegationScAddresses { + txData += "@" + hex.EncodeToString(address) + listAddresses = append(listAddresses, address) + } + + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[0], "reDelegateMulti", listAddresses, 5400) + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[1], "reDelegateMulti", listAddresses, 5400) + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[2], "reDelegateMulti", listAddresses, 2700) + checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[3], "reDelegateMulti", listAddresses, 2700) + + for _, delegator := range delegators { + returnedCode, err := processTransaction(tpn, delegator, vm.DelegationManagerSCAddress, txData, big.NewInt(0)) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnedCode) + } + + for i := range delegationScAddresses { + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[0], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[1], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[2], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[3], 0) + checkDelegatorReward(t, tpn, delegationScAddresses[i], ownerAddresses[i], 6900) + } + + verifyDelegatorsStake(t, tpn, "getUserActiveStake", firstTwoDelegators, delegationScAddresses[0], big.NewInt(3700)) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", firstTwoDelegators, delegationScAddresses[1], big.NewInt(3700)) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", lastTwoDelegators, delegationScAddresses[0], big.NewInt(1850)) + verifyDelegatorsStake(t, tpn, "getUserActiveStake", lastTwoDelegators, delegationScAddresses[1], big.NewInt(1850)) +} + +func checkClaimMultiReturn( + t *testing.T, + tpn *integrationTests.TestProcessorNode, + delegMgrAddr []byte, + delegAddr []byte, + function string, + arguments [][]byte, + expectedRewards int64, +) { + query := &process.SCQuery{ + ScAddress: delegMgrAddr, + FuncName: function, + CallerAddr: delegAddr, + CallValue: big.NewInt(0), + Arguments: arguments, + } + 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]) +} From a4d66baf72737e95682de55da5110b7f901b9c42 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 31 Jan 2023 13:11:24 +0200 Subject: [PATCH 162/335] go build !race --- integrationTests/vm/delegation/delegationMulti_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/delegation/delegationMulti_test.go b/integrationTests/vm/delegation/delegationMulti_test.go index f09449d42d7..b41238ad9fe 100644 --- a/integrationTests/vm/delegation/delegationMulti_test.go +++ b/integrationTests/vm/delegation/delegationMulti_test.go @@ -1,7 +1,13 @@ +//go:build !race +// +build !race + package delegation import ( "encoding/hex" + "math/big" + "testing" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-go/integrationTests" @@ -11,8 +17,6 @@ import ( vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "math/big" - "testing" ) func TestDelegationSystemClaimMulti(t *testing.T) { From 69e624226b27cc37c0cf4c4628a7959998f03a06 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Wed, 1 Feb 2023 16:46:29 +0200 Subject: [PATCH 163/335] MX-13760: improve handlers sorting on epoch change subscriber --- .../notifier/epochStartSubscriptionHandler.go | 13 +--- .../epochStartSubscriptionHandler_test.go | 63 ++++++++++++++----- state/syncer/userAccountsSyncer.go | 4 +- 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/epochStart/notifier/epochStartSubscriptionHandler.go b/epochStart/notifier/epochStartSubscriptionHandler.go index fbb9a2d2050..4c1e6c558b9 100644 --- a/epochStart/notifier/epochStartSubscriptionHandler.go +++ b/epochStart/notifier/epochStartSubscriptionHandler.go @@ -42,6 +42,9 @@ func (essh *epochStartSubscriptionHandler) RegisterHandler(handler epochStart.Ac if handler != nil { essh.mutEpochStartHandler.Lock() essh.epochStartHandlers = append(essh.epochStartHandlers, handler) + sort.Slice(essh.epochStartHandlers, func(i, j int) bool { + return essh.epochStartHandlers[i].NotifyOrder() < essh.epochStartHandlers[j].NotifyOrder() + }) essh.mutEpochStartHandler.Unlock() } } @@ -62,11 +65,6 @@ func (essh *epochStartSubscriptionHandler) UnregisterHandler(handlerToUnregister // NotifyAll will call all the subscribed functions from the internal slice func (essh *epochStartSubscriptionHandler) NotifyAll(hdr data.HeaderHandler) { essh.mutEpochStartHandler.RLock() - - sort.Slice(essh.epochStartHandlers, func(i, j int) bool { - return essh.epochStartHandlers[i].NotifyOrder() < essh.epochStartHandlers[j].NotifyOrder() - }) - for i := 0; i < len(essh.epochStartHandlers); i++ { essh.epochStartHandlers[i].EpochStartAction(hdr) } @@ -77,11 +75,6 @@ func (essh *epochStartSubscriptionHandler) NotifyAll(hdr data.HeaderHandler) { // observed, but not yet confirmed/committed. Some components may need to do some initialisation/preparation func (essh *epochStartSubscriptionHandler) NotifyAllPrepare(metaHdr data.HeaderHandler, body data.BodyHandler) { essh.mutEpochStartHandler.RLock() - - sort.Slice(essh.epochStartHandlers, func(i, j int) bool { - return essh.epochStartHandlers[i].NotifyOrder() < essh.epochStartHandlers[j].NotifyOrder() - }) - for i := 0; i < len(essh.epochStartHandlers); i++ { essh.epochStartHandlers[i].EpochStartPrepare(metaHdr, body) } diff --git a/epochStart/notifier/epochStartSubscriptionHandler_test.go b/epochStart/notifier/epochStartSubscriptionHandler_test.go index fb290574a57..7d157d69458 100644 --- a/epochStart/notifier/epochStartSubscriptionHandler_test.go +++ b/epochStart/notifier/epochStartSubscriptionHandler_test.go @@ -1,6 +1,7 @@ package notifier_test import ( + "sync" "testing" "github.com/multiversx/mx-chain-core-go/data" @@ -82,31 +83,65 @@ func TestEpochStartSubscriptionHandler_UnregisterHandlerOklHandlerShouldRemove(t func TestEpochStartSubscriptionHandler_NotifyAll(t *testing.T) { t.Parallel() - firstHandlerWasCalled := false - secondHandlerWasCalled := false - lastCalled := 0 + calledHandlers := make(map[int]struct{}) + calledHandlersIndices := make([]int, 0) essh := notifier.NewEpochStartSubscriptionHandler() - // register 2 handlers handler1 := notifier.NewHandlerForEpochStart(func(hdr data.HeaderHandler) { - firstHandlerWasCalled = true - lastCalled = 1 + calledHandlers[1] = struct{}{} + calledHandlersIndices = append(calledHandlersIndices, 1) }, nil, 1) handler2 := notifier.NewHandlerForEpochStart(func(hdr data.HeaderHandler) { - secondHandlerWasCalled = true - lastCalled = 2 + calledHandlers[2] = struct{}{} + calledHandlersIndices = append(calledHandlersIndices, 2) }, nil, 2) + handler3 := notifier.NewHandlerForEpochStart(func(hdr data.HeaderHandler) { + calledHandlers[3] = struct{}{} + calledHandlersIndices = append(calledHandlersIndices, 3) + }, nil, 3) - essh.RegisterHandler(handler1) essh.RegisterHandler(handler2) + essh.RegisterHandler(handler1) + essh.RegisterHandler(handler3) // make sure that the handler were not called yet - assert.False(t, firstHandlerWasCalled) - assert.False(t, secondHandlerWasCalled) + assert.Empty(t, calledHandlers) // now we call the NotifyAll method and all handlers should be called essh.NotifyAll(&block.Header{}) - assert.True(t, firstHandlerWasCalled) - assert.True(t, secondHandlerWasCalled) - assert.Equal(t, lastCalled, 2) + assert.Len(t, calledHandlers, 3) + assert.Equal(t, []int{1, 2, 3}, calledHandlersIndices) +} + +func TestEpochStartSubscriptionHandler_ConcurrentOperations(t *testing.T) { + t.Parallel() + + handler := notifier.NewEpochStartSubscriptionHandler() + + numOperations := 500 + wg := sync.WaitGroup{} + wg.Add(numOperations) + for i := 0; i < numOperations; i++ { + i := i + go func(idx int) { + switch idx { + case 0: + handler.RegisterHandler(notifier.NewHandlerForEpochStart(func(hdr data.HeaderHandler) {}, func(hdr data.HeaderHandler) {}, 0)) + case 1: + handler.UnregisterHandler(notifier.NewHandlerForEpochStart(func(hdr data.HeaderHandler) {}, func(hdr data.HeaderHandler) {}, 0)) + case 2: + handler.NotifyAll(&block.Header{}) + case 3: + handler.NotifyAllPrepare(&block.Header{}, &block.Body{}) + case 4: + handler.NotifyEpochChangeConfirmed(uint32(idx + 1)) + case 5: + handler.RegisterForEpochChangeConfirmed(func(epoch uint32) {}) + } + + wg.Done() + }(i % 6) + } + + wg.Wait() } diff --git a/state/syncer/userAccountsSyncer.go b/state/syncer/userAccountsSyncer.go index ca2e1142266..5dcacb2f9df 100644 --- a/state/syncer/userAccountsSyncer.go +++ b/state/syncer/userAccountsSyncer.go @@ -274,8 +274,8 @@ func (u *userAccountsSyncer) syncAccountDataTries( } func (u *userAccountsSyncer) printDataTrieStatistics() { - u.mutStatistics.RLock() - defer u.mutStatistics.RUnlock() + u.mutStatistics.Lock() + defer u.mutStatistics.Unlock() log.Debug("user accounts tries sync has finished", "num small data tries", u.numSmallTries, "threshold", core.ConvertBytes(uint64(smallTrieThreshold))) From e34bab6c87d96b5c16d04fcf2984f1bf3a3ce2ef Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Wed, 1 Feb 2023 16:56:03 +0200 Subject: [PATCH 164/335] fix after review --- .../notifier/epochStartSubscriptionHandler.go | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/epochStart/notifier/epochStartSubscriptionHandler.go b/epochStart/notifier/epochStartSubscriptionHandler.go index 4c1e6c558b9..52518627212 100644 --- a/epochStart/notifier/epochStartSubscriptionHandler.go +++ b/epochStart/notifier/epochStartSubscriptionHandler.go @@ -4,6 +4,7 @@ import ( "sort" "sync" + "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-go/epochStart" ) @@ -39,27 +40,30 @@ func NewEpochStartSubscriptionHandler() *epochStartSubscriptionHandler { // RegisterHandler will subscribe a function, so it will be called when NotifyAll method is called func (essh *epochStartSubscriptionHandler) RegisterHandler(handler epochStart.ActionHandler) { - if handler != nil { - essh.mutEpochStartHandler.Lock() - essh.epochStartHandlers = append(essh.epochStartHandlers, handler) - sort.Slice(essh.epochStartHandlers, func(i, j int) bool { - return essh.epochStartHandlers[i].NotifyOrder() < essh.epochStartHandlers[j].NotifyOrder() - }) - essh.mutEpochStartHandler.Unlock() + if check.IfNilReflect(handler) { + return } + + essh.mutEpochStartHandler.Lock() + essh.epochStartHandlers = append(essh.epochStartHandlers, handler) + sort.Slice(essh.epochStartHandlers, func(i, j int) bool { + return essh.epochStartHandlers[i].NotifyOrder() < essh.epochStartHandlers[j].NotifyOrder() + }) + essh.mutEpochStartHandler.Unlock() } // UnregisterHandler will unsubscribe a function from the slice func (essh *epochStartSubscriptionHandler) UnregisterHandler(handlerToUnregister epochStart.ActionHandler) { - if handlerToUnregister != nil { - essh.mutEpochStartHandler.Lock() - for idx, handler := range essh.epochStartHandlers { - if handler == handlerToUnregister { - essh.epochStartHandlers = append(essh.epochStartHandlers[:idx], essh.epochStartHandlers[idx+1:]...) - } + if check.IfNilReflect(handlerToUnregister) { + return + } + essh.mutEpochStartHandler.Lock() + for idx, handler := range essh.epochStartHandlers { + if handler == handlerToUnregister { + essh.epochStartHandlers = append(essh.epochStartHandlers[:idx], essh.epochStartHandlers[idx+1:]...) } - essh.mutEpochStartHandler.Unlock() } + essh.mutEpochStartHandler.Unlock() } // NotifyAll will call all the subscribed functions from the internal slice From bed3899463711e6d97dd2fb273623d57f7ac8424 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Wed, 1 Feb 2023 17:16:06 +0200 Subject: [PATCH 165/335] fix after review: don't allow duplicated handlers --- .../notifier/epochStartSubscriptionHandler.go | 11 ++++++- .../epochStartSubscriptionHandler_test.go | 31 ++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/epochStart/notifier/epochStartSubscriptionHandler.go b/epochStart/notifier/epochStartSubscriptionHandler.go index 52518627212..1e4141a96dd 100644 --- a/epochStart/notifier/epochStartSubscriptionHandler.go +++ b/epochStart/notifier/epochStartSubscriptionHandler.go @@ -1,6 +1,7 @@ package notifier import ( + "runtime/debug" "sort" "sync" @@ -45,11 +46,19 @@ func (essh *epochStartSubscriptionHandler) RegisterHandler(handler epochStart.Ac } essh.mutEpochStartHandler.Lock() + defer essh.mutEpochStartHandler.Unlock() + + for _, existingHandler := range essh.epochStartHandlers { + if existingHandler == handler { + log.Error("epochStartSubscriptionHandler.RegisterHandler - trying to add a duplicated handler", "stack trace", string(debug.Stack())) + return + } + } + essh.epochStartHandlers = append(essh.epochStartHandlers, handler) sort.Slice(essh.epochStartHandlers, func(i, j int) bool { return essh.epochStartHandlers[i].NotifyOrder() < essh.epochStartHandlers[j].NotifyOrder() }) - essh.mutEpochStartHandler.Unlock() } // UnregisterHandler will unsubscribe a function from the slice diff --git a/epochStart/notifier/epochStartSubscriptionHandler_test.go b/epochStart/notifier/epochStartSubscriptionHandler_test.go index 7d157d69458..cfd5d2787a9 100644 --- a/epochStart/notifier/epochStartSubscriptionHandler_test.go +++ b/epochStart/notifier/epochStartSubscriptionHandler_test.go @@ -44,6 +44,30 @@ func TestEpochStartSubscriptionHandler_RegisterHandlerOkHandlerShouldAdd(t *test mutHandlers.RUnlock() } +func TestEpochStartSubscriptionHandler_RegisterHandlerShouldNotAllowDuplicates(t *testing.T) { + t.Parallel() + + essh := notifier.NewEpochStartSubscriptionHandler() + handler := notifier.NewHandlerForEpochStart(func(hdr data.HeaderHandler) {}, nil, 0) + + essh.RegisterHandler(handler) + essh.RegisterHandler(handler) + + handlers, mutHandlers := essh.RegisteredHandlers() + mutHandlers.RLock() + assert.Len(t, handlers, 1) + mutHandlers.RUnlock() + + // check unregister twice to ensure there is no problem + essh.UnregisterHandler(handler) + essh.UnregisterHandler(handler) + + handlers, mutHandlers = essh.RegisteredHandlers() + mutHandlers.RLock() + assert.Len(t, handlers, 0) + mutHandlers.RUnlock() +} + func TestEpochStartSubscriptionHandler_UnregisterHandlerNilHandlerShouldDoNothing(t *testing.T) { t.Parallel() @@ -62,7 +86,7 @@ func TestEpochStartSubscriptionHandler_UnregisterHandlerNilHandlerShouldDoNothin mutHandlers.RUnlock() } -func TestEpochStartSubscriptionHandler_UnregisterHandlerOklHandlerShouldRemove(t *testing.T) { +func TestEpochStartSubscriptionHandler_UnregisterHandlerOkHandlerShouldRemove(t *testing.T) { t.Parallel() essh := notifier.NewEpochStartSubscriptionHandler() @@ -122,9 +146,8 @@ func TestEpochStartSubscriptionHandler_ConcurrentOperations(t *testing.T) { wg := sync.WaitGroup{} wg.Add(numOperations) for i := 0; i < numOperations; i++ { - i := i go func(idx int) { - switch idx { + switch idx & 6 { case 0: handler.RegisterHandler(notifier.NewHandlerForEpochStart(func(hdr data.HeaderHandler) {}, func(hdr data.HeaderHandler) {}, 0)) case 1: @@ -140,7 +163,7 @@ func TestEpochStartSubscriptionHandler_ConcurrentOperations(t *testing.T) { } wg.Done() - }(i % 6) + }(i) } wg.Wait() From 65bcc7f5b156d3b616d31658eb4e2fbeeef18f86 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 3 Feb 2023 11:48:50 +0200 Subject: [PATCH 166/335] fixes after merge --- api/groups/transactionGroup.go | 11 +++--- common/statistics/resourceMonitor_test.go | 2 +- facade/nodeFacade.go | 2 +- genesis/process/disabled/txVersionChecker.go | 2 +- go.mod | 14 ++++---- go.sum | 31 ++++++++-------- integrationTests/vm/testInitializer.go | 1 + .../vm/txsFee/guardAccount_test.go | 36 +++++++++---------- integrationTests/vm/wasm/utils.go | 2 +- .../timemachine/fee/feeComputer_test.go | 5 ++- .../gasUsedAndFeeProcessor_test.go | 4 +++ .../block/preprocess/gasComputation_test.go | 2 +- process/dataValidators/export_test.go | 4 +-- process/dataValidators/txValidator.go | 1 + process/dataValidators/txValidator_test.go | 11 ++---- process/economics/economicsData.go | 3 +- .../preProcessorsContainerFactory_test.go | 2 +- .../disabled/disabledGuardedAccount.go | 6 ++-- process/guardian/guardedAccount.go | 16 ++++----- process/guardian/guardedAccount_test.go | 22 ++++++------ process/interceptors/processor/interface.go | 2 +- process/transaction/baseProcess.go | 1 + process/transaction/baseProcess_test.go | 22 ++++++------ .../memoryEvictionWaitingList.go | 2 +- state/userAccount.go | 2 +- testscommon/TxVersionCheckerStub.go | 2 +- .../guardianAccountHandlerStub.go | 6 ++-- .../InterceptedUnsignedTxHandlerStub.go | 2 +- .../interceptedTxMocks/interceptedTxStub.go | 2 +- testscommon/state/accountAdapterStub.go | 2 +- testscommon/state/userAccountStub.go | 9 +++-- testscommon/vmcommonMocks/userAccountStub.go | 2 +- 32 files changed, 118 insertions(+), 113 deletions(-) diff --git a/api/groups/transactionGroup.go b/api/groups/transactionGroup.go index 216fe009458..70b77cae6b6 100644 --- a/api/groups/transactionGroup.go +++ b/api/groups/transactionGroup.go @@ -18,6 +18,7 @@ import ( "github.com/multiversx/mx-chain-go/api/shared" "github.com/multiversx/mx-chain-go/api/shared/logging" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/node/external" txSimData "github.com/multiversx/mx-chain-go/process/txsimulator/data" ) @@ -43,7 +44,7 @@ const ( // transactionFacadeHandler defines the methods to be implemented by a facade for transaction requests type transactionFacadeHandler interface { - CreateTransaction(txArgs *nodeExternal.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) + CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) ValidateTransaction(tx *transaction.Transaction) error ValidateTransactionForSimulation(tx *transaction.Transaction, checkSignature bool) error SendBulkTransactions([]*transaction.Transaction) (uint64, error) @@ -216,7 +217,7 @@ func (tg *transactionGroup) simulateTransaction(c *gin.Context) { return } - txArgs := &nodeExternal.ArgsCreateTransaction{ + txArgs := &external.ArgsCreateTransaction{ Nonce: gtx.Nonce, Value: gtx.Value, Receiver: gtx.Receiver, @@ -306,7 +307,7 @@ func (tg *transactionGroup) sendTransaction(c *gin.Context) { return } - txArgs := &nodeExternal.ArgsCreateTransaction{ + txArgs := &external.ArgsCreateTransaction{ Nonce: gtx.Nonce, Value: gtx.Value, Receiver: gtx.Receiver, @@ -404,7 +405,7 @@ func (tg *transactionGroup) sendMultipleTransactions(c *gin.Context) { var start time.Time txsHashes := make(map[int]string) for idx, receivedTx := range gtx { - txArgs := &nodeExternal.ArgsCreateTransaction{ + txArgs := &external.ArgsCreateTransaction{ Nonce: receivedTx.Nonce, Value: receivedTx.Value, Receiver: receivedTx.Receiver, @@ -533,7 +534,7 @@ func (tg *transactionGroup) computeTransactionGasLimit(c *gin.Context) { return } - txArgs := &nodeExternal.ArgsCreateTransaction{ + txArgs := &external.ArgsCreateTransaction{ Nonce: gtx.Nonce, Value: gtx.Value, Receiver: gtx.Receiver, diff --git a/common/statistics/resourceMonitor_test.go b/common/statistics/resourceMonitor_test.go index c9614d5dca4..738a53275d6 100644 --- a/common/statistics/resourceMonitor_test.go +++ b/common/statistics/resourceMonitor_test.go @@ -5,10 +5,10 @@ import ( "fmt" "testing" - logger "github.com/multiversx/mx-chain-logger-go" stats "github.com/multiversx/mx-chain-go/common/statistics" "github.com/multiversx/mx-chain-go/common/statistics/disabled" "github.com/multiversx/mx-chain-go/config" + logger "github.com/multiversx/mx-chain-logger-go" "github.com/stretchr/testify/assert" ) diff --git a/facade/nodeFacade.go b/facade/nodeFacade.go index 27ad1233725..6930f8a1397 100644 --- a/facade/nodeFacade.go +++ b/facade/nodeFacade.go @@ -273,7 +273,7 @@ func (nf *nodeFacade) getContextForApiTrieRangeOperations() (context.Context, co } // CreateTransaction creates a transaction from all needed fields -func (nf *nodeFacade) CreateTransaction(txArgs *nodeExternal.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { +func (nf *nodeFacade) CreateTransaction(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) { return nf.node.CreateTransaction(txArgs) } diff --git a/genesis/process/disabled/txVersionChecker.go b/genesis/process/disabled/txVersionChecker.go index 99a19e34631..f8089a9a211 100644 --- a/genesis/process/disabled/txVersionChecker.go +++ b/genesis/process/disabled/txVersionChecker.go @@ -1,6 +1,6 @@ package disabled -import "github.com/ElrondNetwork/elrond-go-core/data/transaction" +import "github.com/multiversx/mx-chain-core-go/data/transaction" // TxVersionChecker implements the TxVersionChecker interface, it does nothing as it is a disabled component type TxVersionChecker struct{} diff --git a/go.mod b/go.mod index 45e7f8e9651..40d86f8b5c4 100644 --- a/go.mod +++ b/go.mod @@ -14,16 +14,16 @@ 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.1.32 - github.com/multiversx/mx-chain-crypto-go v1.2.5 + github.com/multiversx/mx-chain-core-go v1.1.33-0.20230202120347-d6f693e74417 + github.com/multiversx/mx-chain-crypto-go v1.2.6-0.20230202152403-757f8ca0be13 github.com/multiversx/mx-chain-es-indexer-go v1.3.9 github.com/multiversx/mx-chain-logger-go v1.0.11 - github.com/multiversx/mx-chain-p2p-go v1.0.10 + github.com/multiversx/mx-chain-p2p-go v1.0.11-0.20230202152730-438885fb703d github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.36 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.76 + github.com/multiversx/mx-chain-vm-common-go v1.3.37-0.20230202165947-64f070d656e3 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230202172648-8fbdbe9c384c + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230202172716-54839202baaf + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77-0.20230202172735-b1076cf4e8e7 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 942aaa56e75..e648bbb04e4 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,7 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= @@ -596,28 +597,28 @@ 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.1.31/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.1.32 h1:7Es5r4go0jJt3eBuPGv4RnYeHX/GkISET32SO8xJF+w= -github.com/multiversx/mx-chain-core-go v1.1.32/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -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-core-go v1.1.33-0.20230202120347-d6f693e74417 h1:wY/dhfwJC0mpeGwpvBRWWh/IL4aJLyQoqS+s3Bz17fw= +github.com/multiversx/mx-chain-core-go v1.1.33-0.20230202120347-d6f693e74417/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-crypto-go v1.2.6-0.20230202113457-3066d2598c7a/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= +github.com/multiversx/mx-chain-crypto-go v1.2.6-0.20230202152403-757f8ca0be13 h1:rVjlCtEVNdt39s9H76RONNI/cNCsI0i0o8/t2u0L86I= +github.com/multiversx/mx-chain-crypto-go v1.2.6-0.20230202152403-757f8ca0be13/go.mod h1:rOj0Rr19HTOYt9YTeym7RKxlHt91NXln3LVKjHKVmA0= github.com/multiversx/mx-chain-es-indexer-go v1.3.9 h1:6AS3f158aJ1E6Pzs6jvyBUiCaq/5yof4lbkGdSTzJng= github.com/multiversx/mx-chain-es-indexer-go v1.3.9/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= 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.10 h1:CYCuI0SP8Pt9K0TcJjUyxK7ByvWi2FXNUihy0iCEVIA= -github.com/multiversx/mx-chain-p2p-go v1.0.10/go.mod h1:j9Ueo2ptCnL7TQvQg6KS/KWAoJEJpjkPgE5ZTaqEAn4= +github.com/multiversx/mx-chain-p2p-go v1.0.11-0.20230202152730-438885fb703d h1:bXGh+i8XWP5JvUuGy3bM4eUIZsaDGGF35dfxJQTgoiM= +github.com/multiversx/mx-chain-p2p-go v1.0.11-0.20230202152730-438885fb703d/go.mod h1:oM8OV80AJku6lkocWcbQuk62dyXTwSOlQr6X1vdIJv8= 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.34/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.36 h1:9TViMK+vqTHss9cnGKtzOWzsxI/LWIetAYzrgf4H/w0= -github.com/multiversx/mx-chain-vm-common-go v1.3.36/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50 h1:ScUq7/wq78vthMTQ6v5Ux1DvSMQMHxQ2Sl7aPP26q1w= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50/go.mod h1:e3uYdgoKzs3puaznbmSjDcRisJc5Do4tpg7VqyYwoek= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51 h1:axtp5/mpA+xYJ1cu4KtAGETV4t6v6/tNfQh0HCclBYY= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51/go.mod h1:oKj32V2nkd+KGNOL6emnwVkDRPpciwHHDqBmeorcL8k= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.76 h1:HFTf/GuLt68UiDKDZL3GD/YMFdDBaOv31OeP7n0ICQc= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.76/go.mod h1:iyAWamHL3voN/T2sjx7UZ8L4kXLImkgMNh27WUFFhxE= +github.com/multiversx/mx-chain-vm-common-go v1.3.37-0.20230202165947-64f070d656e3 h1:SYQTxS2KyYt5vgveDxetP7LVW0q/N6i0RVw6Jn2kDDk= +github.com/multiversx/mx-chain-vm-common-go v1.3.37-0.20230202165947-64f070d656e3/go.mod h1:7DV6Bu5GYyFW1T7swv44W/Eo2RDSJbhyeh5DJuz6GnY= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230202172648-8fbdbe9c384c h1:rqYl1maYfXsk/NdUwJic2OuOSdHWRNMQPa0DsNzM9yE= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230202172648-8fbdbe9c384c/go.mod h1:ZhYZiqymuvO0tuWnl3/ZAdp5oxBn6QfWUi865T49iQw= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230202172716-54839202baaf h1:ejv0o0pLPkE+1dcjRlVQx5NP/DDjUMhj810DhT6spr0= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230202172716-54839202baaf/go.mod h1:1lAeuSWICo/zjIzfBSMi02Jfei2WUrJg3YVhpPWMsik= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77-0.20230202172735-b1076cf4e8e7 h1:Vv06Vyy3BzmC6Bq6vcuXlnxf5mW68Y4J4Tmg0I0geEA= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77-0.20230202172735-b1076cf4e8e7/go.mod h1:Z8JpJcZLSk/XCy6XnuRQF5Y5PI6EntYR0S4MhaKi4hU= 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= diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 9d28f8453de..6d35fd2dd9c 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -13,6 +13,7 @@ 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/pubkeyConverter" + "github.com/multiversx/mx-chain-core-go/core/versioning" "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/scheduled" diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index 224d414fd9b..b93cfdd37f0 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -1,7 +1,7 @@ //go:build !race // +build !race -// TODO remove build condition above to allow -race -short, after Arwen fix +// TODO remove build condition above to allow -race -short, after Wasm VM fix package txsFee @@ -11,19 +11,19 @@ import ( "sync" "testing" - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/data/block" - "github.com/ElrondNetwork/elrond-go-core/data/guardians" - "github.com/ElrondNetwork/elrond-go-core/data/transaction" - "github.com/ElrondNetwork/elrond-go/common/forking" - "github.com/ElrondNetwork/elrond-go/config" - "github.com/ElrondNetwork/elrond-go/integrationTests/mock" - "github.com/ElrondNetwork/elrond-go/integrationTests/vm" - "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/process/guardian" - "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/testscommon/integrationtests" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/block" + "github.com/multiversx/mx-chain-core-go/data/guardians" + "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/common/forking" + "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests/vm" + "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/process/guardian" + "github.com/multiversx/mx-chain-go/state" + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/integrationtests" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -45,9 +45,9 @@ func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { GasScheduleConfig: config.GasScheduleConfig{ GasScheduleByEpochs: []config.GasScheduleByEpochs{cfg}, }, - ConfigDir: gasScheduleDir, - EpochNotifier: forking.NewGenericEpochNotifier(), - ArwenChangeLocker: &sync.RWMutex{}, + ConfigDir: gasScheduleDir, + EpochNotifier: forking.NewGenericEpochNotifier(), + WasmVMChangeLocker: &sync.RWMutex{}, } gasScheduleNotifier, err := forking.NewGasScheduleNotifier(argsGasScheduleNotifier) require.Nil(tb, err) @@ -60,7 +60,7 @@ func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { RefactorPeersMiniBlocksEnableEpoch: unreachableEpoch, GuardAccountFeatureEnableEpoch: 0, }, - mock.NewMultiShardsCoordinatorMock(2), + testscommon.NewMultiShardsCoordinatorMock(2), db, gasScheduleNotifier, ) diff --git a/integrationTests/vm/wasm/utils.go b/integrationTests/vm/wasm/utils.go index b1b4a6171c8..d6abad6b22b 100644 --- a/integrationTests/vm/wasm/utils.go +++ b/integrationTests/vm/wasm/utils.go @@ -46,9 +46,9 @@ import ( "github.com/multiversx/mx-chain-go/testscommon" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" + "github.com/multiversx/mx-chain-go/testscommon/guardianMocks" "github.com/multiversx/mx-chain-go/testscommon/integrationtests" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" - "github.com/multiversx/mx-chain-go/testscommon/guardianMocks" "github.com/multiversx/mx-chain-go/vm/systemSmartContracts/defaults" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/parsers" diff --git a/node/external/timemachine/fee/feeComputer_test.go b/node/external/timemachine/fee/feeComputer_test.go index 058978b80b8..1fe13e8e451 100644 --- a/node/external/timemachine/fee/feeComputer_test.go +++ b/node/external/timemachine/fee/feeComputer_test.go @@ -47,6 +47,7 @@ func TestFeeComputer_ComputeGasUsedAndFeeBasedOnRefundValue(t *testing.T) { PenalizedTooMuchGasEnableEpoch: 124, GasPriceModifierEnableEpoch: 180, }, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } computer, _ := NewFeeComputer(arguments) @@ -83,6 +84,7 @@ func TestFeeComputer_ComputeFeeBasedOnGasUsed(t *testing.T) { PenalizedTooMuchGasEnableEpoch: 124, GasPriceModifierEnableEpoch: 180, }, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } computer, _ := NewFeeComputer(arguments) @@ -117,6 +119,7 @@ func TestFeeComputer_ComputeGasLimit(t *testing.T) { PenalizedTooMuchGasEnableEpoch: 124, GasPriceModifierEnableEpoch: 180, }, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } computer, _ := NewFeeComputer(arguments) @@ -150,7 +153,7 @@ func TestFeeComputer_ComputeTransactionFeeShouldWorkForDifferentEpochs(t *testin PenalizedTooMuchGasEnableEpoch: 124, GasPriceModifierEnableEpoch: 180, }, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } contract, _ := hex.DecodeString("000000000000000000010000000000000000000000000000000000000000abba") diff --git a/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go b/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go index 85001719ad9..72b251b6bfd 100644 --- a/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go +++ b/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go @@ -21,6 +21,7 @@ func TestComputeTransactionGasUsedAndFeeMoveBalance(t *testing.T) { feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, }) computer := fee.NewTestFeeComputer(feeComp) @@ -50,6 +51,7 @@ func TestComputeTransactionGasUsedAndFeeLogWithError(t *testing.T) { feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, }) computer := fee.NewTestFeeComputer(feeComp) @@ -92,6 +94,7 @@ func TestComputeTransactionGasUsedAndFeeRelayedTxWithWriteLog(t *testing.T) { feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, }) computer := fee.NewTestFeeComputer(feeComp) @@ -129,6 +132,7 @@ func TestComputeTransactionGasUsedAndFeeTransactionWithScrWithRefund(t *testing. feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, }) computer := fee.NewTestFeeComputer(feeComp) diff --git a/process/block/preprocess/gasComputation_test.go b/process/block/preprocess/gasComputation_test.go index 69cd5477e92..91c504d97c6 100644 --- a/process/block/preprocess/gasComputation_test.go +++ b/process/block/preprocess/gasComputation_test.go @@ -11,8 +11,8 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/block/preprocess" - "github.com/multiversx/mx-chain-go/process/mock" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/process/dataValidators/export_test.go b/process/dataValidators/export_test.go index b192ae6274c..0b3e8ee5568 100644 --- a/process/dataValidators/export_test.go +++ b/process/dataValidators/export_test.go @@ -1,8 +1,8 @@ package dataValidators import ( - "github.com/ElrondNetwork/elrond-go/process" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/multiversx/mx-chain-go/process" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) // CheckAccount - diff --git a/process/dataValidators/txValidator.go b/process/dataValidators/txValidator.go index a260edf827d..981837b9dd8 100644 --- a/process/dataValidators/txValidator.go +++ b/process/dataValidators/txValidator.go @@ -8,6 +8,7 @@ import ( "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/state" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) var _ process.TxValidator = (*txValidator)(nil) diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index f5855e456ed..74fb8bf728b 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -7,8 +7,8 @@ import ( "testing" "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-core-go/core/data" - "github.com/multiversx/mx-chain-core-go/core/data/transaction" + "github.com/multiversx/mx-chain-core-go/data" + "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/dataValidators" "github.com/multiversx/mx-chain-go/process/mock" @@ -488,10 +488,3 @@ func getDefaultInterceptedTx() *mock.InterceptedTxHandlerStub { }, } } - -func createDummyGuardedAccount() state.UserAccountHandler { - acc := state.NewEmptyUserAccount() - metadata := &vmcommon.CodeMetadata{Guarded: true} - acc.SetCodeMetadata(metadata.ToBytes()) - return acc -} diff --git a/process/economics/economicsData.go b/process/economics/economicsData.go index a9b120953c7..268a3f30650 100644 --- a/process/economics/economicsData.go +++ b/process/economics/economicsData.go @@ -11,6 +11,7 @@ import ( "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/smartContractResult" + "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/process" @@ -66,7 +67,7 @@ type economicsData struct { // ArgsNewEconomicsData defines the arguments needed for new economics economicsData type ArgsNewEconomicsData struct { - TxVersionChecker process.TxVersionCheckerHandler + TxVersionChecker process.TxVersionCheckerHandler BuiltInFunctionsCostHandler BuiltInFunctionsCostHandler Economics *config.EconomicsConfig EpochNotifier process.EpochNotifier diff --git a/process/factory/metachain/preProcessorsContainerFactory_test.go b/process/factory/metachain/preProcessorsContainerFactory_test.go index f4f0dd8925b..9f504b1a227 100644 --- a/process/factory/metachain/preProcessorsContainerFactory_test.go +++ b/process/factory/metachain/preProcessorsContainerFactory_test.go @@ -8,8 +8,8 @@ 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" - "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" "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" diff --git a/process/guardian/disabled/disabledGuardedAccount.go b/process/guardian/disabled/disabledGuardedAccount.go index 80863dca1d7..b09f8dd181c 100644 --- a/process/guardian/disabled/disabledGuardedAccount.go +++ b/process/guardian/disabled/disabledGuardedAccount.go @@ -1,9 +1,9 @@ package disabled import ( - "github.com/ElrondNetwork/elrond-go-core/data/guardians" - "github.com/ElrondNetwork/elrond-go/state" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/multiversx/mx-chain-core-go/data/guardians" + "github.com/multiversx/mx-chain-go/state" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) type disabledGuardedAccount struct{} diff --git a/process/guardian/guardedAccount.go b/process/guardian/guardedAccount.go index b58c45c6dfb..91556072a34 100644 --- a/process/guardian/guardedAccount.go +++ b/process/guardian/guardedAccount.go @@ -5,16 +5,16 @@ import ( "fmt" "sync" - "github.com/ElrondNetwork/elrond-go-core/core" - "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data/guardians" - "github.com/ElrondNetwork/elrond-go-core/marshal" - "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/state" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "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/guardians" + "github.com/multiversx/mx-chain-core-go/marshal" + "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/state" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) -var guardianKey = []byte(core.ElrondProtectedKeyPrefix + core.GuardiansKeyIdentifier) +var guardianKey = []byte(core.ProtectedKeyPrefix + core.GuardiansKeyIdentifier) type guardedAccount struct { marshaller marshal.Marshalizer diff --git a/process/guardian/guardedAccount_test.go b/process/guardian/guardedAccount_test.go index 7b6ff16807e..d6550babd55 100644 --- a/process/guardian/guardedAccount_test.go +++ b/process/guardian/guardedAccount_test.go @@ -6,17 +6,17 @@ import ( "testing" "time" - "github.com/ElrondNetwork/elrond-go-core/core/check" - "github.com/ElrondNetwork/elrond-go-core/data/block" - "github.com/ElrondNetwork/elrond-go-core/data/guardians" - "github.com/ElrondNetwork/elrond-go/common/forking" - "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/testscommon" - "github.com/ElrondNetwork/elrond-go/testscommon/epochNotifier" - stateMocks "github.com/ElrondNetwork/elrond-go/testscommon/state" - "github.com/ElrondNetwork/elrond-go/testscommon/trie" - "github.com/ElrondNetwork/elrond-go/testscommon/vmcommonMocks" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "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/data/guardians" + "github.com/multiversx/mx-chain-go/common/forking" + "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" + stateMocks "github.com/multiversx/mx-chain-go/testscommon/state" + "github.com/multiversx/mx-chain-go/testscommon/trie" + "github.com/multiversx/mx-chain-go/testscommon/vmcommonMocks" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/require" ) diff --git a/process/interceptors/processor/interface.go b/process/interceptors/processor/interface.go index 74ea1c9c8fc..147d8f30270 100644 --- a/process/interceptors/processor/interface.go +++ b/process/interceptors/processor/interface.go @@ -1,7 +1,7 @@ package processor import ( - "github.com/ElrondNetwork/elrond-go/state" + "github.com/multiversx/mx-chain-go/state" ) type interceptedDataSizeHandler interface { diff --git a/process/transaction/baseProcess.go b/process/transaction/baseProcess.go index 27e17b9d3f8..5146f0fe1a4 100644 --- a/process/transaction/baseProcess.go +++ b/process/transaction/baseProcess.go @@ -14,6 +14,7 @@ import ( "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/state" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) type baseTxProcessor struct { diff --git a/process/transaction/baseProcess_test.go b/process/transaction/baseProcess_test.go index bea231db91a..04f58184562 100644 --- a/process/transaction/baseProcess_test.go +++ b/process/transaction/baseProcess_test.go @@ -6,17 +6,17 @@ import ( "strings" "testing" - "github.com/ElrondNetwork/elrond-go-core/data" - "github.com/ElrondNetwork/elrond-go-core/data/transaction" - "github.com/ElrondNetwork/elrond-go/process" - "github.com/ElrondNetwork/elrond-go/process/mock" - "github.com/ElrondNetwork/elrond-go/state" - "github.com/ElrondNetwork/elrond-go/testscommon" - "github.com/ElrondNetwork/elrond-go/testscommon/economicsmocks" - "github.com/ElrondNetwork/elrond-go/testscommon/guardianMocks" - "github.com/ElrondNetwork/elrond-go/testscommon/hashingMocks" - stateMock "github.com/ElrondNetwork/elrond-go/testscommon/state" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/multiversx/mx-chain-core-go/data" + "github.com/multiversx/mx-chain-core-go/data/transaction" + "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/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" + "github.com/multiversx/mx-chain-go/testscommon/guardianMocks" + "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" + stateMock "github.com/multiversx/mx-chain-go/testscommon/state" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/state/storagePruningManager/evictionWaitingList/memoryEvictionWaitingList.go b/state/storagePruningManager/evictionWaitingList/memoryEvictionWaitingList.go index ae67f262ce8..c1515eabb56 100644 --- a/state/storagePruningManager/evictionWaitingList/memoryEvictionWaitingList.go +++ b/state/storagePruningManager/evictionWaitingList/memoryEvictionWaitingList.go @@ -6,9 +6,9 @@ import ( "sync" "github.com/multiversx/mx-chain-core-go/data" - logger "github.com/multiversx/mx-chain-logger-go" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/state" + logger "github.com/multiversx/mx-chain-logger-go" ) var log = logger.GetOrCreate("state/evictionWaitingList") diff --git a/state/userAccount.go b/state/userAccount.go index d05d0d2ce1d..72ff86cd306 100644 --- a/state/userAccount.go +++ b/state/userAccount.go @@ -5,7 +5,7 @@ import ( "bytes" "math/big" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) var _ UserAccountHandler = (*userAccount)(nil) diff --git a/testscommon/TxVersionCheckerStub.go b/testscommon/TxVersionCheckerStub.go index 1f7b9089efb..5616bca3079 100644 --- a/testscommon/TxVersionCheckerStub.go +++ b/testscommon/TxVersionCheckerStub.go @@ -1,7 +1,7 @@ package testscommon import ( - "github.com/ElrondNetwork/elrond-go-core/data/transaction" + "github.com/multiversx/mx-chain-core-go/data/transaction" ) // TxVersionCheckerStub - diff --git a/testscommon/guardianMocks/guardianAccountHandlerStub.go b/testscommon/guardianMocks/guardianAccountHandlerStub.go index f3c86715f96..c2fb2319a5f 100644 --- a/testscommon/guardianMocks/guardianAccountHandlerStub.go +++ b/testscommon/guardianMocks/guardianAccountHandlerStub.go @@ -1,9 +1,9 @@ package guardianMocks import ( - "github.com/ElrondNetwork/elrond-go-core/data/guardians" - "github.com/ElrondNetwork/elrond-go/state" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + "github.com/multiversx/mx-chain-core-go/data/guardians" + "github.com/multiversx/mx-chain-go/state" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) // GuardedAccountHandlerStub - diff --git a/testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go b/testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go index d17f35c1741..06eaf6c4fcb 100644 --- a/testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go +++ b/testscommon/interceptedTxMocks/InterceptedUnsignedTxHandlerStub.go @@ -3,7 +3,7 @@ package interceptedTxMocks import ( "math/big" - "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/multiversx/mx-chain-core-go/data" ) // InterceptedUnsignedTxHandlerStub - diff --git a/testscommon/interceptedTxMocks/interceptedTxStub.go b/testscommon/interceptedTxMocks/interceptedTxStub.go index ce455dee825..7e900aa3fba 100644 --- a/testscommon/interceptedTxMocks/interceptedTxStub.go +++ b/testscommon/interceptedTxMocks/interceptedTxStub.go @@ -3,7 +3,7 @@ package interceptedTxMocks import ( "math/big" - "github.com/ElrondNetwork/elrond-go-core/data" + "github.com/multiversx/mx-chain-core-go/data" ) // InterceptedTxHandlerStub - diff --git a/testscommon/state/accountAdapterStub.go b/testscommon/state/accountAdapterStub.go index 2206ab8c066..8e9ec352a36 100644 --- a/testscommon/state/accountAdapterStub.go +++ b/testscommon/state/accountAdapterStub.go @@ -3,7 +3,7 @@ package state import ( "math/big" - "github.com/ElrondNetwork/elrond-go/common" + "github.com/multiversx/mx-chain-go/common" ) // StateUserAccountHandlerStub - diff --git a/testscommon/state/userAccountStub.go b/testscommon/state/userAccountStub.go index 835ad6bd36d..538316f0acd 100644 --- a/testscommon/state/userAccountStub.go +++ b/testscommon/state/userAccountStub.go @@ -14,11 +14,10 @@ var _ state.UserAccountHandler = (*UserAccountStub)(nil) // UserAccountStub - type UserAccountStub struct { Balance *big.Int - DeveloperRewards *big.Int - UserName []byte - Owner []byte - Address []byte - AddToBalanceCalled func(value *big.Int) error + DeveloperRewards *big.Int + UserName []byte + Owner []byte + Address []byte AddToBalanceCalled func(value *big.Int) error DataTrieTrackerCalled func() state.DataTrieTracker IsGuardedCalled func() bool diff --git a/testscommon/vmcommonMocks/userAccountStub.go b/testscommon/vmcommonMocks/userAccountStub.go index 20bc8131446..6fb0b1f4d85 100644 --- a/testscommon/vmcommonMocks/userAccountStub.go +++ b/testscommon/vmcommonMocks/userAccountStub.go @@ -3,7 +3,7 @@ package vmcommonMocks import ( "math/big" - vmcommon "github.com/ElrondNetwork/elrond-vm-common" + vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) // UserAccountStub - From a374121a3a27569cf4bfbbce70416ff47d1edccf Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 21 Feb 2023 17:31:13 +0200 Subject: [PATCH 167/335] - refactoring in guarded accounts semi-integration tests - added a complex scenario as a semi-integration test --- .../vm/txsFee/guardAccount_test.go | 345 ++++++++++++++++-- 1 file changed, 308 insertions(+), 37 deletions(-) diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index b93cfdd37f0..3fa531b8c12 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -7,7 +7,10 @@ package txsFee import ( "encoding/hex" + "io/ioutil" "math/big" + "sort" + "strings" "sync" "testing" @@ -28,9 +31,6 @@ import ( "github.com/stretchr/testify/require" ) -const instantSetGuardian = true -const delayedSetGuardian = false - func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { unreachableEpoch := uint32(999999) db := integrationtests.CreateStorer(tb.TempDir()) @@ -38,7 +38,7 @@ func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { cfg := config.GasScheduleByEpochs{ StartEpoch: 0, - FileName: "gasScheduleV6.toml", + FileName: getLatestGasScheduleVersion(tb, gasScheduleDir), } argsGasScheduleNotifier := forking.ArgsNewGasScheduleNotifier{ @@ -69,6 +69,34 @@ func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { return testContext } +func getLatestGasScheduleVersion(tb testing.TB, directoryToSearch string) string { + fileInfoSlice, err := ioutil.ReadDir(directoryToSearch) + require.Nil(tb, err) + + gasSchedulePrefix := "gasScheduleV" + + files := make([]string, 0) + for _, fileInfo := range fileInfoSlice { + if fileInfo.IsDir() { + continue + } + if !strings.Contains(fileInfo.Name(), gasSchedulePrefix) { + continue + } + + files = append(files, fileInfo.Name()) + } + + sort.Slice(files, func(i, j int) bool { + return files[i] > files[j] + }) + + gasSchedule := files[0] + log.Info("using gas schedule", "file", gasSchedule) + + return gasSchedule +} + func mintAddress(tb testing.TB, testContext *vm.VMTestContext, address []byte, value *big.Int) { accnt, err := testContext.Accounts.LoadAccount(address) require.Nil(tb, err) @@ -104,7 +132,15 @@ func getGuardiansData(tb testing.TB, testContext *vm.VMTestContext, address []by return guardedAccount.GetConfiguredGuardians(userAccnt) } -func setGuardian(testContext *vm.VMTestContext, userAddress []byte, guardianAddress []byte, uuid []byte, isInstantSet bool) (vmcommon.ReturnCode, error) { +func isAccountGuarded(tb testing.TB, testContext *vm.VMTestContext, address []byte) bool { + accnt, err := testContext.Accounts.GetExistingAccount(address) + require.Nil(tb, err) + + userAccnt := accnt.(state.UserAccountHandler) + return userAccnt.IsGuarded() +} + +func setGuardian(testContext *vm.VMTestContext, userAddress []byte, guardianAddress []byte, uuid []byte) (vmcommon.ReturnCode, error) { gasPrice := uint64(10) gasLimit := uint64(250000 + 1000) @@ -117,9 +153,55 @@ func setGuardian(testContext *vm.VMTestContext, userAddress []byte, guardianAddr gasLimit, []byte("SetGuardian@"+hex.EncodeToString(guardianAddress)+"@"+hex.EncodeToString(uuid))) - if isInstantSet { - tx.GuardianAddr = guardianAddress - } + return testContext.TxProcessor.ProcessTransaction(tx) +} + +func setGuardianCoSigned( + testContext *vm.VMTestContext, + userAddress []byte, + currentGuardianAddress []byte, + newGuardianAddress []byte, + uuid []byte, +) (vmcommon.ReturnCode, error) { + gasPrice := uint64(10) + gasLimit := uint64(250000 + 50000 + 1000) + + tx := vm.CreateTransaction( + getNonce(testContext, userAddress), + big.NewInt(0), + userAddress, + userAddress, + gasPrice, + gasLimit, + []byte("SetGuardian@"+hex.EncodeToString(newGuardianAddress)+"@"+hex.EncodeToString(uuid))) + + tx.GuardianAddr = currentGuardianAddress + tx.Options = tx.Options | transaction.MaskGuardedTransaction + tx.Version = core.InitialVersionOfTransaction + 1 + + return testContext.TxProcessor.ProcessTransaction(tx) +} + +func removeGuardiansCoSigned( + testContext *vm.VMTestContext, + userAddress []byte, + currentGuardianAddress []byte, +) (vmcommon.ReturnCode, error) { + gasPrice := uint64(10) + gasLimit := uint64(250000 + 50000 + 1000) + + tx := vm.CreateTransaction( + getNonce(testContext, userAddress), + big.NewInt(0), + userAddress, + userAddress, + gasPrice, + gasLimit, + []byte("UnGuardAccount")) + + tx.GuardianAddr = currentGuardianAddress + tx.Options = tx.Options | transaction.MaskGuardedTransaction + tx.Version = core.InitialVersionOfTransaction + 1 return testContext.TxProcessor.ProcessTransaction(tx) } @@ -162,7 +244,7 @@ func transferFunds( return err } -func transferFundsWithGuardian( +func transferFundsCoSigned( testContext *vm.VMTestContext, senderAddress []byte, transferValue *big.Int, @@ -209,11 +291,12 @@ func testActiveGuardian( shouldBeNil bool, expectedAddress []byte, expectedUUID []byte, + activationEpoch uint32, ) { active, _, err := getGuardiansData(tb, testContext, address) require.Nil(tb, err) - testGuardianData(tb, active, shouldBeNil, expectedAddress, expectedUUID) + testGuardianData(tb, active, shouldBeNil, expectedAddress, expectedUUID, activationEpoch) } func testGuardianData( @@ -222,6 +305,7 @@ func testGuardianData( shouldBeNil bool, expectedAddress []byte, expectedUUID []byte, + activationEpoch uint32, ) { if shouldBeNil { require.Nil(tb, guardian) @@ -231,6 +315,7 @@ func testGuardianData( require.NotNil(tb, guardian) assert.Equal(tb, expectedAddress, guardian.Address) assert.Equal(tb, expectedUUID, guardian.ServiceUID) + assert.Equal(tb, activationEpoch, guardian.ActivationEpoch) } func testPendingGuardian( @@ -240,11 +325,20 @@ func testPendingGuardian( shouldBeNil bool, expectedAddress []byte, expectedUUID []byte, + activationEpoch uint32, ) { _, pending, err := getGuardiansData(tb, testContext, address) require.Nil(tb, err) - testGuardianData(tb, pending, shouldBeNil, expectedAddress, expectedUUID) + testGuardianData(tb, pending, shouldBeNil, expectedAddress, expectedUUID, activationEpoch) +} + +func setNewEpochOnContext(testContext *vm.VMTestContext, epoch uint32) { + hdr := &block.Header{ + Epoch: epoch, + } + testContext.EpochNotifier.CheckEpoch(hdr) + log.Info("current epoch is now", "epoch", epoch) } func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *testing.T) { @@ -259,7 +353,7 @@ func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *tes testNoGuardianIsSet(t, testContext, userAddress) - returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid, instantSetGuardian) + returnCode, err := setGuardianCoSigned(testContext, userAddress, guardianAddress, guardianAddress, uuid) assert.Equal(t, process.ErrFailedTransaction, err) assert.Equal(t, vmcommon.UserError, returnCode) @@ -278,25 +372,24 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { testNoGuardianIsSet(t, testContext, userAddress) - returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid, delayedSetGuardian) + returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid) assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, returnCode) + currentEpoch := uint32(0) - testActiveGuardian(t, testContext, userAddress, true, nil, nil) - testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid) + testActiveGuardian(t, testContext, userAddress, true, nil, nil, 0) + testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch+vm.EpochGuardianDelay) // can not activate guardian now returnCode, err = guardAccount(testContext, userAddress) assert.Equal(t, process.ErrFailedTransaction, err) assert.Equal(t, vmcommon.UserError, returnCode) - hdr := &block.Header{ - Epoch: vm.EpochGuardianDelay, - } - testContext.EpochNotifier.CheckEpoch(hdr) + currentEpoch = vm.EpochGuardianDelay + setNewEpochOnContext(testContext, currentEpoch) - testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid) - testPendingGuardian(t, testContext, userAddress, true, nil, nil) + testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch) + testPendingGuardian(t, testContext, userAddress, true, nil, nil, 0) // can activate guardian now returnCode, err = guardAccount(testContext, userAddress) @@ -325,37 +418,36 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { require.Equal(t, big.NewInt(transferValue), getBalance(testContext, receiverAddress)) // userAddress can not send funds while not protected with a guardian address - err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "guarded transaction not expected") require.Equal(t, big.NewInt(transferValue), getBalance(testContext, receiverAddress)) // userAddress can send funds while it just added a guardian - returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid, delayedSetGuardian) + returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid) assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, returnCode) + currentEpoch := uint32(0) - testActiveGuardian(t, testContext, userAddress, true, nil, nil) - testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid) + testActiveGuardian(t, testContext, userAddress, true, nil, nil, 0) + testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch+vm.EpochGuardianDelay) err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) require.Nil(t, err) require.Equal(t, big.NewInt(transferValue*2), getBalance(testContext, receiverAddress)) // userAddress can not send funds while not protected with a guardian address - err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "guarded transaction not expected") require.Equal(t, big.NewInt(transferValue*2), getBalance(testContext, receiverAddress)) // delay epoch pasts, the pending guardian is now active (but not activated), userAddress can send funds - hdr := &block.Header{ - Epoch: vm.EpochGuardianDelay, - } - testContext.EpochNotifier.CheckEpoch(hdr) + currentEpoch = vm.EpochGuardianDelay + setNewEpochOnContext(testContext, currentEpoch) - testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid) - testPendingGuardian(t, testContext, userAddress, true, nil, nil) + testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch) + testPendingGuardian(t, testContext, userAddress, true, nil, nil, 0) err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) require.Nil(t, err) @@ -366,8 +458,8 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, returnCode) - testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid) - testPendingGuardian(t, testContext, userAddress, true, nil, nil) + testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch) + testPendingGuardian(t, testContext, userAddress, true, nil, nil, 0) err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) @@ -375,19 +467,198 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { require.Equal(t, big.NewInt(transferValue*3), getBalance(testContext, receiverAddress)) // userAddress can send funds while protected with the guardian address - err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) require.Nil(t, err) require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) // userAddress can not send funds while protected with a wrong guardian address - err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, wrongGuardianAddress) + err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, wrongGuardianAddress) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "mismatch between transaction guardian and configured account guardian") require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) // userAddress can not send funds while protected with an empty guardian address - err = transferFundsWithGuardian(testContext, userAddress, big.NewInt(transferValue), receiverAddress, nil) + err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, nil) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "mismatch between transaction guardian and configured account guardian") require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) } + +// Scenario 1 description: +// 1. create & mint 4 addresses: alice, bob, charlie abd delta +// 2. alice sets bob as guardian (test if pending) +// 3. alice can not set bob as guardian again (test if pending & same activation epoch) +// 3.1 alice can not set bob as guardian again even if one epoch past +// 4. alice activates the guardian (test if active) +// 5. alice sets charlie as pending guardian (test if pending & different activation epoch) +// 5.1. alice wants to set delta as pending guardian (transaction is not executable, will not be included in a miniblock) +// 6. alice sets charlie as guardian immediately through a cosigned transaction (test active & pending guardians) +// 7. alice immediately sets bob as guardian through a cosigned transaction (test active & pending guardians) +// 8. alice adds charlie as a pending guardian (test if pending & different activation epoch) +// wait until charlie becomes active, no more pending guardians +// 9. alice adds bob as a pending guardian and calls set charlie immediately cosigned and should remove the pending guardian +// 10. alice un-guards the account immediately by using a cosigned transaction +// 11. alice guards the account immediately by calling the GuardAccount function +// 13. alice sends a guarded transaction, while account is guarded -> should work +// 14. alice un-guards the accounts immediately using a cosigned transaction and then sends a guarded transaction -> should error +// 14.1 alice sends unguarded transaction -> should work +func TestGuardAccount_Scenario1(t *testing.T) { + testContext := prepareTestContextForFreezeAccounts(t) + defer testContext.Close() + + uuid := []byte("uuid") + // transferValue := int64(2000000) + initialMint := big.NewInt(1000000000000000000) + + alice := []byte("alice-12345678901234567890123456") + bob := []byte("bob-1234567890123456789012345678") + charlie := []byte("charlie-123456789012345678901234") + delta := []byte("delta-12345678901234567890123456") + + // step 1 - mint addresses + allAddresses := [][]byte{alice, bob, charlie} + for _, address := range allAddresses { + mintAddress(t, testContext, address, initialMint) + } + for _, address := range allAddresses { + testNoGuardianIsSet(t, testContext, address) + } + currentEpoch := uint32(0) + + // step 2 - alice sets bob as guardian + step2Epoch := currentEpoch + returnCode, err := setGuardian(testContext, alice, bob, uuid) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.False(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, true, nil, nil, 0) + testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) + + // step 3 - alice wants to set bob as guardian again - should fail + returnCode, err = setGuardian(testContext, alice, bob, uuid) + assert.Equal(t, process.ErrFailedTransaction, err) + assert.Equal(t, vmcommon.UserError, returnCode) + assert.False(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, true, nil, nil, 0) + testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) + + // step 3.1 - one epoch pass, try to make bob again as guardian + currentEpoch++ + setNewEpochOnContext(testContext, currentEpoch) + returnCode, err = setGuardian(testContext, alice, bob, uuid) + assert.Equal(t, process.ErrFailedTransaction, err) + assert.Equal(t, vmcommon.UserError, returnCode) + assert.False(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, true, nil, nil, currentEpoch) + testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) // initial epoch + EpochGuardianDelay + + // step 4 - alice activates the guardian + currentEpoch++ + setNewEpochOnContext(testContext, currentEpoch) + returnCode, err = guardAccount(testContext, alice) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) // initial epoch + EpochGuardianDelay + testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + + // step 5 - alice sets charlie as pending guardian + step5Epoch := currentEpoch + returnCode, err = setGuardian(testContext, alice, charlie, uuid) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) + testPendingGuardian(t, testContext, alice, false, charlie, uuid, step5Epoch+vm.EpochGuardianDelay) + + // step 5.1 - alice tries to set delta as pending guardian, overwriting charlie + currentEpoch++ + setNewEpochOnContext(testContext, currentEpoch) + returnCode, err = setGuardian(testContext, alice, delta, uuid) + assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) + assert.Equal(t, vmcommon.UserError, returnCode) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) + testPendingGuardian(t, testContext, alice, false, charlie, uuid, step5Epoch+vm.EpochGuardianDelay) + + // step 6 - alice sets charlie as guardian immediately through a cosigned transaction + step6Epoch := currentEpoch + returnCode, err = setGuardianCoSigned(testContext, alice, bob, charlie, uuid) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, charlie, uuid, step6Epoch) // instant set, no delay add + testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + + // step 7 - alice immediately sets bob as guardian through a cosigned transaction + currentEpoch++ + setNewEpochOnContext(testContext, currentEpoch) + step7Epoch := currentEpoch + returnCode, err = setGuardianCoSigned(testContext, alice, charlie, bob, uuid) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, bob, uuid, step7Epoch) // instant set, no delay add + testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + + // step 8 - alice adds charlie as a pending guardian (test if pending & different activation epoch) + step8Epoch := currentEpoch + returnCode, err = setGuardian(testContext, alice, charlie, uuid) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + testActiveGuardian(t, testContext, alice, false, bob, uuid, step7Epoch) + testPendingGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) + currentEpoch += vm.EpochGuardianDelay + setNewEpochOnContext(testContext, currentEpoch) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) + testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + + // step 9 - alice adds bob as a pending guardian and calls set charlie immediately cosigned and should remove the pending guardian + step9Epoch := currentEpoch + returnCode, err = setGuardian(testContext, alice, bob, uuid) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) + testPendingGuardian(t, testContext, alice, false, bob, uuid, step9Epoch+vm.EpochGuardianDelay) + // guard account by charlie should remove bob pending guardian + returnCode, err = setGuardianCoSigned(testContext, alice, charlie, charlie, uuid) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) + testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + + // step 10 - alice un-guards the account immediately by using a cosigned transaction + currentEpoch++ + setNewEpochOnContext(testContext, currentEpoch) + returnCode, err = removeGuardiansCoSigned(testContext, alice, charlie) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.False(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) + testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + + // step 11 - alice guards the account immediately by calling the GuardAccount function + returnCode, err = guardAccount(testContext, alice) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.True(t, isAccountGuarded(t, testContext, alice)) + testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) + testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + + // 13. alice sends a guarded transaction, while account is guarded -> should work + err = transferFundsCoSigned(testContext, alice, big.NewInt(100), delta, charlie) + assert.Nil(t, err) + + // 14. alice un-guards the accounts immediately using a cosigned transaction and then sends a guarded transaction -> should error + returnCode, err = removeGuardiansCoSigned(testContext, alice, charlie) + assert.Nil(t, err) + assert.Equal(t, vmcommon.Ok, returnCode) + assert.False(t, isAccountGuarded(t, testContext, alice)) + err = transferFundsCoSigned(testContext, alice, big.NewInt(100), delta, charlie) + assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) + // 14.1 alice sends unguarded transaction -> should work + err = transferFunds(testContext, alice, big.NewInt(100), delta) + assert.Nil(t, err) +} From 963c7ed08c0b18f3f143ae9eedc0d1aef4201c0a Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 21 Feb 2023 17:59:30 +0200 Subject: [PATCH 168/335] - fixes after review + fixed semi-integration test --- .../vm/txsFee/guardAccount_test.go | 146 +++++++++--------- 1 file changed, 72 insertions(+), 74 deletions(-) diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index 3fa531b8c12..a367286fedc 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -31,6 +31,11 @@ import ( "github.com/stretchr/testify/require" ) +const gasPrice = uint64(10) +const transactionSigVerificationGas = uint64(50000) +const guardedAccountGas = uint64(250000) +const transferGas = uint64(1000) + func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { unreachableEpoch := uint32(999999) db := integrationtests.CreateStorer(tb.TempDir()) @@ -141,8 +146,7 @@ func isAccountGuarded(tb testing.TB, testContext *vm.VMTestContext, address []by } func setGuardian(testContext *vm.VMTestContext, userAddress []byte, guardianAddress []byte, uuid []byte) (vmcommon.ReturnCode, error) { - gasPrice := uint64(10) - gasLimit := uint64(250000 + 1000) + gasLimit := guardedAccountGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -163,8 +167,7 @@ func setGuardianCoSigned( newGuardianAddress []byte, uuid []byte, ) (vmcommon.ReturnCode, error) { - gasPrice := uint64(10) - gasLimit := uint64(250000 + 50000 + 1000) + gasLimit := guardedAccountGas + transactionSigVerificationGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -187,8 +190,7 @@ func removeGuardiansCoSigned( userAddress []byte, currentGuardianAddress []byte, ) (vmcommon.ReturnCode, error) { - gasPrice := uint64(10) - gasLimit := uint64(250000 + 50000 + 1000) + gasLimit := guardedAccountGas + transactionSigVerificationGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -207,8 +209,7 @@ func removeGuardiansCoSigned( } func guardAccount(testContext *vm.VMTestContext, userAddress []byte) (vmcommon.ReturnCode, error) { - gasPrice := uint64(10) - gasLimit := uint64(400000 + 1000) + gasLimit := guardedAccountGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -228,16 +229,13 @@ func transferFunds( transferValue *big.Int, receiverAddress []byte, ) error { - gasPrice := uint64(10) - gasLimit := uint64(1000) - tx := vm.CreateTransaction( getNonce(testContext, senderAddress), transferValue, senderAddress, receiverAddress, gasPrice, - gasLimit, + transferGas, make([]byte, 0)) _, err := testContext.TxProcessor.ProcessTransaction(tx) @@ -251,8 +249,7 @@ func transferFundsCoSigned( receiverAddress []byte, guardianAddress []byte, ) error { - gasPrice := uint64(10) - gasLimit := uint64(51000) + gasLimit := transactionSigVerificationGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, senderAddress), @@ -282,6 +279,7 @@ func testNoGuardianIsSet(tb testing.TB, testContext *vm.VMTestContext, address [ require.Nil(tb, err) assert.Nil(tb, active) assert.Nil(tb, pending) + assert.False(tb, isAccountGuarded(tb, testContext, address)) } func testActiveGuardian( @@ -354,8 +352,8 @@ func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *tes testNoGuardianIsSet(t, testContext, userAddress) returnCode, err := setGuardianCoSigned(testContext, userAddress, guardianAddress, guardianAddress, uuid) - assert.Equal(t, process.ErrFailedTransaction, err) - assert.Equal(t, vmcommon.UserError, returnCode) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Equal(t, vmcommon.UserError, returnCode) testNoGuardianIsSet(t, testContext, userAddress) } @@ -373,8 +371,8 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { testNoGuardianIsSet(t, testContext, userAddress) returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) currentEpoch := uint32(0) testActiveGuardian(t, testContext, userAddress, true, nil, nil, 0) @@ -382,8 +380,8 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { // can not activate guardian now returnCode, err = guardAccount(testContext, userAddress) - assert.Equal(t, process.ErrFailedTransaction, err) - assert.Equal(t, vmcommon.UserError, returnCode) + require.Equal(t, process.ErrFailedTransaction, err) + require.Equal(t, vmcommon.UserError, returnCode) currentEpoch = vm.EpochGuardianDelay setNewEpochOnContext(testContext, currentEpoch) @@ -393,8 +391,8 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { // can activate guardian now returnCode, err = guardAccount(testContext, userAddress) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) } func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { @@ -455,8 +453,8 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { // userAddress can not send funds while protected without setting the guardian address returnCode, err = guardAccount(testContext, userAddress) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch) testPendingGuardian(t, testContext, userAddress, true, nil, nil, 0) @@ -485,7 +483,7 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { } // Scenario 1 description: -// 1. create & mint 4 addresses: alice, bob, charlie abd delta +// 1. create & mint 4 addresses: alice, bob, charlie and delta // 2. alice sets bob as guardian (test if pending) // 3. alice can not set bob as guardian again (test if pending & same activation epoch) // 3.1 alice can not set bob as guardian again even if one epoch past @@ -507,16 +505,16 @@ func TestGuardAccount_Scenario1(t *testing.T) { defer testContext.Close() uuid := []byte("uuid") - // transferValue := int64(2000000) + transferValue := big.NewInt(2000000) initialMint := big.NewInt(1000000000000000000) alice := []byte("alice-12345678901234567890123456") bob := []byte("bob-1234567890123456789012345678") charlie := []byte("charlie-123456789012345678901234") delta := []byte("delta-12345678901234567890123456") + allAddresses := [][]byte{alice, bob, charlie, delta} // step 1 - mint addresses - allAddresses := [][]byte{alice, bob, charlie} for _, address := range allAddresses { mintAddress(t, testContext, address, initialMint) } @@ -528,17 +526,17 @@ func TestGuardAccount_Scenario1(t *testing.T) { // step 2 - alice sets bob as guardian step2Epoch := currentEpoch returnCode, err := setGuardian(testContext, alice, bob, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.False(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.False(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, true, nil, nil, 0) testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) // step 3 - alice wants to set bob as guardian again - should fail returnCode, err = setGuardian(testContext, alice, bob, uuid) - assert.Equal(t, process.ErrFailedTransaction, err) - assert.Equal(t, vmcommon.UserError, returnCode) - assert.False(t, isAccountGuarded(t, testContext, alice)) + require.Equal(t, process.ErrFailedTransaction, err) + require.Equal(t, vmcommon.UserError, returnCode) + require.False(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, true, nil, nil, 0) testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) @@ -546,9 +544,9 @@ func TestGuardAccount_Scenario1(t *testing.T) { currentEpoch++ setNewEpochOnContext(testContext, currentEpoch) returnCode, err = setGuardian(testContext, alice, bob, uuid) - assert.Equal(t, process.ErrFailedTransaction, err) - assert.Equal(t, vmcommon.UserError, returnCode) - assert.False(t, isAccountGuarded(t, testContext, alice)) + require.Equal(t, process.ErrFailedTransaction, err) + require.Equal(t, vmcommon.UserError, returnCode) + require.False(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, true, nil, nil, currentEpoch) testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) // initial epoch + EpochGuardianDelay @@ -556,18 +554,18 @@ func TestGuardAccount_Scenario1(t *testing.T) { currentEpoch++ setNewEpochOnContext(testContext, currentEpoch) returnCode, err = guardAccount(testContext, alice) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) // initial epoch + EpochGuardianDelay testPendingGuardian(t, testContext, alice, true, nil, nil, 0) // step 5 - alice sets charlie as pending guardian step5Epoch := currentEpoch returnCode, err = setGuardian(testContext, alice, charlie, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) testPendingGuardian(t, testContext, alice, false, charlie, uuid, step5Epoch+vm.EpochGuardianDelay) @@ -575,18 +573,18 @@ func TestGuardAccount_Scenario1(t *testing.T) { currentEpoch++ setNewEpochOnContext(testContext, currentEpoch) returnCode, err = setGuardian(testContext, alice, delta, uuid) - assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) - assert.Equal(t, vmcommon.UserError, returnCode) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Equal(t, vmcommon.UserError, returnCode) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) testPendingGuardian(t, testContext, alice, false, charlie, uuid, step5Epoch+vm.EpochGuardianDelay) // step 6 - alice sets charlie as guardian immediately through a cosigned transaction step6Epoch := currentEpoch returnCode, err = setGuardianCoSigned(testContext, alice, bob, charlie, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, charlie, uuid, step6Epoch) // instant set, no delay add testPendingGuardian(t, testContext, alice, true, nil, nil, 0) @@ -595,37 +593,37 @@ func TestGuardAccount_Scenario1(t *testing.T) { setNewEpochOnContext(testContext, currentEpoch) step7Epoch := currentEpoch returnCode, err = setGuardianCoSigned(testContext, alice, charlie, bob, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, bob, uuid, step7Epoch) // instant set, no delay add testPendingGuardian(t, testContext, alice, true, nil, nil, 0) // step 8 - alice adds charlie as a pending guardian (test if pending & different activation epoch) step8Epoch := currentEpoch returnCode, err = setGuardian(testContext, alice, charlie, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) testActiveGuardian(t, testContext, alice, false, bob, uuid, step7Epoch) testPendingGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) currentEpoch += vm.EpochGuardianDelay setNewEpochOnContext(testContext, currentEpoch) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) testPendingGuardian(t, testContext, alice, true, nil, nil, 0) // step 9 - alice adds bob as a pending guardian and calls set charlie immediately cosigned and should remove the pending guardian step9Epoch := currentEpoch returnCode, err = setGuardian(testContext, alice, bob, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) testPendingGuardian(t, testContext, alice, false, bob, uuid, step9Epoch+vm.EpochGuardianDelay) // guard account by charlie should remove bob pending guardian returnCode, err = setGuardianCoSigned(testContext, alice, charlie, charlie, uuid) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) testPendingGuardian(t, testContext, alice, true, nil, nil, 0) @@ -633,32 +631,32 @@ func TestGuardAccount_Scenario1(t *testing.T) { currentEpoch++ setNewEpochOnContext(testContext, currentEpoch) returnCode, err = removeGuardiansCoSigned(testContext, alice, charlie) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.False(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.False(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) testPendingGuardian(t, testContext, alice, true, nil, nil, 0) // step 11 - alice guards the account immediately by calling the GuardAccount function returnCode, err = guardAccount(testContext, alice) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.True(t, isAccountGuarded(t, testContext, alice)) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.True(t, isAccountGuarded(t, testContext, alice)) testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) testPendingGuardian(t, testContext, alice, true, nil, nil, 0) // 13. alice sends a guarded transaction, while account is guarded -> should work - err = transferFundsCoSigned(testContext, alice, big.NewInt(100), delta, charlie) - assert.Nil(t, err) + err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) + require.Nil(t, err) // 14. alice un-guards the accounts immediately using a cosigned transaction and then sends a guarded transaction -> should error returnCode, err = removeGuardiansCoSigned(testContext, alice, charlie) - assert.Nil(t, err) - assert.Equal(t, vmcommon.Ok, returnCode) - assert.False(t, isAccountGuarded(t, testContext, alice)) - err = transferFundsCoSigned(testContext, alice, big.NewInt(100), delta, charlie) - assert.ErrorIs(t, err, process.ErrTransactionNotExecutable) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + require.False(t, isAccountGuarded(t, testContext, alice)) + err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) + require.ErrorIs(t, err, process.ErrTransactionNotExecutable) // 14.1 alice sends unguarded transaction -> should work - err = transferFunds(testContext, alice, big.NewInt(100), delta) - assert.Nil(t, err) + err = transferFunds(testContext, alice, transferValue, delta) + require.Nil(t, err) } From 19601131d4ce84b9ea7e74eb4564b90b68a8469e Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 22 Feb 2023 17:59:08 +0200 Subject: [PATCH 169/335] - fixes after review --- .../vm/txsFee/guardAccount_test.go | 404 ++++++++++++------ 1 file changed, 284 insertions(+), 120 deletions(-) diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index a367286fedc..e6bd01ff9d9 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -14,7 +14,6 @@ import ( "sync" "testing" - "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/guardians" "github.com/multiversx/mx-chain-core-go/data/transaction" @@ -31,12 +30,35 @@ import ( "github.com/stretchr/testify/require" ) +const txWithOptionVersion = 2 const gasPrice = uint64(10) -const transactionSigVerificationGas = uint64(50000) -const guardedAccountGas = uint64(250000) +const guardianSigVerificationGas = uint64(50000) +const guardAccountGas = uint64(250000) +const unGuardAccountGas = uint64(250000) +const setGuardianGas = uint64(250000) const transferGas = uint64(1000) -func prepareTestContextForFreezeAccounts(tb testing.TB) *vm.VMTestContext { +type guardianInfo struct { + address []byte + uuid []byte + epoch uint32 +} + +type guardAccountStatus struct { + isGuarded bool + active *guardianInfo + pending *guardianInfo +} + +func createUnGuardedAccountStatus() guardAccountStatus { + return guardAccountStatus{ + isGuarded: false, + active: nil, + pending: nil, + } +} + +func prepareTestContextForGuardedAccounts(tb testing.TB) *vm.VMTestContext { unreachableEpoch := uint32(999999) db := integrationtests.CreateStorer(tb.TempDir()) gasScheduleDir := "../../../cmd/node/config/gasSchedules" @@ -123,7 +145,7 @@ func getNonce(testContext *vm.VMTestContext, address []byte) uint64 { return accnt.GetNonce() } -func getGuardiansData(tb testing.TB, testContext *vm.VMTestContext, address []byte) (active *guardians.Guardian, pending *guardians.Guardian, err error) { +func getGuardiansData(tb testing.TB, testContext *vm.VMTestContext, address []byte) (*guardians.Guardian, *guardians.Guardian, bool) { accnt, err := testContext.Accounts.GetExistingAccount(address) require.Nil(tb, err) @@ -134,19 +156,13 @@ func getGuardiansData(tb testing.TB, testContext *vm.VMTestContext, address []by vm.EpochGuardianDelay) require.Nil(tb, err) - return guardedAccount.GetConfiguredGuardians(userAccnt) -} - -func isAccountGuarded(tb testing.TB, testContext *vm.VMTestContext, address []byte) bool { - accnt, err := testContext.Accounts.GetExistingAccount(address) - require.Nil(tb, err) + active, pending, err := guardedAccount.GetConfiguredGuardians(userAccnt) - userAccnt := accnt.(state.UserAccountHandler) - return userAccnt.IsGuarded() + return active, pending, userAccnt.IsGuarded() } func setGuardian(testContext *vm.VMTestContext, userAddress []byte, guardianAddress []byte, uuid []byte) (vmcommon.ReturnCode, error) { - gasLimit := guardedAccountGas + transferGas + gasLimit := setGuardianGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -167,7 +183,7 @@ func setGuardianCoSigned( newGuardianAddress []byte, uuid []byte, ) (vmcommon.ReturnCode, error) { - gasLimit := guardedAccountGas + transactionSigVerificationGas + transferGas + gasLimit := setGuardianGas + guardianSigVerificationGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -180,7 +196,7 @@ func setGuardianCoSigned( tx.GuardianAddr = currentGuardianAddress tx.Options = tx.Options | transaction.MaskGuardedTransaction - tx.Version = core.InitialVersionOfTransaction + 1 + tx.Version = txWithOptionVersion return testContext.TxProcessor.ProcessTransaction(tx) } @@ -190,7 +206,7 @@ func removeGuardiansCoSigned( userAddress []byte, currentGuardianAddress []byte, ) (vmcommon.ReturnCode, error) { - gasLimit := guardedAccountGas + transactionSigVerificationGas + transferGas + gasLimit := unGuardAccountGas + guardianSigVerificationGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -203,13 +219,13 @@ func removeGuardiansCoSigned( tx.GuardianAddr = currentGuardianAddress tx.Options = tx.Options | transaction.MaskGuardedTransaction - tx.Version = core.InitialVersionOfTransaction + 1 + tx.Version = txWithOptionVersion return testContext.TxProcessor.ProcessTransaction(tx) } func guardAccount(testContext *vm.VMTestContext, userAddress []byte) (vmcommon.ReturnCode, error) { - gasLimit := guardedAccountGas + transferGas + gasLimit := guardAccountGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, userAddress), @@ -249,7 +265,7 @@ func transferFundsCoSigned( receiverAddress []byte, guardianAddress []byte, ) error { - gasLimit := transactionSigVerificationGas + transferGas + gasLimit := guardianSigVerificationGas + transferGas tx := vm.CreateTransaction( getNonce(testContext, senderAddress), @@ -259,7 +275,7 @@ func transferFundsCoSigned( gasPrice, gasLimit, make([]byte, 0)) - tx.Version = core.InitialVersionOfTransaction + 1 + tx.Version = txWithOptionVersion tx.Options = tx.Options | transaction.MaskGuardedTransaction tx.GuardianAddr = guardianAddress @@ -274,61 +290,33 @@ func getBalance(testContext *vm.VMTestContext, address []byte) *big.Int { return userAccnt.GetBalance() } -func testNoGuardianIsSet(tb testing.TB, testContext *vm.VMTestContext, address []byte) { - active, pending, err := getGuardiansData(tb, testContext, address) - require.Nil(tb, err) - assert.Nil(tb, active) - assert.Nil(tb, pending) - assert.False(tb, isAccountGuarded(tb, testContext, address)) -} - -func testActiveGuardian( +func testGuardianStatus( tb testing.TB, testContext *vm.VMTestContext, address []byte, - shouldBeNil bool, - expectedAddress []byte, - expectedUUID []byte, - activationEpoch uint32, + expectedStatus guardAccountStatus, ) { - active, _, err := getGuardiansData(tb, testContext, address) - require.Nil(tb, err) + active, pending, isGuarded := getGuardiansData(tb, testContext, address) + assert.Equal(tb, expectedStatus.isGuarded, isGuarded) - testGuardianData(tb, active, shouldBeNil, expectedAddress, expectedUUID, activationEpoch) + testGuardianData(tb, active, expectedStatus.active) + testGuardianData(tb, pending, expectedStatus.pending) } func testGuardianData( tb testing.TB, guardian *guardians.Guardian, - shouldBeNil bool, - expectedAddress []byte, - expectedUUID []byte, - activationEpoch uint32, + info *guardianInfo, ) { - if shouldBeNil { + if info == nil { require.Nil(tb, guardian) return } require.NotNil(tb, guardian) - assert.Equal(tb, expectedAddress, guardian.Address) - assert.Equal(tb, expectedUUID, guardian.ServiceUID) - assert.Equal(tb, activationEpoch, guardian.ActivationEpoch) -} - -func testPendingGuardian( - tb testing.TB, - testContext *vm.VMTestContext, - address []byte, - shouldBeNil bool, - expectedAddress []byte, - expectedUUID []byte, - activationEpoch uint32, -) { - _, pending, err := getGuardiansData(tb, testContext, address) - require.Nil(tb, err) - - testGuardianData(tb, pending, shouldBeNil, expectedAddress, expectedUUID, activationEpoch) + assert.Equal(tb, info.address, guardian.Address) + assert.Equal(tb, info.uuid, guardian.ServiceUID) + assert.Equal(tb, info.epoch, guardian.ActivationEpoch) } func setNewEpochOnContext(testContext *vm.VMTestContext, epoch uint32) { @@ -340,7 +328,7 @@ func setNewEpochOnContext(testContext *vm.VMTestContext, epoch uint32) { } func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *testing.T) { - testContext := prepareTestContextForFreezeAccounts(t) + testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() uuid := []byte("uuid") @@ -349,17 +337,18 @@ func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *tes guardianAddress := []byte("guardian-12345678901234567890123") mintAddress(t, testContext, userAddress, initialMint) - testNoGuardianIsSet(t, testContext, userAddress) + expectedStatus := createUnGuardedAccountStatus() + testGuardianStatus(t, testContext, userAddress, expectedStatus) returnCode, err := setGuardianCoSigned(testContext, userAddress, guardianAddress, guardianAddress, uuid) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Equal(t, vmcommon.UserError, returnCode) - testNoGuardianIsSet(t, testContext, userAddress) + testGuardianStatus(t, testContext, userAddress, expectedStatus) } func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { - testContext := prepareTestContextForFreezeAccounts(t) + testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() uuid := []byte("uuid") @@ -368,15 +357,24 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { guardianAddress := []byte("guardian-12345678901234567890123") mintAddress(t, testContext, userAddress, initialMint) - testNoGuardianIsSet(t, testContext, userAddress) + expectedStatus := createUnGuardedAccountStatus() + testGuardianStatus(t, testContext, userAddress, expectedStatus) returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) currentEpoch := uint32(0) - testActiveGuardian(t, testContext, userAddress, true, nil, nil, 0) - testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: nil, + pending: &guardianInfo{ + address: guardianAddress, + uuid: uuid, + epoch: currentEpoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, userAddress, expectedStatus) // can not activate guardian now returnCode, err = guardAccount(testContext, userAddress) @@ -386,17 +384,36 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { currentEpoch = vm.EpochGuardianDelay setNewEpochOnContext(testContext, currentEpoch) - testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch) - testPendingGuardian(t, testContext, userAddress, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: &guardianInfo{ + address: guardianAddress, + uuid: uuid, + epoch: currentEpoch, + }, + pending: nil, + } + testGuardianStatus(t, testContext, userAddress, expectedStatus) // can activate guardian now returnCode, err = guardAccount(testContext, userAddress) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) + + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: guardianAddress, + uuid: uuid, + epoch: currentEpoch, + }, + pending: nil, + } + testGuardianStatus(t, testContext, userAddress, expectedStatus) } func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { - testContext := prepareTestContextForFreezeAccounts(t) + testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() uuid := []byte("uuid") @@ -408,7 +425,8 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { wrongGuardianAddress := []byte("wrong-guardian-12345678901234523") mintAddress(t, testContext, userAddress, initialMint) - testNoGuardianIsSet(t, testContext, userAddress) + expectedStatus := createUnGuardedAccountStatus() + testGuardianStatus(t, testContext, userAddress, expectedStatus) // userAddress can send funds while not protected err := transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) @@ -427,8 +445,16 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { assert.Equal(t, vmcommon.Ok, returnCode) currentEpoch := uint32(0) - testActiveGuardian(t, testContext, userAddress, true, nil, nil, 0) - testPendingGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: nil, + pending: &guardianInfo{ + address: guardianAddress, + uuid: uuid, + epoch: currentEpoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, userAddress, expectedStatus) err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) require.Nil(t, err) @@ -444,8 +470,16 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { currentEpoch = vm.EpochGuardianDelay setNewEpochOnContext(testContext, currentEpoch) - testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch) - testPendingGuardian(t, testContext, userAddress, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: &guardianInfo{ + address: guardianAddress, + uuid: uuid, + epoch: currentEpoch, + }, + pending: nil, + } + testGuardianStatus(t, testContext, userAddress, expectedStatus) err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) require.Nil(t, err) @@ -456,8 +490,16 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - testActiveGuardian(t, testContext, userAddress, false, guardianAddress, uuid, currentEpoch) - testPendingGuardian(t, testContext, userAddress, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: guardianAddress, + uuid: uuid, + epoch: currentEpoch, + }, + pending: nil, + } + testGuardianStatus(t, testContext, userAddress, expectedStatus) err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) @@ -501,7 +543,7 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { // 14. alice un-guards the accounts immediately using a cosigned transaction and then sends a guarded transaction -> should error // 14.1 alice sends unguarded transaction -> should work func TestGuardAccount_Scenario1(t *testing.T) { - testContext := prepareTestContextForFreezeAccounts(t) + testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() uuid := []byte("uuid") @@ -518,8 +560,9 @@ func TestGuardAccount_Scenario1(t *testing.T) { for _, address := range allAddresses { mintAddress(t, testContext, address, initialMint) } + expectedStatus := createUnGuardedAccountStatus() for _, address := range allAddresses { - testNoGuardianIsSet(t, testContext, address) + testGuardianStatus(t, testContext, address, expectedStatus) } currentEpoch := uint32(0) @@ -528,17 +571,31 @@ func TestGuardAccount_Scenario1(t *testing.T) { returnCode, err := setGuardian(testContext, alice, bob, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.False(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, true, nil, nil, 0) - testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: nil, + pending: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 3 - alice wants to set bob as guardian again - should fail returnCode, err = setGuardian(testContext, alice, bob, uuid) require.Equal(t, process.ErrFailedTransaction, err) require.Equal(t, vmcommon.UserError, returnCode) - require.False(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, true, nil, nil, 0) - testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: nil, + pending: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 3.1 - one epoch pass, try to make bob again as guardian currentEpoch++ @@ -546,9 +603,16 @@ func TestGuardAccount_Scenario1(t *testing.T) { returnCode, err = setGuardian(testContext, alice, bob, uuid) require.Equal(t, process.ErrFailedTransaction, err) require.Equal(t, vmcommon.UserError, returnCode) - require.False(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, true, nil, nil, currentEpoch) - testPendingGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) // initial epoch + EpochGuardianDelay + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: nil, + pending: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 4 - alice activates the guardian currentEpoch++ @@ -556,18 +620,36 @@ func TestGuardAccount_Scenario1(t *testing.T) { returnCode, err = guardAccount(testContext, alice) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) // initial epoch + EpochGuardianDelay - testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 5 - alice sets charlie as pending guardian step5Epoch := currentEpoch returnCode, err = setGuardian(testContext, alice, charlie, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) - testPendingGuardian(t, testContext, alice, false, charlie, uuid, step5Epoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + pending: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step5Epoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 5.1 - alice tries to set delta as pending guardian, overwriting charlie currentEpoch++ @@ -575,18 +657,36 @@ func TestGuardAccount_Scenario1(t *testing.T) { returnCode, err = setGuardian(testContext, alice, delta, uuid) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Equal(t, vmcommon.UserError, returnCode) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, bob, uuid, step2Epoch+vm.EpochGuardianDelay) - testPendingGuardian(t, testContext, alice, false, charlie, uuid, step5Epoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + pending: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step5Epoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 6 - alice sets charlie as guardian immediately through a cosigned transaction step6Epoch := currentEpoch returnCode, err = setGuardianCoSigned(testContext, alice, bob, charlie, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, charlie, uuid, step6Epoch) // instant set, no delay add - testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ // instant set, no delay added + address: charlie, + uuid: uuid, + epoch: step6Epoch, + }, + pending: nil, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 7 - alice immediately sets bob as guardian through a cosigned transaction currentEpoch++ @@ -595,37 +695,81 @@ func TestGuardAccount_Scenario1(t *testing.T) { returnCode, err = setGuardianCoSigned(testContext, alice, charlie, bob, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, bob, uuid, step7Epoch) // instant set, no delay add - testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ // instant set, no delay added + address: bob, + uuid: uuid, + epoch: step7Epoch, + }, + pending: nil, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 8 - alice adds charlie as a pending guardian (test if pending & different activation epoch) step8Epoch := currentEpoch returnCode, err = setGuardian(testContext, alice, charlie, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - testActiveGuardian(t, testContext, alice, false, bob, uuid, step7Epoch) - testPendingGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step7Epoch, + }, + pending: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step8Epoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, alice, expectedStatus) currentEpoch += vm.EpochGuardianDelay setNewEpochOnContext(testContext, currentEpoch) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) - testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step8Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 9 - alice adds bob as a pending guardian and calls set charlie immediately cosigned and should remove the pending guardian step9Epoch := currentEpoch returnCode, err = setGuardian(testContext, alice, bob, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) - testPendingGuardian(t, testContext, alice, false, bob, uuid, step9Epoch+vm.EpochGuardianDelay) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step8Epoch + vm.EpochGuardianDelay, + }, + pending: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step9Epoch + vm.EpochGuardianDelay, + }, + } + testGuardianStatus(t, testContext, alice, expectedStatus) // guard account by charlie should remove bob pending guardian returnCode, err = setGuardianCoSigned(testContext, alice, charlie, charlie, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) - testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step8Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } // step 10 - alice un-guards the account immediately by using a cosigned transaction currentEpoch++ @@ -633,17 +777,29 @@ func TestGuardAccount_Scenario1(t *testing.T) { returnCode, err = removeGuardiansCoSigned(testContext, alice, charlie) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.False(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) - testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step8Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } // step 11 - alice guards the account immediately by calling the GuardAccount function returnCode, err = guardAccount(testContext, alice) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.True(t, isAccountGuarded(t, testContext, alice)) - testActiveGuardian(t, testContext, alice, false, charlie, uuid, step8Epoch+vm.EpochGuardianDelay) - testPendingGuardian(t, testContext, alice, true, nil, nil, 0) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step8Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } // 13. alice sends a guarded transaction, while account is guarded -> should work err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) @@ -653,7 +809,15 @@ func TestGuardAccount_Scenario1(t *testing.T) { returnCode, err = removeGuardiansCoSigned(testContext, alice, charlie) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) - require.False(t, isAccountGuarded(t, testContext, alice)) + expectedStatus = guardAccountStatus{ + isGuarded: false, + active: &guardianInfo{ + address: charlie, + uuid: uuid, + epoch: step8Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) // 14.1 alice sends unguarded transaction -> should work From 17bf22d69c3c94f3632185fa6c3c22592091ed3e Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 22 Feb 2023 18:13:57 +0200 Subject: [PATCH 170/335] - fixed linter issues --- integrationTests/vm/txsFee/guardAccount_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index e6bd01ff9d9..14f58a41309 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -157,6 +157,7 @@ func getGuardiansData(tb testing.TB, testContext *vm.VMTestContext, address []by require.Nil(tb, err) active, pending, err := guardedAccount.GetConfiguredGuardians(userAccnt) + require.Nil(tb, err) return active, pending, userAccnt.IsGuarded() } @@ -770,6 +771,7 @@ func TestGuardAccount_Scenario1(t *testing.T) { }, pending: nil, } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 10 - alice un-guards the account immediately by using a cosigned transaction currentEpoch++ @@ -786,6 +788,7 @@ func TestGuardAccount_Scenario1(t *testing.T) { }, pending: nil, } + testGuardianStatus(t, testContext, alice, expectedStatus) // step 11 - alice guards the account immediately by calling the GuardAccount function returnCode, err = guardAccount(testContext, alice) @@ -800,6 +803,7 @@ func TestGuardAccount_Scenario1(t *testing.T) { }, pending: nil, } + testGuardianStatus(t, testContext, alice, expectedStatus) // 13. alice sends a guarded transaction, while account is guarded -> should work err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) @@ -818,6 +822,7 @@ func TestGuardAccount_Scenario1(t *testing.T) { }, pending: nil, } + testGuardianStatus(t, testContext, alice, expectedStatus) err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) // 14.1 alice sends unguarded transaction -> should work From 04bebadaa02975bed5c3ae52a3451f3b50a88a6d Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Feb 2023 10:10:22 +0200 Subject: [PATCH 171/335] - refactored guard accounts semi-integration tests to use the same alice, bob... account names --- .../vm/txsFee/guardAccount_test.go | 127 ++++++++---------- 1 file changed, 58 insertions(+), 69 deletions(-) diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index 14f58a41309..fa4c360b947 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -38,6 +38,17 @@ const unGuardAccountGas = uint64(250000) const setGuardianGas = uint64(250000) const transferGas = uint64(1000) +var ( + alice = []byte("alice-12345678901234567890123456") + bob = []byte("bob-1234567890123456789012345678") + charlie = []byte("charlie-123456789012345678901234") + delta = []byte("delta-12345678901234567890123456") + allAddresses = [][]byte{alice, bob, charlie, delta} + uuid = []byte("uuid") + transferValue = big.NewInt(2000000) + initialMint = big.NewInt(1000000000000000000) +) + type guardianInfo struct { address []byte uuid []byte @@ -332,36 +343,30 @@ func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *tes testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() - uuid := []byte("uuid") - initialMint := big.NewInt(1000000000000000000) - userAddress := []byte("user-123456789012345678901234567") - guardianAddress := []byte("guardian-12345678901234567890123") - mintAddress(t, testContext, userAddress, initialMint) + // alice is the user, bob is the guardian + mintAddress(t, testContext, alice, initialMint) expectedStatus := createUnGuardedAccountStatus() - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) - returnCode, err := setGuardianCoSigned(testContext, userAddress, guardianAddress, guardianAddress, uuid) + returnCode, err := setGuardianCoSigned(testContext, alice, bob, bob, uuid) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Equal(t, vmcommon.UserError, returnCode) - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) } func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() - uuid := []byte("uuid") - initialMint := big.NewInt(1000000000000000000) - userAddress := []byte("user-123456789012345678901234567") - guardianAddress := []byte("guardian-12345678901234567890123") - mintAddress(t, testContext, userAddress, initialMint) + // alice is the user, bob is the guardian + mintAddress(t, testContext, alice, initialMint) expectedStatus := createUnGuardedAccountStatus() - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) - returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid) + returnCode, err := setGuardian(testContext, alice, bob, uuid) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) currentEpoch := uint32(0) @@ -370,15 +375,15 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { isGuarded: false, active: nil, pending: &guardianInfo{ - address: guardianAddress, + address: bob, uuid: uuid, epoch: currentEpoch + vm.EpochGuardianDelay, }, } - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) // can not activate guardian now - returnCode, err = guardAccount(testContext, userAddress) + returnCode, err = guardAccount(testContext, alice) require.Equal(t, process.ErrFailedTransaction, err) require.Equal(t, vmcommon.UserError, returnCode) @@ -388,60 +393,54 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { expectedStatus = guardAccountStatus{ isGuarded: false, active: &guardianInfo{ - address: guardianAddress, + address: bob, uuid: uuid, epoch: currentEpoch, }, pending: nil, } - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) // can activate guardian now - returnCode, err = guardAccount(testContext, userAddress) + returnCode, err = guardAccount(testContext, alice) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) expectedStatus = guardAccountStatus{ isGuarded: true, active: &guardianInfo{ - address: guardianAddress, + address: bob, uuid: uuid, epoch: currentEpoch, }, pending: nil, } - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) } func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() - uuid := []byte("uuid") - transferValue := int64(2000000) - initialMint := big.NewInt(1000000000000000000) - userAddress := []byte("user-123456789012345678901234567") - receiverAddress := []byte("recv-123456789012345678901234567") - guardianAddress := []byte("guardian-12345678901234567890123") - wrongGuardianAddress := []byte("wrong-guardian-12345678901234523") - mintAddress(t, testContext, userAddress, initialMint) + // alice is the user, bob is the guardian, charlie is the receiver, delta is the wrong guardian + mintAddress(t, testContext, alice, initialMint) expectedStatus := createUnGuardedAccountStatus() - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) // userAddress can send funds while not protected - err := transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + err := transferFunds(testContext, alice, transferValue, charlie) require.Nil(t, err) - require.Equal(t, big.NewInt(transferValue), getBalance(testContext, receiverAddress)) + require.Equal(t, transferValue, getBalance(testContext, charlie)) // userAddress can not send funds while not protected with a guardian address - err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + err = transferFundsCoSigned(testContext, alice, transferValue, charlie, bob) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "guarded transaction not expected") - require.Equal(t, big.NewInt(transferValue), getBalance(testContext, receiverAddress)) + require.Equal(t, transferValue, getBalance(testContext, charlie)) // userAddress can send funds while it just added a guardian - returnCode, err := setGuardian(testContext, userAddress, guardianAddress, uuid) + returnCode, err := setGuardian(testContext, alice, bob, uuid) assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, returnCode) currentEpoch := uint32(0) @@ -450,22 +449,22 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { isGuarded: false, active: nil, pending: &guardianInfo{ - address: guardianAddress, + address: bob, uuid: uuid, epoch: currentEpoch + vm.EpochGuardianDelay, }, } - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) - err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + err = transferFunds(testContext, alice, transferValue, charlie) require.Nil(t, err) - require.Equal(t, big.NewInt(transferValue*2), getBalance(testContext, receiverAddress)) + require.Equal(t, big.NewInt(transferValue.Int64()*2), getBalance(testContext, charlie)) // userAddress can not send funds while not protected with a guardian address - err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + err = transferFundsCoSigned(testContext, alice, transferValue, charlie, bob) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "guarded transaction not expected") - require.Equal(t, big.NewInt(transferValue*2), getBalance(testContext, receiverAddress)) + require.Equal(t, big.NewInt(transferValue.Int64()*2), getBalance(testContext, charlie)) // delay epoch pasts, the pending guardian is now active (but not activated), userAddress can send funds currentEpoch = vm.EpochGuardianDelay @@ -474,55 +473,55 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { expectedStatus = guardAccountStatus{ isGuarded: false, active: &guardianInfo{ - address: guardianAddress, + address: bob, uuid: uuid, epoch: currentEpoch, }, pending: nil, } - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) - err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + err = transferFunds(testContext, alice, transferValue, charlie) require.Nil(t, err) - require.Equal(t, big.NewInt(transferValue*3), getBalance(testContext, receiverAddress)) + require.Equal(t, big.NewInt(transferValue.Int64()*3), getBalance(testContext, charlie)) // userAddress can not send funds while protected without setting the guardian address - returnCode, err = guardAccount(testContext, userAddress) + returnCode, err = guardAccount(testContext, alice) require.Nil(t, err) require.Equal(t, vmcommon.Ok, returnCode) expectedStatus = guardAccountStatus{ isGuarded: true, active: &guardianInfo{ - address: guardianAddress, + address: bob, uuid: uuid, epoch: currentEpoch, }, pending: nil, } - testGuardianStatus(t, testContext, userAddress, expectedStatus) + testGuardianStatus(t, testContext, alice, expectedStatus) - err = transferFunds(testContext, userAddress, big.NewInt(transferValue), receiverAddress) + err = transferFunds(testContext, alice, transferValue, charlie) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "not allowed to bypass guardian") - require.Equal(t, big.NewInt(transferValue*3), getBalance(testContext, receiverAddress)) + require.Equal(t, big.NewInt(transferValue.Int64()*3), getBalance(testContext, charlie)) // userAddress can send funds while protected with the guardian address - err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, guardianAddress) + err = transferFundsCoSigned(testContext, alice, transferValue, charlie, bob) require.Nil(t, err) - require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) + require.Equal(t, big.NewInt(transferValue.Int64()*4), getBalance(testContext, charlie)) - // userAddress can not send funds while protected with a wrong guardian address - err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, wrongGuardianAddress) + // userAddress can not send funds while protected with a wrong guardian address (delta) + err = transferFundsCoSigned(testContext, alice, transferValue, charlie, delta) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "mismatch between transaction guardian and configured account guardian") - require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) + require.Equal(t, big.NewInt(transferValue.Int64()*4), getBalance(testContext, charlie)) // userAddress can not send funds while protected with an empty guardian address - err = transferFundsCoSigned(testContext, userAddress, big.NewInt(transferValue), receiverAddress, nil) + err = transferFundsCoSigned(testContext, alice, transferValue, charlie, nil) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "mismatch between transaction guardian and configured account guardian") - require.Equal(t, big.NewInt(transferValue*4), getBalance(testContext, receiverAddress)) + require.Equal(t, big.NewInt(transferValue.Int64()*4), getBalance(testContext, charlie)) } // Scenario 1 description: @@ -547,16 +546,6 @@ func TestGuardAccount_Scenario1(t *testing.T) { testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() - uuid := []byte("uuid") - transferValue := big.NewInt(2000000) - initialMint := big.NewInt(1000000000000000000) - - alice := []byte("alice-12345678901234567890123456") - bob := []byte("bob-1234567890123456789012345678") - charlie := []byte("charlie-123456789012345678901234") - delta := []byte("delta-12345678901234567890123456") - allAddresses := [][]byte{alice, bob, charlie, delta} - // step 1 - mint addresses for _, address := range allAddresses { mintAddress(t, testContext, address, initialMint) From a2a511266ea6d4c2d721f9c65d9a8a0b713f768e Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Feb 2023 12:16:20 +0200 Subject: [PATCH 172/335] - added semi-integration tests for relayed & guarded accounts --- .../multiShard/relayedTx/common.go | 11 +- integrationTests/testInitializer.go | 20 ++ .../vm/txsFee/guardAccount_test.go | 271 +++++++++++++++++- .../relayedBuiltInFunctions_test.go | 2 +- .../multiShard/relayedMoveBalance_test.go | 13 +- .../txsFee/multiShard/relayedScDeploy_test.go | 3 +- .../multiShard/relayedTxScCalls_test.go | 5 +- .../vm/txsFee/relayedAsyncCall_test.go | 3 +- .../vm/txsFee/relayedAsyncESDT_test.go | 7 +- .../vm/txsFee/relayedBuiltInFunctions_test.go | 10 +- integrationTests/vm/txsFee/relayedDns_test.go | 7 +- .../vm/txsFee/relayedESDT_test.go | 5 +- .../vm/txsFee/relayedMoveBalance_test.go | 10 +- .../vm/txsFee/relayedScCalls_test.go | 11 +- .../vm/txsFee/relayedScDeploy_test.go | 10 +- integrationTests/vm/txsFee/utils/utils.go | 11 +- integrationTests/vm/txsFee/utils/utilsESDT.go | 9 +- 17 files changed, 331 insertions(+), 77 deletions(-) diff --git a/integrationTests/multiShard/relayedTx/common.go b/integrationTests/multiShard/relayedTx/common.go index 8ae6111fa58..f875dbb6f8b 100644 --- a/integrationTests/multiShard/relayedTx/common.go +++ b/integrationTests/multiShard/relayedTx/common.go @@ -11,7 +11,6 @@ import ( "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/state" - "github.com/multiversx/mx-chain-go/testscommon/txDataBuilder" ) // CreateGeneralSetupForRelayTxTest will create the general setup for relayed transactions @@ -158,21 +157,13 @@ func createRelayedTxV2( userTx *transaction.Transaction, gasLimitForUserTx uint64, ) *transaction.Transaction { - dataBuilder := txDataBuilder.NewBuilder() - txData := dataBuilder. - Func(core.RelayedTransactionV2). - Bytes(userTx.RcvAddr). - Int64(int64(userTx.Nonce)). - Bytes(userTx.Data). - Bytes(userTx.Signature) - tx := &transaction.Transaction{ Nonce: relayer.Nonce, Value: big.NewInt(0).Set(userTx.Value), RcvAddr: userTx.SndAddr, SndAddr: relayer.Address, GasPrice: integrationTests.MinTxGasPrice, - Data: txData.ToBytes(), + Data: integrationTests.PrepareRelayedTxDataV2(userTx), ChainID: userTx.ChainID, Version: userTx.Version, } diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index b2f0f45ab71..05c0e919524 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -61,6 +61,7 @@ import ( testStorage "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" statusHandlerMock "github.com/multiversx/mx-chain-go/testscommon/statusHandler" + "github.com/multiversx/mx-chain-go/testscommon/txDataBuilder" "github.com/multiversx/mx-chain-go/trie" "github.com/multiversx/mx-chain-go/trie/hashesHolder" "github.com/multiversx/mx-chain-go/vm" @@ -2539,3 +2540,22 @@ func SaveDelegationContractsList(nodes []*TestProcessorNode) { _, _ = n.AccntState.Commit() } } + +// PrepareRelayedTxDataV1 repares the data for a relayed transaction V1 +func PrepareRelayedTxDataV1(innerTx *transaction.Transaction) []byte { + userTxBytes, _ := TestMarshalizer.Marshal(innerTx) + return []byte(core.RelayedTransaction + "@" + hex.EncodeToString(userTxBytes)) +} + +// PrepareRelayedTxDataV2 prepares the data for a relayed transaction V2 +func PrepareRelayedTxDataV2(innerTx *transaction.Transaction) []byte { + dataBuilder := txDataBuilder.NewBuilder() + txData := dataBuilder. + Func(core.RelayedTransactionV2). + Bytes(innerTx.RcvAddr). + Int64(int64(innerTx.Nonce)). + Bytes(innerTx.Data). + Bytes(innerTx.Signature) + + return txData.ToBytes() +} diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index fa4c360b947..8dc5f924bf6 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -16,15 +16,17 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/guardians" + "github.com/multiversx/mx-chain-core-go/data/smartContractResult" "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/common/forking" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/guardian" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon" - "github.com/multiversx/mx-chain-go/testscommon/integrationtests" + testscommonIntegrationTests "github.com/multiversx/mx-chain-go/testscommon/integrationtests" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -42,8 +44,8 @@ var ( alice = []byte("alice-12345678901234567890123456") bob = []byte("bob-1234567890123456789012345678") charlie = []byte("charlie-123456789012345678901234") - delta = []byte("delta-12345678901234567890123456") - allAddresses = [][]byte{alice, bob, charlie, delta} + david = []byte("david-12345678901234567890123456") + allAddresses = [][]byte{alice, bob, charlie, david} uuid = []byte("uuid") transferValue = big.NewInt(2000000) initialMint = big.NewInt(1000000000000000000) @@ -71,7 +73,7 @@ func createUnGuardedAccountStatus() guardAccountStatus { func prepareTestContextForGuardedAccounts(tb testing.TB) *vm.VMTestContext { unreachableEpoch := uint32(999999) - db := integrationtests.CreateStorer(tb.TempDir()) + db := testscommonIntegrationTests.CreateStorer(tb.TempDir()) gasScheduleDir := "../../../cmd/node/config/gasSchedules" cfg := config.GasScheduleByEpochs{ @@ -422,7 +424,7 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() - // alice is the user, bob is the guardian, charlie is the receiver, delta is the wrong guardian + // alice is the user, bob is the guardian, charlie is the receiver, david is the wrong guardian mintAddress(t, testContext, alice, initialMint) expectedStatus := createUnGuardedAccountStatus() @@ -511,8 +513,8 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { require.Nil(t, err) require.Equal(t, big.NewInt(transferValue.Int64()*4), getBalance(testContext, charlie)) - // userAddress can not send funds while protected with a wrong guardian address (delta) - err = transferFundsCoSigned(testContext, alice, transferValue, charlie, delta) + // userAddress can not send funds while protected with a wrong guardian address (david) + err = transferFundsCoSigned(testContext, alice, transferValue, charlie, david) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Contains(t, err.Error(), "mismatch between transaction guardian and configured account guardian") require.Equal(t, big.NewInt(transferValue.Int64()*4), getBalance(testContext, charlie)) @@ -525,13 +527,13 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { } // Scenario 1 description: -// 1. create & mint 4 addresses: alice, bob, charlie and delta +// 1. create & mint 4 addresses: alice, bob, charlie and david // 2. alice sets bob as guardian (test if pending) // 3. alice can not set bob as guardian again (test if pending & same activation epoch) // 3.1 alice can not set bob as guardian again even if one epoch past // 4. alice activates the guardian (test if active) // 5. alice sets charlie as pending guardian (test if pending & different activation epoch) -// 5.1. alice wants to set delta as pending guardian (transaction is not executable, will not be included in a miniblock) +// 5.1. alice wants to set david as pending guardian (transaction is not executable, will not be included in a miniblock) // 6. alice sets charlie as guardian immediately through a cosigned transaction (test active & pending guardians) // 7. alice immediately sets bob as guardian through a cosigned transaction (test active & pending guardians) // 8. alice adds charlie as a pending guardian (test if pending & different activation epoch) @@ -641,10 +643,10 @@ func TestGuardAccount_Scenario1(t *testing.T) { } testGuardianStatus(t, testContext, alice, expectedStatus) - // step 5.1 - alice tries to set delta as pending guardian, overwriting charlie + // step 5.1 - alice tries to set david as pending guardian, overwriting charlie currentEpoch++ setNewEpochOnContext(testContext, currentEpoch) - returnCode, err = setGuardian(testContext, alice, delta, uuid) + returnCode, err = setGuardian(testContext, alice, david, uuid) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) require.Equal(t, vmcommon.UserError, returnCode) expectedStatus = guardAccountStatus{ @@ -795,7 +797,7 @@ func TestGuardAccount_Scenario1(t *testing.T) { testGuardianStatus(t, testContext, alice, expectedStatus) // 13. alice sends a guarded transaction, while account is guarded -> should work - err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) + err = transferFundsCoSigned(testContext, alice, transferValue, david, charlie) require.Nil(t, err) // 14. alice un-guards the accounts immediately using a cosigned transaction and then sends a guarded transaction -> should error @@ -812,9 +814,250 @@ func TestGuardAccount_Scenario1(t *testing.T) { pending: nil, } testGuardianStatus(t, testContext, alice, expectedStatus) - err = transferFundsCoSigned(testContext, alice, transferValue, delta, charlie) + err = transferFundsCoSigned(testContext, alice, transferValue, david, charlie) require.ErrorIs(t, err, process.ErrTransactionNotExecutable) // 14.1 alice sends unguarded transaction -> should work - err = transferFunds(testContext, alice, transferValue, delta) + err = transferFunds(testContext, alice, transferValue, david) require.Nil(t, err) } + +// 1. create & mint 4 addresses: alice, bob, charlie and david +// 2. alice sets bob as guardian and the account becomes guarded +// 3. test that charlie can send a relayed transaction v1 on the behalf of alice to david +// 3.1 cosigned transaction should work +// 3.2 single signed transaction should not work +func TestGuardAccounts_RelayedTransactionV1(t *testing.T) { + testContext := prepareTestContextForGuardedAccounts(t) + defer testContext.Close() + + // step 1 - mint addresses + for _, address := range allAddresses { + mintAddress(t, testContext, address, initialMint) + } + expectedStatus := createUnGuardedAccountStatus() + for _, address := range allAddresses { + testGuardianStatus(t, testContext, address, expectedStatus) + } + + currentEpoch := uint32(0) + + // step 2 - alice sets bob as guardian + step2Epoch := currentEpoch + returnCode, err := setGuardian(testContext, alice, bob, uuid) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + currentEpoch += vm.EpochGuardianDelay + setNewEpochOnContext(testContext, currentEpoch) + returnCode, err = guardAccount(testContext, alice) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } + testGuardianStatus(t, testContext, alice, expectedStatus) + + aliceCurrentBalance := getBalance(testContext, alice) + + // step 3 - charlie sends a relayed transaction v1 on the behalf of alice + // 3.1 cosigned transaction should work + userTx := vm.CreateTransaction( + getNonce(testContext, alice), + transferValue, + alice, + david, + gasPrice, + transferGas+guardianSigVerificationGas, + make([]byte, 0)) + + userTx.GuardianAddr = bob + userTx.Options = userTx.Options | transaction.MaskGuardedTransaction + userTx.Version = txWithOptionVersion + + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) + rTxGasLimit := 1 + transferGas + guardianSigVerificationGas + uint64(len(rtxData)) + rtx := vm.CreateTransaction(getNonce(testContext, charlie), big.NewInt(0), charlie, alice, gasPrice, rTxGasLimit, rtxData) + returnCode, err = testContext.TxProcessor.ProcessTransaction(rtx) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + // balance tests: + // alice: aliceCurrentBalance - transferValue (no fee for relayed transaction) + // bob: initialMint + // charlie: initialMint - rtxGasLimit * gasPrice + // david: initialMint + transferValue + aliceExpectedBalance := big.NewInt(0).Sub(aliceCurrentBalance, transferValue) + assert.Equal(t, aliceExpectedBalance, getBalance(testContext, alice)) + bobExpectedBalance := big.NewInt(0).Set(initialMint) + assert.Equal(t, bobExpectedBalance, getBalance(testContext, bob)) + charlieExpectedBalance := big.NewInt(0).Sub(initialMint, big.NewInt(int64(rTxGasLimit*gasPrice))) + assert.Equal(t, charlieExpectedBalance, getBalance(testContext, charlie)) + davidExpectedBalance := big.NewInt(0).Add(initialMint, transferValue) + assert.Equal(t, davidExpectedBalance, getBalance(testContext, david)) + + aliceCurrentBalance = getBalance(testContext, alice) + charlieCurrentBalance := getBalance(testContext, charlie) + davidCurrentBalance := getBalance(testContext, david) + testContext.CleanIntermediateTransactions(t) + + // 3.1 single signed transaction should not work + userTx = vm.CreateTransaction( + getNonce(testContext, alice), + transferValue, + alice, + david, + gasPrice, + transferGas+guardianSigVerificationGas, + make([]byte, 0)) + + userTx.Version = txWithOptionVersion + + rtxData = integrationTests.PrepareRelayedTxDataV1(userTx) + rTxGasLimit = 1 + transferGas + guardianSigVerificationGas + uint64(len(rtxData)) + rtx = vm.CreateTransaction(getNonce(testContext, charlie), big.NewInt(0), charlie, alice, gasPrice, rTxGasLimit, rtxData) + returnCode, err = testContext.TxProcessor.ProcessTransaction(rtx) + require.Nil(t, err) + require.Equal(t, vmcommon.UserError, returnCode) + intermediateTxs := testContext.GetIntermediateTransactions(t) + require.Equal(t, 1, len(intermediateTxs)) + scr := intermediateTxs[0].(*smartContractResult.SmartContractResult) + // expectedReturnMessage is hardcoded for backwards compatibility reasons + expectedReturnMessage := "transaction is not executable and gas will not be consumed, not allowed to bypass guardian" + require.Equal(t, expectedReturnMessage, string(scr.ReturnMessage)) + // balance tests: + // alice: aliceCurrentBalance (no fee for the failed relayed transaction) + // bob: initialMint + // charlie: charlieCurrentBalance - rtxGasLimit * gasPrice + // david: davidCurrentBalance + assert.Equal(t, aliceCurrentBalance, getBalance(testContext, alice)) + bobExpectedBalance = big.NewInt(0).Set(initialMint) + assert.Equal(t, bobExpectedBalance, getBalance(testContext, bob)) + charlieExpectedBalance = big.NewInt(0).Sub(charlieCurrentBalance, big.NewInt(int64(rTxGasLimit*gasPrice))) + assert.Equal(t, charlieExpectedBalance, getBalance(testContext, charlie)) + assert.Equal(t, davidCurrentBalance, getBalance(testContext, david)) +} + +// 1. create & mint 4 addresses: alice, bob, charlie and david +// 2. alice sets bob as guardian and the account becomes guarded +// 3. test that charlie can not send a relayed transaction v2 on the behalf of alice to david +// 3.1 cosigned transaction should not work +// 3.2 single signed transaction should not work +func TestGuardAccounts_RelayedTransactionV2(t *testing.T) { + testContext := prepareTestContextForGuardedAccounts(t) + defer testContext.Close() + + // step 1 - mint addresses + for _, address := range allAddresses { + mintAddress(t, testContext, address, initialMint) + } + expectedStatus := createUnGuardedAccountStatus() + for _, address := range allAddresses { + testGuardianStatus(t, testContext, address, expectedStatus) + } + + currentEpoch := uint32(0) + + // step 2 - alice sets bob as guardian + step2Epoch := currentEpoch + returnCode, err := setGuardian(testContext, alice, bob, uuid) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + currentEpoch += vm.EpochGuardianDelay + setNewEpochOnContext(testContext, currentEpoch) + returnCode, err = guardAccount(testContext, alice) + require.Nil(t, err) + require.Equal(t, vmcommon.Ok, returnCode) + expectedStatus = guardAccountStatus{ + isGuarded: true, + active: &guardianInfo{ + address: bob, + uuid: uuid, + epoch: step2Epoch + vm.EpochGuardianDelay, + }, + pending: nil, + } + testGuardianStatus(t, testContext, alice, expectedStatus) + + aliceCurrentBalance := getBalance(testContext, alice) + testContext.CleanIntermediateTransactions(t) + + // step 3 - charlie sends a relayed transaction v1 on the behalf of alice + // 3.1 cosigned transaction should work + userTx := vm.CreateTransaction( + getNonce(testContext, alice), + transferValue, + alice, + david, + gasPrice, + transferGas+guardianSigVerificationGas, + make([]byte, 0)) + + userTx.GuardianAddr = bob + userTx.Options = userTx.Options | transaction.MaskGuardedTransaction + userTx.Version = txWithOptionVersion + + rtxData := integrationTests.PrepareRelayedTxDataV2(userTx) + rTxGasLimit := 1 + transferGas + guardianSigVerificationGas + uint64(len(rtxData)) + rtx := vm.CreateTransaction(getNonce(testContext, charlie), big.NewInt(0), charlie, alice, gasPrice, rTxGasLimit, rtxData) + returnCode, err = testContext.TxProcessor.ProcessTransaction(rtx) + require.Nil(t, err) + require.Equal(t, vmcommon.UserError, returnCode) + intermediateTxs := testContext.GetIntermediateTransactions(t) + require.Equal(t, 1, len(intermediateTxs)) + scr := intermediateTxs[0].(*smartContractResult.SmartContractResult) + // expectedReturnMessage is hardcoded for backwards compatibility reasons + expectedReturnMessage := "transaction is not executable and gas will not be consumed, not allowed to bypass guardian" + require.Equal(t, expectedReturnMessage, string(scr.ReturnMessage)) + // balance tests: + // alice: aliceCurrentBalance (no fee for relayed transaction V2) + // bob: initialMint + // charlie: initialMint - rtxGasLimit * gasPrice + // david: initialMint + assert.Equal(t, aliceCurrentBalance, getBalance(testContext, alice)) + bobExpectedBalance := big.NewInt(0).Set(initialMint) + assert.Equal(t, bobExpectedBalance, getBalance(testContext, bob)) + charlieExpectedBalance := big.NewInt(0).Sub(initialMint, big.NewInt(int64(rTxGasLimit*gasPrice))) + assert.Equal(t, charlieExpectedBalance, getBalance(testContext, charlie)) + assert.Equal(t, initialMint, getBalance(testContext, david)) + + charlieCurrentBalance := getBalance(testContext, charlie) + testContext.CleanIntermediateTransactions(t) + + // 3.1 single signed transaction should not work + userTx = vm.CreateTransaction( + getNonce(testContext, alice), + transferValue, + alice, + david, + gasPrice, + transferGas+guardianSigVerificationGas, + make([]byte, 0)) + + userTx.Version = txWithOptionVersion + + rtxData = integrationTests.PrepareRelayedTxDataV2(userTx) + rTxGasLimit = 1 + transferGas + guardianSigVerificationGas + uint64(len(rtxData)) + rtx = vm.CreateTransaction(getNonce(testContext, charlie), big.NewInt(0), charlie, alice, gasPrice, rTxGasLimit, rtxData) + returnCode, err = testContext.TxProcessor.ProcessTransaction(rtx) + require.Nil(t, err) + require.Equal(t, vmcommon.UserError, returnCode) + intermediateTxs = testContext.GetIntermediateTransactions(t) + require.Equal(t, 1, len(intermediateTxs)) + scr = intermediateTxs[0].(*smartContractResult.SmartContractResult) + require.Equal(t, expectedReturnMessage, string(scr.ReturnMessage)) + // balance tests: + // alice: aliceCurrentBalance (no fee for the failed relayed transaction) + // bob: initialMint + // charlie: charlieCurrentBalance - rtxGasLimit * gasPrice + // david: davidCurrentBalance + assert.Equal(t, aliceCurrentBalance, getBalance(testContext, alice)) + bobExpectedBalance = big.NewInt(0).Set(initialMint) + assert.Equal(t, bobExpectedBalance, getBalance(testContext, bob)) + charlieExpectedBalance = big.NewInt(0).Sub(charlieCurrentBalance, big.NewInt(int64(rTxGasLimit*gasPrice))) + assert.Equal(t, charlieExpectedBalance, getBalance(testContext, charlie)) + assert.Equal(t, initialMint, getBalance(testContext, david)) +} diff --git a/integrationTests/vm/txsFee/multiShard/relayedBuiltInFunctions_test.go b/integrationTests/vm/txsFee/multiShard/relayedBuiltInFunctions_test.go index 2fdeb14eeb9..56d97f9546b 100644 --- a/integrationTests/vm/txsFee/multiShard/relayedBuiltInFunctions_test.go +++ b/integrationTests/vm/txsFee/multiShard/relayedBuiltInFunctions_test.go @@ -56,7 +56,7 @@ func TestRelayedBuiltInFunctionExecuteOnRelayerAndDstShardShouldWork(t *testing. _, _ = vm.CreateAccount(testContextRelayer.Accounts, relayerAddr, 0, big.NewInt(15000)) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, owner, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/multiShard/relayedMoveBalance_test.go b/integrationTests/vm/txsFee/multiShard/relayedMoveBalance_test.go index bdb65593459..2dd36161143 100644 --- a/integrationTests/vm/txsFee/multiShard/relayedMoveBalance_test.go +++ b/integrationTests/vm/txsFee/multiShard/relayedMoveBalance_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -34,7 +35,7 @@ func TestRelayedMoveBalanceRelayerShard0InnerTxSenderAndReceiverShard1ShouldWork userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, rcvAddr, gasPrice, gasLimit, []byte("aaaa")) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -80,7 +81,7 @@ func TestRelayedMoveBalanceRelayerAndInnerTxSenderShard0ReceiverShard1(t *testin userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, scAddrBytes, gasPrice, gasLimit, nil) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -131,7 +132,7 @@ func TestRelayedMoveBalanceExecuteOnSourceAndDestination(t *testing.T) { userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, scAddrBytes, gasPrice, gasLimit, nil) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -193,7 +194,7 @@ func TestRelayedMoveBalanceExecuteOnSourceAndDestinationRelayerAndInnerTxSenderS userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, rcvAddr, gasPrice, gasLimit, nil) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -253,7 +254,7 @@ func TestRelayedMoveBalanceRelayerAndInnerTxReceiverShard0SenderShard1(t *testin innerTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, rcvAddr, gasPrice, gasLimit, nil) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -329,7 +330,7 @@ func TestMoveBalanceRelayerShard0InnerTxSenderShard1InnerTxReceiverShard2ShouldW innerTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, rcvAddr, gasPrice, gasLimit, nil) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go b/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go index 0a82260631d..82bf9fc370f 100644 --- a/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go +++ b/integrationTests/vm/txsFee/multiShard/relayedScDeploy_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm" @@ -39,7 +40,7 @@ func TestRelayedSCDeployShouldWork(t *testing.T) { scCode := wasm.GetSCCode(contractPath) userTx := vm.CreateTransaction(0, big.NewInt(0), sndAddr, vm.CreateEmptyAddress(), gasPrice, gasLimit, []byte(wasm.CreateDeployTxData(scCode))) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, big.NewInt(0), relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go b/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go index f9849be4720..1c37b9624c3 100644 --- a/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go +++ b/integrationTests/vm/txsFee/multiShard/relayedTxScCalls_test.go @@ -10,6 +10,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -57,7 +58,7 @@ func TestRelayedTxScCallMultiShardShouldWork(t *testing.T) { gasLimit := uint64(500) innerTx := vm.CreateTransaction(0, big.NewInt(0), sndAddr, scAddr, gasPrice, gasLimit, []byte("increment")) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -162,7 +163,7 @@ func TestRelayedTxScCallMultiShardFailOnInnerTxDst(t *testing.T) { gasLimit := uint64(500) innerTx := vm.CreateTransaction(0, big.NewInt(0), sndAddr, scAddr, gasPrice, gasLimit, []byte("incremeno")) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedAsyncCall_test.go b/integrationTests/vm/txsFee/relayedAsyncCall_test.go index 7cf8c80d82c..36b739007a3 100644 --- a/integrationTests/vm/txsFee/relayedAsyncCall_test.go +++ b/integrationTests/vm/txsFee/relayedAsyncCall_test.go @@ -11,6 +11,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -48,7 +49,7 @@ func TestRelayedAsyncCallShouldWork(t *testing.T) { innerTx := vm.CreateTransaction(0, big.NewInt(0), senderAddr, secondSCAddress, gasPrice, gasLimit, []byte("doSomething")) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, senderAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedAsyncESDT_test.go b/integrationTests/vm/txsFee/relayedAsyncESDT_test.go index 15db4d3b331..9ef738063fb 100644 --- a/integrationTests/vm/txsFee/relayedAsyncESDT_test.go +++ b/integrationTests/vm/txsFee/relayedAsyncESDT_test.go @@ -11,6 +11,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -54,7 +55,7 @@ func TestRelayedAsyncESDTCallShouldWork(t *testing.T) { innerTx := utils.CreateESDTTransferTx(0, sndAddr, firstSCAddress, token, big.NewInt(5000), gasPrice, gasLimit) innerTx.Data = []byte(string(innerTx.Data) + "@" + hex.EncodeToString([]byte("transferToSecondContractHalf"))) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -113,7 +114,7 @@ func TestRelayedAsyncESDTCall_InvalidCallFirstContract(t *testing.T) { innerTx := utils.CreateESDTTransferTx(0, sndAddr, firstSCAddress, token, big.NewInt(5000), gasPrice, gasLimit) innerTx.Data = []byte(string(innerTx.Data) + "@" + hex.EncodeToString([]byte("transferToSecondContractRejected"))) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -172,7 +173,7 @@ func TestRelayedAsyncESDTCall_InvalidOutOfGas(t *testing.T) { innerTx := utils.CreateESDTTransferTx(0, sndAddr, firstSCAddress, token, big.NewInt(5000), gasPrice, gasLimit) innerTx.Data = []byte(string(innerTx.Data) + "@" + hex.EncodeToString([]byte("transferToSecondContractHalf"))) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go b/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go index 72d972b07ff..b4be8665953 100644 --- a/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go +++ b/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go @@ -42,7 +42,7 @@ func TestRelayedBuildInFunctionChangeOwnerCallShouldWork(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(30000)) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, owner, gasPrice, rTxGasLimit, rtxData) @@ -89,7 +89,7 @@ func TestRelayedBuildInFunctionChangeOwnerCallWrongOwnerShouldConsumeGas(t *test _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(30000)) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, owner, gasPrice, rTxGasLimit, rtxData) @@ -135,7 +135,7 @@ func TestRelayedBuildInFunctionChangeOwnerInvalidAddressShouldConsumeGas(t *test _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(30000)) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, owner, gasPrice, rTxGasLimit, rtxData) @@ -180,7 +180,7 @@ func TestRelayedBuildInFunctionChangeOwnerCallInsufficientGasLimitShouldConsumeG _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(30000)) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, owner, gasPrice, rTxGasLimit, rtxData) @@ -225,7 +225,7 @@ func TestRelayedBuildInFunctionChangeOwnerCallOutOfGasShouldConsumeGas(t *testin _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(30000)) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, owner, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedDns_test.go b/integrationTests/vm/txsFee/relayedDns_test.go index 31867df3330..6f440a2bc41 100644 --- a/integrationTests/vm/txsFee/relayedDns_test.go +++ b/integrationTests/vm/txsFee/relayedDns_test.go @@ -11,6 +11,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -40,7 +41,7 @@ func TestRelayedTxDnsTransaction_ShouldWork(t *testing.T) { // create user name for sender innerTx := vm.CreateTransaction(0, big.NewInt(0), sndAddr, scAddress, gasPrice, gasLimit, txData) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -62,7 +63,7 @@ func TestRelayedTxDnsTransaction_ShouldWork(t *testing.T) { // create user name for receiver innerTx = vm.CreateTransaction(0, big.NewInt(0), rcvAddr, scAddress, gasPrice, gasLimit, txData) - rtxData = utils.PrepareRelayerTxData(innerTx) + rtxData = integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit = 1 + gasLimit + uint64(len(rtxData)) rtx = vm.CreateTransaction(1, innerTx.Value, relayerAddr, rcvAddr, gasPrice, rTxGasLimit, rtxData) @@ -84,7 +85,7 @@ func TestRelayedTxDnsTransaction_ShouldWork(t *testing.T) { innerTx.SndUserName = sndAddrUserName innerTx.RcvUserName = rcvAddrUserName - rtxData = utils.PrepareRelayerTxData(innerTx) + rtxData = integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit = 1 + gasLimit + uint64(len(rtxData)) rtx = vm.CreateTransaction(2, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedESDT_test.go b/integrationTests/vm/txsFee/relayedESDT_test.go index 80e4b0e0462..3c5ffef15ce 100644 --- a/integrationTests/vm/txsFee/relayedESDT_test.go +++ b/integrationTests/vm/txsFee/relayedESDT_test.go @@ -10,6 +10,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -35,7 +36,7 @@ func TestRelayedESDTTransferShouldWork(t *testing.T) { gasLimit := uint64(40) innerTx := utils.CreateESDTTransferTx(0, sndAddr, rcvAddr, token, big.NewInt(100), gasPrice, gasLimit) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -81,7 +82,7 @@ func TestTestRelayedESTTransferNotEnoughESTValueShouldConsumeGas(t *testing.T) { gasLimit := uint64(40) innerTx := utils.CreateESDTTransferTx(0, sndAddr, rcvAddr, token, big.NewInt(100000001), gasPrice, gasLimit) - rtxData := utils.PrepareRelayerTxData(innerTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(innerTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, innerTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedMoveBalance_test.go b/integrationTests/vm/txsFee/relayedMoveBalance_test.go index e0e52bc1e4b..9790a4f7aef 100644 --- a/integrationTests/vm/txsFee/relayedMoveBalance_test.go +++ b/integrationTests/vm/txsFee/relayedMoveBalance_test.go @@ -5,8 +5,8 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" - "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" "github.com/multiversx/mx-chain-go/process" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/require" @@ -32,7 +32,7 @@ func TestRelayedMoveBalanceShouldWork(t *testing.T) { // gas consumed = 50 userTx := vm.CreateTransaction(senderNonce, big.NewInt(100), sndAddr, rcvAddr, gasPrice, gasLimit, []byte("aaaa")) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -73,7 +73,7 @@ func TestRelayedMoveBalanceInvalidGasLimitShouldConsumeGas(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(3000)) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 2 + userTx.GasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, 1, rTxGasLimit, rtxData) @@ -105,7 +105,7 @@ func TestRelayedMoveBalanceInvalidUserTxShouldConsumeGas(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(3000)) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + userTx.GasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, 1, rTxGasLimit, rtxData) @@ -137,7 +137,7 @@ func TestRelayedMoveBalanceInvalidUserTxValueShouldConsumeGas(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, big.NewInt(3000)) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + userTx.GasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, big.NewInt(100), relayerAddr, sndAddr, 1, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedScCalls_test.go b/integrationTests/vm/txsFee/relayedScCalls_test.go index 24b1ca74787..5108a313f44 100644 --- a/integrationTests/vm/txsFee/relayedScCalls_test.go +++ b/integrationTests/vm/txsFee/relayedScCalls_test.go @@ -11,6 +11,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -35,7 +36,7 @@ func TestRelayedScCallShouldWork(t *testing.T) { userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, scAddress, gasPrice, gasLimit, []byte("increment")) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -78,7 +79,7 @@ func TestRelayedScCallContractNotFoundShouldConsumeGas(t *testing.T) { userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, scAddrBytes, gasPrice, gasLimit, []byte("increment")) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -118,7 +119,7 @@ func TestRelayedScCallInvalidMethodShouldConsumeGas(t *testing.T) { userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, scAddress, gasPrice, gasLimit, []byte("invalidMethod")) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -158,7 +159,7 @@ func TestRelayedScCallInsufficientGasLimitShouldConsumeGas(t *testing.T) { userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, scAddress, gasPrice, gasLimit, []byte("increment")) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -197,7 +198,7 @@ func TestRelayedScCallOutOfGasShouldConsumeGas(t *testing.T) { userTx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, scAddress, gasPrice, gasLimit, []byte("increment")) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, userTx.Value, relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/relayedScDeploy_test.go b/integrationTests/vm/txsFee/relayedScDeploy_test.go index d56071d61ec..d1eac0ce8d0 100644 --- a/integrationTests/vm/txsFee/relayedScDeploy_test.go +++ b/integrationTests/vm/txsFee/relayedScDeploy_test.go @@ -10,8 +10,8 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" - "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/require" @@ -36,7 +36,7 @@ func TestRelayedScDeployShouldWork(t *testing.T) { scCode := wasm.GetSCCode("../wasm/testdata/misc/fib_wasm/output/fib_wasm.wasm") userTx := vm.CreateTransaction(senderNonce, big.NewInt(0), sndAddr, vm.CreateEmptyAddress(), gasPrice, gasLimit, []byte(wasm.CreateDeployTxData(scCode))) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, big.NewInt(0), relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -79,7 +79,7 @@ func TestRelayedScDeployInvalidCodeShouldConsumeGas(t *testing.T) { scCodeBytes = append(scCodeBytes, []byte("aaaaa")...) userTx := vm.CreateTransaction(senderNonce, big.NewInt(0), sndAddr, vm.CreateEmptyAddress(), gasPrice, gasLimit, scCodeBytes) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, big.NewInt(0), relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -119,7 +119,7 @@ func TestRelayedScDeployInsufficientGasLimitShouldConsumeGas(t *testing.T) { scCode := wasm.GetSCCode("../wasm/testdata/misc/fib_wasm/output/fib_wasm.wasm") userTx := vm.CreateTransaction(senderNonce, big.NewInt(0), sndAddr, vm.CreateEmptyAddress(), gasPrice, gasLimit, []byte(wasm.CreateDeployTxData(scCode))) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, big.NewInt(0), relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) @@ -159,7 +159,7 @@ func TestRelayedScDeployOutOfGasShouldConsumeGas(t *testing.T) { scCode := wasm.GetSCCode("../wasm/testdata/misc/fib_wasm/output/fib_wasm.wasm") userTx := vm.CreateTransaction(senderNonce, big.NewInt(0), sndAddr, vm.CreateEmptyAddress(), gasPrice, gasLimit, []byte(wasm.CreateDeployTxData(scCode))) - rtxData := utils.PrepareRelayerTxData(userTx) + rtxData := integrationTests.PrepareRelayedTxDataV1(userTx) rTxGasLimit := 1 + gasLimit + uint64(len(rtxData)) rtx := vm.CreateTransaction(0, big.NewInt(0), relayerAddr, sndAddr, gasPrice, rTxGasLimit, rtxData) diff --git a/integrationTests/vm/txsFee/utils/utils.go b/integrationTests/vm/txsFee/utils/utils.go index 02a8ff7c435..0610cb91557 100644 --- a/integrationTests/vm/txsFee/utils/utils.go +++ b/integrationTests/vm/txsFee/utils/utils.go @@ -11,13 +11,11 @@ import ( "strings" "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/scheduled" "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/hashing/keccak" - "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/integrationTests/mock" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/wasm" @@ -31,8 +29,7 @@ import ( ) var ( - protoMarshalizer = &marshal.GogoProtoMarshalizer{} - log = logger.GetOrCreate("integrationTests/vm/txFee/utils") + log = logger.GetOrCreate("integrationTests/vm/txFee/utils") ) // DoDeploy - @@ -255,12 +252,6 @@ func DoDeployDNS(t *testing.T, testContext *vm.VMTestContext, pathToContract str return scAddr, owner } -// PrepareRelayerTxData - -func PrepareRelayerTxData(innerTx *transaction.Transaction) []byte { - userTxBytes, _ := protoMarshalizer.Marshal(innerTx) - return []byte(core.RelayedTransaction + "@" + hex.EncodeToString(userTxBytes)) -} - // CheckOwnerAddr - func CheckOwnerAddr(t *testing.T, testContext *vm.VMTestContext, scAddr []byte, owner []byte) { acc, err := testContext.Accounts.GetExistingAccount(scAddr) diff --git a/integrationTests/vm/txsFee/utils/utilsESDT.go b/integrationTests/vm/txsFee/utils/utilsESDT.go index 96c2c56e24e..dbc2a6665e1 100644 --- a/integrationTests/vm/txsFee/utils/utilsESDT.go +++ b/integrationTests/vm/txsFee/utils/utilsESDT.go @@ -10,6 +10,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/esdt" "github.com/multiversx/mx-chain-core-go/data/transaction" + "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon/txDataBuilder" @@ -46,7 +47,7 @@ func CreateAccountWithESDTBalance( } } - esdtDataBytes, err := protoMarshalizer.Marshal(esdtData) + esdtDataBytes, err := integrationTests.TestMarshalizer.Marshal(esdtData) require.Nil(t, err) key := append([]byte(core.ProtectedKeyPrefix), []byte(core.ESDTKeyIdentifier)...) @@ -95,7 +96,7 @@ func CreateAccountWithNFT( }, } - esdtDataBytes, err := protoMarshalizer.Marshal(esdtData) + esdtDataBytes, err := integrationTests.TestMarshalizer.Marshal(esdtData) require.Nil(t, err) key := append([]byte(core.ProtectedKeyPrefix), []byte(core.ESDTKeyIdentifier)...) @@ -120,7 +121,7 @@ func saveNewTokenOnSystemAccount(t *testing.T, accnts state.AccountsAdapter, tok esdtDataOnSystemAcc.Reserved = []byte{1} esdtDataOnSystemAcc.Value.Set(esdtData.Value) - esdtDataBytes, err := protoMarshalizer.Marshal(esdtData) + esdtDataBytes, err := integrationTests.TestMarshalizer.Marshal(esdtData) require.Nil(t, err) sysAccount, err := accnts.LoadAccount(core.SystemAccountAddress) @@ -179,7 +180,7 @@ func SetESDTRoles( Roles: roles, } - rolesDataBytes, err := protoMarshalizer.Marshal(rolesData) + rolesDataBytes, err := integrationTests.TestMarshalizer.Marshal(rolesData) require.Nil(t, err) err = userAccount.SaveKeyValue(key, rolesDataBytes) From cb7d9d12d9084c48deb3efc3dbb8eeba54cb8a86 Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Feb 2023 12:24:29 +0200 Subject: [PATCH 173/335] - cleanup redundant gasPrice definition --- integrationTests/vm/txsFee/asyncCall_test.go | 2 -- integrationTests/vm/txsFee/asyncESDT_test.go | 7 ------- .../vm/txsFee/backwardsCompatibility_test.go | 3 --- .../vm/txsFee/builtInFunctions_test.go | 7 ------- integrationTests/vm/txsFee/dns_test.go | 1 - integrationTests/vm/txsFee/esdtLocalBurn_test.go | 3 --- integrationTests/vm/txsFee/esdtLocalMint_test.go | 2 -- integrationTests/vm/txsFee/esdt_test.go | 3 --- integrationTests/vm/txsFee/moveBalance_test.go | 16 ++++++---------- .../vm/txsFee/multiESDTTransfer_test.go | 2 -- .../vm/txsFee/relayedAsyncCall_test.go | 1 - .../vm/txsFee/relayedAsyncESDT_test.go | 3 --- .../vm/txsFee/relayedBuiltInFunctions_test.go | 5 ----- integrationTests/vm/txsFee/relayedDns_test.go | 1 - integrationTests/vm/txsFee/relayedESDT_test.go | 2 -- .../vm/txsFee/relayedMoveBalance_test.go | 1 - .../vm/txsFee/relayedScCalls_test.go | 5 ----- .../vm/txsFee/relayedScDeploy_test.go | 4 ---- integrationTests/vm/txsFee/scCalls_test.go | 11 ----------- integrationTests/vm/txsFee/scDeploy_test.go | 4 ---- .../vm/txsFee/txCostEstimator_test.go | 3 --- integrationTests/vm/txsFee/validatorSC_test.go | 9 ++------- 22 files changed, 8 insertions(+), 87 deletions(-) diff --git a/integrationTests/vm/txsFee/asyncCall_test.go b/integrationTests/vm/txsFee/asyncCall_test.go index d7afad10ad0..72221845738 100644 --- a/integrationTests/vm/txsFee/asyncCall_test.go +++ b/integrationTests/vm/txsFee/asyncCall_test.go @@ -34,7 +34,6 @@ func TestAsyncCallShouldWork(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) _, _ = vm.CreateAccount(testContext.Accounts, senderAddr, 0, egldBalance) - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) @@ -93,7 +92,6 @@ func TestMinterContractWithAsyncCalls(t *testing.T) { token := []byte("miiutoken") roles := [][]byte{[]byte(core.ESDTRoleNFTCreate)} - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(500000) pathToContract := "testdata/minter/minter.wasm" diff --git a/integrationTests/vm/txsFee/asyncESDT_test.go b/integrationTests/vm/txsFee/asyncESDT_test.go index 28415adc9e5..7ab646f1fa8 100644 --- a/integrationTests/vm/txsFee/asyncESDT_test.go +++ b/integrationTests/vm/txsFee/asyncESDT_test.go @@ -36,7 +36,6 @@ func TestAsyncESDTCallShouldWork(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) // deploy 2 contracts - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) @@ -89,7 +88,6 @@ func TestAsyncESDTCallSecondScRefusesPayment(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) // deploy 2 contracts - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) @@ -143,7 +141,6 @@ func TestAsyncESDTCallsOutOfGas(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) // deploy 2 contracts - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) @@ -193,7 +190,6 @@ func TestAsyncMultiTransferOnCallback(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, ownerAddr, big.NewInt(1000000000), sftTokenID, sftNonce, sftBalance) utils.CheckESDTNFTBalance(t, testContext, ownerAddr, sftTokenID, sftNonce, sftBalance) - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(1000000) txGasLimit := uint64(1000000) @@ -287,7 +283,6 @@ func TestAsyncMultiTransferOnCallAndOnCallback(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, ownerAddr, big.NewInt(1000000000), sftTokenID, sftNonce, sftBalance) utils.CheckESDTNFTBalance(t, testContext, ownerAddr, sftTokenID, sftNonce, sftBalance) - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(1000000) txGasLimit := uint64(1000000) @@ -387,7 +382,6 @@ func TestSendNFTToContractWith0Function(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, ownerAddr, big.NewInt(1000000000), sftTokenID, sftNonce, sftBalance) utils.CheckESDTNFTBalance(t, testContext, ownerAddr, sftTokenID, sftNonce, sftBalance) - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(1000000) txGasLimit := uint64(1000000) @@ -437,7 +431,6 @@ func TestSendNFTToContractWith0FunctionNonPayable(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, ownerAddr, big.NewInt(1000000000), sftTokenID, sftNonce, sftBalance) utils.CheckESDTNFTBalance(t, testContext, ownerAddr, sftTokenID, sftNonce, sftBalance) - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(1000000) txGasLimit := uint64(1000000) diff --git a/integrationTests/vm/txsFee/backwardsCompatibility_test.go b/integrationTests/vm/txsFee/backwardsCompatibility_test.go index abc67b92d16..b4a73596edb 100644 --- a/integrationTests/vm/txsFee/backwardsCompatibility_test.go +++ b/integrationTests/vm/txsFee/backwardsCompatibility_test.go @@ -30,7 +30,6 @@ func TestMoveBalanceSelfShouldWorkAndConsumeTxFeeWhenAllFlagsAreDisabled(t *test sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(10000) - gasPrice := uint64(10) gasLimit := uint64(100) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -72,7 +71,6 @@ func TestMoveBalanceAllFlagsDisabledLessBalanceThanGasLimitMulGasPrice(t *testin sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(10000) - gasPrice := uint64(10) gasLimit := uint64(10000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -97,7 +95,6 @@ func TestMoveBalanceSelfShouldWorkAndConsumeTxFeeWhenSomeFlagsAreDisabled(t *tes sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(10000) - gasPrice := uint64(10) gasLimit := uint64(100) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) diff --git a/integrationTests/vm/txsFee/builtInFunctions_test.go b/integrationTests/vm/txsFee/builtInFunctions_test.go index 0367decab5c..c321a85df89 100644 --- a/integrationTests/vm/txsFee/builtInFunctions_test.go +++ b/integrationTests/vm/txsFee/builtInFunctions_test.go @@ -36,7 +36,6 @@ func TestBuildInFunctionChangeOwnerCallShouldWork(t *testing.T) { utils.CleanAccumulatedIntermediateTransactions(t, testContext) newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) @@ -72,7 +71,6 @@ func TestBuildInFunctionChangeOwnerCallWrongOwnerShouldConsumeGas(t *testing.T) sndAddr := []byte("12345678901234567890123456789113") newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, big.NewInt(100000)) @@ -109,7 +107,6 @@ func TestBuildInFunctionChangeOwnerInvalidAddressShouldConsumeGas(t *testing.T) testContext.TxFeeHandler.CreateBlockStarted(getZeroGasAndFees()) newOwner := []byte("invalidAddress") - gasPrice := uint64(10) gasLimit := uint64(1000) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) @@ -143,7 +140,6 @@ func TestBuildInFunctionChangeOwnerCallInsufficientGasLimitShouldNotConsumeGas(t testContext.TxFeeHandler.CreateBlockStarted(getZeroGasAndFees()) newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) _, _ = vm.CreateAccount(testContext.Accounts, owner, 1, big.NewInt(10970)) @@ -181,7 +177,6 @@ func TestBuildInFunctionChangeOwnerOutOfGasShouldConsumeGas(t *testing.T) { testContext.TxFeeHandler.CreateBlockStarted(getZeroGasAndFees()) newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) gasLimit := uint64(len(txData) + 1) @@ -226,7 +221,6 @@ func TestBuildInFunctionSaveKeyValue_WrongDestination(t *testing.T) { txData := []byte(core.BuiltInFunctionSaveKeyValue + "@01@02") gasLimit := uint64(len(txData) + 1) - gasPrice := uint64(10) tx := vm.CreateTransaction(0, big.NewInt(0), sndAddr, destAddr, gasPrice, gasLimit, txData) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) @@ -259,7 +253,6 @@ func TestBuildInFunctionSaveKeyValue_NotEnoughGasFor3rdSave(t *testing.T) { txData := []byte(core.BuiltInFunctionSaveKeyValue + "@01000000@02000000@03000000@04000000@05000000@06000000") gasLimit := uint64(len(txData) + 20) - gasPrice := uint64(10) tx := vm.CreateTransaction(0, big.NewInt(0), sndAddr, sndAddr, gasPrice, gasLimit, txData) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) diff --git a/integrationTests/vm/txsFee/dns_test.go b/integrationTests/vm/txsFee/dns_test.go index 3d8edc6c63a..1d4a439a692 100644 --- a/integrationTests/vm/txsFee/dns_test.go +++ b/integrationTests/vm/txsFee/dns_test.go @@ -30,7 +30,6 @@ func TestDeployDNSContract_TestRegisterAndResolveAndSendTxWithSndAndRcvUserName( sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(10000000) - gasPrice := uint64(10) gasLimit := uint64(200000) rcvAddr := []byte("12345678901234567890123456789113") diff --git a/integrationTests/vm/txsFee/esdtLocalBurn_test.go b/integrationTests/vm/txsFee/esdtLocalBurn_test.go index 636e9b7c7f0..c76957928a5 100644 --- a/integrationTests/vm/txsFee/esdtLocalBurn_test.go +++ b/integrationTests/vm/txsFee/esdtLocalBurn_test.go @@ -26,7 +26,6 @@ func TestESDTLocalBurnShouldWork(t *testing.T) { roles := [][]byte{[]byte(core.ESDTRoleLocalMint), []byte(core.ESDTRoleLocalBurn)} utils.CreateAccountWithESDTBalanceAndRoles(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance, roles) - gasPrice := uint64(10) gasLimit := uint64(40) tx := utils.CreateESDTLocalBurnTx(0, sndAddr, sndAddr, token, big.NewInt(100), gasPrice, gasLimit) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) @@ -57,7 +56,6 @@ func TestESDTLocalBurnMoreThanTotalBalanceShouldErr(t *testing.T) { roles := [][]byte{[]byte(core.ESDTRoleLocalMint), []byte(core.ESDTRoleLocalBurn)} utils.CreateAccountWithESDTBalanceAndRoles(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance, roles) - gasPrice := uint64(10) gasLimit := uint64(60) tx := utils.CreateESDTLocalBurnTx(0, sndAddr, sndAddr, token, big.NewInt(100000001), gasPrice, gasLimit) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) @@ -87,7 +85,6 @@ func TestESDTLocalBurnNotAllowedShouldErr(t *testing.T) { token := []byte("miiutoken") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) - gasPrice := uint64(10) gasLimit := uint64(40) tx := utils.CreateESDTLocalBurnTx(0, sndAddr, sndAddr, token, big.NewInt(100), gasPrice, gasLimit) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) diff --git a/integrationTests/vm/txsFee/esdtLocalMint_test.go b/integrationTests/vm/txsFee/esdtLocalMint_test.go index 440e0d2f7d0..491d9102372 100644 --- a/integrationTests/vm/txsFee/esdtLocalMint_test.go +++ b/integrationTests/vm/txsFee/esdtLocalMint_test.go @@ -26,7 +26,6 @@ func TestESDTLocalMintShouldWork(t *testing.T) { roles := [][]byte{[]byte(core.ESDTRoleLocalMint), []byte(core.ESDTRoleLocalBurn)} utils.CreateAccountWithESDTBalanceAndRoles(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance, roles) - gasPrice := uint64(10) gasLimit := uint64(40) tx := utils.CreateESDTLocalMintTx(0, sndAddr, sndAddr, token, big.NewInt(100), gasPrice, gasLimit) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) @@ -56,7 +55,6 @@ func TestESDTLocalMintNotAllowedShouldErr(t *testing.T) { token := []byte("miiutoken") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) - gasPrice := uint64(10) gasLimit := uint64(40) tx := utils.CreateESDTLocalMintTx(0, sndAddr, sndAddr, token, big.NewInt(100), gasPrice, gasLimit) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) diff --git a/integrationTests/vm/txsFee/esdt_test.go b/integrationTests/vm/txsFee/esdt_test.go index b3196010fc6..da865619d4e 100644 --- a/integrationTests/vm/txsFee/esdt_test.go +++ b/integrationTests/vm/txsFee/esdt_test.go @@ -30,7 +30,6 @@ func TestESDTTransferShouldWork(t *testing.T) { token := []byte("miiutoken") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) - gasPrice := uint64(10) gasLimit := uint64(40) tx := utils.CreateESDTTransferTx(0, sndAddr, rcvAddr, token, big.NewInt(100), gasPrice, gasLimit) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) @@ -67,7 +66,6 @@ func TestESDTTransferShouldWorkToMuchGasShouldConsumeAllGas(t *testing.T) { token := []byte("miiutoken") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) - gasPrice := uint64(10) gasLimit := uint64(1000) tx := utils.CreateESDTTransferTx(0, sndAddr, rcvAddr, token, big.NewInt(100), gasPrice, gasLimit) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) @@ -104,7 +102,6 @@ func TestESDTTransferInvalidESDTValueShouldConsumeGas(t *testing.T) { token := []byte("miiutoken") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) - gasPrice := uint64(10) gasLimit := uint64(1000) tx := utils.CreateESDTTransferTx(0, sndAddr, rcvAddr, token, big.NewInt(100000000+1), gasPrice, gasLimit) diff --git a/integrationTests/vm/txsFee/moveBalance_test.go b/integrationTests/vm/txsFee/moveBalance_test.go index 7e07584dbb4..8a119084cff 100644 --- a/integrationTests/vm/txsFee/moveBalance_test.go +++ b/integrationTests/vm/txsFee/moveBalance_test.go @@ -25,7 +25,6 @@ func TestMoveBalanceSelfShouldWorkAndConsumeTxFee(t *testing.T) { sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(10000) - gasPrice := uint64(10) gasLimit := uint64(100) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -61,7 +60,6 @@ func TestMoveBalanceAllFlagsEnabledLessBalanceThanGasLimitMulGasPrice(t *testing sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(10000) - gasPrice := uint64(10) gasLimit := uint64(10000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -80,7 +78,6 @@ func TestMoveBalanceShouldWork(t *testing.T) { rcvAddr := []byte("12345678901234567890123456789022") senderNonce := uint64(0) senderBalance := big.NewInt(10000) - gasPrice := uint64(10) gasLimit := uint64(100) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -120,10 +117,10 @@ func TestMoveBalanceInvalidHasGasButNoValueShouldConsumeGas(t *testing.T) { sndAddr := []byte("12345678901234567890123456789012") rcvAddr := []byte("12345678901234567890123456789022") senderBalance := big.NewInt(100) - gasPrice := uint64(1) + gasPriceLocal := uint64(1) gasLimit := uint64(20) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) - tx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, rcvAddr, gasPrice, gasLimit, []byte("aaaa")) + tx := vm.CreateTransaction(0, big.NewInt(100), sndAddr, rcvAddr, gasPriceLocal, gasLimit, []byte("aaaa")) returnCode, err := testContext.TxProcessor.ProcessTransaction(tx) require.Equal(t, process.ErrFailedTransaction, err) @@ -150,11 +147,11 @@ func TestMoveBalanceHigherNonceShouldNotConsumeGas(t *testing.T) { rcvAddr := []byte("12345678901234567890123456789022") senderBalance := big.NewInt(100) - gasPrice := uint64(1) + gasPriceLocal := uint64(1) gasLimit := uint64(20) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) - tx := vm.CreateTransaction(1, big.NewInt(500), sndAddr, rcvAddr, gasPrice, gasLimit, []byte("aaaa")) + tx := vm.CreateTransaction(1, big.NewInt(500), sndAddr, rcvAddr, gasPriceLocal, gasLimit, []byte("aaaa")) _, err = testContext.TxProcessor.ProcessTransaction(tx) require.Equal(t, process.ErrHigherNonceInTransaction, err) @@ -180,11 +177,11 @@ func TestMoveBalanceMoreGasThanGasLimitPerMiniBlockForSafeCrossShard(t *testing. rcvAddr := []byte("12345678901234567890123456789022") senderBalance := big.NewInt(0).SetUint64(math.MaxUint64) - gasPrice := uint64(1) + gasPriceLocal := uint64(1) gasLimit := uint64(math.MaxUint64) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) - tx := vm.CreateTransaction(0, big.NewInt(500), sndAddr, rcvAddr, gasPrice, gasLimit, []byte("aaaa")) + tx := vm.CreateTransaction(0, big.NewInt(500), sndAddr, rcvAddr, gasPriceLocal, gasLimit, []byte("aaaa")) returnCode, err := testContext.TxProcessor.ProcessTransaction(tx) require.Equal(t, process.ErrMoreGasThanGasLimitPerBlock, err) @@ -211,7 +208,6 @@ func TestMoveBalanceInvalidUserNames(t *testing.T) { rcvAddr := []byte("12345678901234567890123456789022") senderNonce := uint64(0) senderBalance := big.NewInt(10000) - gasPrice := uint64(10) gasLimit := uint64(100) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) diff --git a/integrationTests/vm/txsFee/multiESDTTransfer_test.go b/integrationTests/vm/txsFee/multiESDTTransfer_test.go index dd0ffcf788b..8f7978685b8 100644 --- a/integrationTests/vm/txsFee/multiESDTTransfer_test.go +++ b/integrationTests/vm/txsFee/multiESDTTransfer_test.go @@ -29,7 +29,6 @@ func TestMultiESDTTransferShouldWork(t *testing.T) { secondToken := []byte("second") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), secondToken, 0, esdtBalance) - gasPrice := uint64(10) gasLimit := uint64(4000) tx := utils.CreateMultiTransferTX(0, sndAddr, rcvAddr, gasPrice, gasLimit, &utils.TransferESDTData{ Token: token, @@ -87,7 +86,6 @@ func TestMultiESDTTransferFailsBecauseOfMaxLimit(t *testing.T) { secondToken := []byte("second") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), secondToken, 0, esdtBalance) - gasPrice := uint64(10) gasLimit := uint64(4000) tx := utils.CreateMultiTransferTX(0, sndAddr, rcvAddr, gasPrice, gasLimit, &utils.TransferESDTData{ Token: token, diff --git a/integrationTests/vm/txsFee/relayedAsyncCall_test.go b/integrationTests/vm/txsFee/relayedAsyncCall_test.go index 36b739007a3..8de0eaf7948 100644 --- a/integrationTests/vm/txsFee/relayedAsyncCall_test.go +++ b/integrationTests/vm/txsFee/relayedAsyncCall_test.go @@ -31,7 +31,6 @@ func TestRelayedAsyncCallShouldWork(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) - gasPrice := uint64(10) 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 9ef738063fb..3a447d0d361 100644 --- a/integrationTests/vm/txsFee/relayedAsyncESDT_test.go +++ b/integrationTests/vm/txsFee/relayedAsyncESDT_test.go @@ -37,7 +37,6 @@ func TestRelayedAsyncESDTCallShouldWork(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) // deploy 2 contracts - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) @@ -96,7 +95,6 @@ func TestRelayedAsyncESDTCall_InvalidCallFirstContract(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) // deploy 2 contracts - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) @@ -155,7 +153,6 @@ func TestRelayedAsyncESDTCall_InvalidOutOfGas(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, egldBalance) // deploy 2 contracts - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) diff --git a/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go b/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go index b4be8665953..2c56fdd1f04 100644 --- a/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go +++ b/integrationTests/vm/txsFee/relayedBuiltInFunctions_test.go @@ -34,7 +34,6 @@ func TestRelayedBuildInFunctionChangeOwnerCallShouldWork(t *testing.T) { relayerAddr := []byte("12345678901234567890123456789033") newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) @@ -81,7 +80,6 @@ func TestRelayedBuildInFunctionChangeOwnerCallWrongOwnerShouldConsumeGas(t *test relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789113") newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) @@ -127,7 +125,6 @@ func TestRelayedBuildInFunctionChangeOwnerInvalidAddressShouldConsumeGas(t *test relayerAddr := []byte("12345678901234567890123456789033") newOwner := []byte("invalidAddress") - gasPrice := uint64(10) gasLimit := uint64(1000) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) @@ -172,7 +169,6 @@ func TestRelayedBuildInFunctionChangeOwnerCallInsufficientGasLimitShouldConsumeG relayerAddr := []byte("12345678901234567890123456789033") newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) gasLimit := uint64(len(txData) - 1) @@ -217,7 +213,6 @@ func TestRelayedBuildInFunctionChangeOwnerCallOutOfGasShouldConsumeGas(t *testin relayerAddr := []byte("12345678901234567890123456789033") newOwner := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) txData := []byte(core.BuiltInFunctionChangeOwnerAddress + "@" + hex.EncodeToString(newOwner)) gasLimit := uint64(len(txData) + 1) diff --git a/integrationTests/vm/txsFee/relayedDns_test.go b/integrationTests/vm/txsFee/relayedDns_test.go index 6f440a2bc41..37d1633a53f 100644 --- a/integrationTests/vm/txsFee/relayedDns_test.go +++ b/integrationTests/vm/txsFee/relayedDns_test.go @@ -29,7 +29,6 @@ func TestRelayedTxDnsTransaction_ShouldWork(t *testing.T) { relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789112") rcvAddr := []byte("12345678901234567890123456789110") - gasPrice := uint64(10) gasLimit := uint64(500000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, big.NewInt(0)) diff --git a/integrationTests/vm/txsFee/relayedESDT_test.go b/integrationTests/vm/txsFee/relayedESDT_test.go index 3c5ffef15ce..96b4ad6ce14 100644 --- a/integrationTests/vm/txsFee/relayedESDT_test.go +++ b/integrationTests/vm/txsFee/relayedESDT_test.go @@ -32,7 +32,6 @@ func TestRelayedESDTTransferShouldWork(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, esdtBalance) _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, relayerBalance) - gasPrice := uint64(10) gasLimit := uint64(40) innerTx := utils.CreateESDTTransferTx(0, sndAddr, rcvAddr, token, big.NewInt(100), gasPrice, gasLimit) @@ -78,7 +77,6 @@ func TestTestRelayedESTTransferNotEnoughESTValueShouldConsumeGas(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, big.NewInt(0), token, 0, esdtBalance) _, _ = vm.CreateAccount(testContext.Accounts, relayerAddr, 0, relayerBalance) - gasPrice := uint64(10) gasLimit := uint64(40) innerTx := utils.CreateESDTTransferTx(0, sndAddr, rcvAddr, token, big.NewInt(100000001), gasPrice, gasLimit) diff --git a/integrationTests/vm/txsFee/relayedMoveBalance_test.go b/integrationTests/vm/txsFee/relayedMoveBalance_test.go index 9790a4f7aef..89a447742ca 100644 --- a/integrationTests/vm/txsFee/relayedMoveBalance_test.go +++ b/integrationTests/vm/txsFee/relayedMoveBalance_test.go @@ -23,7 +23,6 @@ func TestRelayedMoveBalanceShouldWork(t *testing.T) { senderNonce := uint64(0) senderBalance := big.NewInt(0) - gasPrice := uint64(10) gasLimit := uint64(100) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) diff --git a/integrationTests/vm/txsFee/relayedScCalls_test.go b/integrationTests/vm/txsFee/relayedScCalls_test.go index 5108a313f44..cb1c9bbfbd9 100644 --- a/integrationTests/vm/txsFee/relayedScCalls_test.go +++ b/integrationTests/vm/txsFee/relayedScCalls_test.go @@ -28,7 +28,6 @@ func TestRelayedScCallShouldWork(t *testing.T) { relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, big.NewInt(0)) @@ -71,7 +70,6 @@ func TestRelayedScCallContractNotFoundShouldConsumeGas(t *testing.T) { relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, big.NewInt(0)) @@ -111,7 +109,6 @@ func TestRelayedScCallInvalidMethodShouldConsumeGas(t *testing.T) { relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, big.NewInt(0)) @@ -151,7 +148,6 @@ func TestRelayedScCallInsufficientGasLimitShouldConsumeGas(t *testing.T) { relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(5) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, big.NewInt(0)) @@ -190,7 +186,6 @@ func TestRelayedScCallOutOfGasShouldConsumeGas(t *testing.T) { relayerAddr := []byte("12345678901234567890123456789033") sndAddr := []byte("12345678901234567890123456789112") - gasPrice := uint64(10) gasLimit := uint64(20) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, big.NewInt(0)) diff --git a/integrationTests/vm/txsFee/relayedScDeploy_test.go b/integrationTests/vm/txsFee/relayedScDeploy_test.go index d1eac0ce8d0..e31ec9c5386 100644 --- a/integrationTests/vm/txsFee/relayedScDeploy_test.go +++ b/integrationTests/vm/txsFee/relayedScDeploy_test.go @@ -27,7 +27,6 @@ func TestRelayedScDeployShouldWork(t *testing.T) { senderNonce := uint64(0) senderBalance := big.NewInt(0) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -68,7 +67,6 @@ func TestRelayedScDeployInvalidCodeShouldConsumeGas(t *testing.T) { senderNonce := uint64(0) senderBalance := big.NewInt(0) - gasPrice := uint64(10) gasLimit := uint64(500) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -110,7 +108,6 @@ func TestRelayedScDeployInsufficientGasLimitShouldConsumeGas(t *testing.T) { senderNonce := uint64(0) senderBalance := big.NewInt(0) - gasPrice := uint64(10) gasLimit := uint64(500) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -150,7 +147,6 @@ func TestRelayedScDeployOutOfGasShouldConsumeGas(t *testing.T) { senderNonce := uint64(0) senderBalance := big.NewInt(0) - gasPrice := uint64(10) gasLimit := uint64(570) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) diff --git a/integrationTests/vm/txsFee/scCalls_test.go b/integrationTests/vm/txsFee/scCalls_test.go index 18e28691225..88c34fa32c2 100644 --- a/integrationTests/vm/txsFee/scCalls_test.go +++ b/integrationTests/vm/txsFee/scCalls_test.go @@ -96,7 +96,6 @@ func TestScCallShouldWork(t *testing.T) { sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -138,7 +137,6 @@ func TestScCallContractNotFoundShouldConsumeGas(t *testing.T) { scAddrBytes, _ := hex.DecodeString(scAddress) sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -169,7 +167,6 @@ func TestScCallInvalidMethodToCallShouldConsumeGas(t *testing.T) { sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -202,7 +199,6 @@ func TestScCallInsufficientGasLimitShouldNotConsumeGas(t *testing.T) { sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(9) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -238,7 +234,6 @@ func TestScCallOutOfGasShouldConsumeGas(t *testing.T) { sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(20) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -274,7 +269,6 @@ func TestScCallAndGasChangeShouldWork(t *testing.T) { sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(10000000) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -313,7 +307,6 @@ func TestESDTScCallAndGasChangeShouldWork(t *testing.T) { owner := []byte("12345678901234567890123456789011") senderBalance := big.NewInt(1000000000) - gasPrice := uint64(10) gasLimit := uint64(2000000) _, _ = vm.CreateAccount(testContext.Accounts, owner, 0, senderBalance) @@ -323,7 +316,6 @@ func TestESDTScCallAndGasChangeShouldWork(t *testing.T) { sndAddr := []byte("12345678901234567890123456789112") senderBalance = big.NewInt(10000000) - gasPrice = uint64(10) gasLimit = uint64(30000) esdtBalance := big.NewInt(100000000) @@ -426,7 +418,6 @@ func TestScCallBuyNFT_OneFailedTxAndOneOkTx(t *testing.T) { sndAddr1 := []byte("12345678901234567890123456789112") sndAddr2 := []byte("12345678901234567890123456789113") senderBalance := big.NewInt(1000000000000000000) - gasPrice := uint64(10) gasLimit := uint64(1000000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr1, 0, senderBalance) @@ -488,7 +479,6 @@ func TestScCallBuyNFT_TwoOkTxs(t *testing.T) { sndAddr1 := []byte("12345678901234567890123456789112") sndAddr2 := []byte("12345678901234567890123456789113") senderBalance := big.NewInt(1000000000000000000) - gasPrice := uint64(10) gasLimit := uint64(1000000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr1, 0, senderBalance) @@ -558,7 +548,6 @@ func TestScCallDistributeStakingRewards_ShouldWork(t *testing.T) { require.Nil(t, err) senderBalance := big.NewInt(1000000000000000000) - gasPrice := uint64(10) gasLimit := uint64(600000000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr1, 0, senderBalance) diff --git a/integrationTests/vm/txsFee/scDeploy_test.go b/integrationTests/vm/txsFee/scDeploy_test.go index 6157314bd4d..2f608b8cf86 100644 --- a/integrationTests/vm/txsFee/scDeploy_test.go +++ b/integrationTests/vm/txsFee/scDeploy_test.go @@ -25,7 +25,6 @@ func TestScDeployShouldWork(t *testing.T) { sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -57,7 +56,6 @@ func TestScDeployInvalidContractCodeShouldConsumeGas(t *testing.T) { sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -90,7 +88,6 @@ func TestScDeployInsufficientGasLimitShouldNotConsumeGas(t *testing.T) { sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(568) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -122,7 +119,6 @@ func TestScDeployOutOfGasShouldConsumeGas(t *testing.T) { sndAddr := []byte("12345678901234567890123456789012") senderNonce := uint64(0) senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(570) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) diff --git a/integrationTests/vm/txsFee/txCostEstimator_test.go b/integrationTests/vm/txsFee/txCostEstimator_test.go index 0157944a8b4..c39f3f9769f 100644 --- a/integrationTests/vm/txsFee/txCostEstimator_test.go +++ b/integrationTests/vm/txsFee/txCostEstimator_test.go @@ -39,7 +39,6 @@ func TestSCCallCostTransactionCost(t *testing.T) { sndAddr := []byte("12345678901234567890123456789112") senderBalance := big.NewInt(100000) - gasPrice := uint64(10) gasLimit := uint64(1000) _, _ = vm.CreateAccount(testContext.Accounts, sndAddr, 0, senderBalance) @@ -86,7 +85,6 @@ func TestAsyncCallsTransactionCost(t *testing.T) { _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) _, _ = vm.CreateAccount(testContext.Accounts, senderAddr, 0, egldBalance) - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(2000) @@ -173,7 +171,6 @@ func TestAsyncESDTTransfer(t *testing.T) { utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) // deploy 2 contracts - gasPrice := uint64(10) ownerAccount, _ := testContext.Accounts.LoadAccount(ownerAddr) deployGasLimit := uint64(50000) diff --git a/integrationTests/vm/txsFee/validatorSC_test.go b/integrationTests/vm/txsFee/validatorSC_test.go index b9e9ffe9adf..d2b4d3426ec 100644 --- a/integrationTests/vm/txsFee/validatorSC_test.go +++ b/integrationTests/vm/txsFee/validatorSC_test.go @@ -58,7 +58,6 @@ func TestValidatorsSC_DoStakePutInQueueUnStakeAndUnBondShouldRefund(t *testing.T testContextMeta.BlockchainHook.(*hooks.BlockChainHookImpl).SetCurrentHeader(&block.MetaBlock{Epoch: 1}) saveDelegationManagerConfig(testContextMeta) - gasPrice := uint64(10) gasLimit := uint64(4000) sndAddr := []byte("12345678901234567890123456789012") tx := vm.CreateTransaction(0, value2500EGLD, sndAddr, vmAddr.ValidatorSCAddress, gasPrice, gasLimit, []byte(validatorStakeData)) @@ -94,8 +93,8 @@ func checkReturnLog(t *testing.T, testContextMeta *vm.VMTestContext, subStr stri } found := false - for _, log := range allLogs { - for _, event := range log.GetLogEvents() { + for _, eventLog := range allLogs { + for _, event := range eventLog.GetLogEvents() { if string(event.GetIdentifier()) == identifierStr { require.True(t, strings.Contains(string(event.GetTopics()[1]), subStr)) found = true @@ -115,7 +114,6 @@ func TestValidatorsSC_DoStakePutInQueueUnStakeAndUnBondTokensShouldRefund(t *tes saveDelegationManagerConfig(testContextMeta) testContextMeta.BlockchainHook.(*hooks.BlockChainHookImpl).SetCurrentHeader(&block.MetaBlock{Epoch: 1}) - gasPrice := uint64(10) gasLimit := uint64(4000) sndAddr := []byte("12345678901234567890123456789012") tx := vm.CreateTransaction(0, value2500EGLD, sndAddr, vmAddr.ValidatorSCAddress, gasPrice, gasLimit, []byte(validatorStakeData)) @@ -158,7 +156,6 @@ func testValidatorsSCDoStakeWithTopUpValueTryToUnStakeTokensAndUnBondTokens(t *t saveDelegationManagerConfig(testContextMeta) testContextMeta.BlockchainHook.(*hooks.BlockChainHookImpl).SetCurrentHeader(&block.MetaBlock{Epoch: 0}) - gasPrice := uint64(10) gasLimit := uint64(4000) sndAddr := []byte("12345678901234567890123456789012") tx := vm.CreateTransaction(0, value2700EGLD, sndAddr, vmAddr.ValidatorSCAddress, gasPrice, gasLimit, []byte(validatorStakeData)) @@ -186,7 +183,6 @@ func TestValidatorsSC_ToStakePutInQueueUnStakeAndUnBondShouldRefundUnBondTokens( saveDelegationManagerConfig(testContextMeta) testContextMeta.BlockchainHook.(*hooks.BlockChainHookImpl).SetCurrentHeader(&block.MetaBlock{Epoch: 1}) - gasPrice := uint64(10) gasLimit := uint64(4000) sndAddr := []byte("12345678901234567890123456789012") tx := vm.CreateTransaction(0, value2700EGLD, sndAddr, vmAddr.ValidatorSCAddress, gasPrice, gasLimit, []byte(validatorStakeData)) @@ -233,7 +229,6 @@ func TestValidatorsSC_ToStakePutInQueueUnStakeNodesAndUnBondNodesShouldRefund(t saveDelegationManagerConfig(testContextMeta) testContextMeta.BlockchainHook.(*hooks.BlockChainHookImpl).SetCurrentHeader(&block.MetaBlock{Epoch: 1}) - gasPrice := uint64(10) gasLimit := uint64(4000) sndAddr := []byte("12345678901234567890123456789012") tx := vm.CreateTransaction(0, value2700EGLD, sndAddr, vmAddr.ValidatorSCAddress, gasPrice, gasLimit, []byte(validatorStakeData)) From fc033322141a2334ca80a20c496f541ecf7cd78e Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Feb 2023 13:00:15 +0200 Subject: [PATCH 174/335] - fixed semi-integration tests --- integrationTests/vm/txsFee/guardAccount_test.go | 1 - integrationTests/vm/txsFee/moveBalance_test.go | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index 8dc5f924bf6..eae375cf11d 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -33,7 +33,6 @@ import ( ) const txWithOptionVersion = 2 -const gasPrice = uint64(10) const guardianSigVerificationGas = uint64(50000) const guardAccountGas = uint64(250000) const unGuardAccountGas = uint64(250000) diff --git a/integrationTests/vm/txsFee/moveBalance_test.go b/integrationTests/vm/txsFee/moveBalance_test.go index 8a119084cff..78646813825 100644 --- a/integrationTests/vm/txsFee/moveBalance_test.go +++ b/integrationTests/vm/txsFee/moveBalance_test.go @@ -16,6 +16,8 @@ import ( "github.com/stretchr/testify/require" ) +const gasPrice = uint64(10) + // minGasPrice = 1, gasPerDataByte = 1, minGasLimit = 1 func TestMoveBalanceSelfShouldWorkAndConsumeTxFee(t *testing.T) { testContext, err := vm.CreatePreparedTxProcessorWithVMs(config.EnableEpochs{}) From bb6624ae041155924f3cc42664eda6af3ddbdd08 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 8 Mar 2023 13:14:19 +0200 Subject: [PATCH 175/335] fix after review --- vm/systemSmartContracts/delegation.go | 9 ++++++--- vm/systemSmartContracts/delegationManager.go | 14 ++++++++------ 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/vm/systemSmartContracts/delegation.go b/vm/systemSmartContracts/delegation.go index 69866adb3f8..75d5b6fbd27 100644 --- a/vm/systemSmartContracts/delegation.go +++ b/vm/systemSmartContracts/delegation.go @@ -34,6 +34,9 @@ const deleteWhitelistForMerge = "deleteWhitelistForMerge" const whitelistedAddress = "whitelistedAddress" const changeOwner = "changeOwner" const withdraw = "withdraw" +const claimRewards = "claimRewards" +const reDelegateRewards = "reDelegateRewards" +const delegate = "delegate" const ( active = uint32(0) @@ -199,7 +202,7 @@ func (d *delegation) Execute(args *vmcommon.ContractCallInput) vmcommon.ReturnCo return d.unBondNodes(args) case "unJailNodes": return d.unJailNodes(args) - case "delegate": + case delegate: return d.delegate(args) case "unDelegate": return d.unDelegate(args) @@ -215,7 +218,7 @@ func (d *delegation) Execute(args *vmcommon.ContractCallInput) vmcommon.ReturnCo return d.modifyTotalDelegationCap(args) case "updateRewards": return d.updateRewards(args) - case "claimRewards": + case claimRewards: return d.claimRewards(args) case "getRewardData": return d.getRewardData(args) @@ -245,7 +248,7 @@ func (d *delegation) Execute(args *vmcommon.ContractCallInput) vmcommon.ReturnCo return d.getContractConfig(args) case "unStakeAtEndOfEpoch": return d.unStakeAtEndOfEpoch(args) - case "reDelegateRewards": + case reDelegateRewards: return d.reDelegateRewards(args) case "reStakeUnStakedNodes": return d.reStakeUnStakedNodes(args) diff --git a/vm/systemSmartContracts/delegationManager.go b/vm/systemSmartContracts/delegationManager.go index fcfea05e9e7..3d7756bb786 100644 --- a/vm/systemSmartContracts/delegationManager.go +++ b/vm/systemSmartContracts/delegationManager.go @@ -145,7 +145,7 @@ func (d *delegationManager) Execute(args *vmcommon.ContractCallInput) vmcommon.R case "mergeValidatorToDelegationWithWhitelist": return d.mergeValidatorToDelegation(args, d.isAddressWhiteListedForMerge) case "claimMulti": - return d.claimMultipleDelegation(args) + return d.claimMulti(args) case "reDelegateMulti": return d.reDelegateMulti(args) } @@ -499,8 +499,8 @@ func (d *delegationManager) getContractConfig(args *vmcommon.ContractCallInput) return vmcommon.Ok } -func (d *delegationManager) claimMultipleDelegation(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - returnCode := d.executeFuncOnListAddresses(args, "claimRewards") +func (d *delegationManager) claimMulti(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { + returnCode := d.executeFuncOnListAddresses(args, claimRewards) if returnCode != vmcommon.Ok { return returnCode } @@ -511,7 +511,7 @@ func (d *delegationManager) claimMultipleDelegation(args *vmcommon.ContractCallI } func (d *delegationManager) reDelegateMulti(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - returnCode := d.executeFuncOnListAddresses(args, "reDelegateRewards") + returnCode := d.executeFuncOnListAddresses(args, reDelegateRewards) if returnCode != vmcommon.Ok { return returnCode } @@ -528,7 +528,7 @@ func getTotalReDelegatedFromLogs(logs []*vmcommon.LogEntry) *big.Int { if len(reDelegateLog.Topics) < 1 { continue } - if !bytes.Equal(reDelegateLog.Identifier, []byte("delegate")) { + if !bytes.Equal(reDelegateLog.Identifier, []byte(delegate)) { continue } valueFromFirstTopic := big.NewInt(0).SetBytes(reDelegateLog.Topics[0]) @@ -558,12 +558,14 @@ func (d *delegationManager) executeFuncOnListAddresses( mapAddresses := make(map[string]struct{}) var vmOutput *vmcommon.VMOutput + var found bool for _, address := range args.Arguments { if len(address) != len(args.CallerAddr) { d.eei.AddReturnMessage(vm.ErrInvalidArgument.Error()) return vmcommon.UserError } - if _, ok := mapAddresses[string(address)]; ok { + _, found = mapAddresses[string(address)] + if found { d.eei.AddReturnMessage("duplicated input") return vmcommon.UserError } From c5bcdc1990f6d08893b430087627f6fe33d46493 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 8 Mar 2023 17:31:16 +0200 Subject: [PATCH 176/335] update deps --- go.mod | 14 +++++++------- go.sum | 31 +++++++++++++++---------------- 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index a1651fcd248..6ee8cb75131 100644 --- a/go.mod +++ b/go.mod @@ -13,16 +13,16 @@ 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.1.33 // todo: update - github.com/multiversx/mx-chain-crypto-go v1.2.5 // todo: update + github.com/multiversx/mx-chain-core-go v1.1.34-0.20230308105332-12c26500c7f7 + github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.3.12 github.com/multiversx/mx-chain-logger-go v1.0.11 - github.com/multiversx/mx-chain-p2p-go v1.0.10 // todo: update + github.com/multiversx/mx-chain-p2p-go v1.0.13-0.20230308113355-ba992b84110b github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.37 // todo: update - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50 // todo: update - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51 // todo: update - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77 // todo: update + github.com/multiversx/mx-chain-vm-common-go v1.3.38-0.20230308110011-f72eec6f1a08 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230308144027-4c00284edde1 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230308152315-a2b207d23ffb + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78-0.20230308152912-b97bcb50de0b 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 6deb791602f..1a37356f52d 100644 --- a/go.sum +++ b/go.sum @@ -37,6 +37,7 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= +filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= @@ -609,29 +610,27 @@ 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.1.31/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.1.33 h1:qk+TlaOhHpu+9VncL3yowjY4KU8uJ0oSdPfU7SgVDnk= -github.com/multiversx/mx-chain-core-go v1.1.33/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -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-core-go v1.1.34-0.20230308105332-12c26500c7f7 h1:dHukjD7Atn5TU1JkXN7+Lgxv7RYwl9IvR2tfGPV3GLM= +github.com/multiversx/mx-chain-core-go v1.1.34-0.20230308105332-12c26500c7f7/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.3.12 h1:b7B8KMrCHM0Ghh4W0s1jXLI5MknEAOo7ZChFAwUUYpY= github.com/multiversx/mx-chain-es-indexer-go v1.3.12/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= 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.10 h1:CYCuI0SP8Pt9K0TcJjUyxK7ByvWi2FXNUihy0iCEVIA= -github.com/multiversx/mx-chain-p2p-go v1.0.10/go.mod h1:j9Ueo2ptCnL7TQvQg6KS/KWAoJEJpjkPgE5ZTaqEAn4= +github.com/multiversx/mx-chain-p2p-go v1.0.13-0.20230308113355-ba992b84110b h1:ewqI4G8a4d/dUz9n/ekdTLac5NYhlvnBy5crR4Bl4Cs= +github.com/multiversx/mx-chain-p2p-go v1.0.13-0.20230308113355-ba992b84110b/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2cGV/vPHsnqqbvTA2AN0= 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.34/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.36/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.37 h1:KeK6JCjeNUOHC5Z12/CTQIa8Z1at0dnnL9hY1LNrHS8= -github.com/multiversx/mx-chain-vm-common-go v1.3.37/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50 h1:ScUq7/wq78vthMTQ6v5Ux1DvSMQMHxQ2Sl7aPP26q1w= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50/go.mod h1:e3uYdgoKzs3puaznbmSjDcRisJc5Do4tpg7VqyYwoek= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51 h1:axtp5/mpA+xYJ1cu4KtAGETV4t6v6/tNfQh0HCclBYY= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51/go.mod h1:oKj32V2nkd+KGNOL6emnwVkDRPpciwHHDqBmeorcL8k= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77 h1:3Yh4brS5/Jye24l5AKy+Q6Yci6Rv55pHyj9/GR3AYos= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77/go.mod h1:3IaAOHc1JfxL5ywQZIrcaHQu5+CVdZNDaoY64NGOtUE= +github.com/multiversx/mx-chain-vm-common-go v1.3.38-0.20230308110011-f72eec6f1a08 h1:r7ZHBcoPmKWnmLsGLL0lh01gNCVTc56COfXR+SQQsZg= +github.com/multiversx/mx-chain-vm-common-go v1.3.38-0.20230308110011-f72eec6f1a08/go.mod h1:+tr9VOLfAg5MVxjtSrO9QhWJU6nugUFwHWzGmzwBd/E= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230308144027-4c00284edde1 h1:qkMtBeZNQSn2XrFVn36vL1DHTSfryPMZgacqnqDSmFE= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230308144027-4c00284edde1/go.mod h1:VcaphqJlrjLDxUGIpfneI8hEkdFTW14wEgMcLrtfDUo= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230308152315-a2b207d23ffb h1:xkU3/MFCBMBgkJcZ+99Y8OqPzvBJ5mDdncyl1e1Dch4= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230308152315-a2b207d23ffb/go.mod h1:rjOpaArerItt6z3uFGGwe0XsZN8xrWHAebdBBgic/wg= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78-0.20230308152912-b97bcb50de0b h1:VbP4c/xc7H0IB/0FG29VG/fIb7qW+pkvi5ehj3CCjHo= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78-0.20230308152912-b97bcb50de0b/go.mod h1:8syIEIMFS32/nZdUQG1GPIdICghHmev3xJI3whDtJck= 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 de0351fa0b180cc9d469cff64cb143a08a9df7b5 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 8 Mar 2023 17:43:03 +0200 Subject: [PATCH 177/335] fix unit test --- .../gasUsedAndFeeProcessor_test.go | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go b/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go index 16786a81f4b..14eacade5f7 100644 --- a/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go +++ b/node/external/transactionAPI/gasUsedAndFeeProcessor_test.go @@ -17,7 +17,7 @@ var pubKeyConverter, _ = pubkeyConverter.NewBech32PubkeyConverter(32, log) func TestComputeTransactionGasUsedAndFeeMoveBalance(t *testing.T) { t.Parallel() - require := require.New(t) + req := require.New(t) feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), @@ -40,14 +40,14 @@ func TestComputeTransactionGasUsedAndFeeMoveBalance(t *testing.T) { } gasUsedAndFeeProc.computeAndAttachGasUsedAndFee(moveBalanceTx) - require.Equal(uint64(50_000), moveBalanceTx.GasUsed) - require.Equal("50000000000000", moveBalanceTx.Fee) + req.Equal(uint64(50_000), moveBalanceTx.GasUsed) + req.Equal("50000000000000", moveBalanceTx.Fee) } func TestComputeTransactionGasUsedAndFeeLogWithError(t *testing.T) { t.Parallel() - require := require.New(t) + req := require.New(t) feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), @@ -78,8 +78,8 @@ func TestComputeTransactionGasUsedAndFeeLogWithError(t *testing.T) { } gasUsedAndFeeProc.computeAndAttachGasUsedAndFee(txWithSignalErrorLog) - require.Equal(uint64(80_000), txWithSignalErrorLog.GasUsed) - require.Equal("50300000000000", txWithSignalErrorLog.Fee) + req.Equal(uint64(80_000), txWithSignalErrorLog.GasUsed) + req.Equal("50300000000000", txWithSignalErrorLog.Fee) } func silentDecodeAddress(address string) []byte { @@ -90,7 +90,7 @@ func silentDecodeAddress(address string) []byte { func TestComputeTransactionGasUsedAndFeeRelayedTxWithWriteLog(t *testing.T) { t.Parallel() - require := require.New(t) + req := require.New(t) feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), @@ -123,12 +123,12 @@ func TestComputeTransactionGasUsedAndFeeRelayedTxWithWriteLog(t *testing.T) { } gasUsedAndFeeProc.computeAndAttachGasUsedAndFee(relayedTxWithWriteLog) - require.Equal(uint64(200_000), relayedTxWithWriteLog.GasUsed) - require.Equal("66350000000000", relayedTxWithWriteLog.Fee) + req.Equal(uint64(200_000), relayedTxWithWriteLog.GasUsed) + req.Equal("66350000000000", relayedTxWithWriteLog.Fee) } func TestComputeTransactionGasUsedAndFeeTransactionWithScrWithRefund(t *testing.T) { - require := require.New(t) + req := require.New(t) feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), @@ -170,17 +170,19 @@ func TestComputeTransactionGasUsedAndFeeTransactionWithScrWithRefund(t *testing. } gasUsedAndFeeProc.computeAndAttachGasUsedAndFee(txWithSRefundSCR) - require.Equal(uint64(3_365_000), txWithSRefundSCR.GasUsed) - require.Equal("98000000000000", txWithSRefundSCR.Fee) + req.Equal(uint64(3_365_000), txWithSRefundSCR.GasUsed) + req.Equal("98000000000000", txWithSRefundSCR.Fee) } func TestNFTTransferWithScCall(t *testing.T) { - require := require.New(t) - feeComp, _ := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ + req := require.New(t) + feeComp, err := fee.NewFeeComputer(fee.ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, EconomicsConfig: testscommon.GetEconomicsConfig(), + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, }) computer := fee.NewTestFeeComputer(feeComp) + req.Nil(err) gasUsedAndFeeProc := newGasUsedAndFeeProcessor(computer, pubKeyConverter) @@ -203,6 +205,6 @@ func TestNFTTransferWithScCall(t *testing.T) { tx.InitiallyPaidFee = feeComp.ComputeTransactionFee(tx).String() gasUsedAndFeeProc.computeAndAttachGasUsedAndFee(tx) - require.Equal(uint64(55_000_000), tx.GasUsed) - require.Equal("822250000000000", tx.Fee) + req.Equal(uint64(55_000_000), tx.GasUsed) + req.Equal("822250000000000", tx.Fee) } From a3fc0e47c7cad5c72a0c7f09c4284d631d14a372 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 8 Mar 2023 17:58:06 +0200 Subject: [PATCH 178/335] fix same problem different unit test --- node/external/timemachine/fee/feeComputer_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/node/external/timemachine/fee/feeComputer_test.go b/node/external/timemachine/fee/feeComputer_test.go index 0decc28c0e8..065f23ceaa3 100644 --- a/node/external/timemachine/fee/feeComputer_test.go +++ b/node/external/timemachine/fee/feeComputer_test.go @@ -198,6 +198,7 @@ func TestFeeComputer_InHighConcurrency(t *testing.T) { PenalizedTooMuchGasEnableEpoch: 124, GasPriceModifierEnableEpoch: 180, }, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, } computer, _ := NewFeeComputer(arguments) From e135ee5478457a2b767d24de8bce5f02f08a0791 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 9 Mar 2023 11:18:14 +0200 Subject: [PATCH 179/335] create a new errChan struct that wraps an err chan --- common/errChan/errChan.go | 62 ++++++++++ common/errChan/errChan_test.go | 81 +++++++++++++ common/interface.go | 10 +- debug/process/stateExport.go | 5 +- epochStart/metachain/systemSCs.go | 5 +- factory/processing/processComponents.go | 5 +- .../stateTrieClose/stateTrieClose_test.go | 21 ++-- .../state/stateTrieSync/stateTrieSync_test.go | 13 +- integrationTests/testProcessorNode.go | 5 +- node/node.go | 17 +-- node/node_test.go | 24 ++-- node/trieIterators/delegatedListProcessor.go | 5 +- .../delegatedListProcessor_test.go | 2 +- .../directStakedListProcessor.go | 5 +- .../directStakedListProcessor_test.go | 2 +- node/trieIterators/stakeValuesProcessor.go | 5 +- .../stakeValuesProcessor_test.go | 4 +- process/block/baseProcess.go | 9 +- process/block/baseProcess_test.go | 10 +- process/peer/process.go | 5 +- process/peer/process_test.go | 10 +- process/txsimulator/wrappedAccountsDB_test.go | 5 +- state/accountsDB.go | 29 ++--- state/accountsDB_test.go | 76 ++++++++---- state/peerAccountsDB.go | 5 +- state/syncer/userAccountsSyncer.go | 5 +- trie/node_test.go | 5 +- trie/patriciaMerkleTrie.go | 8 +- trie/patriciaMerkleTrie_test.go | 21 ++-- trie/trieStorageManager.go | 10 +- trie/trieStorageManagerFactory_test.go | 5 +- ...ieStorageManagerWithoutCheckpoints_test.go | 5 +- .../trieStorageManagerWithoutSnapshot_test.go | 3 +- trie/trieStorageManager_test.go | 113 +++++++++++------- update/genesis/common.go | 2 +- update/genesis/export.go | 7 +- update/genesis/export_test.go | 4 +- 37 files changed, 419 insertions(+), 189 deletions(-) create mode 100644 common/errChan/errChan.go create mode 100644 common/errChan/errChan_test.go diff --git a/common/errChan/errChan.go b/common/errChan/errChan.go new file mode 100644 index 00000000000..a2f08d1b3fb --- /dev/null +++ b/common/errChan/errChan.go @@ -0,0 +1,62 @@ +package errChan + +import "sync" + +type errChan struct { + ch chan error + closed bool + closeMutex sync.Mutex +} + +// NewErrChan creates a new errChan +func NewErrChan() *errChan { + return &errChan{ + ch: make(chan error, 1), + closed: false, + } +} + +// WriteInChanNonBlocking will send the given error on the channel if the chan is not blocked +func (ec *errChan) WriteInChanNonBlocking(err error) { + select { + case ec.ch <- err: + default: + } +} + +// ReadFromChanNonBlocking will read from the channel, or return nil if no error was sent on the channel +func (ec *errChan) ReadFromChanNonBlocking() error { + select { + case err := <-ec.ch: + return err + default: + return nil + } +} + +// Close will close the channel +func (ec *errChan) Close() { + ec.closeMutex.Lock() + defer ec.closeMutex.Unlock() + + if ec.closed { + return + } + + if ec.ch == nil { + return + } + + close(ec.ch) + ec.closed = true +} + +// Len returns the length of the channel +func (ec *errChan) Len() int { + return len(ec.ch) +} + +// IsInterfaceNil returns true if there is no value under the interface +func (ec *errChan) IsInterfaceNil() bool { + return ec == nil +} diff --git a/common/errChan/errChan_test.go b/common/errChan/errChan_test.go new file mode 100644 index 00000000000..b753a4ce224 --- /dev/null +++ b/common/errChan/errChan_test.go @@ -0,0 +1,81 @@ +package errChan + +import ( + "fmt" + "testing" + + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/stretchr/testify/assert" +) + +func TestNewErrChan(t *testing.T) { + t.Parallel() + + ec := NewErrChan() + assert.False(t, check.IfNil(ec)) + assert.Equal(t, 1, cap(ec.ch)) +} + +func TestErrChan_WriteInChanNonBlocking(t *testing.T) { + t.Parallel() + + expectedErr := fmt.Errorf("err1") + ec := NewErrChan() + ec.WriteInChanNonBlocking(expectedErr) + ec.WriteInChanNonBlocking(fmt.Errorf("err2")) + ec.WriteInChanNonBlocking(fmt.Errorf("err3")) + + assert.Equal(t, 1, len(ec.ch)) + assert.Equal(t, expectedErr, <-ec.ch) + assert.Equal(t, 0, len(ec.ch)) +} + +func TestErrChan_ReadFromChanNonBlocking(t *testing.T) { + t.Parallel() + + expectedErr := fmt.Errorf("err1") + ec := NewErrChan() + ec.ch <- expectedErr + + assert.Equal(t, 1, len(ec.ch)) + assert.Equal(t, expectedErr, ec.ReadFromChanNonBlocking()) + assert.Equal(t, 0, len(ec.ch)) + assert.Nil(t, ec.ReadFromChanNonBlocking()) +} + +func TestErrChan_Close(t *testing.T) { + t.Parallel() + + t.Run("close an already closed channel", func(t *testing.T) { + t.Parallel() + + ec := NewErrChan() + ec.Close() + + assert.True(t, ec.closed) + ec.Close() + }) + + t.Run("close a nil channel", func(t *testing.T) { + t.Parallel() + + ec := NewErrChan() + ec.ch = nil + ec.Close() + + assert.False(t, ec.closed) + }) +} + +func TestErrChan_Len(t *testing.T) { + t.Parallel() + + ec := NewErrChan() + assert.Equal(t, 0, ec.Len()) + + ec.ch <- fmt.Errorf("err1") + assert.Equal(t, 1, ec.Len()) + + ec.WriteInChanNonBlocking(fmt.Errorf("err2")) + assert.Equal(t, 1, ec.Len()) +} diff --git a/common/interface.go b/common/interface.go index a58b6aa94db..16f448179ec 100644 --- a/common/interface.go +++ b/common/interface.go @@ -13,7 +13,15 @@ import ( // TrieIteratorChannels defines the channels that are being used when iterating the trie nodes type TrieIteratorChannels struct { LeavesChan chan core.KeyValueHolder - ErrChan chan error + ErrChan BufferedErrChan +} + +// BufferedErrChan is an interface that defines the methods for a buffered error channel +type BufferedErrChan interface { + WriteInChanNonBlocking(err error) + ReadFromChanNonBlocking() error + Close() + IsInterfaceNil() bool } // Trie is an interface for Merkle Trees implementations diff --git a/debug/process/stateExport.go b/debug/process/stateExport.go index 9fbdd6ce1bc..b8cd8128255 100644 --- a/debug/process/stateExport.go +++ b/debug/process/stateExport.go @@ -9,6 +9,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/state" ) @@ -66,7 +67,7 @@ func getCode(accountsDB state.AccountsAdapter, codeHash []byte) ([]byte, error) func getData(accountsDB state.AccountsAdapter, rootHash []byte, address []byte) ([]string, error) { leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := accountsDB.GetAllLeaves(leavesChannels, context.Background(), rootHash) @@ -89,7 +90,7 @@ func getData(accountsDB state.AccountsAdapter, rootHash []byte, address []byte) hex.EncodeToString(valWithoutSuffix))) } - err = <-leavesChannels.ErrChan + err = leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, fmt.Errorf("%w while trying to export data on hex root hash %s, address %s", err, hex.EncodeToString(rootHash), hex.EncodeToString(address)) diff --git a/epochStart/metachain/systemSCs.go b/epochStart/metachain/systemSCs.go index 642053ad7d1..faf909008fe 100644 --- a/epochStart/metachain/systemSCs.go +++ b/epochStart/metachain/systemSCs.go @@ -16,6 +16,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" vInfo "github.com/multiversx/mx-chain-go/common/validatorInfo" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/epochStart" @@ -1102,7 +1103,7 @@ func (s *systemSCProcessor) getArgumentsForSetOwnerFunctionality(userValidatorAc leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = userValidatorAccount.DataTrie().GetAllLeavesOnChannel(leavesChannels, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -1125,7 +1126,7 @@ func (s *systemSCProcessor) getArgumentsForSetOwnerFunctionality(userValidatorAc } } - err = common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err = leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 49c62ae9a50..347a2645790 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -16,6 +16,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/outport" nodeFactory "github.com/multiversx/mx-chain-go/cmd/node/factory" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/consensus" "github.com/multiversx/mx-chain-go/dataRetriever" @@ -874,7 +875,7 @@ func (pcf *processComponentsFactory) indexAndReturnGenesisAccounts() (map[string leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = pcf.state.AccountsAdapter().GetAllLeaves(leavesChannels, context.Background(), rootHash) if err != nil { @@ -901,7 +902,7 @@ func (pcf *processComponentsFactory) indexAndReturnGenesisAccounts() (map[string } } - err = common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err = leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } diff --git a/integrationTests/state/stateTrieClose/stateTrieClose_test.go b/integrationTests/state/stateTrieClose/stateTrieClose_test.go index ab18ce244b6..cfa352c9b24 100644 --- a/integrationTests/state/stateTrieClose/stateTrieClose_test.go +++ b/integrationTests/state/stateTrieClose/stateTrieClose_test.go @@ -9,6 +9,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/testscommon" @@ -36,25 +37,25 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { rootHash, _ := tr.RootHash() leavesChannel1 := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } _ = tr.GetAllLeavesOnChannel(leavesChannel1, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) time.Sleep(time.Second) // allow the go routine to start idx, _ := gc.Snapshot() diff := gc.DiffGoRoutines(idxInitial, idx) assert.True(t, len(diff) <= 1) // can be 0 on a fast running host - err := common.GetErrorFromChanNonBlocking(leavesChannel1.ErrChan) + err := leavesChannel1.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) leavesChannel1 = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } _ = tr.GetAllLeavesOnChannel(leavesChannel1, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) idx, _ = gc.Snapshot() diff = gc.DiffGoRoutines(idxInitial, idx) assert.True(t, len(diff) <= 2) - err = common.GetErrorFromChanNonBlocking(leavesChannel1.ErrChan) + err = leavesChannel1.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) _ = tr.Update([]byte("god"), []byte("puppy")) @@ -63,13 +64,13 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { rootHash, _ = tr.RootHash() leavesChannel1 = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } _ = tr.GetAllLeavesOnChannel(leavesChannel1, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) idx, _ = gc.Snapshot() diff = gc.DiffGoRoutines(idxInitial, idx) assert.Equal(t, 3, len(diff), fmt.Sprintf("%v", diff)) - err = common.GetErrorFromChanNonBlocking(leavesChannel1.ErrChan) + err = leavesChannel1.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) _ = tr.Update([]byte("eggod"), []byte("cat")) @@ -78,14 +79,14 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { rootHash, _ = tr.RootHash() leavesChannel2 := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } _ = tr.GetAllLeavesOnChannel(leavesChannel2, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) time.Sleep(time.Second) // allow the go routine to start idx, _ = gc.Snapshot() diff = gc.DiffGoRoutines(idxInitial, idx) assert.True(t, len(diff) <= 4) - err = common.GetErrorFromChanNonBlocking(leavesChannel2.ErrChan) + err = leavesChannel2.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) for range leavesChannel1.LeavesChan { @@ -94,7 +95,7 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { idx, _ = gc.Snapshot() diff = gc.DiffGoRoutines(idxInitial, idx) assert.True(t, len(diff) <= 3) - err = common.GetErrorFromChanNonBlocking(leavesChannel1.ErrChan) + err = leavesChannel1.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) for range leavesChannel2.LeavesChan { @@ -103,7 +104,7 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { idx, _ = gc.Snapshot() diff = gc.DiffGoRoutines(idxInitial, idx) assert.True(t, len(diff) <= 2) - err = common.GetErrorFromChanNonBlocking(leavesChannel2.ErrChan) + err = leavesChannel2.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) err = tr.Close() diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index 0e7387825fd..175f3a3c460 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -3,6 +3,7 @@ package stateTrieSync import ( "context" "fmt" + "github.com/multiversx/mx-chain-go/common/errChan" "math/big" "strconv" "testing" @@ -329,13 +330,13 @@ func testMultipleDataTriesSync(t *testing.T, numAccounts int, numDataTrieLeaves rootHash, _ := accState.RootHash() leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = accState.GetAllLeaves(leavesChannel, context.Background(), rootHash) for range leavesChannel.LeavesChan { } require.Nil(t, err) - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() require.Nil(t, err) requesterTrie := nRequester.TrieContainer.Get([]byte(trieFactory.UserAccountTrie)) @@ -357,7 +358,7 @@ func testMultipleDataTriesSync(t *testing.T, numAccounts int, numDataTrieLeaves leavesChannel = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = nRequester.AccntState.GetAllLeaves(leavesChannel, context.Background(), rootHash) assert.Nil(t, err) @@ -365,7 +366,7 @@ func testMultipleDataTriesSync(t *testing.T, numAccounts int, numDataTrieLeaves for range leavesChannel.LeavesChan { numLeaves++ } - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() require.Nil(t, err) assert.Equal(t, numAccounts, numLeaves) checkAllDataTriesAreSynced(t, numDataTrieLeaves, requesterTrie, dataTrieRootHashes) @@ -559,7 +560,7 @@ func addAccountsToState(t *testing.T, numAccounts int, numDataTrieLeaves int, ac func getNumLeaves(t *testing.T, tr common.Trie, rootHash []byte) int { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) require.Nil(t, err) @@ -569,7 +570,7 @@ func getNumLeaves(t *testing.T, tr common.Trie, rootHash []byte) int { numLeaves++ } - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() require.Nil(t, err) return numLeaves diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 532b7a64673..8d3b1834f34 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -34,6 +34,7 @@ import ( nodeFactory "github.com/multiversx/mx-chain-go/cmd/node/factory" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/common/enablers" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/common/forking" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/consensus" @@ -3148,7 +3149,7 @@ func GetTokenIdentifier(nodes []*TestProcessorNode, ticker []byte) []byte { rootHash, _ := userAcc.DataTrie().RootHash() chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } _ = userAcc.DataTrie().GetAllLeavesOnChannel(chLeaves, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) for leaf := range chLeaves.LeavesChan { @@ -3159,7 +3160,7 @@ func GetTokenIdentifier(nodes []*TestProcessorNode, ticker []byte) []byte { return leaf.Key() } - err := common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err := chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { log.Error("error getting all leaves from channel", "err", err) } diff --git a/node/node.go b/node/node.go index ce56b3a02e4..3af65f4d36b 100644 --- a/node/node.go +++ b/node/node.go @@ -22,6 +22,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/transaction" disabledSig "github.com/multiversx/mx-chain-crypto-go/signing/disabled/singlesig" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/debug" "github.com/multiversx/mx-chain-go/facade" @@ -215,7 +216,7 @@ func (n *Node) GetAllIssuedESDTs(tokenType string, ctx context.Context) ([]strin chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -243,7 +244,7 @@ func (n *Node) GetAllIssuedESDTs(tokenType string, ctx context.Context) ([]strin } } - err = common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err = chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } @@ -291,7 +292,7 @@ func (n *Node) GetKeyValuePairs(address string, options api.AccountQueryOptions, chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -310,7 +311,7 @@ func (n *Node) GetKeyValuePairs(address string, options api.AccountQueryOptions, mapToReturn[hex.EncodeToString(leaf.Key())] = hex.EncodeToString(value) } - err = common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err = chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, api.BlockInfo{}, err } @@ -399,7 +400,7 @@ func (n *Node) getTokensIDsWithFilter( chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -422,7 +423,7 @@ func (n *Node) getTokensIDsWithFilter( } } - err = common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err = chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, api.BlockInfo{}, err } @@ -535,7 +536,7 @@ func (n *Node) GetAllESDTTokens(address string, options api.AccountQueryOptions, chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -573,7 +574,7 @@ func (n *Node) GetAllESDTTokens(address string, options api.AccountQueryOptions, allESDTs[tokenName] = esdtToken } - err = common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err = chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, api.BlockInfo{}, err } diff --git a/node/node_test.go b/node/node_test.go index 59d0c18cfc9..8915cdaac92 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -310,7 +310,7 @@ func TestNode_GetKeyValuePairs(t *testing.T) { trieLeaf2 := keyValStorage.NewKeyValStorage(k2, append(v2, suffix...)) leavesChannels.LeavesChan <- trieLeaf2 close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -369,7 +369,7 @@ func TestNode_GetKeyValuePairs_GetAllLeavesShouldFail(t *testing.T) { &trieMock.TrieStub{ GetAllLeavesOnChannelCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte, _ common.KeyBuilder) error { go func() { - leavesChannels.ErrChan <- expectedErr + leavesChannels.ErrChan.WriteInChanNonBlocking(expectedErr) close(leavesChannels.LeavesChan) }() @@ -424,7 +424,7 @@ func TestNode_GetKeyValuePairsContextShouldTimeout(t *testing.T) { go func() { time.Sleep(time.Second) close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -627,7 +627,7 @@ func TestNode_GetAllESDTTokens(t *testing.T) { trieLeaf := keyValStorage.NewKeyValStorage(esdtKey, nil) leavesChannels.LeavesChan <- trieLeaf close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -683,7 +683,7 @@ func TestNode_GetAllESDTTokens_GetAllLeavesShouldFail(t *testing.T) { &trieMock.TrieStub{ GetAllLeavesOnChannelCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte, _ common.KeyBuilder) error { go func() { - leavesChannels.ErrChan <- expectedErr + leavesChannels.ErrChan.WriteInChanNonBlocking(expectedErr) close(leavesChannels.LeavesChan) }() @@ -740,7 +740,7 @@ func TestNode_GetAllESDTTokensContextShouldTimeout(t *testing.T) { go func() { time.Sleep(time.Second) close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -834,7 +834,7 @@ func TestNode_GetAllESDTTokensShouldReturnEsdtAndFormattedNft(t *testing.T) { leavesChannels.LeavesChan <- trieLeaf wg.Done() close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() wg.Wait() @@ -920,7 +920,7 @@ func TestNode_GetAllIssuedESDTs(t *testing.T) { trieLeaf = keyValStorage.NewKeyValStorage(nftToken, append(nftMarshalledData, nftSuffix...)) leavesChannels.LeavesChan <- trieLeaf close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -1006,7 +1006,7 @@ func TestNode_GetESDTsWithRole(t *testing.T) { trieLeaf := keyValStorage.NewKeyValStorage(esdtToken, append(marshalledData, esdtSuffix...)) leavesChannels.LeavesChan <- trieLeaf close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -1086,7 +1086,7 @@ func TestNode_GetESDTsRoles(t *testing.T) { trieLeaf := keyValStorage.NewKeyValStorage(esdtToken, append(marshalledData, esdtSuffix...)) leavesChannels.LeavesChan <- trieLeaf close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -1151,7 +1151,7 @@ func TestNode_GetNFTTokenIDsRegisteredByAddress(t *testing.T) { trieLeaf := keyValStorage.NewKeyValStorage(esdtToken, append(marshalledData, esdtSuffix...)) leavesChannels.LeavesChan <- trieLeaf close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -1208,7 +1208,7 @@ func TestNode_GetNFTTokenIDsRegisteredByAddressContextShouldTimeout(t *testing.T go func() { time.Sleep(time.Second) close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil diff --git a/node/trieIterators/delegatedListProcessor.go b/node/trieIterators/delegatedListProcessor.go index 5db7ecb4116..c77d54a0880 100644 --- a/node/trieIterators/delegatedListProcessor.go +++ b/node/trieIterators/delegatedListProcessor.go @@ -11,6 +11,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/epochStart" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/trie/keyBuilder" @@ -129,7 +130,7 @@ func (dlp *delegatedListProcessor) getDelegatorsList(delegationSC []byte, ctx co chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = delegatorAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -146,7 +147,7 @@ func (dlp *delegatedListProcessor) getDelegatorsList(delegationSC []byte, ctx co delegators = append(delegators, leafKey) } - err = common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err = chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } diff --git a/node/trieIterators/delegatedListProcessor_test.go b/node/trieIterators/delegatedListProcessor_test.go index 090f8ce68e1..c669b43924e 100644 --- a/node/trieIterators/delegatedListProcessor_test.go +++ b/node/trieIterators/delegatedListProcessor_test.go @@ -232,7 +232,7 @@ func createDelegationScAccount(address []byte, leaves [][]byte, rootHash []byte, } close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil diff --git a/node/trieIterators/directStakedListProcessor.go b/node/trieIterators/directStakedListProcessor.go index 0ff046919b4..3e4ca62daeb 100644 --- a/node/trieIterators/directStakedListProcessor.go +++ b/node/trieIterators/directStakedListProcessor.go @@ -7,6 +7,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/trie/keyBuilder" "github.com/multiversx/mx-chain-go/vm" @@ -56,7 +57,7 @@ func (dslp *directStakedListProcessor) getAllStakedAccounts(validatorAccount sta chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = validatorAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -90,7 +91,7 @@ func (dslp *directStakedListProcessor) getAllStakedAccounts(validatorAccount sta stakedAccounts = append(stakedAccounts, val) } - err = common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err = chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } diff --git a/node/trieIterators/directStakedListProcessor_test.go b/node/trieIterators/directStakedListProcessor_test.go index 18b0bba952d..29e19f82542 100644 --- a/node/trieIterators/directStakedListProcessor_test.go +++ b/node/trieIterators/directStakedListProcessor_test.go @@ -162,7 +162,7 @@ func createValidatorScAccount(address []byte, leaves [][]byte, rootHash []byte, } close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil diff --git a/node/trieIterators/stakeValuesProcessor.go b/node/trieIterators/stakeValuesProcessor.go index c77169203d3..b0f01baff76 100644 --- a/node/trieIterators/stakeValuesProcessor.go +++ b/node/trieIterators/stakeValuesProcessor.go @@ -10,6 +10,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/trie/keyBuilder" @@ -98,7 +99,7 @@ func (svp *stakedValuesProcessor) computeBaseStakedAndTopUp(ctx context.Context) // TODO investigate if a call to GetAllLeavesKeysOnChannel (without values) might increase performance chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = validatorAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -123,7 +124,7 @@ func (svp *stakedValuesProcessor) computeBaseStakedAndTopUp(ctx context.Context) totalTopUp = totalTopUp.Add(totalTopUp, info.topUpValue) } - err = common.GetErrorFromChanNonBlocking(chLeaves.ErrChan) + err = chLeaves.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, nil, err } diff --git a/node/trieIterators/stakeValuesProcessor_test.go b/node/trieIterators/stakeValuesProcessor_test.go index 166b4fc37f0..6a81e0ddd76 100644 --- a/node/trieIterators/stakeValuesProcessor_test.go +++ b/node/trieIterators/stakeValuesProcessor_test.go @@ -195,7 +195,7 @@ func TestTotalStakedValueProcessor_GetTotalStakedValue_ContextShouldTimeout(t *t GetAllLeavesOnChannelCalled: func(leavesChannels *common.TrieIteratorChannels, _ context.Context, _ []byte, _ common.KeyBuilder) error { time.Sleep(time.Second) close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() return nil }, RootCalled: func() ([]byte, error) { @@ -297,7 +297,7 @@ func TestTotalStakedValueProcessor_GetTotalStakedValue(t *testing.T) { channels.LeavesChan <- leaf6 close(channels.LeavesChan) - close(channels.ErrChan) + channels.ErrChan.Close() }() return nil diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index a9c47516a55..b327d045b63 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -21,6 +21,7 @@ import ( "github.com/multiversx/mx-chain-core-go/marshal" nodeFactory "github.com/multiversx/mx-chain-go/cmd/node/factory" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/common/holders" "github.com/multiversx/mx-chain-go/common/logging" "github.com/multiversx/mx-chain-go/config" @@ -1733,7 +1734,7 @@ func (bp *baseProcessor) commitTrieEpochRootHashIfNeeded(metaBlock *block.MetaBl iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = userAccountsDb.GetAllLeaves(iteratorChannels, context.Background(), rootHash) if err != nil { @@ -1762,7 +1763,7 @@ func (bp *baseProcessor) commitTrieEpochRootHashIfNeeded(metaBlock *block.MetaBl if len(rh) != 0 { dataTrie := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } errDataTrieGet := userAccountsDb.GetAllLeaves(dataTrie, context.Background(), rh) if errDataTrieGet != nil { @@ -1774,7 +1775,7 @@ func (bp *baseProcessor) commitTrieEpochRootHashIfNeeded(metaBlock *block.MetaBl currentSize += len(lf.Value()) } - err = common.GetErrorFromChanNonBlocking(dataTrie.ErrChan) + err = dataTrie.ErrChan.ReadFromChanNonBlocking() if err != nil { return err } @@ -1790,7 +1791,7 @@ func (bp *baseProcessor) commitTrieEpochRootHashIfNeeded(metaBlock *block.MetaBl balanceSum.Add(balanceSum, userAccount.GetBalance()) } - err = common.GetErrorFromChanNonBlocking(iteratorChannels.ErrChan) + err = iteratorChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return err } diff --git a/process/block/baseProcess_test.go b/process/block/baseProcess_test.go index a8525909b4f..ba89195248f 100644 --- a/process/block/baseProcess_test.go +++ b/process/block/baseProcess_test.go @@ -1892,7 +1892,7 @@ func TestBaseProcessor_commitTrieEpochRootHashIfNeededShouldWork(t *testing.T) { }, GetAllLeavesCalled: func(channels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { close(channels.LeavesChan) - close(channels.ErrChan) + channels.ErrChan.Close() return nil }, }, @@ -1936,7 +1936,7 @@ func TestBaseProcessor_commitTrieEpochRootHashIfNeeded_GetAllLeaves(t *testing.T }, GetAllLeavesCalled: func(channels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { close(channels.LeavesChan) - close(channels.ErrChan) + channels.ErrChan.Close() return expectedErr }, }, @@ -1973,7 +1973,7 @@ func TestBaseProcessor_commitTrieEpochRootHashIfNeeded_GetAllLeaves(t *testing.T return rootHash, nil }, GetAllLeavesCalled: func(channels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { - channels.ErrChan <- expectedErr + channels.ErrChan.WriteInChanNonBlocking(expectedErr) close(channels.LeavesChan) return nil }, @@ -2033,14 +2033,14 @@ func TestBaseProcessor_commitTrieEpochRootHashIfNeededShouldUseDataTrieIfNeededW if bytes.Equal(rootHash, rh) { calledWithUserAccountRootHash = true close(channels.LeavesChan) - close(channels.ErrChan) + channels.ErrChan.Close() return nil } go func() { channels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("address"), []byte("bytes")) close(channels.LeavesChan) - close(channels.ErrChan) + channels.ErrChan.Close() }() return nil diff --git a/process/peer/process.go b/process/peer/process.go index d5ed5d06b2e..76f264917f9 100644 --- a/process/peer/process.go +++ b/process/peer/process.go @@ -14,6 +14,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/common/validatorInfo" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/process" @@ -447,7 +448,7 @@ func (vs *validatorStatistics) getValidatorDataFromLeaves( validators[currentShardId] = append(validators[currentShardId], validatorInfoData) } - err := common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err := leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } @@ -562,7 +563,7 @@ func (vs *validatorStatistics) GetValidatorInfoForRootHash(rootHash []byte) (map leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := vs.peerAdapter.GetAllLeaves(leavesChannels, context.Background(), rootHash) if err != nil { diff --git a/process/peer/process_test.go b/process/peer/process_test.go index ee1bab03e7f..5f84e61d749 100644 --- a/process/peer/process_test.go +++ b/process/peer/process_test.go @@ -1969,7 +1969,7 @@ func TestValidatorStatistics_ResetValidatorStatisticsAtNewEpoch(t *testing.T) { go func() { ch.LeavesChan <- keyValStorage.NewKeyValStorage(addrBytes0, marshalizedPa0) close(ch.LeavesChan) - close(ch.ErrChan) + ch.ErrChan.Close() }() return nil @@ -2032,7 +2032,7 @@ func TestValidatorStatistics_Process(t *testing.T) { ch.LeavesChan <- keyValStorage.NewKeyValStorage(addrBytes0, marshalizedPa0) ch.LeavesChan <- keyValStorage.NewKeyValStorage(addrBytesMeta, marshalizedPaMeta) close(ch.LeavesChan) - close(ch.ErrChan) + ch.ErrChan.Close() }() return nil @@ -2078,7 +2078,7 @@ func TestValidatorStatistics_GetValidatorInfoForRootHash(t *testing.T) { peerAdapter.GetAllLeavesCalled = func(ch *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { if bytes.Equal(rootHash, hash) { go func() { - ch.ErrChan <- expectedErr + ch.ErrChan.WriteInChanNonBlocking(expectedErr) close(ch.LeavesChan) }() @@ -2108,7 +2108,7 @@ func TestValidatorStatistics_GetValidatorInfoForRootHash(t *testing.T) { ch.LeavesChan <- keyValStorage.NewKeyValStorage(addrBytes0, marshalizedPa0) ch.LeavesChan <- keyValStorage.NewKeyValStorage(addrBytesMeta, marshalizedPaMeta) close(ch.LeavesChan) - close(ch.ErrChan) + ch.ErrChan.Close() }() return nil @@ -2555,7 +2555,7 @@ func updateArgumentsWithNeeded(arguments peer.ArgValidatorStatisticsProcessor) { ch.LeavesChan <- keyValStorage.NewKeyValStorage(addrBytes0, marshalizedPa0) ch.LeavesChan <- keyValStorage.NewKeyValStorage(addrBytesMeta, marshalizedPaMeta) close(ch.LeavesChan) - close(ch.ErrChan) + ch.ErrChan.Close() }() return nil diff --git a/process/txsimulator/wrappedAccountsDB_test.go b/process/txsimulator/wrappedAccountsDB_test.go index 1bf48e18531..016a6f6a0f1 100644 --- a/process/txsimulator/wrappedAccountsDB_test.go +++ b/process/txsimulator/wrappedAccountsDB_test.go @@ -7,6 +7,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/state" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" vmcommon "github.com/multiversx/mx-chain-vm-common-go" @@ -150,11 +151,11 @@ func TestReadOnlyAccountsDB_ReadOperationsShouldWork(t *testing.T) { allLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = roAccDb.GetAllLeaves(allLeaves, context.Background(), nil) require.NoError(t, err) - err = common.GetErrorFromChanNonBlocking(allLeaves.ErrChan) + err = allLeaves.ErrChan.ReadFromChanNonBlocking() require.NoError(t, err) } diff --git a/state/accountsDB.go b/state/accountsDB.go index 534e94d703c..e767ac459fe 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -16,6 +16,7 @@ import ( "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/errChan" "github.com/multiversx/mx-chain-go/common/holders" "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/trie/keyBuilder" @@ -1036,7 +1037,7 @@ func (adb *AccountsDB) recreateTrie(options common.RootHashHolder) error { func (adb *AccountsDB) RecreateAllTries(rootHash []byte) (map[string]common.Trie, error) { leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } mainTrie := adb.getMainTrie() err := mainTrie.GetAllLeavesOnChannel(leavesChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) @@ -1067,7 +1068,7 @@ func (adb *AccountsDB) RecreateAllTries(rootHash []byte) (map[string]common.Trie } } - err = common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err = leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } @@ -1142,7 +1143,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } stats := newSnapshotStatistics(1, 1) @@ -1253,7 +1254,7 @@ func (adb *AccountsDB) processSnapshotCompletion( stats *snapshotStatistics, trieStorageManager common.StorageManager, missingNodesCh chan []byte, - errChan chan error, + errChan common.BufferedErrChan, rootHash []byte, metrics *accountMetrics, epoch uint32, @@ -1263,15 +1264,15 @@ func (adb *AccountsDB) processSnapshotCompletion( defer func() { adb.isSnapshotInProgress.Reset() adb.updateMetricsOnSnapshotCompletion(metrics, stats) - close(errChan) + errChan.Close() }() - containsErrorDuringSnapshot := emptyErrChanReturningHadContained(errChan) - shouldNotMarkActive := trieStorageManager.IsClosed() || containsErrorDuringSnapshot + errorDuringSnapshot := errChan.ReadFromChanNonBlocking() + shouldNotMarkActive := trieStorageManager.IsClosed() || errorDuringSnapshot != nil if shouldNotMarkActive { log.Debug("will not set activeDB in epoch as the snapshot might be incomplete", "epoch", epoch, "trie storage manager closed", trieStorageManager.IsClosed(), - "errors during snapshot found", containsErrorDuringSnapshot) + "errors during snapshot found", errorDuringSnapshot) return } @@ -1283,7 +1284,7 @@ func (adb *AccountsDB) processSnapshotCompletion( handleLoggingWhenError("error while putting active DB value into main storer", errPut) } -func (adb *AccountsDB) syncMissingNodes(missingNodesChan chan []byte, errChan chan error, stats *snapshotStatistics, syncer AccountsDBSyncer) { +func (adb *AccountsDB) syncMissingNodes(missingNodesChan chan []byte, errChan common.BufferedErrChan, stats *snapshotStatistics, syncer AccountsDBSyncer) { defer stats.SyncFinished() if check.IfNil(syncer) { @@ -1291,7 +1292,7 @@ func (adb *AccountsDB) syncMissingNodes(missingNodesChan chan []byte, errChan ch for missingNode := range missingNodesChan { log.Warn("could not sync node", "hash", missingNode) } - errChan <- ErrNilTrieSyncer + errChan.WriteInChanNonBlocking(ErrNilTrieSyncer) return } @@ -1302,7 +1303,7 @@ func (adb *AccountsDB) syncMissingNodes(missingNodesChan chan []byte, errChan ch "missing node hash", missingNode, "error", err, ) - errChan <- err + errChan.WriteInChanNonBlocking(err) } } } @@ -1370,7 +1371,7 @@ func (adb *AccountsDB) setStateCheckpoint(rootHash []byte) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } missingNodesChannel := make(chan []byte, missingNodesChannelSize) stats := newSnapshotStatistics(1, 1) @@ -1436,7 +1437,7 @@ func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatist iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := mainTrie.GetAllLeavesOnChannel(iteratorChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) if err != nil { @@ -1459,7 +1460,7 @@ func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatist collectStats(tr, stats, account.RootHash, address) } - err = common.GetErrorFromChanNonBlocking(iteratorChannels.ErrChan) + err = iteratorChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index f0ddcf55616..3cc0f40a149 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -18,6 +18,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/keyValStorage" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/common/holders" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/process/mock" @@ -1027,7 +1028,7 @@ func TestAccountsDB_SnapshotStateWithErrorsShouldNotMarkActiveDB(t *testing.T) { return true }, TakeSnapshotCalled: func(_ string, _ []byte, _ []byte, iteratorChannels *common.TrieIteratorChannels, _ chan []byte, stats common.SnapshotStatisticsHandler, _ uint32) { - iteratorChannels.ErrChan <- expectedErr + iteratorChannels.ErrChan.WriteInChanNonBlocking(expectedErr) close(iteratorChannels.LeavesChan) stats.SnapshotFinished() }, @@ -1428,7 +1429,7 @@ func TestAccountsDB_GetAllLeaves(t *testing.T) { GetAllLeavesOnChannelCalled: func(channels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte, builder common.KeyBuilder) error { getAllLeavesCalled = true close(channels.LeavesChan) - close(channels.ErrChan) + channels.ErrChan.Close() return nil }, @@ -1441,13 +1442,13 @@ func TestAccountsDB_GetAllLeaves(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := adb.GetAllLeaves(leavesChannel, context.Background(), []byte("root hash")) assert.Nil(t, err) assert.True(t, getAllLeavesCalled) - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) } @@ -2324,10 +2325,10 @@ func TestAccountsDB_RecreateAllTries(t *testing.T) { GetAllLeavesOnChannelCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte, keyBuilder common.KeyBuilder) error { go func() { leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("key"), []byte("val")) - leavesChannels.ErrChan <- expectedErr + leavesChannels.ErrChan.WriteInChanNonBlocking(expectedErr) close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -2355,7 +2356,7 @@ func TestAccountsDB_RecreateAllTries(t *testing.T) { leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("key"), []byte("val")) close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil @@ -2733,17 +2734,17 @@ func TestEmptyErrChanReturningHadContained(t *testing.T) { t.Run("unbuffered chan", func(t *testing.T) { t.Parallel() - errChan := make(chan error) - assert.False(t, state.EmptyErrChanReturningHadContained(errChan)) - assert.Equal(t, 0, len(errChan)) + errChannel := make(chan error) + assert.False(t, state.EmptyErrChanReturningHadContained(errChannel)) + assert.Equal(t, 0, len(errChannel)) }) t.Run("buffered chan", func(t *testing.T) { t.Parallel() for i := 1; i < 10; i++ { - errChan := make(chan error, i) - assert.False(t, state.EmptyErrChanReturningHadContained(errChan)) - assert.Equal(t, 0, len(errChan)) + errChannel := make(chan error, i) + assert.False(t, state.EmptyErrChanReturningHadContained(errChannel)) + assert.Equal(t, 0, len(errChannel)) } }) }) @@ -2753,27 +2754,27 @@ func TestEmptyErrChanReturningHadContained(t *testing.T) { t.Run("unbuffered chan", func(t *testing.T) { t.Parallel() - errChan := make(chan error) + errChannel := make(chan error) go func() { - errChan <- errors.New("test") + errChannel <- errors.New("test") }() time.Sleep(time.Second) // allow the go routine to start - assert.True(t, state.EmptyErrChanReturningHadContained(errChan)) - assert.Equal(t, 0, len(errChan)) + assert.True(t, state.EmptyErrChanReturningHadContained(errChannel)) + assert.Equal(t, 0, len(errChannel)) }) t.Run("buffered chan", func(t *testing.T) { t.Parallel() for i := 1; i < 10; i++ { - errChan := make(chan error, i) + errChannel := make(chan error, i) for j := 0; j < i; j++ { - errChan <- errors.New("test") + errChannel <- errors.New("test") } - assert.True(t, state.EmptyErrChanReturningHadContained(errChan)) - assert.Equal(t, 0, len(errChan)) + assert.True(t, state.EmptyErrChanReturningHadContained(errChannel)) + assert.Equal(t, 0, len(errChannel)) } }) }) @@ -2900,6 +2901,39 @@ func TestAccountsDB_SyncMissingSnapshotNodes(t *testing.T) { assert.True(t, isMissingNodeCalled) }) + + t.Run("should not deadlock if sync err after another err", func(t *testing.T) { + t.Parallel() + + missingNodeError := errors.New("missing trie node") + isMissingNodeCalled := false + + memDbMock := testscommon.NewMemDbMock() + memDbMock.PutCalled = func(key, val []byte) error { + return fmt.Errorf("put error") + } + memDbMock.GetCalled = func(key []byte) ([]byte, error) { + if bytes.Equal(key, []byte(common.ActiveDBKey)) { + return []byte(common.ActiveDBVal), nil + } + + isMissingNodeCalled = true + return nil, missingNodeError + } + + tr, adb := getDefaultTrieAndAccountsDbWithCustomDB(&testscommon.SnapshotPruningStorerMock{MemDbMock: memDbMock}) + prepareTrie(tr, 3) + + rootHash, _ := tr.RootHash() + + adb.SnapshotState(rootHash) + + for tr.GetStorageManager().IsPruningBlocked() { + time.Sleep(time.Millisecond * 100) + } + + assert.True(t, isMissingNodeCalled) + }) } func prepareTrie(tr common.Trie, numKeys int) { diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index ed1f080069e..1e597d884af 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -2,6 +2,7 @@ package state import ( "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" ) // PeerAccountsDB will save and synchronize data from peer processor, plus will synchronize with nodesCoordinator @@ -56,7 +57,7 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } stats := newSnapshotStatistics(0, 1) stats.NewSnapshotStarted() @@ -92,7 +93,7 @@ func (adb *PeerAccountsDB) SetStateCheckpoint(rootHash []byte) { stats.NewSnapshotStarted() iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } trieStorageManager.SetCheckpoint(rootHash, rootHash, iteratorChannels, missingNodesChannel, stats) diff --git a/state/syncer/userAccountsSyncer.go b/state/syncer/userAccountsSyncer.go index ca2e1142266..f508341b749 100644 --- a/state/syncer/userAccountsSyncer.go +++ b/state/syncer/userAccountsSyncer.go @@ -12,6 +12,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/epochStart" "github.com/multiversx/mx-chain-go/process/factory" "github.com/multiversx/mx-chain-go/state" @@ -213,7 +214,7 @@ func (u *userAccountsSyncer) syncAccountDataTries( leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = mainTrie.GetAllLeavesOnChannel(leavesChannels, context.Background(), mainRootHash, keyBuilder.NewDisabledKeyBuilder()) if err != nil { @@ -265,7 +266,7 @@ func (u *userAccountsSyncer) syncAccountDataTries( wg.Wait() - err = common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err = leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return err } diff --git a/trie/node_test.go b/trie/node_test.go index dbc30aa4174..95c439aa91a 100644 --- a/trie/node_test.go +++ b/trie/node_test.go @@ -8,6 +8,7 @@ import ( "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/common/errChan" dataMock "github.com/multiversx/mx-chain-go/dataRetriever/mock" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/trie/keyBuilder" @@ -518,7 +519,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesCollapsedTrie(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), tr.root.getHash(), keyBuilder.NewKeyBuilder()) assert.Nil(t, err) @@ -528,7 +529,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesCollapsedTrie(t *testing.T) { leaves[string(l.Key())] = l.Value() } - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) assert.Equal(t, 3, len(leaves)) diff --git a/trie/patriciaMerkleTrie.go b/trie/patriciaMerkleTrie.go index e6d22323566..352772ab219 100644 --- a/trie/patriciaMerkleTrie.go +++ b/trie/patriciaMerkleTrie.go @@ -457,14 +457,14 @@ func (tr *patriciaMerkleTrie) GetAllLeavesOnChannel( if err != nil { tr.mutOperation.RUnlock() close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() return err } if check.IfNil(newTrie) || newTrie.root == nil { tr.mutOperation.RUnlock() close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() return nil } @@ -481,7 +481,7 @@ func (tr *patriciaMerkleTrie) GetAllLeavesOnChannel( ctx, ) if err != nil { - writeInChanNonBlocking(leavesChannels.ErrChan, err) + leavesChannels.ErrChan.WriteInChanNonBlocking(err) log.Error("could not get all trie leaves: ", "error", err) } @@ -490,7 +490,7 @@ func (tr *patriciaMerkleTrie) GetAllLeavesOnChannel( tr.mutOperation.Unlock() close(leavesChannels.LeavesChan) - close(leavesChannels.ErrChan) + leavesChannels.ErrChan.Close() }() return nil diff --git a/trie/patriciaMerkleTrie_test.go b/trie/patriciaMerkleTrie_test.go index 45b9066e490..ab0518247fc 100644 --- a/trie/patriciaMerkleTrie_test.go +++ b/trie/patriciaMerkleTrie_test.go @@ -15,6 +15,7 @@ import ( "github.com/multiversx/mx-chain-core-go/hashing/keccak" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/common/holders" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/testscommon" @@ -475,7 +476,7 @@ func TestPatriciaMerkleTrie_GetSerializedNodesGetFromCheckpoint(t *testing.T) { storageManager.AddDirtyCheckpointHashes(rootHash, dirtyHashes) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } storageManager.SetCheckpoint(rootHash, make([]byte, 0), iteratorChannels, nil, &trieMock.MockStatistics{}) trie.WaitForOperationToComplete(storageManager) @@ -562,7 +563,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := tr.GetAllLeavesOnChannel(iteratorChannels, context.Background(), []byte{}, keyBuilder.NewDisabledKeyBuilder()) assert.Equal(t, trie.ErrNilTrieIteratorLeavesChannel, err) @@ -588,7 +589,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), []byte{}, keyBuilder.NewDisabledKeyBuilder()) assert.Nil(t, err) @@ -597,7 +598,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { _, ok := <-leavesChannel.LeavesChan assert.False(t, ok) - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) }) @@ -610,7 +611,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } expectedErr := errors.New("expected error") @@ -630,7 +631,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { for leaf := range leavesChannel.LeavesChan { recovered[string(leaf.Key())] = leaf.Value() } - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() assert.Equal(t, expectedErr, err) assert.Equal(t, 0, len(recovered)) }) @@ -646,7 +647,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } expectedErr := errors.New("expected error") @@ -672,7 +673,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { for leaf := range leavesChannel.LeavesChan { recovered[string(leaf.Key())] = leaf.Value() } - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() assert.Equal(t, expectedErr, err) expectedLeaves := map[string][]byte{ @@ -695,7 +696,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) assert.Nil(t, err) @@ -705,7 +706,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { for leaf := range leavesChannel.LeavesChan { recovered[string(leaf.Key())] = leaf.Value() } - err = common.GetErrorFromChanNonBlocking(leavesChannel.ErrChan) + err = leavesChannel.ErrChan.ReadFromChanNonBlocking() assert.Nil(t, err) assert.Equal(t, leaves, recovered) }) diff --git a/trie/trieStorageManager.go b/trie/trieStorageManager.go index dc50faff711..78b647030e3 100644 --- a/trie/trieStorageManager.go +++ b/trie/trieStorageManager.go @@ -438,7 +438,7 @@ func (tsm *trieStorageManager) takeSnapshot(snapshotEntry *snapshotsQueueEntry, stsm, err := newSnapshotTrieStorageManager(tsm, snapshotEntry.epoch) if err != nil { - writeInChanNonBlocking(snapshotEntry.iteratorChannels.ErrChan, err) + snapshotEntry.iteratorChannels.ErrChan.WriteInChanNonBlocking(err) log.Error("takeSnapshot: trie storage manager: newSnapshotTrieStorageManager", "rootHash", snapshotEntry.rootHash, "main trie rootHash", snapshotEntry.mainTrieRootHash, @@ -448,7 +448,7 @@ func (tsm *trieStorageManager) takeSnapshot(snapshotEntry *snapshotsQueueEntry, newRoot, err := newSnapshotNode(stsm, msh, hsh, snapshotEntry.rootHash, snapshotEntry.missingNodesChan) if err != nil { - writeInChanNonBlocking(snapshotEntry.iteratorChannels.ErrChan, err) + snapshotEntry.iteratorChannels.ErrChan.WriteInChanNonBlocking(err) treatSnapshotError(err, "trie storage manager: newSnapshotNode takeSnapshot", snapshotEntry.rootHash, @@ -460,7 +460,7 @@ func (tsm *trieStorageManager) takeSnapshot(snapshotEntry *snapshotsQueueEntry, stats := statistics.NewTrieStatistics() err = newRoot.commitSnapshot(stsm, snapshotEntry.iteratorChannels.LeavesChan, snapshotEntry.missingNodesChan, ctx, stats, tsm.idleProvider, rootDepthLevel) if err != nil { - writeInChanNonBlocking(snapshotEntry.iteratorChannels.ErrChan, err) + snapshotEntry.iteratorChannels.ErrChan.WriteInChanNonBlocking(err) treatSnapshotError(err, "trie storage manager: takeSnapshot commit", snapshotEntry.rootHash, @@ -490,7 +490,7 @@ func (tsm *trieStorageManager) takeCheckpoint(checkpointEntry *snapshotsQueueEnt newRoot, err := newSnapshotNode(tsm, msh, hsh, checkpointEntry.rootHash, checkpointEntry.missingNodesChan) if err != nil { - writeInChanNonBlocking(checkpointEntry.iteratorChannels.ErrChan, err) + checkpointEntry.iteratorChannels.ErrChan.WriteInChanNonBlocking(err) treatSnapshotError(err, "trie storage manager: newSnapshotNode takeCheckpoint", checkpointEntry.rootHash, @@ -502,7 +502,7 @@ func (tsm *trieStorageManager) takeCheckpoint(checkpointEntry *snapshotsQueueEnt stats := statistics.NewTrieStatistics() err = newRoot.commitCheckpoint(tsm, tsm.checkpointsStorer, tsm.checkpointHashesHolder, checkpointEntry.iteratorChannels.LeavesChan, ctx, stats, tsm.idleProvider, rootDepthLevel) if err != nil { - writeInChanNonBlocking(checkpointEntry.iteratorChannels.ErrChan, err) + checkpointEntry.iteratorChannels.ErrChan.WriteInChanNonBlocking(err) treatSnapshotError(err, "trie storage manager: takeCheckpoint commit", checkpointEntry.rootHash, diff --git a/trie/trieStorageManagerFactory_test.go b/trie/trieStorageManagerFactory_test.go index d5a28801d9c..d79fa2c77fa 100644 --- a/trie/trieStorageManagerFactory_test.go +++ b/trie/trieStorageManagerFactory_test.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/testscommon" trieMock "github.com/multiversx/mx-chain-go/testscommon/trie" "github.com/multiversx/mx-chain-go/trie" @@ -134,7 +135,7 @@ func TestTrieStorageManager_SerialFuncShadowingCallsExpectedImpl(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } tsm.SetCheckpoint(nil, nil, iteratorChannels, nil, &trieMock.MockStatistics{}) @@ -167,7 +168,7 @@ func testTsmWithoutSnapshot( iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } tsm.TakeSnapshot("", nil, nil, iteratorChannels, nil, &trieMock.MockStatistics{}, 10) diff --git a/trie/trieStorageManagerWithoutCheckpoints_test.go b/trie/trieStorageManagerWithoutCheckpoints_test.go index 0f3cf254a77..2f76292d574 100644 --- a/trie/trieStorageManagerWithoutCheckpoints_test.go +++ b/trie/trieStorageManagerWithoutCheckpoints_test.go @@ -5,6 +5,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" trieMock "github.com/multiversx/mx-chain-go/testscommon/trie" "github.com/multiversx/mx-chain-go/trie" "github.com/stretchr/testify/assert" @@ -27,14 +28,14 @@ func TestTrieStorageManagerWithoutCheckpoints_SetCheckpoint(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } ts.SetCheckpoint([]byte("rootHash"), make([]byte, 0), iteratorChannels, nil, &trieMock.MockStatistics{}) assert.Equal(t, uint32(0), ts.PruningBlockingOperations()) iteratorChannels = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } ts.SetCheckpoint([]byte("rootHash"), make([]byte, 0), iteratorChannels, nil, &trieMock.MockStatistics{}) assert.Equal(t, uint32(0), ts.PruningBlockingOperations()) diff --git a/trie/trieStorageManagerWithoutSnapshot_test.go b/trie/trieStorageManagerWithoutSnapshot_test.go index 4077c71978a..d3ba6073770 100644 --- a/trie/trieStorageManagerWithoutSnapshot_test.go +++ b/trie/trieStorageManagerWithoutSnapshot_test.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" trieMock "github.com/multiversx/mx-chain-go/testscommon/trie" "github.com/multiversx/mx-chain-go/trie" "github.com/stretchr/testify/assert" @@ -79,7 +80,7 @@ func TestTrieStorageManagerWithoutSnapshot_TakeSnapshot(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } ts.TakeSnapshot("", nil, nil, iteratorChannels, nil, &trieMock.MockStatistics{}, 10) diff --git a/trie/trieStorageManager_test.go b/trie/trieStorageManager_test.go index f634024514d..9dc02201ab4 100644 --- a/trie/trieStorageManager_test.go +++ b/trie/trieStorageManager_test.go @@ -9,6 +9,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/testscommon" @@ -36,6 +37,12 @@ func getNewTrieStorageManagerArgs() trie.NewTrieStorageManagerArgs { } } +// ErrChanWithLen extends the BufferedErrChan interface with a Len method +type ErrChanWithLen interface { + common.BufferedErrChan + Len() int +} + func TestNewTrieStorageManager(t *testing.T) { t.Parallel() @@ -91,7 +98,7 @@ func TestTrieCheckpoint(t *testing.T) { trieStorage.AddDirtyCheckpointHashes(rootHash, dirtyHashes) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } trieStorage.SetCheckpoint(rootHash, []byte{}, iteratorChannels, nil, &trieMock.MockStatistics{}) trie.WaitForOperationToComplete(trieStorage) @@ -99,7 +106,10 @@ func TestTrieCheckpoint(t *testing.T) { val, err = trieStorage.GetFromCheckpoint(rootHash) assert.Nil(t, err) assert.NotNil(t, val) - assert.Equal(t, 0, len(iteratorChannels.ErrChan)) + + ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + assert.True(t, ok) + assert.Equal(t, 0, ch.Len()) } func TestTrieStorageManager_SetCheckpointNilErrorChan(t *testing.T) { @@ -131,13 +141,15 @@ func TestTrieStorageManager_SetCheckpointClosedDb(t *testing.T) { rootHash := []byte("rootHash") iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } ts.SetCheckpoint(rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - assert.Equal(t, 0, len(iteratorChannels.ErrChan)) + ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + assert.True(t, ok) + assert.Equal(t, 0, ch.Len()) } func TestTrieStorageManager_SetCheckpointEmptyTrieRootHash(t *testing.T) { @@ -149,13 +161,15 @@ func TestTrieStorageManager_SetCheckpointEmptyTrieRootHash(t *testing.T) { rootHash := make([]byte, 32) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } ts.SetCheckpoint(rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - assert.Equal(t, 0, len(iteratorChannels.ErrChan)) + ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + assert.True(t, ok) + assert.Equal(t, 0, ch.Len()) } func TestTrieCheckpoint_DoesNotSaveToCheckpointStorageIfNotDirty(t *testing.T) { @@ -170,7 +184,7 @@ func TestTrieCheckpoint_DoesNotSaveToCheckpointStorageIfNotDirty(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } trieStorage.SetCheckpoint(rootHash, []byte{}, iteratorChannels, nil, &trieMock.MockStatistics{}) trie.WaitForOperationToComplete(trieStorage) @@ -178,7 +192,9 @@ func TestTrieCheckpoint_DoesNotSaveToCheckpointStorageIfNotDirty(t *testing.T) { val, err = trieStorage.GetFromCheckpoint(rootHash) assert.NotNil(t, err) assert.Nil(t, val) - assert.Equal(t, 0, len(iteratorChannels.ErrChan)) + ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + assert.True(t, ok) + assert.Equal(t, 0, ch.Len()) } func TestTrieStorageManager_IsPruningEnabled(t *testing.T) { @@ -344,13 +360,15 @@ func TestTrieStorageManager_TakeSnapshotClosedDb(t *testing.T) { rootHash := []byte("rootHash") iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } ts.TakeSnapshot("", rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}, 0) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - assert.Equal(t, 0, len(iteratorChannels.ErrChan)) + ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + assert.True(t, ok) + assert.Equal(t, 0, ch.Len()) } func TestTrieStorageManager_TakeSnapshotEmptyTrieRootHash(t *testing.T) { @@ -362,13 +380,15 @@ func TestTrieStorageManager_TakeSnapshotEmptyTrieRootHash(t *testing.T) { rootHash := make([]byte, 32) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } ts.TakeSnapshot("", rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}, 0) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - assert.Equal(t, 0, len(iteratorChannels.ErrChan)) + ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + assert.True(t, ok) + assert.Equal(t, 0, ch.Len()) } func TestTrieStorageManager_TakeSnapshotWithGetNodeFromDBError(t *testing.T) { @@ -381,15 +401,17 @@ func TestTrieStorageManager_TakeSnapshotWithGetNodeFromDBError(t *testing.T) { rootHash := []byte("rootHash") iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } missingNodesChan := make(chan []byte, 2) ts.TakeSnapshot("", rootHash, rootHash, iteratorChannels, missingNodesChan, &trieMock.MockStatistics{}, 0) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - require.Equal(t, 1, len(iteratorChannels.ErrChan)) - errRecovered := <-iteratorChannels.ErrChan + ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + assert.True(t, ok) + assert.Equal(t, 1, ch.Len()) + errRecovered := iteratorChannels.ErrChan.ReadFromChanNonBlocking() assert.True(t, strings.Contains(errRecovered.Error(), common.GetNodeFromDBErrorString)) } @@ -430,20 +452,20 @@ func TestWriteInChanNonBlocking(t *testing.T) { t.Run("unbuffered, reader has been set up, should add", func(t *testing.T) { t.Parallel() - errChan := make(chan error) + errChannel := make(chan error) var recovered error wg := sync.WaitGroup{} wg.Add(1) // set up the consumer that will be blocked until writing is done go func() { - recovered = <-errChan + recovered = <-errChannel wg.Done() }() time.Sleep(time.Second) // allow the go routine to start - trie.WriteInChanNonBlocking(errChan, err1) + trie.WriteInChanNonBlocking(errChannel, err1) wg.Wait() assert.Equal(t, err1, recovered) @@ -453,8 +475,8 @@ func TestWriteInChanNonBlocking(t *testing.T) { chanFinish := make(chan struct{}) go func() { - errChan := make(chan error) - trie.WriteInChanNonBlocking(errChan, err1) + errChannel := make(chan error) + trie.WriteInChanNonBlocking(errChannel, err1) close(chanFinish) }() @@ -468,53 +490,54 @@ func TestWriteInChanNonBlocking(t *testing.T) { t.Run("buffered (one element), empty chan should add", func(t *testing.T) { t.Parallel() - errChan := make(chan error, 1) - trie.WriteInChanNonBlocking(errChan, err1) - require.Equal(t, 1, len(errChan)) - recovered := <-errChan + errChannel := errChan.NewErrChan() + errChannel.WriteInChanNonBlocking(err1) + + require.Equal(t, 1, errChannel.Len()) + recovered := errChannel.ReadFromChanNonBlocking() assert.Equal(t, err1, recovered) }) t.Run("buffered (1 element), full chan should not add, but should finish", func(t *testing.T) { t.Parallel() - errChan := make(chan error, 1) - trie.WriteInChanNonBlocking(errChan, err1) - trie.WriteInChanNonBlocking(errChan, err2) + errChannel := errChan.NewErrChan() + errChannel.WriteInChanNonBlocking(err1) + errChannel.WriteInChanNonBlocking(err2) - require.Equal(t, 1, len(errChan)) - recovered := <-errChan + require.Equal(t, 1, errChannel.Len()) + recovered := errChannel.ReadFromChanNonBlocking() assert.Equal(t, err1, recovered) }) t.Run("buffered (two elements), empty chan should add", func(t *testing.T) { t.Parallel() - errChan := make(chan error, 2) - trie.WriteInChanNonBlocking(errChan, err1) - require.Equal(t, 1, len(errChan)) - recovered := <-errChan + errChannel := make(chan error, 2) + trie.WriteInChanNonBlocking(errChannel, err1) + require.Equal(t, 1, len(errChannel)) + recovered := <-errChannel assert.Equal(t, err1, recovered) - trie.WriteInChanNonBlocking(errChan, err1) - trie.WriteInChanNonBlocking(errChan, err2) - require.Equal(t, 2, len(errChan)) + trie.WriteInChanNonBlocking(errChannel, err1) + trie.WriteInChanNonBlocking(errChannel, err2) + require.Equal(t, 2, len(errChannel)) - recovered = <-errChan + recovered = <-errChannel assert.Equal(t, err1, recovered) - recovered = <-errChan + recovered = <-errChannel assert.Equal(t, err2, recovered) }) t.Run("buffered (2 elements), full chan should not add, but should finish", func(t *testing.T) { t.Parallel() - errChan := make(chan error, 2) - trie.WriteInChanNonBlocking(errChan, err1) - trie.WriteInChanNonBlocking(errChan, err2) - trie.WriteInChanNonBlocking(errChan, err3) + errChannel := make(chan error, 2) + trie.WriteInChanNonBlocking(errChannel, err1) + trie.WriteInChanNonBlocking(errChannel, err2) + trie.WriteInChanNonBlocking(errChannel, err3) - require.Equal(t, 2, len(errChan)) - recovered := <-errChan + require.Equal(t, 2, len(errChannel)) + recovered := <-errChannel assert.Equal(t, err1, recovered) - recovered = <-errChan + recovered = <-errChannel assert.Equal(t, err2, recovered) }) } diff --git a/update/genesis/common.go b/update/genesis/common.go index 8c62a78ef61..023fe6d7c8d 100644 --- a/update/genesis/common.go +++ b/update/genesis/common.go @@ -34,7 +34,7 @@ func getValidatorDataFromLeaves( validators[currentShardId] = append(validators[currentShardId], validatorInfoData) } - err := common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err := leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return nil, err } diff --git a/update/genesis/export.go b/update/genesis/export.go index f885c9cf55c..ccf2b3cdb62 100644 --- a/update/genesis/export.go +++ b/update/genesis/export.go @@ -16,6 +16,7 @@ import ( "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/errChan" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" "github.com/multiversx/mx-chain-go/state" @@ -295,7 +296,7 @@ func (se *stateExport) exportTrie(key string, trie common.Trie) error { leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChan(), } err = trie.GetAllLeavesOnChannel(leavesChannels, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -357,7 +358,7 @@ func (se *stateExport) exportDataTries( } } - err := common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err := leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return err } @@ -379,7 +380,7 @@ func (se *stateExport) exportAccountLeaves( } } - err := common.GetErrorFromChanNonBlocking(leavesChannels.ErrChan) + err := leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { return err } diff --git a/update/genesis/export_test.go b/update/genesis/export_test.go index 44800205606..08be4eee55c 100644 --- a/update/genesis/export_test.go +++ b/update/genesis/export_test.go @@ -294,7 +294,7 @@ func TestStateExport_ExportTrieShouldExportNodesSetupJson(t *testing.T) { go func() { channels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("test"), pacB) - channels.ErrChan <- expectedErr + channels.ErrChan.WriteInChanNonBlocking(expectedErr) close(channels.LeavesChan) }() @@ -344,7 +344,7 @@ func TestStateExport_ExportTrieShouldExportNodesSetupJson(t *testing.T) { go func() { channels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("test"), pacB) close(channels.LeavesChan) - close(channels.ErrChan) + channels.ErrChan.Close() }() return nil From 14cff8180adc94a595de82af3f6df5cfe426e391 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 9 Mar 2023 11:34:12 +0200 Subject: [PATCH 180/335] sort imports --- integrationTests/state/stateTrieSync/stateTrieSync_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index 175f3a3c460..2704aa1fd4c 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -3,7 +3,6 @@ package stateTrieSync import ( "context" "fmt" - "github.com/multiversx/mx-chain-go/common/errChan" "math/big" "strconv" "testing" @@ -12,6 +11,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/throttler" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/epochStart/notifier" "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/process/factory" From c7107d905e983420bc551105cd7802291f12ed35 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 10 Mar 2023 16:38:23 +0200 Subject: [PATCH 181/335] return nil error for missing account but empty guardian data --- node/node.go | 4 ++++ node/node_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/node/node.go b/node/node.go index a16bec3c069..ff4323fb90d 100644 --- a/node/node.go +++ b/node/node.go @@ -348,6 +348,10 @@ func (n *Node) GetValueForKey(address string, key string, options api.AccountQue func (n *Node) GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { + apiBlockInfo, ok := extractApiBlockInfoIfErrAccountNotFoundAtBlock(err) + if ok { + return api.GuardianData{}, apiBlockInfo, nil + } return api.GuardianData{}, api.BlockInfo{}, err } diff --git a/node/node_test.go b/node/node_test.go index 7e91a5982cc..2b41cdd0490 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4168,6 +4168,38 @@ func TestNode_GetGuardianData(t *testing.T) { require.NotNil(t, err) require.True(t, strings.Contains(err.Error(), "invalid address")) }) + t.Run("error on loadUserAccountHandlerByAddress but extractApiBlockInfoIfErrAccountNotFoundAtBlock ok", func(t *testing.T) { + providedBlockInfo := holders.NewBlockInfo([]byte{0xaa}, 7, []byte{0xbb}) + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(providedBlockInfo) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) + require.Equal(t, api.GuardianData{}, guardianData) + expectedBlockInfo := api.BlockInfo{ + Nonce: providedBlockInfo.GetNonce(), + Hash: hex.EncodeToString(providedBlockInfo.GetHash()), + RootHash: hex.EncodeToString(providedBlockInfo.GetRootHash()), + } + require.Equal(t, expectedBlockInfo, blockInfo) + require.Nil(t, err) + }) t.Run("getPendingAndActiveGuardians with error", func(t *testing.T) { expectedError := errors.New("expected error") bootstrapComponents := getDefaultBootstrapComponents() From c240bea8cbee643528f4b1c16376a72ae741586b Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 10 Mar 2023 17:16:11 +0200 Subject: [PATCH 182/335] - fixed dependabot issues on external libs --- go.mod | 24 +++++++++++++----------- go.sum | 44 +++++++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 9b47348a875..1cc95cc3102 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible github.com/stretchr/testify v1.8.1 github.com/urfave/cli v1.22.10 - golang.org/x/crypto v0.5.0 + golang.org/x/crypto v0.7.0 gopkg.in/go-playground/validator.v8 v8.18.2 ) @@ -72,17 +72,18 @@ require ( github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/herumi/bls-go-binary v1.0.0 // indirect github.com/huin/goupnp v1.0.3 // indirect - github.com/ipfs/go-cid v0.2.0 // indirect + github.com/ipfs/go-cid v0.3.2 // indirect github.com/ipfs/go-datastore v0.5.1 // indirect github.com/ipfs/go-ipfs-util v0.0.2 // indirect github.com/ipfs/go-ipns v0.2.0 // indirect github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect - github.com/ipld/go-ipld-prime v0.9.0 // indirect + github.com/ipld/go-ipld-prime v0.19.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/json-iterator/go v1.1.12 // indirect + github.com/jtolds/gls v4.20.0+incompatible // indirect github.com/klauspost/compress v1.15.1 // indirect github.com/klauspost/cpuid/v2 v2.1.0 // indirect github.com/koron/go-ssdp v0.0.3 // indirect @@ -127,7 +128,7 @@ require ( github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.1.1 // indirect - github.com/multiformats/go-multicodec v0.5.0 // indirect + github.com/multiformats/go-multicodec v0.6.0 // indirect github.com/multiformats/go-multihash v0.2.1 // indirect github.com/multiformats/go-multistream v0.3.3 // indirect github.com/multiformats/go-varint v0.0.6 // indirect @@ -141,7 +142,7 @@ require ( github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 // indirect + github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e // indirect github.com/prometheus/client_golang v1.12.1 // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.37.0 // indirect @@ -149,6 +150,7 @@ require ( github.com/raulk/go-watchdog v1.3.0 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/smartystreets/assertions v1.13.0 // indirect github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect @@ -167,12 +169,12 @@ require ( go.uber.org/multierr v1.8.0 // indirect go.uber.org/zap v1.22.0 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/net v0.7.0 // indirect - golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect - golang.org/x/sys v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - golang.org/x/tools v0.1.12 // indirect + golang.org/x/mod v0.8.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + golang.org/x/tools v0.6.0 // indirect google.golang.org/protobuf v1.28.1 // indirect gopkg.in/go-playground/assert.v1 v1.2.1 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect diff --git a/go.sum b/go.sum index 184ca5a99e7..bc8b955046a 100644 --- a/go.sum +++ b/go.sum @@ -167,6 +167,8 @@ github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwU github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= @@ -274,8 +276,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -336,8 +339,9 @@ github.com/ipfs/go-cid v0.0.3/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUP github.com/ipfs/go-cid v0.0.4/go.mod h1:4LLaPOQwmk5z9LBgQnpkivrx8BJjUyGwTXCd5Xfj6+M= github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.2.0 h1:01JTiihFq9en9Vz0lc0VDWvZe/uBonGpzo4THP0vcQ0= github.com/ipfs/go-cid v0.2.0/go.mod h1:P+HXFDF4CVhaVayiEb4wkAy7zBHxBwsJyt0Y5U6MLro= +github.com/ipfs/go-cid v0.3.2 h1:OGgOd+JCFM+y1DjWPmVH+2/4POtpDzwcr7VgnB7mZXc= +github.com/ipfs/go-cid v0.3.2/go.mod h1:gQ8pKqT/sUxGY+tIwy1RPpAojYu7jAyCp5Tz1svoupw= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= @@ -370,8 +374,9 @@ github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Ax github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipld/go-ipld-prime v0.9.0 h1:N2OjJMb+fhyFPwPnVvJcWU/NsumP8etal+d2v3G4eww= github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= +github.com/ipld/go-ipld-prime v0.19.0 h1:5axC7rJmPc17Emw6TelxGwnzALk0PdupZ2oj2roDj04= +github.com/ipld/go-ipld-prime v0.19.0/go.mod h1:Q9j3BaVXwaA3o5JUDNvptDDr/x8+F7FG6XJ8WI3ILg4= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= @@ -588,8 +593,9 @@ github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPw github.com/multiformats/go-multibase v0.1.1 h1:3ASCDsuLX8+j4kx58qnJ4YFq/JWTJpCyDW27ztsVTOI= github.com/multiformats/go-multibase v0.1.1/go.mod h1:ZEjHE+IsUrgp5mhlEAYjMtZwK1k4haNkcaPg9aoe1a8= github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.5.0 h1:EgU6cBe/D7WRwQb1KmnBvU7lrcFGMggZVTPtOW9dDHs= github.com/multiformats/go-multicodec v0.5.0/go.mod h1:DiY2HFaEp5EhEXb/iYzVAunmyX/aSFMxq2KMKfWEues= +github.com/multiformats/go-multicodec v0.6.0 h1:KhH2kSuCARyuJraYMFxrNO3DqIaYhOdS039kbhgVwpE= +github.com/multiformats/go-multicodec v0.6.0/go.mod h1:GUC8upxSBE4oG+q3kWZRw/+6yC1BqO550bjhWsJbZlw= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= github.com/multiformats/go-multihash v0.0.9/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -681,8 +687,9 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1 h1:CskT+S6Ay54OwxBGB0R3Rsx4Muto6UnEYTyKJbyRIAI= github.com/polydawn/refmt v0.0.0-20190807091052-3d65705ee9f1/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= +github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e h1:ZOcivgkkFRnjfoTcGsDq3UQYiBmekwLA+qg0OjyB/ls= +github.com/polydawn/refmt v0.0.0-20201211092308-30ac6d18308e/go.mod h1:uIp+gprXxxrWSjjklXD+mN4wed/tMfjMMmN/9+JsA9o= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -753,8 +760,9 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.13.0 h1:Dx1kYM01xsSqKPno3aqLnrwac2LetPvN23diwyr69Qs= +github.com/smartystreets/assertions v1.13.0/go.mod h1:wDmR7qL282YbGsPy6H/yAsesrxfxaaSlJazyFLYVFx8= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/smola/gocompat v0.2.0/go.mod h1:1B0MlxbmoZNo3h8guHp8HztB3BSYR5itql9qtVc0ypY= @@ -816,6 +824,7 @@ github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60Nt github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= +github.com/warpfork/go-testmark v0.10.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= @@ -895,8 +904,9 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= +golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -932,8 +942,9 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20211013180041-c96bc1413d57/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -990,8 +1001,10 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1014,8 +1027,9 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1093,14 +1107,16 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1111,8 +1127,9 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1170,8 +1187,9 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.8-0.20211029000441-d6a9af8af023/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 1b703d90f80b5798d687f5b56e9a67872eeb0e71 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 13 Mar 2023 10:29:03 +0200 Subject: [PATCH 183/335] upgrade indexer --- go.mod | 2 +- go.sum | 4 ++-- vm/systemSmartContracts/esdt.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index b3193c94a46..5c63c6a5ffa 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-core-go v1.1.33 github.com/multiversx/mx-chain-crypto-go v1.2.5 - github.com/multiversx/mx-chain-es-indexer-go v1.3.13 + github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313082458-2979bd238821 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.10 github.com/multiversx/mx-chain-storage-go v1.0.7 diff --git a/go.sum b/go.sum index 7595f688474..4585429b608 100644 --- a/go.sum +++ b/go.sum @@ -601,8 +601,8 @@ github.com/multiversx/mx-chain-core-go v1.1.33 h1:qk+TlaOhHpu+9VncL3yowjY4KU8uJ0 github.com/multiversx/mx-chain-core-go v1.1.33/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= 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.3.13 h1:n32q0Xe6YfUIjfK3ryKe70WnsBQseaDrwb2tGDpTTAk= -github.com/multiversx/mx-chain-es-indexer-go v1.3.13/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313082458-2979bd238821 h1:SI+9VI+4VJUdOmUO7hQAY81tN523UI1e3TH7Eu31DxE= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313082458-2979bd238821/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= 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.10 h1:CYCuI0SP8Pt9K0TcJjUyxK7ByvWi2FXNUihy0iCEVIA= diff --git a/vm/systemSmartContracts/esdt.go b/vm/systemSmartContracts/esdt.go index 89a8ad39772..4f49327ac0b 100644 --- a/vm/systemSmartContracts/esdt.go +++ b/vm/systemSmartContracts/esdt.go @@ -427,7 +427,7 @@ func (e *esdt) registerMetaESDT(args *vmcommon.ContractCallInput) vmcommon.Retur logEntry := &vmcommon.LogEntry{ Identifier: []byte(args.Function), Address: args.CallerAddr, - Topics: [][]byte{tokenIdentifier, args.Arguments[0], args.Arguments[1], []byte(metaESDT)}, + Topics: [][]byte{tokenIdentifier, args.Arguments[0], args.Arguments[1], []byte(metaESDT), big.NewInt(int64(numOfDecimals)).Bytes()}, } e.eei.AddLogEntry(logEntry) From a1304ac4ff380999148653296816cf33f0b55363 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Mon, 13 Mar 2023 12:21:47 +0200 Subject: [PATCH 184/335] always return empty responses when accounts are not found --- node/node.go | 64 +++++++++-- node/node_test.go | 287 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 342 insertions(+), 9 deletions(-) diff --git a/node/node.go b/node/node.go index ce56b3a02e4..d7dfdb95786 100644 --- a/node/node.go +++ b/node/node.go @@ -157,13 +157,11 @@ func (n *Node) GetConsensusGroupSize() int { func (n *Node) GetBalance(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - apiBlockInfo, ok := extractApiBlockInfoIfErrAccountNotFoundAtBlock(err) - if ok { - return big.NewInt(0), apiBlockInfo, nil - } - if err == ErrCannotCastAccountHandlerToUserAccountHandler { - return big.NewInt(0), api.BlockInfo{}, nil + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { + return big.NewInt(0), adaptedBlockInfo, nil } + return nil, api.BlockInfo{}, err } @@ -174,6 +172,11 @@ func (n *Node) GetBalance(address string, options api.AccountQueryOptions) (*big func (n *Node) GetUsername(address string, options api.AccountQueryOptions) (string, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { + return "", adaptedBlockInfo, nil + } + return "", api.BlockInfo{}, err } @@ -185,6 +188,11 @@ func (n *Node) GetUsername(address string, options api.AccountQueryOptions) (str func (n *Node) GetCodeHash(address string, options api.AccountQueryOptions) ([]byte, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { + return make([]byte, 0), adaptedBlockInfo, nil + } + return nil, api.BlockInfo{}, err } @@ -200,6 +208,7 @@ func (n *Node) GetAllIssuedESDTs(tokenType string, ctx context.Context) ([]strin userAccount, _, err := n.loadUserAccountHandlerByPubKey(vm.ESDTSCAddress, api.AccountQueryOptions{}) if err != nil { + // don't return 0 values here - not finding the ESDT SC address is an error that should be returned return nil, err } @@ -277,6 +286,11 @@ func (n *Node) getEsdtDataFromLeaf(leaf core.KeyValueHolder, userAccount state.U func (n *Node) GetKeyValuePairs(address string, options api.AccountQueryOptions, ctx context.Context) (map[string]string, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { + return make(map[string]string), adaptedBlockInfo, nil + } + return nil, api.BlockInfo{}, err } @@ -331,6 +345,11 @@ func (n *Node) GetValueForKey(address string, key string, options api.AccountQue userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { + return "", adaptedBlockInfo, nil + } + return "", api.BlockInfo{}, err } @@ -347,6 +366,13 @@ func (n *Node) GetESDTData(address, tokenID string, nonce uint64, options api.Ac // TODO: refactor here as to ensure userAccount and systemAccount are on the same root-hash userAccount, _, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { + return &esdt.ESDigitalToken{ + Value: big.NewInt(0), + }, adaptedBlockInfo, nil + } + return nil, api.BlockInfo{}, err } @@ -512,6 +538,11 @@ func (n *Node) GetAllESDTTokens(address string, options api.AccountQueryOptions, // TODO: refactor here as to ensure userAccount and systemAccount are on the same root-hash userAccount, _, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { + return make(map[string]*esdt.ESDigitalToken), adaptedBlockInfo, nil + } + return nil, api.BlockInfo{}, err } @@ -839,13 +870,13 @@ func (n *Node) CreateTransaction( func (n *Node) GetAccount(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { account, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - apiBlockInfo, ok := extractApiBlockInfoIfErrAccountNotFoundAtBlock(err) - if ok { + adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) + if adaptErr == nil { return api.AccountResponse{ Address: address, Balance: "0", DeveloperReward: "0", - }, apiBlockInfo, nil + }, adaptedBlockInfo, nil } return api.AccountResponse{}, api.BlockInfo{}, err @@ -870,6 +901,21 @@ func (n *Node) GetAccount(address string, options api.AccountQueryOptions) (api. }, blockInfo, nil } +func adaptBlockInfoIfError(err error) (api.BlockInfo, error) { + if err == nil { + return api.BlockInfo{}, nil + } + + apiBlockInfo, ok := extractApiBlockInfoIfErrAccountNotFoundAtBlock(err) + if ok { + return apiBlockInfo, nil + } + if err == ErrCannotCastAccountHandlerToUserAccountHandler { + return api.BlockInfo{}, nil + } + return api.BlockInfo{}, err +} + // GetCode returns the code for the given code hash func (n *Node) GetCode(codeHash []byte, options api.AccountQueryOptions) ([]byte, api.BlockInfo) { return n.loadAccountCode(codeHash, options) diff --git a/node/node_test.go b/node/node_test.go index 59d0c18cfc9..40479c69e22 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -62,6 +62,25 @@ import ( "github.com/stretchr/testify/require" ) +type testBlockInfo struct { +} + +func (t testBlockInfo) asApiResult() api.BlockInfo { + return api.BlockInfo{ + Nonce: 37, + Hash: hex.EncodeToString([]byte("hash")), + RootHash: hex.EncodeToString([]byte("root")), + } +} + +func (t testBlockInfo) asForProcessing() common.BlockInfo { + hash := []byte("hash") + rHash := []byte("root") + return holders.NewBlockInfo(hash, 37, rHash) +} + +var dummyBlockInfo = testBlockInfo{} + func createMockPubkeyConverter() *mock.PubkeyConverterMock { return mock.NewPubkeyConverterMock(32) } @@ -192,6 +211,44 @@ func TestGetBalance_AccountNotFoundShouldReturnZeroBalance(t *testing.T) { assert.Equal(t, big.NewInt(0), balance) } +func TestNode_GetBalanceAccNotFoundShouldReturnEmpty(t *testing.T) { + t.Parallel() + + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + + dataComponents := getDefaultDataComponents() + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + balance, bInfo, err := n.GetBalance(testscommon.TestAddressAlice, api.AccountQueryOptions{}) + require.Nil(t, err) + require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Empty(t, balance) +} + func TestGetBalance(t *testing.T) { t.Parallel() @@ -256,6 +313,44 @@ func TestGetUsername(t *testing.T) { assert.Equal(t, string(expectedUsername), username) } +func TestNode_GetCodeHashAccNotFoundShouldReturnEmpty(t *testing.T) { + t.Parallel() + + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + + dataComponents := getDefaultDataComponents() + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + codeHash, bInfo, err := n.GetCodeHash("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", api.AccountQueryOptions{}) + require.Nil(t, err) + require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Empty(t, codeHash) +} + func TestGetCodeHash(t *testing.T) { t.Parallel() @@ -289,6 +384,44 @@ func TestGetCodeHash(t *testing.T) { assert.Equal(t, expectedCodeHash, codeHash) } +func TestNode_GetKeyValuePairsAccNotFoundShouldReturnEmpty(t *testing.T) { + t.Parallel() + + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + + dataComponents := getDefaultDataComponents() + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + pairs, bInfo, err := n.GetKeyValuePairs(testscommon.TestAddressAlice, api.AccountQueryOptions{}, context.Background()) + require.Nil(t, err) + require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Len(t, pairs, 0) +} + func TestNode_GetKeyValuePairs(t *testing.T) { t.Parallel() @@ -469,6 +602,44 @@ func TestNode_GetKeyValuePairsContextShouldTimeout(t *testing.T) { assert.Equal(t, node.ErrTrieOperationsTimeout, err) } +func TestNode_GetValueForKeyAccNotFoundShouldReturnEmpty(t *testing.T) { + t.Parallel() + + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + + dataComponents := getDefaultDataComponents() + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + value, bInfo, err := n.GetValueForKey(testscommon.TestAddressAlice, "0a0a", api.AccountQueryOptions{}) + require.Nil(t, err) + require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Empty(t, value) +} + func TestNode_GetValueForKey(t *testing.T) { t.Parallel() @@ -511,6 +682,46 @@ func TestNode_GetValueForKey(t *testing.T) { assert.Equal(t, hex.EncodeToString(v1), value) } +func TestNode_GetESDTDataAccNotFoundShouldReturnEmpty(t *testing.T) { + t.Parallel() + + esdtToken := "newToken" + + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + + dataComponents := getDefaultDataComponents() + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + esdtTokenData, bInfo, err := n.GetESDTData(testscommon.TestAddressAlice, esdtToken, 0, api.AccountQueryOptions{}) + require.Nil(t, err) + require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, "0", esdtTokenData.Value.String()) +} + func TestNode_GetESDTData(t *testing.T) { t.Parallel() @@ -787,6 +998,44 @@ func TestNode_GetAllESDTTokensContextShouldTimeout(t *testing.T) { assert.Equal(t, node.ErrTrieOperationsTimeout, err) } +func TestNode_GetAllESDTsAccNotFoundShouldReturnEmpty(t *testing.T) { + t.Parallel() + + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + + dataComponents := getDefaultDataComponents() + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + tokens, bInfo, err := n.GetAllESDTTokens(testscommon.TestAddressAlice, api.AccountQueryOptions{}, context.Background()) + require.Nil(t, err) + require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Len(t, tokens, 0) +} + func TestNode_GetAllESDTTokensShouldReturnEsdtAndFormattedNft(t *testing.T) { t.Parallel() @@ -2941,6 +3190,44 @@ func TestNode_GetAccountAccountsRepositoryFailsShouldErr(t *testing.T) { assert.ErrorIs(t, err, errExpected) } +func TestNode_GetAccountAccNotFoundShouldReturnEmpty(t *testing.T) { + t.Parallel() + + accDB := &stateMock.AccountsStub{ + GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + }, + RecreateTrieCalled: func(_ []byte) error { + return nil + }, + } + + dataComponents := getDefaultDataComponents() + coreComponents := getDefaultCoreComponents() + coreComponents.IntMarsh = getMarshalizer() + coreComponents.VmMarsh = getMarshalizer() + coreComponents.Hash = getHasher() + + stateComponents := getDefaultStateComponents() + args := state.ArgsAccountsRepository{ + FinalStateAccountsWrapper: accDB, + CurrentStateAccountsWrapper: accDB, + HistoricalStateAccountsWrapper: accDB, + } + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + + n, _ := node.NewNode( + node.WithDataComponents(dataComponents), + node.WithCoreComponents(coreComponents), + node.WithStateComponents(stateComponents), + ) + + acc, bInfo, err := n.GetAccount(testscommon.TestAddressAlice, api.AccountQueryOptions{}) + require.Nil(t, err) + require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, api.AccountResponse{Address: testscommon.TestAddressAlice, Balance: "0", DeveloperReward: "0"}, acc) +} + func TestNode_GetAccountAccountExistsShouldReturn(t *testing.T) { t.Parallel() From e2dea11a0b32856d57fc1e4ba0884fab79d526d2 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Mon, 13 Mar 2023 13:55:17 +0200 Subject: [PATCH 185/335] fixes after review --- node/node.go | 44 +++++++++++++++++++++++--------------------- node/node_test.go | 32 ++++++++++++++++---------------- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/node/node.go b/node/node.go index d7dfdb95786..b6553c127ed 100644 --- a/node/node.go +++ b/node/node.go @@ -157,8 +157,8 @@ func (n *Node) GetConsensusGroupSize() int { func (n *Node) GetBalance(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return big.NewInt(0), adaptedBlockInfo, nil } @@ -172,8 +172,8 @@ func (n *Node) GetBalance(address string, options api.AccountQueryOptions) (*big func (n *Node) GetUsername(address string, options api.AccountQueryOptions) (string, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return "", adaptedBlockInfo, nil } @@ -188,8 +188,8 @@ func (n *Node) GetUsername(address string, options api.AccountQueryOptions) (str func (n *Node) GetCodeHash(address string, options api.AccountQueryOptions) ([]byte, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return make([]byte, 0), adaptedBlockInfo, nil } @@ -286,8 +286,8 @@ func (n *Node) getEsdtDataFromLeaf(leaf core.KeyValueHolder, userAccount state.U func (n *Node) GetKeyValuePairs(address string, options api.AccountQueryOptions, ctx context.Context) (map[string]string, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return make(map[string]string), adaptedBlockInfo, nil } @@ -345,8 +345,8 @@ func (n *Node) GetValueForKey(address string, key string, options api.AccountQue userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return "", adaptedBlockInfo, nil } @@ -366,8 +366,8 @@ func (n *Node) GetESDTData(address, tokenID string, nonce uint64, options api.Ac // TODO: refactor here as to ensure userAccount and systemAccount are on the same root-hash userAccount, _, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return &esdt.ESDigitalToken{ Value: big.NewInt(0), }, adaptedBlockInfo, nil @@ -538,8 +538,8 @@ func (n *Node) GetAllESDTTokens(address string, options api.AccountQueryOptions, // TODO: refactor here as to ensure userAccount and systemAccount are on the same root-hash userAccount, _, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return make(map[string]*esdt.ESDigitalToken), adaptedBlockInfo, nil } @@ -870,8 +870,8 @@ func (n *Node) CreateTransaction( func (n *Node) GetAccount(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { account, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - adaptedBlockInfo, adaptErr := adaptBlockInfoIfError(err) - if adaptErr == nil { + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { return api.AccountResponse{ Address: address, Balance: "0", @@ -901,19 +901,21 @@ func (n *Node) GetAccount(address string, options api.AccountQueryOptions) (api. }, blockInfo, nil } -func adaptBlockInfoIfError(err error) (api.BlockInfo, error) { +func extractBlockInfoIfNewAccount(err error) (api.BlockInfo, bool) { if err == nil { - return api.BlockInfo{}, nil + return api.BlockInfo{}, true } apiBlockInfo, ok := extractApiBlockInfoIfErrAccountNotFoundAtBlock(err) if ok { - return apiBlockInfo, nil + return apiBlockInfo, true } + // we need this check since (in some situations) this error is also returned when a nil account handler is passed (empty account) if err == ErrCannotCastAccountHandlerToUserAccountHandler { - return api.BlockInfo{}, nil + return api.BlockInfo{}, true } - return api.BlockInfo{}, err + + return api.BlockInfo{}, false } // GetCode returns the code for the given code hash diff --git a/node/node_test.go b/node/node_test.go index 40479c69e22..c1d1b47a4a4 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -65,7 +65,7 @@ import ( type testBlockInfo struct { } -func (t testBlockInfo) asApiResult() api.BlockInfo { +func (t testBlockInfo) apiResult() api.BlockInfo { return api.BlockInfo{ Nonce: 37, Hash: hex.EncodeToString([]byte("hash")), @@ -73,7 +73,7 @@ func (t testBlockInfo) asApiResult() api.BlockInfo { } } -func (t testBlockInfo) asForProcessing() common.BlockInfo { +func (t testBlockInfo) forProcessing() common.BlockInfo { hash := []byte("hash") rHash := []byte("root") return holders.NewBlockInfo(hash, 37, rHash) @@ -216,7 +216,7 @@ func TestNode_GetBalanceAccNotFoundShouldReturnEmpty(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.forProcessing()) }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -245,7 +245,7 @@ func TestNode_GetBalanceAccNotFoundShouldReturnEmpty(t *testing.T) { balance, bInfo, err := n.GetBalance(testscommon.TestAddressAlice, api.AccountQueryOptions{}) require.Nil(t, err) - require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, dummyBlockInfo.apiResult(), bInfo) require.Empty(t, balance) } @@ -318,7 +318,7 @@ func TestNode_GetCodeHashAccNotFoundShouldReturnEmpty(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.forProcessing()) }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -347,7 +347,7 @@ func TestNode_GetCodeHashAccNotFoundShouldReturnEmpty(t *testing.T) { codeHash, bInfo, err := n.GetCodeHash("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", api.AccountQueryOptions{}) require.Nil(t, err) - require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, dummyBlockInfo.apiResult(), bInfo) require.Empty(t, codeHash) } @@ -389,7 +389,7 @@ func TestNode_GetKeyValuePairsAccNotFoundShouldReturnEmpty(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.forProcessing()) }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -418,7 +418,7 @@ func TestNode_GetKeyValuePairsAccNotFoundShouldReturnEmpty(t *testing.T) { pairs, bInfo, err := n.GetKeyValuePairs(testscommon.TestAddressAlice, api.AccountQueryOptions{}, context.Background()) require.Nil(t, err) - require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, dummyBlockInfo.apiResult(), bInfo) require.Len(t, pairs, 0) } @@ -607,7 +607,7 @@ func TestNode_GetValueForKeyAccNotFoundShouldReturnEmpty(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.forProcessing()) }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -636,7 +636,7 @@ func TestNode_GetValueForKeyAccNotFoundShouldReturnEmpty(t *testing.T) { value, bInfo, err := n.GetValueForKey(testscommon.TestAddressAlice, "0a0a", api.AccountQueryOptions{}) require.Nil(t, err) - require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, dummyBlockInfo.apiResult(), bInfo) require.Empty(t, value) } @@ -689,7 +689,7 @@ func TestNode_GetESDTDataAccNotFoundShouldReturnEmpty(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.forProcessing()) }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -718,7 +718,7 @@ func TestNode_GetESDTDataAccNotFoundShouldReturnEmpty(t *testing.T) { esdtTokenData, bInfo, err := n.GetESDTData(testscommon.TestAddressAlice, esdtToken, 0, api.AccountQueryOptions{}) require.Nil(t, err) - require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, dummyBlockInfo.apiResult(), bInfo) require.Equal(t, "0", esdtTokenData.Value.String()) } @@ -1003,7 +1003,7 @@ func TestNode_GetAllESDTsAccNotFoundShouldReturnEmpty(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.forProcessing()) }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -1032,7 +1032,7 @@ func TestNode_GetAllESDTsAccNotFoundShouldReturnEmpty(t *testing.T) { tokens, bInfo, err := n.GetAllESDTTokens(testscommon.TestAddressAlice, api.AccountQueryOptions{}, context.Background()) require.Nil(t, err) - require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, dummyBlockInfo.apiResult(), bInfo) require.Len(t, tokens, 0) } @@ -3195,7 +3195,7 @@ func TestNode_GetAccountAccNotFoundShouldReturnEmpty(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.asForProcessing()) + return nil, nil, state.NewErrAccountNotFoundAtBlock(dummyBlockInfo.forProcessing()) }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -3224,7 +3224,7 @@ func TestNode_GetAccountAccNotFoundShouldReturnEmpty(t *testing.T) { acc, bInfo, err := n.GetAccount(testscommon.TestAddressAlice, api.AccountQueryOptions{}) require.Nil(t, err) - require.Equal(t, dummyBlockInfo.asApiResult(), bInfo) + require.Equal(t, dummyBlockInfo.apiResult(), bInfo) require.Equal(t, api.AccountResponse{Address: testscommon.TestAddressAlice, Balance: "0", DeveloperReward: "0"}, acc) } From 330e9c1a82d7059f87a9c99d2ec372a09b2933da Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 13 Mar 2023 14:42:55 +0200 Subject: [PATCH 186/335] last commit --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 5c63c6a5ffa..4b9a0ef7275 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-core-go v1.1.33 github.com/multiversx/mx-chain-crypto-go v1.2.5 - github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313082458-2979bd238821 + github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313121143-b267eb5f6eb4 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.10 github.com/multiversx/mx-chain-storage-go v1.0.7 diff --git a/go.sum b/go.sum index 4585429b608..cd78bc5db3b 100644 --- a/go.sum +++ b/go.sum @@ -601,8 +601,8 @@ github.com/multiversx/mx-chain-core-go v1.1.33 h1:qk+TlaOhHpu+9VncL3yowjY4KU8uJ0 github.com/multiversx/mx-chain-core-go v1.1.33/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= 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.3.14-0.20230313082458-2979bd238821 h1:SI+9VI+4VJUdOmUO7hQAY81tN523UI1e3TH7Eu31DxE= -github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313082458-2979bd238821/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313121143-b267eb5f6eb4 h1:IBqfuSt2L3nTO3DHIOcdCGoEL9Y/RPTSviNxGFZQV8I= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313121143-b267eb5f6eb4/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= 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.10 h1:CYCuI0SP8Pt9K0TcJjUyxK7ByvWi2FXNUihy0iCEVIA= From ece55424a44cb53bbbbf60a1f6980f0302efd717 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Mon, 13 Mar 2023 16:31:05 +0200 Subject: [PATCH 187/335] use normal PersisterTracker if processing mode is import db --- common/configParser.go | 9 ++++ epochStart/bootstrap/metaStorageHandler.go | 2 + .../bootstrap/metaStorageHandler_test.go | 15 +++--- epochStart/bootstrap/process.go | 6 +++ epochStart/bootstrap/shardStorageHandler.go | 2 + .../bootstrap/shardStorageHandler_test.go | 49 ++++++++++--------- factory/bootstrap/bootstrapComponents.go | 1 + factory/data/dataComponents.go | 5 ++ factory/processing/processComponents.go | 1 + .../startInEpoch/startInEpoch_test.go | 2 + node/nodeRunner.go | 7 +-- storage/factory/pruningStorerFactory.go | 6 ++- testscommon/components/components.go | 1 + 13 files changed, 70 insertions(+), 36 deletions(-) diff --git a/common/configParser.go b/common/configParser.go index 77a46161a71..bc814990528 100644 --- a/common/configParser.go +++ b/common/configParser.go @@ -163,3 +163,12 @@ func GetSkBytesFromP2pKey(p2pKeyFilename string) ([]byte, error) { return skBytes, nil } + +// GetNodeProcessingMode returns the node processing mode based on the provided config +func GetNodeProcessingMode(importDbConfig *config.ImportDbConfig) NodeProcessingMode { + if importDbConfig.IsImportDBMode { + return ImportDb + } + + return Normal +} diff --git a/epochStart/bootstrap/metaStorageHandler.go b/epochStart/bootstrap/metaStorageHandler.go index 53c77c23fd0..9f9df9e9880 100644 --- a/epochStart/bootstrap/metaStorageHandler.go +++ b/epochStart/bootstrap/metaStorageHandler.go @@ -36,6 +36,7 @@ func NewMetaStorageHandler( currentEpoch uint32, uint64Converter typeConverters.Uint64ByteSliceConverter, nodeTypeProvider NodeTypeProviderHandler, + nodeProcessingMode common.NodeProcessingMode, ) (*metaStorageHandler, error) { epochStartNotifier := &disabled.EpochStartNotifier{} storageFactory, err := factory.NewStorageServiceFactory( @@ -49,6 +50,7 @@ func NewMetaStorageHandler( CurrentEpoch: currentEpoch, StorageType: factory.BootstrapStorageService, CreateTrieEpochRootHashStorer: false, + NodeProcessingMode: nodeProcessingMode, }, ) if err != nil { diff --git a/epochStart/bootstrap/metaStorageHandler_test.go b/epochStart/bootstrap/metaStorageHandler_test.go index 732c617304f..ac5a3ed13b0 100644 --- a/epochStart/bootstrap/metaStorageHandler_test.go +++ b/epochStart/bootstrap/metaStorageHandler_test.go @@ -10,6 +10,7 @@ import ( "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/block" + "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/epochStart/mock" @@ -33,7 +34,7 @@ func TestNewMetaStorageHandler_InvalidConfigErr(t *testing.T) { uit64Cvt := &mock.Uint64ByteSliceConverterMock{} nodeTypeProvider := &nodeTypeProviderMock.NodeTypeProviderStub{} - mtStrHandler, err := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider) + mtStrHandler, err := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider, common.Normal) assert.True(t, check.IfNil(mtStrHandler)) assert.NotNil(t, err) } @@ -51,7 +52,7 @@ func TestNewMetaStorageHandler_CreateForMetaErr(t *testing.T) { hasher := &hashingMocks.HasherMock{} uit64Cvt := &mock.Uint64ByteSliceConverterMock{} nodeTypeProvider := &nodeTypeProviderMock.NodeTypeProviderStub{} - mtStrHandler, err := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider) + mtStrHandler, err := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider, common.Normal) assert.False(t, check.IfNil(mtStrHandler)) assert.Nil(t, err) } @@ -70,7 +71,7 @@ func TestMetaStorageHandler_saveLastHeader(t *testing.T) { uit64Cvt := &mock.Uint64ByteSliceConverterMock{} nodeTypeProvider := &nodeTypeProviderMock.NodeTypeProviderStub{} - mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider) + mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider, common.Normal) header := &block.MetaBlock{Nonce: 0} @@ -98,7 +99,7 @@ func TestMetaStorageHandler_saveLastCrossNotarizedHeaders(t *testing.T) { uit64Cvt := &mock.Uint64ByteSliceConverterMock{} nodeTypeProvider := &nodeTypeProviderMock.NodeTypeProviderStub{} - mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider) + mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider, common.Normal) hdr1 := &block.Header{Nonce: 1} hdr2 := &block.Header{Nonce: 2} @@ -132,7 +133,7 @@ func TestMetaStorageHandler_saveTriggerRegistry(t *testing.T) { uit64Cvt := &mock.Uint64ByteSliceConverterMock{} nodeTypeProvider := &nodeTypeProviderMock.NodeTypeProviderStub{} - mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider) + mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider, common.Normal) components := &ComponentsNeededForBootstrap{ EpochStartMetaBlock: &block.MetaBlock{Nonce: 3}, @@ -157,7 +158,7 @@ func TestMetaStorageHandler_saveDataToStorage(t *testing.T) { uit64Cvt := &mock.Uint64ByteSliceConverterMock{} nodeTypeProvider := &nodeTypeProviderMock.NodeTypeProviderStub{} - mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider) + mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider, common.Normal) components := &ComponentsNeededForBootstrap{ EpochStartMetaBlock: &block.MetaBlock{Nonce: 3}, @@ -199,7 +200,7 @@ func testMetaWithMissingStorer(missingUnit dataRetriever.UnitType, atCallNumber uit64Cvt := &mock.Uint64ByteSliceConverterMock{} nodeTypeProvider := &nodeTypeProviderMock.NodeTypeProviderStub{} - mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider) + mtStrHandler, _ := NewMetaStorageHandler(gCfg, prefsConfig, coordinator, pathManager, marshalizer, hasher, 1, uit64Cvt, nodeTypeProvider, common.Normal) counter := 0 mtStrHandler.storageService = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { diff --git a/epochStart/bootstrap/process.go b/epochStart/bootstrap/process.go index 7ae86c77f98..1d7ea39dbae 100644 --- a/epochStart/bootstrap/process.go +++ b/epochStart/bootstrap/process.go @@ -114,6 +114,7 @@ type epochStartBootstrap struct { checkNodesOnDisk bool bootstrapHeartbeatSender update.Closer trieSyncStatisticsProvider common.SizeSyncStatisticsHandler + nodeProcessingMode common.NodeProcessingMode // created components requestHandler process.RequestHandler @@ -177,6 +178,7 @@ type ArgsEpochStartBootstrap struct { DataSyncerCreator types.ScheduledDataSyncerCreator ScheduledSCRsStorer storage.Storer TrieSyncStatisticsProvider common.SizeSyncStatisticsHandler + NodeProcessingMode common.NodeProcessingMode } type dataToSync struct { @@ -223,6 +225,7 @@ func NewEpochStartBootstrap(args ArgsEpochStartBootstrap) (*epochStartBootstrap, storerScheduledSCRs: args.ScheduledSCRsStorer, shardCoordinator: args.GenesisShardCoordinator, trieSyncStatisticsProvider: args.TrieSyncStatisticsProvider, + nodeProcessingMode: args.NodeProcessingMode, } whiteListCache, err := storageunit.NewCache(storageFactory.GetCacherFromConfig(epochStartProvider.generalConfig.WhiteListPool)) @@ -756,6 +759,7 @@ func (e *epochStartBootstrap) requestAndProcessForMeta(peerMiniBlocks []*block.M e.epochStartMeta.GetEpoch(), e.coreComponentsHolder.Uint64ByteSliceConverter(), e.coreComponentsHolder.NodeTypeProvider(), + e.nodeProcessingMode, ) if err != nil { return err @@ -922,6 +926,7 @@ func (e *epochStartBootstrap) requestAndProcessForShard(peerMiniBlocks []*block. e.baseData.lastEpoch, e.coreComponentsHolder.Uint64ByteSliceConverter(), e.coreComponentsHolder.NodeTypeProvider(), + e.nodeProcessingMode, ) if err != nil { return err @@ -1103,6 +1108,7 @@ func (e *epochStartBootstrap) createStorageService( CurrentEpoch: startEpoch, StorageType: storageFactory.BootstrapStorageService, CreateTrieEpochRootHashStorer: createTrieEpochRootHashStorer, + NodeProcessingMode: e.nodeProcessingMode, }) if err != nil { return nil, err diff --git a/epochStart/bootstrap/shardStorageHandler.go b/epochStart/bootstrap/shardStorageHandler.go index 79d2993d204..9bb1040bbed 100644 --- a/epochStart/bootstrap/shardStorageHandler.go +++ b/epochStart/bootstrap/shardStorageHandler.go @@ -40,6 +40,7 @@ func NewShardStorageHandler( currentEpoch uint32, uint64Converter typeConverters.Uint64ByteSliceConverter, nodeTypeProvider core.NodeTypeProviderHandler, + nodeProcessingMode common.NodeProcessingMode, ) (*shardStorageHandler, error) { epochStartNotifier := &disabled.EpochStartNotifier{} storageFactory, err := factory.NewStorageServiceFactory( @@ -53,6 +54,7 @@ func NewShardStorageHandler( CurrentEpoch: currentEpoch, StorageType: factory.BootstrapStorageService, CreateTrieEpochRootHashStorer: false, + NodeProcessingMode: nodeProcessingMode, }, ) if err != nil { diff --git a/epochStart/bootstrap/shardStorageHandler_test.go b/epochStart/bootstrap/shardStorageHandler_test.go index 61adf0d4921..922c4c308b9 100644 --- a/epochStart/bootstrap/shardStorageHandler_test.go +++ b/epochStart/bootstrap/shardStorageHandler_test.go @@ -16,6 +16,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/typeConverters" "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/config" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/epochStart" @@ -39,7 +40,7 @@ func TestNewShardStorageHandler_ShouldWork(t *testing.T) { }() args := createDefaultShardStorageArgs() - shardStorage, err := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, err := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) assert.False(t, check.IfNil(shardStorage)) assert.Nil(t, err) @@ -51,7 +52,7 @@ func TestShardStorageHandler_SaveDataToStorageShardDataNotFound(t *testing.T) { }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) components := &ComponentsNeededForBootstrap{ EpochStartMetaBlock: &block.MetaBlock{Epoch: 1}, @@ -69,7 +70,7 @@ func TestShardStorageHandler_SaveDataToStorageMissingHeader(t *testing.T) { }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) components := &ComponentsNeededForBootstrap{ EpochStartMetaBlock: &block.MetaBlock{ @@ -110,7 +111,7 @@ func testShardWithMissingStorer(missingUnit dataRetriever.UnitType, atCallNumber counter := 0 args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shardStorage.storageService = &storageStubs.ChainStorerStub{ GetStorerCalled: func(unitType dataRetriever.UnitType) (storage.Storer, error) { counter++ @@ -152,7 +153,7 @@ func TestShardStorageHandler_SaveDataToStorage(t *testing.T) { }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) hash1 := []byte("hash1") hdr1 := block.MetaBlock{ @@ -251,7 +252,7 @@ func TestShardStorageHandler_getCrossProcessedMiniBlockHeadersDestMe(t *testing. mbs := append(intraMbs, crossMbs...) args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shardHeader := &block.Header{ Nonce: 100, MiniBlockHeaders: mbs, @@ -271,7 +272,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksWithScheduledErrorG t.Parallel() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) meta := &block.MetaBlock{ Nonce: 100, EpochStart: block.EpochStart{}, @@ -289,7 +290,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksWithScheduledNoSche t.Parallel() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) scenario := createPendingAndProcessedMiniBlocksScenario() processedMiniBlocks, pendingMiniBlocks, err := shardStorage.getProcessedAndPendingMiniBlocksWithScheduled(scenario.metaBlock, scenario.headers, scenario.shardHeader, false) @@ -304,7 +305,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksWithScheduledWrongH t.Parallel() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) scenario := createPendingAndProcessedMiniBlocksScenario() wrongShardHeader := &block.MetaBlock{} @@ -326,7 +327,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksWithScheduled(t *te t.Parallel() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) scenario := createPendingAndProcessedMiniBlocksScenario() processedMiniBlocks, pendingMiniBlocks, err := shardStorage.getProcessedAndPendingMiniBlocksWithScheduled(scenario.metaBlock, scenario.headers, scenario.shardHeader, true) @@ -494,7 +495,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksErrorGettingEpochSt }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) meta := &block.MetaBlock{ Nonce: 100, EpochStart: block.EpochStart{}, @@ -517,7 +518,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksMissingHeader(t *te lastFinishedMetaBlock := "last finished meta block" args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) meta := &block.MetaBlock{ Nonce: 100, EpochStart: block.EpochStart{ @@ -543,7 +544,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksWrongHeader(t *test lastFinishedMetaBlockHash := "last finished meta block" firstPendingMeta := "first pending meta" args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) lastFinishedHeaders := createDefaultEpochStartShardData([]byte(lastFinishedMetaBlockHash), []byte("headerHash")) lastFinishedHeaders[0].FirstPendingMetaBlock = []byte(firstPendingMeta) meta := &block.MetaBlock{ @@ -574,7 +575,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksNilMetaBlock(t *tes lastFinishedMetaBlockHash := "last finished meta block" firstPendingMeta := "first pending meta" args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) lastFinishedHeaders := createDefaultEpochStartShardData([]byte(lastFinishedMetaBlockHash), []byte("headerHash")) lastFinishedHeaders[0].FirstPendingMetaBlock = []byte(firstPendingMeta) meta := &block.MetaBlock{ @@ -607,7 +608,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksNoProcessedNoPendin lastFinishedMetaBlockHash := "last finished meta block" firstPendingMeta := "first pending meta" args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) lastFinishedHeaders := createDefaultEpochStartShardData([]byte(lastFinishedMetaBlockHash), []byte("headerHash")) lastFinishedHeaders[0].FirstPendingMetaBlock = []byte(firstPendingMeta) lastFinishedHeaders[0].PendingMiniBlockHeaders = nil @@ -636,7 +637,7 @@ func TestShardStorageHandler_getProcessedAndPendingMiniBlocksWithProcessedAndPen t.Parallel() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) scenario := createPendingAndProcessedMiniBlocksScenario() processedMiniBlocks, pendingMiniBlocks, firstPendingMetaBlockHash, err := shardStorage.getProcessedAndPendingMiniBlocks(scenario.metaBlock, scenario.headers) @@ -654,7 +655,7 @@ func TestShardStorageHandler_saveLastCrossNotarizedHeadersWithoutScheduledGetSha }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) headers := map[string]data.HeaderHandler{} meta := &block.MetaBlock{ @@ -675,7 +676,7 @@ func TestShardStorageHandler_saveLastCrossNotarizedHeadersWithoutScheduledMissin }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shard0HeaderHash := "shard0 header hash" lastFinishedMetaBlock := "last finished meta block" @@ -704,7 +705,7 @@ func TestShardStorageHandler_saveLastCrossNotarizedHeadersWithoutScheduledWrongT }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shard0HeaderHash := "shard0 header hash" lastFinishedMetaBlock := "last finished meta block" @@ -740,7 +741,7 @@ func TestShardStorageHandler_saveLastCrossNotarizedHeadersWithoutScheduledErrorW args.marshalizer = &testscommon.MarshalizerStub{MarshalCalled: func(obj interface{}) ([]byte, error) { return nil, expectedErr }} - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shard0HeaderHash := "shard0 header hash" lastFinishedMetaBlock := "last finished meta block" @@ -771,7 +772,7 @@ func TestShardStorageHandler_saveLastCrossNotarizedHeadersWithoutScheduled(t *te }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shard0HeaderHash := "shard0 header hash" lastFinishedMetaBlock := "last finished meta block" @@ -807,7 +808,7 @@ func TestShardStorageHandler_saveLastCrossNotarizedHeadersWithScheduledErrorUpda }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shard0HeaderHash := "shard0 header hash" lastFinishedMetaBlock := "last finished meta block" @@ -837,7 +838,7 @@ func TestShardStorageHandler_saveLastCrossNotarizedHeadersWithScheduled(t *testi }() args := createDefaultShardStorageArgs() - shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider) + shardStorage, _ := NewShardStorageHandler(args.generalConfig, args.prefsConfig, args.shardCoordinator, args.pathManagerHandler, args.marshalizer, args.hasher, 1, args.uint64Converter, args.nodeTypeProvider, args.nodeProcessingMode) shard0HeaderHash := "shard0 header hash" lastFinishedMetaBlock := "last finished meta block" prevMetaHash := "prev metaHlock hash" @@ -1059,6 +1060,7 @@ type shardStorageArgs struct { currentEpoch uint32 uint64Converter typeConverters.Uint64ByteSliceConverter nodeTypeProvider core.NodeTypeProviderHandler + nodeProcessingMode common.NodeProcessingMode } func createDefaultShardStorageArgs() shardStorageArgs { @@ -1072,6 +1074,7 @@ func createDefaultShardStorageArgs() shardStorageArgs { currentEpoch: 0, uint64Converter: &mock.Uint64ByteSliceConverterMock{}, nodeTypeProvider: &nodeTypeProviderMock.NodeTypeProviderStub{}, + nodeProcessingMode: common.Normal, } } diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index e0f6ae2b110..4d0e3ab0687 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -201,6 +201,7 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { DataSyncerCreator: dataSyncerFactory, ScheduledSCRsStorer: nil, // will be updated after sync from network TrieSyncStatisticsProvider: tss, + NodeProcessingMode: common.GetNodeProcessingMode(&bcf.importDbConfig), } var epochStartBootstrapper factory.EpochStartBootstrapper diff --git a/factory/data/dataComponents.go b/factory/data/dataComponents.go index 70348f9ff81..d2032acd193 100644 --- a/factory/data/dataComponents.go +++ b/factory/data/dataComponents.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/dataRetriever/blockchain" @@ -28,6 +29,7 @@ type DataComponentsFactoryArgs struct { EpochStartNotifier factory.EpochStartNotifier CurrentEpoch uint32 CreateTrieEpochRootHashStorer bool + NodeProcessingMode common.NodeProcessingMode } type dataComponentsFactory struct { @@ -39,6 +41,7 @@ type dataComponentsFactory struct { statusCore factory.StatusCoreComponentsHolder currentEpoch uint32 createTrieEpochRootHashStorer bool + nodeProcessingMode common.NodeProcessingMode } // dataComponents struct holds the data components @@ -84,6 +87,7 @@ func NewDataComponentsFactory(args DataComponentsFactoryArgs) (*dataComponentsFa epochStartNotifier: args.EpochStartNotifier, currentEpoch: args.CurrentEpoch, createTrieEpochRootHashStorer: args.CreateTrieEpochRootHashStorer, + nodeProcessingMode: args.NodeProcessingMode, }, nil } @@ -172,6 +176,7 @@ func (dcf *dataComponentsFactory) createDataStoreFromConfig() (dataRetriever.Sto CurrentEpoch: dcf.currentEpoch, StorageType: storageFactory.ProcessStorageService, CreateTrieEpochRootHashStorer: dcf.createTrieEpochRootHashStorer, + NodeProcessingMode: dcf.nodeProcessingMode, }) if err != nil { return nil, err diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 49c62ae9a50..60860011ef4 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -1454,6 +1454,7 @@ func (pcf *processComponentsFactory) newStorageResolver() (dataRetriever.Resolve CurrentEpoch: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), StorageType: storageFactory.ProcessStorageService, CreateTrieEpochRootHashStorer: false, + NodeProcessingMode: common.GetNodeProcessingMode(&pcf.importDBConfig), }, ) if err != nil { diff --git a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go index 9a54cbaded2..c7c5fd45c40 100644 --- a/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go +++ b/integrationTests/multiShard/endOfEpoch/startInEpoch/startInEpoch_test.go @@ -11,6 +11,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/endProcess" "github.com/multiversx/mx-chain-core-go/data/typeConverters/uint64ByteSlice" + "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/epochStart/bootstrap" @@ -285,6 +286,7 @@ func testNodeStartsInEpoch(t *testing.T, shardID uint32, expectedHighestRound ui CurrentEpoch: 0, StorageType: factory.ProcessStorageService, CreateTrieEpochRootHashStorer: false, + NodeProcessingMode: common.Normal, }, ) assert.NoError(t, err) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 7bbc5941cc1..afccea3d0b0 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -1259,6 +1259,7 @@ func (nr *nodeRunner) CreateManagedDataComponents( EpochStartNotifier: coreComponents.EpochStartNotifierWithConfirm(), CurrentEpoch: storerEpoch, CreateTrieEpochRootHashStorer: configs.ImportDbConfig.ImportDbSaveTrieEpochRootHash, + NodeProcessingMode: common.GetNodeProcessingMode(nr.configs.ImportDbConfig), } dataComponentsFactory, err := dataComp.NewDataComponentsFactory(dataArgs) @@ -1295,17 +1296,13 @@ func (nr *nodeRunner) CreateManagedStateComponents( dataComponents mainFactory.DataComponentsHandler, statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.StateComponentsHandler, error) { - processingMode := common.Normal - if nr.configs.ImportDbConfig.IsImportDBMode { - processingMode = common.ImportDb - } stateArgs := stateComp.StateComponentsFactoryArgs{ Config: *nr.configs.GeneralConfig, ShardCoordinator: bootstrapComponents.ShardCoordinator(), Core: coreComponents, StatusCore: statusCoreComponents, StorageService: dataComponents.StorageService(), - ProcessingMode: processingMode, + ProcessingMode: common.GetNodeProcessingMode(nr.configs.ImportDbConfig), ShouldSerializeSnapshots: nr.configs.FlagsConfig.SerializeSnapshots, ChainHandler: dataComponents.Blockchain(), } diff --git a/storage/factory/pruningStorerFactory.go b/storage/factory/pruningStorerFactory.go index 34293aaf9f3..899cf46f969 100644 --- a/storage/factory/pruningStorerFactory.go +++ b/storage/factory/pruningStorerFactory.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" + "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/epochStart" @@ -48,6 +49,7 @@ type StorageServiceFactory struct { createTrieEpochRootHashStorer bool currentEpoch uint32 storageType StorageServiceType + nodeProcessingMode common.NodeProcessingMode } // StorageServiceFactoryArgs holds the arguments needed for creating a new storage service factory @@ -61,6 +63,7 @@ type StorageServiceFactoryArgs struct { StorageType StorageServiceType CurrentEpoch uint32 CreateTrieEpochRootHashStorer bool + NodeProcessingMode common.NodeProcessingMode } // NewStorageServiceFactory will return a new instance of StorageServiceFactory @@ -91,6 +94,7 @@ func NewStorageServiceFactory(args StorageServiceFactoryArgs) (*StorageServiceFa createTrieEpochRootHashStorer: args.CreateTrieEpochRootHashStorer, oldDataCleanerProvider: oldDataCleanProvider, storageType: args.StorageType, + nodeProcessingMode: args.NodeProcessingMode, }, nil } @@ -364,7 +368,7 @@ func (psf *StorageServiceFactory) createTriePruningStorer( customDatabaseRemover storage.CustomDatabaseRemoverHandler, ) (storage.Storer, error) { accountsUnitArgs := psf.createPruningStorerArgs(storageConfig, customDatabaseRemover) - if psf.storageType == ProcessStorageService { + if psf.storageType == ProcessStorageService && psf.nodeProcessingMode == common.Normal { accountsUnitArgs.PersistersTracker = pruning.NewTriePersisterTracker(accountsUnitArgs.EpochsData) } diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 1afe538b5b6..7f38e669f7b 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -218,6 +218,7 @@ func GetDataArgs(coreComponents factory.CoreComponentsHolder, shardCoordinator s EpochStartNotifier: &mock.EpochStartNotifierStub{}, CurrentEpoch: 0, CreateTrieEpochRootHashStorer: false, + NodeProcessingMode: common.Normal, } } From fb6cb0d5175bad3cbf0babf07d897aab5a738c7a Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 13 Mar 2023 16:50:18 +0200 Subject: [PATCH 188/335] last commit from indexer --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4b9a0ef7275..7f0a1648f6e 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-core-go v1.1.33 github.com/multiversx/mx-chain-crypto-go v1.2.5 - github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313121143-b267eb5f6eb4 + github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313144405-7c1ad2c727ba github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.10 github.com/multiversx/mx-chain-storage-go v1.0.7 diff --git a/go.sum b/go.sum index cd78bc5db3b..23bc8d87353 100644 --- a/go.sum +++ b/go.sum @@ -601,8 +601,8 @@ github.com/multiversx/mx-chain-core-go v1.1.33 h1:qk+TlaOhHpu+9VncL3yowjY4KU8uJ0 github.com/multiversx/mx-chain-core-go v1.1.33/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= 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.3.14-0.20230313121143-b267eb5f6eb4 h1:IBqfuSt2L3nTO3DHIOcdCGoEL9Y/RPTSviNxGFZQV8I= -github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313121143-b267eb5f6eb4/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313144405-7c1ad2c727ba h1:SSReszOV9hMPXvHSKDHUWOqKI6qQTgH8kPqdVLujDHQ= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313144405-7c1ad2c727ba/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= 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.10 h1:CYCuI0SP8Pt9K0TcJjUyxK7ByvWi2FXNUihy0iCEVIA= From 77a2d9ac25978fe7befff906e5e9a566262f0ed1 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 13 Mar 2023 17:51:06 +0200 Subject: [PATCH 189/335] proper tag --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7f0a1648f6e..d3f3434ade0 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-core-go v1.1.33 github.com/multiversx/mx-chain-crypto-go v1.2.5 - github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313144405-7c1ad2c727ba + github.com/multiversx/mx-chain-es-indexer-go v1.3.14 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.10 github.com/multiversx/mx-chain-storage-go v1.0.7 diff --git a/go.sum b/go.sum index 23bc8d87353..6d8780bcd35 100644 --- a/go.sum +++ b/go.sum @@ -601,8 +601,8 @@ github.com/multiversx/mx-chain-core-go v1.1.33 h1:qk+TlaOhHpu+9VncL3yowjY4KU8uJ0 github.com/multiversx/mx-chain-core-go v1.1.33/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= 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.3.14-0.20230313144405-7c1ad2c727ba h1:SSReszOV9hMPXvHSKDHUWOqKI6qQTgH8kPqdVLujDHQ= -github.com/multiversx/mx-chain-es-indexer-go v1.3.14-0.20230313144405-7c1ad2c727ba/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14 h1:cDaBsY8i2PuCQZ6DMf3LgxB0ocErM3TWlKGGzGqGX7E= +github.com/multiversx/mx-chain-es-indexer-go v1.3.14/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= 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.10 h1:CYCuI0SP8Pt9K0TcJjUyxK7ByvWi2FXNUihy0iCEVIA= From b61fd477c2a647bf979e744514c95c2c40928074 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Wed, 15 Mar 2023 10:06:41 +0200 Subject: [PATCH 190/335] fix after review --- common/errChan/errChan.go | 27 ++++--- common/errChan/errChan_test.go | 81 ++++++++++++++++--- debug/process/stateExport.go | 2 +- epochStart/metachain/systemSCs.go | 2 +- factory/processing/processComponents.go | 2 +- .../stateTrieClose/stateTrieClose_test.go | 8 +- .../state/stateTrieSync/stateTrieSync_test.go | 6 +- integrationTests/testProcessorNode.go | 2 +- node/node.go | 8 +- node/trieIterators/delegatedListProcessor.go | 2 +- .../directStakedListProcessor.go | 2 +- node/trieIterators/stakeValuesProcessor.go | 2 +- process/block/baseProcess.go | 4 +- process/peer/process.go | 2 +- process/txsimulator/wrappedAccountsDB_test.go | 2 +- state/accountsDB.go | 8 +- state/accountsDB_test.go | 2 +- state/peerAccountsDB.go | 4 +- state/syncer/userAccountsSyncer.go | 2 +- trie/export_test.go | 5 +- trie/node_test.go | 2 +- trie/patriciaMerkleTrie_test.go | 12 +-- trie/trieStorageManager.go | 7 -- trie/trieStorageManagerFactory_test.go | 4 +- ...ieStorageManagerWithoutCheckpoints_test.go | 4 +- .../trieStorageManagerWithoutSnapshot_test.go | 2 +- trie/trieStorageManager_test.go | 36 ++++----- update/genesis/export.go | 2 +- 28 files changed, 150 insertions(+), 92 deletions(-) diff --git a/common/errChan/errChan.go b/common/errChan/errChan.go index a2f08d1b3fb..47cf29e320b 100644 --- a/common/errChan/errChan.go +++ b/common/errChan/errChan.go @@ -2,22 +2,29 @@ package errChan import "sync" -type errChan struct { +type errChanWrapper struct { ch chan error closed bool - closeMutex sync.Mutex + closeMutex sync.RWMutex } -// NewErrChan creates a new errChan -func NewErrChan() *errChan { - return &errChan{ +// NewErrChanWrapper creates a new errChanWrapper +func NewErrChanWrapper() *errChanWrapper { + return &errChanWrapper{ ch: make(chan error, 1), closed: false, } } // WriteInChanNonBlocking will send the given error on the channel if the chan is not blocked -func (ec *errChan) WriteInChanNonBlocking(err error) { +func (ec *errChanWrapper) WriteInChanNonBlocking(err error) { + ec.closeMutex.RLock() + defer ec.closeMutex.RUnlock() + + if ec.closed { + return + } + select { case ec.ch <- err: default: @@ -25,7 +32,7 @@ func (ec *errChan) WriteInChanNonBlocking(err error) { } // ReadFromChanNonBlocking will read from the channel, or return nil if no error was sent on the channel -func (ec *errChan) ReadFromChanNonBlocking() error { +func (ec *errChanWrapper) ReadFromChanNonBlocking() error { select { case err := <-ec.ch: return err @@ -35,7 +42,7 @@ func (ec *errChan) ReadFromChanNonBlocking() error { } // Close will close the channel -func (ec *errChan) Close() { +func (ec *errChanWrapper) Close() { ec.closeMutex.Lock() defer ec.closeMutex.Unlock() @@ -52,11 +59,11 @@ func (ec *errChan) Close() { } // Len returns the length of the channel -func (ec *errChan) Len() int { +func (ec *errChanWrapper) Len() int { return len(ec.ch) } // IsInterfaceNil returns true if there is no value under the interface -func (ec *errChan) IsInterfaceNil() bool { +func (ec *errChanWrapper) IsInterfaceNil() bool { return ec == nil } diff --git a/common/errChan/errChan_test.go b/common/errChan/errChan_test.go index b753a4ce224..3d88f358015 100644 --- a/common/errChan/errChan_test.go +++ b/common/errChan/errChan_test.go @@ -2,6 +2,7 @@ package errChan import ( "fmt" + "sync" "testing" "github.com/multiversx/mx-chain-core-go/core/check" @@ -11,7 +12,7 @@ import ( func TestNewErrChan(t *testing.T) { t.Parallel() - ec := NewErrChan() + ec := NewErrChanWrapper() assert.False(t, check.IfNil(ec)) assert.Equal(t, 1, cap(ec.ch)) } @@ -19,22 +20,44 @@ func TestNewErrChan(t *testing.T) { func TestErrChan_WriteInChanNonBlocking(t *testing.T) { t.Parallel() - expectedErr := fmt.Errorf("err1") - ec := NewErrChan() - ec.WriteInChanNonBlocking(expectedErr) - ec.WriteInChanNonBlocking(fmt.Errorf("err2")) - ec.WriteInChanNonBlocking(fmt.Errorf("err3")) + t.Run("write in a nil channel", func(t *testing.T) { + t.Parallel() - assert.Equal(t, 1, len(ec.ch)) - assert.Equal(t, expectedErr, <-ec.ch) - assert.Equal(t, 0, len(ec.ch)) + ec := NewErrChanWrapper() + ec.ch = nil + ec.WriteInChanNonBlocking(fmt.Errorf("err1")) + + assert.Equal(t, 0, len(ec.ch)) + }) + + t.Run("write in a closed channel", func(t *testing.T) { + t.Parallel() + + ec := NewErrChanWrapper() + ec.Close() + ec.WriteInChanNonBlocking(fmt.Errorf("err1")) + + assert.Equal(t, 0, len(ec.ch)) + }) + + t.Run("should work", func(t *testing.T) { + expectedErr := fmt.Errorf("err1") + ec := NewErrChanWrapper() + ec.WriteInChanNonBlocking(expectedErr) + ec.WriteInChanNonBlocking(fmt.Errorf("err2")) + ec.WriteInChanNonBlocking(fmt.Errorf("err3")) + + assert.Equal(t, 1, len(ec.ch)) + assert.Equal(t, expectedErr, <-ec.ch) + assert.Equal(t, 0, len(ec.ch)) + }) } func TestErrChan_ReadFromChanNonBlocking(t *testing.T) { t.Parallel() expectedErr := fmt.Errorf("err1") - ec := NewErrChan() + ec := NewErrChanWrapper() ec.ch <- expectedErr assert.Equal(t, 1, len(ec.ch)) @@ -49,7 +72,7 @@ func TestErrChan_Close(t *testing.T) { t.Run("close an already closed channel", func(t *testing.T) { t.Parallel() - ec := NewErrChan() + ec := NewErrChanWrapper() ec.Close() assert.True(t, ec.closed) @@ -59,7 +82,7 @@ func TestErrChan_Close(t *testing.T) { t.Run("close a nil channel", func(t *testing.T) { t.Parallel() - ec := NewErrChan() + ec := NewErrChanWrapper() ec.ch = nil ec.Close() @@ -70,7 +93,7 @@ func TestErrChan_Close(t *testing.T) { func TestErrChan_Len(t *testing.T) { t.Parallel() - ec := NewErrChan() + ec := NewErrChanWrapper() assert.Equal(t, 0, ec.Len()) ec.ch <- fmt.Errorf("err1") @@ -79,3 +102,35 @@ func TestErrChan_Len(t *testing.T) { ec.WriteInChanNonBlocking(fmt.Errorf("err2")) assert.Equal(t, 1, ec.Len()) } + +func TestErrChan_ConcurrentOperations(t *testing.T) { + t.Parallel() + + ec := NewErrChanWrapper() + numOperations := 1000 + numMethods := 2 + wg := sync.WaitGroup{} + wg.Add(numOperations) + for i := 0; i < numOperations; i++ { + go func(idx int) { + + if idx == numOperations-100 { + ec.Close() + } + + operation := idx % numMethods + switch operation { + case 0: + ec.WriteInChanNonBlocking(fmt.Errorf("err")) + case 1: + _ = ec.ReadFromChanNonBlocking() + default: + assert.Fail(t, "invalid numMethods") + } + + wg.Done() + }(i) + } + + wg.Wait() +} diff --git a/debug/process/stateExport.go b/debug/process/stateExport.go index b8cd8128255..831aaebfc0e 100644 --- a/debug/process/stateExport.go +++ b/debug/process/stateExport.go @@ -67,7 +67,7 @@ func getCode(accountsDB state.AccountsAdapter, codeHash []byte) ([]byte, error) func getData(accountsDB state.AccountsAdapter, rootHash []byte, address []byte) ([]string, error) { leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := accountsDB.GetAllLeaves(leavesChannels, context.Background(), rootHash) diff --git a/epochStart/metachain/systemSCs.go b/epochStart/metachain/systemSCs.go index faf909008fe..645f54ce3ea 100644 --- a/epochStart/metachain/systemSCs.go +++ b/epochStart/metachain/systemSCs.go @@ -1103,7 +1103,7 @@ func (s *systemSCProcessor) getArgumentsForSetOwnerFunctionality(userValidatorAc leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = userValidatorAccount.DataTrie().GetAllLeavesOnChannel(leavesChannels, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) if err != nil { diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 347a2645790..312132b9210 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -875,7 +875,7 @@ func (pcf *processComponentsFactory) indexAndReturnGenesisAccounts() (map[string leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = pcf.state.AccountsAdapter().GetAllLeaves(leavesChannels, context.Background(), rootHash) if err != nil { diff --git a/integrationTests/state/stateTrieClose/stateTrieClose_test.go b/integrationTests/state/stateTrieClose/stateTrieClose_test.go index cfa352c9b24..985f49c660a 100644 --- a/integrationTests/state/stateTrieClose/stateTrieClose_test.go +++ b/integrationTests/state/stateTrieClose/stateTrieClose_test.go @@ -37,7 +37,7 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { rootHash, _ := tr.RootHash() leavesChannel1 := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } _ = tr.GetAllLeavesOnChannel(leavesChannel1, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) time.Sleep(time.Second) // allow the go routine to start @@ -49,7 +49,7 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { leavesChannel1 = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } _ = tr.GetAllLeavesOnChannel(leavesChannel1, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) idx, _ = gc.Snapshot() @@ -64,7 +64,7 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { rootHash, _ = tr.RootHash() leavesChannel1 = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } _ = tr.GetAllLeavesOnChannel(leavesChannel1, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) idx, _ = gc.Snapshot() @@ -79,7 +79,7 @@ func TestPatriciaMerkleTrie_Close(t *testing.T) { rootHash, _ = tr.RootHash() leavesChannel2 := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } _ = tr.GetAllLeavesOnChannel(leavesChannel2, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) time.Sleep(time.Second) // allow the go routine to start diff --git a/integrationTests/state/stateTrieSync/stateTrieSync_test.go b/integrationTests/state/stateTrieSync/stateTrieSync_test.go index 2704aa1fd4c..7b2e28e5866 100644 --- a/integrationTests/state/stateTrieSync/stateTrieSync_test.go +++ b/integrationTests/state/stateTrieSync/stateTrieSync_test.go @@ -330,7 +330,7 @@ func testMultipleDataTriesSync(t *testing.T, numAccounts int, numDataTrieLeaves rootHash, _ := accState.RootHash() leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = accState.GetAllLeaves(leavesChannel, context.Background(), rootHash) for range leavesChannel.LeavesChan { @@ -358,7 +358,7 @@ func testMultipleDataTriesSync(t *testing.T, numAccounts int, numDataTrieLeaves leavesChannel = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = nRequester.AccntState.GetAllLeaves(leavesChannel, context.Background(), rootHash) assert.Nil(t, err) @@ -560,7 +560,7 @@ func addAccountsToState(t *testing.T, numAccounts int, numDataTrieLeaves int, ac func getNumLeaves(t *testing.T, tr common.Trie, rootHash []byte) int { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) require.Nil(t, err) diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 8d3b1834f34..995d1659d8a 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -3149,7 +3149,7 @@ func GetTokenIdentifier(nodes []*TestProcessorNode, ticker []byte) []byte { rootHash, _ := userAcc.DataTrie().RootHash() chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } _ = userAcc.DataTrie().GetAllLeavesOnChannel(chLeaves, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) for leaf := range chLeaves.LeavesChan { diff --git a/node/node.go b/node/node.go index 3af65f4d36b..4ee5485e8f6 100644 --- a/node/node.go +++ b/node/node.go @@ -216,7 +216,7 @@ func (n *Node) GetAllIssuedESDTs(tokenType string, ctx context.Context) ([]strin chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -292,7 +292,7 @@ func (n *Node) GetKeyValuePairs(address string, options api.AccountQueryOptions, chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -400,7 +400,7 @@ func (n *Node) getTokensIDsWithFilter( chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { @@ -536,7 +536,7 @@ func (n *Node) GetAllESDTTokens(address string, options api.AccountQueryOptions, chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = userAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { diff --git a/node/trieIterators/delegatedListProcessor.go b/node/trieIterators/delegatedListProcessor.go index c77d54a0880..acf6c763128 100644 --- a/node/trieIterators/delegatedListProcessor.go +++ b/node/trieIterators/delegatedListProcessor.go @@ -130,7 +130,7 @@ func (dlp *delegatedListProcessor) getDelegatorsList(delegationSC []byte, ctx co chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = delegatorAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { diff --git a/node/trieIterators/directStakedListProcessor.go b/node/trieIterators/directStakedListProcessor.go index 3e4ca62daeb..884607e7d7f 100644 --- a/node/trieIterators/directStakedListProcessor.go +++ b/node/trieIterators/directStakedListProcessor.go @@ -57,7 +57,7 @@ func (dslp *directStakedListProcessor) getAllStakedAccounts(validatorAccount sta chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = validatorAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { diff --git a/node/trieIterators/stakeValuesProcessor.go b/node/trieIterators/stakeValuesProcessor.go index b0f01baff76..17109690b98 100644 --- a/node/trieIterators/stakeValuesProcessor.go +++ b/node/trieIterators/stakeValuesProcessor.go @@ -99,7 +99,7 @@ func (svp *stakedValuesProcessor) computeBaseStakedAndTopUp(ctx context.Context) // TODO investigate if a call to GetAllLeavesKeysOnChannel (without values) might increase performance chLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = validatorAccount.DataTrie().GetAllLeavesOnChannel(chLeaves, ctx, rootHash, keyBuilder.NewKeyBuilder()) if err != nil { diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index b327d045b63..02ca6f7652e 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -1734,7 +1734,7 @@ func (bp *baseProcessor) commitTrieEpochRootHashIfNeeded(metaBlock *block.MetaBl iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = userAccountsDb.GetAllLeaves(iteratorChannels, context.Background(), rootHash) if err != nil { @@ -1763,7 +1763,7 @@ func (bp *baseProcessor) commitTrieEpochRootHashIfNeeded(metaBlock *block.MetaBl if len(rh) != 0 { dataTrie := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } errDataTrieGet := userAccountsDb.GetAllLeaves(dataTrie, context.Background(), rh) if errDataTrieGet != nil { diff --git a/process/peer/process.go b/process/peer/process.go index 76f264917f9..3eac66835a8 100644 --- a/process/peer/process.go +++ b/process/peer/process.go @@ -563,7 +563,7 @@ func (vs *validatorStatistics) GetValidatorInfoForRootHash(rootHash []byte) (map leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := vs.peerAdapter.GetAllLeaves(leavesChannels, context.Background(), rootHash) if err != nil { diff --git a/process/txsimulator/wrappedAccountsDB_test.go b/process/txsimulator/wrappedAccountsDB_test.go index 016a6f6a0f1..e83fe6a0d58 100644 --- a/process/txsimulator/wrappedAccountsDB_test.go +++ b/process/txsimulator/wrappedAccountsDB_test.go @@ -151,7 +151,7 @@ func TestReadOnlyAccountsDB_ReadOperationsShouldWork(t *testing.T) { allLeaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = roAccDb.GetAllLeaves(allLeaves, context.Background(), nil) require.NoError(t, err) diff --git a/state/accountsDB.go b/state/accountsDB.go index e767ac459fe..5dfa0dead7d 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -1037,7 +1037,7 @@ func (adb *AccountsDB) recreateTrie(options common.RootHashHolder) error { func (adb *AccountsDB) RecreateAllTries(rootHash []byte) (map[string]common.Trie, error) { leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } mainTrie := adb.getMainTrie() err := mainTrie.GetAllLeavesOnChannel(leavesChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) @@ -1143,7 +1143,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } stats := newSnapshotStatistics(1, 1) @@ -1371,7 +1371,7 @@ func (adb *AccountsDB) setStateCheckpoint(rootHash []byte) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } missingNodesChannel := make(chan []byte, missingNodesChannelSize) stats := newSnapshotStatistics(1, 1) @@ -1437,7 +1437,7 @@ func (adb *AccountsDB) GetStatsForRootHash(rootHash []byte) (common.TriesStatist iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, leavesChannelSize), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := mainTrie.GetAllLeavesOnChannel(iteratorChannels, context.Background(), rootHash, keyBuilder.NewDisabledKeyBuilder()) if err != nil { diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index 3cc0f40a149..c5864dc0e98 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -1442,7 +1442,7 @@ func TestAccountsDB_GetAllLeaves(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := adb.GetAllLeaves(leavesChannel, context.Background(), []byte("root hash")) assert.Nil(t, err) diff --git a/state/peerAccountsDB.go b/state/peerAccountsDB.go index 1e597d884af..171ab6e3d06 100644 --- a/state/peerAccountsDB.go +++ b/state/peerAccountsDB.go @@ -57,7 +57,7 @@ func (adb *PeerAccountsDB) SnapshotState(rootHash []byte) { missingNodesChannel := make(chan []byte, missingNodesChannelSize) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } stats := newSnapshotStatistics(0, 1) stats.NewSnapshotStarted() @@ -93,7 +93,7 @@ func (adb *PeerAccountsDB) SetStateCheckpoint(rootHash []byte) { stats.NewSnapshotStarted() iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } trieStorageManager.SetCheckpoint(rootHash, rootHash, iteratorChannels, missingNodesChannel, stats) diff --git a/state/syncer/userAccountsSyncer.go b/state/syncer/userAccountsSyncer.go index f508341b749..2e4f7f1f156 100644 --- a/state/syncer/userAccountsSyncer.go +++ b/state/syncer/userAccountsSyncer.go @@ -214,7 +214,7 @@ func (u *userAccountsSyncer) syncAccountDataTries( leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = mainTrie.GetAllLeavesOnChannel(leavesChannels, context.Background(), mainRootHash, keyBuilder.NewDisabledKeyBuilder()) if err != nil { diff --git a/trie/export_test.go b/trie/export_test.go index 66c17dd56c3..83fa38f3c8f 100644 --- a/trie/export_test.go +++ b/trie/export_test.go @@ -75,7 +75,10 @@ func GetDirtyHashes(tr common.Trie) common.ModifiedHashes { // WriteInChanNonBlocking - func WriteInChanNonBlocking(errChan chan error, err error) { - writeInChanNonBlocking(errChan, err) + select { + case errChan <- err: + default: + } } type StorageManagerExtensionStub struct { diff --git a/trie/node_test.go b/trie/node_test.go index a993d15d4be..bca8482a618 100644 --- a/trie/node_test.go +++ b/trie/node_test.go @@ -520,7 +520,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesCollapsedTrie(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), tr.root.getHash(), keyBuilder.NewKeyBuilder()) assert.Nil(t, err) diff --git a/trie/patriciaMerkleTrie_test.go b/trie/patriciaMerkleTrie_test.go index ab0518247fc..9ec956e96cf 100644 --- a/trie/patriciaMerkleTrie_test.go +++ b/trie/patriciaMerkleTrie_test.go @@ -476,7 +476,7 @@ func TestPatriciaMerkleTrie_GetSerializedNodesGetFromCheckpoint(t *testing.T) { storageManager.AddDirtyCheckpointHashes(rootHash, dirtyHashes) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } storageManager.SetCheckpoint(rootHash, make([]byte, 0), iteratorChannels, nil, &trieMock.MockStatistics{}) trie.WaitForOperationToComplete(storageManager) @@ -563,7 +563,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := tr.GetAllLeavesOnChannel(iteratorChannels, context.Background(), []byte{}, keyBuilder.NewDisabledKeyBuilder()) assert.Equal(t, trie.ErrNilTrieIteratorLeavesChannel, err) @@ -589,7 +589,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), []byte{}, keyBuilder.NewDisabledKeyBuilder()) assert.Nil(t, err) @@ -611,7 +611,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } expectedErr := errors.New("expected error") @@ -647,7 +647,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } expectedErr := errors.New("expected error") @@ -696,7 +696,7 @@ func TestPatriciaMerkleTrie_GetAllLeavesOnChannel(t *testing.T) { leavesChannel := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err := tr.GetAllLeavesOnChannel(leavesChannel, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) assert.Nil(t, err) diff --git a/trie/trieStorageManager.go b/trie/trieStorageManager.go index 78b647030e3..c5304e45428 100644 --- a/trie/trieStorageManager.go +++ b/trie/trieStorageManager.go @@ -473,13 +473,6 @@ func (tsm *trieStorageManager) takeSnapshot(snapshotEntry *snapshotsQueueEntry, snapshotEntry.stats.AddTrieStats(stats.GetTrieStats()) } -func writeInChanNonBlocking(errChan chan error, err error) { - select { - case errChan <- err: - default: - } -} - func (tsm *trieStorageManager) takeCheckpoint(checkpointEntry *snapshotsQueueEntry, msh marshal.Marshalizer, hsh hashing.Hasher, ctx context.Context, goRoutinesThrottler core.Throttler) { defer func() { tsm.finishOperation(checkpointEntry, "trie checkpoint finished") diff --git a/trie/trieStorageManagerFactory_test.go b/trie/trieStorageManagerFactory_test.go index d79fa2c77fa..8045a06d707 100644 --- a/trie/trieStorageManagerFactory_test.go +++ b/trie/trieStorageManagerFactory_test.go @@ -135,7 +135,7 @@ func TestTrieStorageManager_SerialFuncShadowingCallsExpectedImpl(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } tsm.SetCheckpoint(nil, nil, iteratorChannels, nil, &trieMock.MockStatistics{}) @@ -168,7 +168,7 @@ func testTsmWithoutSnapshot( iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } tsm.TakeSnapshot("", nil, nil, iteratorChannels, nil, &trieMock.MockStatistics{}, 10) diff --git a/trie/trieStorageManagerWithoutCheckpoints_test.go b/trie/trieStorageManagerWithoutCheckpoints_test.go index 2f76292d574..891a14a392e 100644 --- a/trie/trieStorageManagerWithoutCheckpoints_test.go +++ b/trie/trieStorageManagerWithoutCheckpoints_test.go @@ -28,14 +28,14 @@ func TestTrieStorageManagerWithoutCheckpoints_SetCheckpoint(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } ts.SetCheckpoint([]byte("rootHash"), make([]byte, 0), iteratorChannels, nil, &trieMock.MockStatistics{}) assert.Equal(t, uint32(0), ts.PruningBlockingOperations()) iteratorChannels = &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } ts.SetCheckpoint([]byte("rootHash"), make([]byte, 0), iteratorChannels, nil, &trieMock.MockStatistics{}) assert.Equal(t, uint32(0), ts.PruningBlockingOperations()) diff --git a/trie/trieStorageManagerWithoutSnapshot_test.go b/trie/trieStorageManagerWithoutSnapshot_test.go index d3ba6073770..309e328433f 100644 --- a/trie/trieStorageManagerWithoutSnapshot_test.go +++ b/trie/trieStorageManagerWithoutSnapshot_test.go @@ -80,7 +80,7 @@ func TestTrieStorageManagerWithoutSnapshot_TakeSnapshot(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } ts.TakeSnapshot("", nil, nil, iteratorChannels, nil, &trieMock.MockStatistics{}, 10) diff --git a/trie/trieStorageManager_test.go b/trie/trieStorageManager_test.go index 9dc02201ab4..a0b5a88ce63 100644 --- a/trie/trieStorageManager_test.go +++ b/trie/trieStorageManager_test.go @@ -37,8 +37,8 @@ func getNewTrieStorageManagerArgs() trie.NewTrieStorageManagerArgs { } } -// ErrChanWithLen extends the BufferedErrChan interface with a Len method -type ErrChanWithLen interface { +// errChanWithLen extends the BufferedErrChan interface with a Len method +type errChanWithLen interface { common.BufferedErrChan Len() int } @@ -98,7 +98,7 @@ func TestTrieCheckpoint(t *testing.T) { trieStorage.AddDirtyCheckpointHashes(rootHash, dirtyHashes) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } trieStorage.SetCheckpoint(rootHash, []byte{}, iteratorChannels, nil, &trieMock.MockStatistics{}) trie.WaitForOperationToComplete(trieStorage) @@ -107,7 +107,7 @@ func TestTrieCheckpoint(t *testing.T) { assert.Nil(t, err) assert.NotNil(t, val) - ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + ch, ok := iteratorChannels.ErrChan.(errChanWithLen) assert.True(t, ok) assert.Equal(t, 0, ch.Len()) } @@ -141,13 +141,13 @@ func TestTrieStorageManager_SetCheckpointClosedDb(t *testing.T) { rootHash := []byte("rootHash") iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } ts.SetCheckpoint(rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + ch, ok := iteratorChannels.ErrChan.(errChanWithLen) assert.True(t, ok) assert.Equal(t, 0, ch.Len()) } @@ -161,13 +161,13 @@ func TestTrieStorageManager_SetCheckpointEmptyTrieRootHash(t *testing.T) { rootHash := make([]byte, 32) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } ts.SetCheckpoint(rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + ch, ok := iteratorChannels.ErrChan.(errChanWithLen) assert.True(t, ok) assert.Equal(t, 0, ch.Len()) } @@ -184,7 +184,7 @@ func TestTrieCheckpoint_DoesNotSaveToCheckpointStorageIfNotDirty(t *testing.T) { iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: nil, - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } trieStorage.SetCheckpoint(rootHash, []byte{}, iteratorChannels, nil, &trieMock.MockStatistics{}) trie.WaitForOperationToComplete(trieStorage) @@ -192,7 +192,7 @@ func TestTrieCheckpoint_DoesNotSaveToCheckpointStorageIfNotDirty(t *testing.T) { val, err = trieStorage.GetFromCheckpoint(rootHash) assert.NotNil(t, err) assert.Nil(t, val) - ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + ch, ok := iteratorChannels.ErrChan.(errChanWithLen) assert.True(t, ok) assert.Equal(t, 0, ch.Len()) } @@ -360,13 +360,13 @@ func TestTrieStorageManager_TakeSnapshotClosedDb(t *testing.T) { rootHash := []byte("rootHash") iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } ts.TakeSnapshot("", rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}, 0) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + ch, ok := iteratorChannels.ErrChan.(errChanWithLen) assert.True(t, ok) assert.Equal(t, 0, ch.Len()) } @@ -380,13 +380,13 @@ func TestTrieStorageManager_TakeSnapshotEmptyTrieRootHash(t *testing.T) { rootHash := make([]byte, 32) iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } ts.TakeSnapshot("", rootHash, rootHash, iteratorChannels, nil, &trieMock.MockStatistics{}, 0) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + ch, ok := iteratorChannels.ErrChan.(errChanWithLen) assert.True(t, ok) assert.Equal(t, 0, ch.Len()) } @@ -401,14 +401,14 @@ func TestTrieStorageManager_TakeSnapshotWithGetNodeFromDBError(t *testing.T) { rootHash := []byte("rootHash") iteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } missingNodesChan := make(chan []byte, 2) ts.TakeSnapshot("", rootHash, rootHash, iteratorChannels, missingNodesChan, &trieMock.MockStatistics{}, 0) _, ok := <-iteratorChannels.LeavesChan assert.False(t, ok) - ch, ok := iteratorChannels.ErrChan.(ErrChanWithLen) + ch, ok := iteratorChannels.ErrChan.(errChanWithLen) assert.True(t, ok) assert.Equal(t, 1, ch.Len()) errRecovered := iteratorChannels.ErrChan.ReadFromChanNonBlocking() @@ -490,7 +490,7 @@ func TestWriteInChanNonBlocking(t *testing.T) { t.Run("buffered (one element), empty chan should add", func(t *testing.T) { t.Parallel() - errChannel := errChan.NewErrChan() + errChannel := errChan.NewErrChanWrapper() errChannel.WriteInChanNonBlocking(err1) require.Equal(t, 1, errChannel.Len()) @@ -500,7 +500,7 @@ func TestWriteInChanNonBlocking(t *testing.T) { t.Run("buffered (1 element), full chan should not add, but should finish", func(t *testing.T) { t.Parallel() - errChannel := errChan.NewErrChan() + errChannel := errChan.NewErrChanWrapper() errChannel.WriteInChanNonBlocking(err1) errChannel.WriteInChanNonBlocking(err2) diff --git a/update/genesis/export.go b/update/genesis/export.go index ccf2b3cdb62..149f29ef6c1 100644 --- a/update/genesis/export.go +++ b/update/genesis/export.go @@ -296,7 +296,7 @@ func (se *stateExport) exportTrie(key string, trie common.Trie) error { leavesChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, common.TrieLeavesChannelDefaultCapacity), - ErrChan: errChan.NewErrChan(), + ErrChan: errChan.NewErrChanWrapper(), } err = trie.GetAllLeavesOnChannel(leavesChannels, context.Background(), rootHash, keyBuilder.NewKeyBuilder()) if err != nil { From 35fa2808a348952006a85b6680b24167624a047b Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 16 Mar 2023 13:12:13 +0200 Subject: [PATCH 191/335] remove unused code --- common/channels.go | 10 -------- common/channels_test.go | 57 ----------------------------------------- 2 files changed, 67 deletions(-) diff --git a/common/channels.go b/common/channels.go index 3d00dcde162..177ac89f5c5 100644 --- a/common/channels.go +++ b/common/channels.go @@ -7,13 +7,3 @@ func GetClosedUnbufferedChannel() chan struct{} { return ch } - -// GetErrorFromChanNonBlocking will get the error from channel -func GetErrorFromChanNonBlocking(errChan chan error) error { - select { - case err := <-errChan: - return err - default: - return nil - } -} diff --git a/common/channels_test.go b/common/channels_test.go index a5fad97d1a4..4e2828e2d6a 100644 --- a/common/channels_test.go +++ b/common/channels_test.go @@ -1,11 +1,8 @@ package common import ( - "errors" "testing" - "time" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -39,57 +36,3 @@ func didTriggerHappen(ch chan struct{}) bool { return false } } - -func TestErrFromChannel(t *testing.T) { - t.Parallel() - - t.Run("empty channel, should return nil", func(t *testing.T) { - t.Parallel() - - t.Run("unbuffered chan", func(t *testing.T) { - t.Parallel() - - errChan := make(chan error) - assert.Nil(t, GetErrorFromChanNonBlocking(errChan)) - }) - - t.Run("buffered chan", func(t *testing.T) { - t.Parallel() - - errChan := make(chan error, 1) - assert.Nil(t, GetErrorFromChanNonBlocking(errChan)) - }) - }) - - t.Run("non empty channel, should return error", func(t *testing.T) { - t.Parallel() - - t.Run("unbuffered chan", func(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("expected error") - errChan := make(chan error) - go func() { - errChan <- expectedErr - }() - - time.Sleep(time.Second) // allow the go routine to start - - assert.Equal(t, expectedErr, GetErrorFromChanNonBlocking(errChan)) - }) - - t.Run("buffered chan", func(t *testing.T) { - t.Parallel() - - for i := 1; i < 10; i++ { - errChan := make(chan error, i) - expectedErr := errors.New("expected error") - for j := 0; j < i; j++ { - errChan <- expectedErr - } - - assert.Equal(t, expectedErr, GetErrorFromChanNonBlocking(errChan)) - } - }) - }) -} From c4c53949afd5f39d2ef962c386e1c76b086d01f1 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 17 Mar 2023 17:46:32 +0200 Subject: [PATCH 192/335] rewriting merging on execondest --- .../vm/delegation/delegationMulti_test.go | 2 + process/smartContract/process.go | 5 + .../delegationManager_test.go | 3 +- vm/systemSmartContracts/eei.go | 115 +++++++++++++++--- 4 files changed, 110 insertions(+), 15 deletions(-) diff --git a/integrationTests/vm/delegation/delegationMulti_test.go b/integrationTests/vm/delegation/delegationMulti_test.go index b41238ad9fe..3aac775a6de 100644 --- a/integrationTests/vm/delegation/delegationMulti_test.go +++ b/integrationTests/vm/delegation/delegationMulti_test.go @@ -5,6 +5,7 @@ package delegation import ( "encoding/hex" + "fmt" "math/big" "testing" @@ -104,6 +105,7 @@ func TestDelegationSystemClaimMulti(t *testing.T) { checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[2], "claimMulti", listAddresses, 2700) checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[3], "claimMulti", listAddresses, 2700) + fmt.Println("FROM HEEEREEEEEEE !!!!!!!!!!!!!!!!!!!!!!!!!") for _, delegator := range delegators { returnedCode, err := processTransaction(tpn, delegator, vm.DelegationManagerSCAddress, txData, big.NewInt(0)) assert.Nil(t, err) diff --git a/process/smartContract/process.go b/process/smartContract/process.go index 7fd952a00bb..7853c6842a9 100644 --- a/process/smartContract/process.go +++ b/process/smartContract/process.go @@ -330,6 +330,11 @@ func (sc *scProcessor) doExecuteSmartContractTransaction( return vmOutput.ReturnCode, nil } + outAcc, exists := vmOutput.OutputAccounts[string(tx.GetSndAddr())] + if exists { + log.Error("num transfers", "num", len(outAcc.OutputTransfers)) + } + err = sc.gasConsumedChecks(tx, vmInput.GasProvided, vmInput.GasLocked, vmOutput) if err != nil { log.Error("gasConsumedChecks with problem ", "err", err.Error(), "txHash", txHash) diff --git a/vm/systemSmartContracts/delegationManager_test.go b/vm/systemSmartContracts/delegationManager_test.go index 75ceb982ad0..ed374a69b24 100644 --- a/vm/systemSmartContracts/delegationManager_test.go +++ b/vm/systemSmartContracts/delegationManager_test.go @@ -1192,7 +1192,7 @@ func TestDelegationManagerSystemSC_ClaimMultipleDelegation(t *testing.T) { GetCalled: func(key []byte) (vm.SystemSmartContract, error) { return &mock.SystemSCStub{ ExecuteCalled: func(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { - _ = d.eei.Transfer(args.RecipientAddr, args.CallerAddr, big.NewInt(10), nil, 0) + _ = d.eei.Transfer(args.CallerAddr, args.RecipientAddr, big.NewInt(10), nil, 0) return vmcommon.Ok }, }, nil @@ -1206,6 +1206,7 @@ func TestDelegationManagerSystemSC_ClaimMultipleDelegation(t *testing.T) { require.Equal(t, vmcommon.Ok, returnCode) require.Equal(t, len(eei.output), 1) require.Equal(t, eei.output[0], big.NewInt(20).Bytes()) + require.Equal(t, len(eei.outputAccounts[string(vmInput.CallerAddr)].OutputTransfers), 2) } func TestDelegationManagerSystemSC_ReDelegateMulti(t *testing.T) { diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 7e81c536f93..7fa27faac63 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -209,16 +209,7 @@ func (host *vmContext) SendGlobalSettingToAll(_ []byte, input []byte) { } } -// Transfer handles any necessary value transfer required and takes -// the necessary steps to create accounts -func (host *vmContext) Transfer( - destination []byte, - sender []byte, - value *big.Int, - input []byte, - gasLimit uint64, -) error { - +func (host *vmContext) getSenderDestination(sender, destination []byte) (*vmcommon.OutputAccount, *vmcommon.OutputAccount) { senderAcc, exists := host.outputAccounts[string(sender)] if !exists { senderAcc = &vmcommon.OutputAccount{ @@ -239,9 +230,31 @@ func (host *vmContext) Transfer( host.outputAccounts[string(destAcc.Address)] = destAcc } + return senderAcc, destAcc +} + +func (host *vmContext) transferValueOnly( + destination []byte, + sender []byte, + value *big.Int, +) { + senderAcc, destAcc := host.getSenderDestination(sender, destination) + _ = senderAcc.BalanceDelta.Sub(senderAcc.BalanceDelta, value) _ = destAcc.BalanceDelta.Add(destAcc.BalanceDelta, value) +} +// Transfer handles any necessary value transfer required and takes +// the necessary steps to create accounts +func (host *vmContext) Transfer( + destination []byte, + sender []byte, + value *big.Int, + input []byte, + gasLimit uint64, +) error { + host.transferValueOnly(destination, sender, value) + senderAcc, destAcc := host.getSenderDestination(sender, destination) outputTransfer := vmcommon.OutputTransfer{ Value: big.NewInt(0).Set(value), GasLimit: gasLimit, @@ -310,6 +323,70 @@ func (host *vmContext) mergeContext(currContext *vmContext) { host.scAddress = currContext.scAddress } +func (host *vmContext) properMergeContexts(parentContext *vmContext, returnCode vmcommon.ReturnCode) { + if !host.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { + host.mergeContext(parentContext) + return + } + + if returnCode != vmcommon.UserError { + // no need to merge - revert was done - transaction will fail + return + } + + // do not merge storage updates, those are already updated + + for _, rightAccount := range parentContext.outputAccounts { + leftAccount, exist := host.outputAccounts[string(rightAccount.Address)] + if !exist { + leftAccount = &vmcommon.OutputAccount{} + host.outputAccounts[string(rightAccount.Address)] = leftAccount + continue + } + + addOutputAccounts(leftAccount, rightAccount) + } + host.scAddress = parentContext.scAddress +} + +func addOutputAccounts( + destination *vmcommon.OutputAccount, + rightAccount *vmcommon.OutputAccount, +) { + if len(rightAccount.Address) != 0 { + destination.Address = rightAccount.Address + } + if rightAccount.Balance != nil { + destination.Balance = rightAccount.Balance + } + if destination.BalanceDelta == nil { + destination.BalanceDelta = big.NewInt(0) + } + if rightAccount.BalanceDelta != nil { + destination.BalanceDelta = rightAccount.BalanceDelta + } + if len(rightAccount.Code) > 0 { + destination.Code = rightAccount.Code + } + if len(rightAccount.CodeMetadata) > 0 { + destination.CodeMetadata = rightAccount.CodeMetadata + } + if rightAccount.Nonce > destination.Nonce { + destination.Nonce = rightAccount.Nonce + } + + destination.GasUsed += rightAccount.GasUsed + + if rightAccount.CodeDeployerAddress != nil { + destination.CodeDeployerAddress = rightAccount.CodeDeployerAddress + } + + destination.BytesAddedToStorage += rightAccount.BytesAddedToStorage + destination.BytesDeletedFromStorage += rightAccount.BytesDeletedFromStorage + + destination.OutputTransfers = append(destination.OutputTransfers, rightAccount.OutputTransfers...) +} + func (host *vmContext) createContractCallInput( destination []byte, sender []byte, @@ -343,6 +420,14 @@ func createDirectCallInput( return input } +func (host *vmContext) transferBeforeInternalExec(callInput *vmcommon.ContractCallInput, sender []byte) error { + if !host.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { + return host.Transfer(callInput.RecipientAddr, sender, callInput.CallValue, nil, 0) + } + host.transferValueOnly(callInput.RecipientAddr, sender, callInput.CallValue) + return nil +} + // DeploySystemSC will deploy a smart contract according to the input // will call the init function and merge the vmOutputs // will add to the system smart contracts container the new address @@ -360,7 +445,8 @@ func (host *vmContext) DeploySystemSC( } callInput := createDirectCallInput(newAddress, ownerAddress, value, initFunction, input) - err := host.Transfer(callInput.RecipientAddr, host.scAddress, callInput.CallValue, nil, 0) + + err := host.transferBeforeInternalExec(callInput, host.scAddress) if err != nil { return vmcommon.ExecutionFailed, err } @@ -417,16 +503,16 @@ func (host *vmContext) ExecuteOnDestContext(destination []byte, sender []byte, v return nil, err } - err = host.Transfer(callInput.RecipientAddr, callInput.CallerAddr, callInput.CallValue, nil, 0) + err = host.transferBeforeInternalExec(callInput, sender) if err != nil { return nil, err } - vmOutput := &vmcommon.VMOutput{} + vmOutput := &vmcommon.VMOutput{ReturnCode: vmcommon.UserError} currContext := host.copyToNewContext() defer func() { host.output = make([][]byte, 0) - host.mergeContext(currContext) + host.properMergeContexts(currContext, vmOutput.ReturnCode) }() host.softCleanCache() @@ -451,6 +537,7 @@ func (host *vmContext) ExecuteOnDestContext(destination []byte, sender []byte, v } else { // all changes must be deleted host.outputAccounts = make(map[string]*vmcommon.OutputAccount) + host.storageUpdate = currContext.storageUpdate } vmOutput.ReturnCode = returnCode vmOutput.ReturnMessage = host.returnMessage From 614c56a2b1923b2e5551bb36b4e02676da54778d Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 20 Mar 2023 13:00:42 +0200 Subject: [PATCH 193/335] rewriting merging on execondest --- .../vm/delegation/delegationMulti_test.go | 16 +++++++++++-- process/smartContract/process.go | 5 ---- .../delegationManager_test.go | 1 + vm/systemSmartContracts/delegation_test.go | 6 +++-- vm/systemSmartContracts/eei.go | 23 +++++++++++-------- 5 files changed, 33 insertions(+), 18 deletions(-) diff --git a/integrationTests/vm/delegation/delegationMulti_test.go b/integrationTests/vm/delegation/delegationMulti_test.go index 3aac775a6de..3d87dec1e08 100644 --- a/integrationTests/vm/delegation/delegationMulti_test.go +++ b/integrationTests/vm/delegation/delegationMulti_test.go @@ -5,7 +5,6 @@ package delegation import ( "encoding/hex" - "fmt" "math/big" "testing" @@ -69,6 +68,9 @@ func TestDelegationSystemClaimMulti(t *testing.T) { assert.Equal(t, vmcommon.Ok, returnedCode) } + verifyValidatorSCStake(t, tpn, delegationScAddresses[0], big.NewInt(5000)) + verifyValidatorSCStake(t, tpn, delegationScAddresses[1], big.NewInt(5000)) + for i := range delegationScAddresses { addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(1000), 1, 1) addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(2000), 2, 1) @@ -105,11 +107,12 @@ func TestDelegationSystemClaimMulti(t *testing.T) { checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[2], "claimMulti", listAddresses, 2700) checkClaimMultiReturn(t, tpn, vm.DelegationManagerSCAddress, delegators[3], "claimMulti", listAddresses, 2700) - fmt.Println("FROM HEEEREEEEEEE !!!!!!!!!!!!!!!!!!!!!!!!!") for _, delegator := range delegators { + tpn.ScrForwarder.CreateBlockStarted() returnedCode, err := processTransaction(tpn, delegator, vm.DelegationManagerSCAddress, txData, big.NewInt(0)) assert.Nil(t, err) assert.Equal(t, vmcommon.Ok, returnedCode) + assert.Equal(t, len(delegationScAddresses), len(tpn.ScrForwarder.GetAllCurrentFinishedTxs())) } for i := range delegationScAddresses { @@ -119,6 +122,9 @@ func TestDelegationSystemClaimMulti(t *testing.T) { checkDelegatorReward(t, tpn, delegationScAddresses[i], delegators[3], 0) checkDelegatorReward(t, tpn, delegationScAddresses[i], ownerAddresses[i], 6900) } + + verifyValidatorSCStake(t, tpn, delegationScAddresses[0], big.NewInt(5000)) + verifyValidatorSCStake(t, tpn, delegationScAddresses[1], big.NewInt(5000)) } func TestDelegationSystemRedelegateMulti(t *testing.T) { @@ -170,6 +176,9 @@ func TestDelegationSystemRedelegateMulti(t *testing.T) { assert.Equal(t, vmcommon.Ok, returnedCode) } + verifyValidatorSCStake(t, tpn, delegationScAddresses[0], big.NewInt(5000)) + verifyValidatorSCStake(t, tpn, delegationScAddresses[1], big.NewInt(5000)) + for i := range delegationScAddresses { addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(1000), 1, 1) addRewardsToDelegation(tpn, delegationScAddresses[i], big.NewInt(2000), 2, 1) @@ -224,6 +233,9 @@ func TestDelegationSystemRedelegateMulti(t *testing.T) { verifyDelegatorsStake(t, tpn, "getUserActiveStake", firstTwoDelegators, delegationScAddresses[1], big.NewInt(3700)) verifyDelegatorsStake(t, tpn, "getUserActiveStake", lastTwoDelegators, delegationScAddresses[0], big.NewInt(1850)) verifyDelegatorsStake(t, tpn, "getUserActiveStake", lastTwoDelegators, delegationScAddresses[1], big.NewInt(1850)) + + verifyValidatorSCStake(t, tpn, delegationScAddresses[0], big.NewInt(5000+8100)) + verifyValidatorSCStake(t, tpn, delegationScAddresses[1], big.NewInt(5000+8100)) } func checkClaimMultiReturn( diff --git a/process/smartContract/process.go b/process/smartContract/process.go index 7853c6842a9..7fd952a00bb 100644 --- a/process/smartContract/process.go +++ b/process/smartContract/process.go @@ -330,11 +330,6 @@ func (sc *scProcessor) doExecuteSmartContractTransaction( return vmOutput.ReturnCode, nil } - outAcc, exists := vmOutput.OutputAccounts[string(tx.GetSndAddr())] - if exists { - log.Error("num transfers", "num", len(outAcc.OutputTransfers)) - } - err = sc.gasConsumedChecks(tx, vmInput.GasProvided, vmInput.GasLocked, vmOutput) if err != nil { log.Error("gasConsumedChecks with problem ", "err", err.Error(), "txHash", txHash) diff --git a/vm/systemSmartContracts/delegationManager_test.go b/vm/systemSmartContracts/delegationManager_test.go index ed374a69b24..2c80cf0e204 100644 --- a/vm/systemSmartContracts/delegationManager_test.go +++ b/vm/systemSmartContracts/delegationManager_test.go @@ -812,6 +812,7 @@ func TestDelegationManagerSystemSC_mergeValidatorToDelegationSameOwner(t *testin assert.Equal(t, vmcommon.UserError, returnCode) assert.Equal(t, eei.returnMessage, vm.ErrUnknownSystemSmartContract.Error()) + //eei.softCleanCache() _ = eei.SetSystemSCContainer(&mock.SystemSCContainerStub{GetCalled: func(key []byte) (vm.SystemSmartContract, error) { return &mock.SystemSCStub{ExecuteCalled: func(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { return vmcommon.Ok diff --git a/vm/systemSmartContracts/delegation_test.go b/vm/systemSmartContracts/delegation_test.go index 29821fcf027..5cb17b9bac8 100644 --- a/vm/systemSmartContracts/delegation_test.go +++ b/vm/systemSmartContracts/delegation_test.go @@ -919,7 +919,6 @@ func TestDelegationSystemSC_ExecuteDelegateStakeNodes(t *testing.T) { vmOutput := eei.CreateVMOutput() assert.Equal(t, 6, len(vmOutput.OutputAccounts)) - assert.Equal(t, 2, len(vmOutput.OutputAccounts[string(vm.StakingSCAddress)].OutputTransfers)) output = d.Execute(vmInput) eei.gasRemaining = vmInput.GasProvided @@ -4576,6 +4575,7 @@ func TestDelegation_OptimizeRewardsComputation(t *testing.T) { vmInput.CallerAddr = delegator output = d.Execute(vmInput) + fmt.Println(eei.returnMessage) assert.Equal(t, vmcommon.Ok, output) destAcc, exists := eei.outputAccounts[string(vmInput.CallerAddr)] @@ -4758,7 +4758,9 @@ func createDefaultEeiArgs() VMContextArgs { InputParser: parsers.NewCallArgsParser(), ValidatorAccountsDB: &stateMock.AccountsStub{}, ChanceComputer: &mock.RaterMock{}, - EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{ + IsMultiClaimOnDelegationEnabledField: true, + }, } } diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 7fa27faac63..0abe296322f 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -120,9 +120,11 @@ func (host *vmContext) GetContract(address []byte) (vm.SystemSmartContract, erro // GetStorageFromAddress gets the storage from address and key func (host *vmContext) GetStorageFromAddress(address []byte, key []byte) []byte { + //log.Warn("get storage", "addr", address, "key", key) storageAdrMap, exists := host.storageUpdate[string(address)] if exists { if value, isInMap := storageAdrMap[string(key)]; isInMap { + //log.Warn("get storage", "addr", address, "key", key, "value", value) return value } } @@ -151,6 +153,8 @@ func (host *vmContext) SetStorageForAddress(address []byte, key []byte, value [] length := len(value) host.storageUpdate[strAdr][string(key)] = make([]byte, length) copy(host.storageUpdate[strAdr][string(key)][:length], value[:length]) + + //log.Warn("set storage", "addr", address, "key", key, "value", value) } // SetStorage saves the key value storage under the address @@ -329,24 +333,26 @@ func (host *vmContext) properMergeContexts(parentContext *vmContext, returnCode return } - if returnCode != vmcommon.UserError { + host.scAddress = parentContext.scAddress + host.AddReturnMessage(parentContext.returnMessage) + if returnCode != vmcommon.Ok { // no need to merge - revert was done - transaction will fail return } - // do not merge storage updates, those are already updated - + host.output = append(host.output, parentContext.output...) for _, rightAccount := range parentContext.outputAccounts { leftAccount, exist := host.outputAccounts[string(rightAccount.Address)] if !exist { - leftAccount = &vmcommon.OutputAccount{} + leftAccount = &vmcommon.OutputAccount{ + Balance: big.NewInt(0), + BalanceDelta: big.NewInt(0), + Address: rightAccount.Address, + } host.outputAccounts[string(rightAccount.Address)] = leftAccount - continue } - addOutputAccounts(leftAccount, rightAccount) } - host.scAddress = parentContext.scAddress } func addOutputAccounts( @@ -363,7 +369,7 @@ func addOutputAccounts( destination.BalanceDelta = big.NewInt(0) } if rightAccount.BalanceDelta != nil { - destination.BalanceDelta = rightAccount.BalanceDelta + destination.BalanceDelta.Add(destination.BalanceDelta, rightAccount.BalanceDelta) } if len(rightAccount.Code) > 0 { destination.Code = rightAccount.Code @@ -383,7 +389,6 @@ func addOutputAccounts( destination.BytesAddedToStorage += rightAccount.BytesAddedToStorage destination.BytesDeletedFromStorage += rightAccount.BytesDeletedFromStorage - destination.OutputTransfers = append(destination.OutputTransfers, rightAccount.OutputTransfers...) } From d681ccf07906bafc18837cc2beb4878ce0e9919d Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 20 Mar 2023 13:35:36 +0200 Subject: [PATCH 194/335] fix after review --- common/enablers/enableEpochsHandler_test.go | 3 ++- config/tomlConfig_test.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/common/enablers/enableEpochsHandler_test.go b/common/enablers/enableEpochsHandler_test.go index 50070d40c3b..e2bfa843ec6 100644 --- a/common/enablers/enableEpochsHandler_test.go +++ b/common/enablers/enableEpochsHandler_test.go @@ -91,7 +91,7 @@ func createEnableEpochsConfig() config.EnableEpochs { WipeSingleNFTLiquidityDecreaseEnableEpoch: 75, AlwaysSaveTokenMetaDataEnableEpoch: 76, RuntimeCodeSizeFixEnableEpoch: 77, - MultiClaimOnDelegationEnableEpoch: 77, + MultiClaimOnDelegationEnableEpoch: 78, } } @@ -215,6 +215,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.True(t, handler.IsAlwaysSaveTokenMetaDataEnabled()) assert.True(t, handler.IsRuntimeCodeSizeFixEnabled()) assert.True(t, handler.IsAlwaysSaveTokenMetaDataEnabled()) + assert.False(t, handler.IsMultiClaimOnDelegationEnabled()) }) t.Run("flags with == condition should be set, along with all >=", func(t *testing.T) { t.Parallel() diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index fb4d6a0fa19..2d24e9e17e9 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -685,7 +685,7 @@ func TestEnableEpochConfig(t *testing.T) { RuntimeMemStoreLimitEnableEpoch = 63 # MultiClaimOnDelegationEnableEpoch represents the epoch when the multi claim on delegation function is enabled - MultiClaimOnDelegationEnableEpoch = 62 + MultiClaimOnDelegationEnableEpoch = 64 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ @@ -782,7 +782,7 @@ func TestEnableEpochConfig(t *testing.T) { AlwaysSaveTokenMetaDataEnableEpoch: 61, RuntimeCodeSizeFixEnableEpoch: 62, RuntimeMemStoreLimitEnableEpoch: 63, - MultiClaimOnDelegationEnableEpoch: 62, + MultiClaimOnDelegationEnableEpoch: 64, BLSMultiSignerEnableEpoch: []MultiSignerConfig{ { EnableEpoch: 0, From 77d6b67f9fcb0a6e355613453b20caa633d1ef70 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 20 Mar 2023 14:56:07 +0200 Subject: [PATCH 195/335] fix after review --- vm/systemSmartContracts/delegationManager_test.go | 1 - vm/systemSmartContracts/eei.go | 4 ---- 2 files changed, 5 deletions(-) diff --git a/vm/systemSmartContracts/delegationManager_test.go b/vm/systemSmartContracts/delegationManager_test.go index 2c80cf0e204..ed374a69b24 100644 --- a/vm/systemSmartContracts/delegationManager_test.go +++ b/vm/systemSmartContracts/delegationManager_test.go @@ -812,7 +812,6 @@ func TestDelegationManagerSystemSC_mergeValidatorToDelegationSameOwner(t *testin assert.Equal(t, vmcommon.UserError, returnCode) assert.Equal(t, eei.returnMessage, vm.ErrUnknownSystemSmartContract.Error()) - //eei.softCleanCache() _ = eei.SetSystemSCContainer(&mock.SystemSCContainerStub{GetCalled: func(key []byte) (vm.SystemSmartContract, error) { return &mock.SystemSCStub{ExecuteCalled: func(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { return vmcommon.Ok diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 0abe296322f..9caea39e71b 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -120,11 +120,9 @@ func (host *vmContext) GetContract(address []byte) (vm.SystemSmartContract, erro // GetStorageFromAddress gets the storage from address and key func (host *vmContext) GetStorageFromAddress(address []byte, key []byte) []byte { - //log.Warn("get storage", "addr", address, "key", key) storageAdrMap, exists := host.storageUpdate[string(address)] if exists { if value, isInMap := storageAdrMap[string(key)]; isInMap { - //log.Warn("get storage", "addr", address, "key", key, "value", value) return value } } @@ -153,8 +151,6 @@ func (host *vmContext) SetStorageForAddress(address []byte, key []byte, value [] length := len(value) host.storageUpdate[strAdr][string(key)] = make([]byte, length) copy(host.storageUpdate[strAdr][string(key)][:length], value[:length]) - - //log.Warn("set storage", "addr", address, "key", key, "value", value) } // SetStorage saves the key value storage under the address From 94c2a365964c580a59c4451ee40f7c16eda83e38 Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 21 Mar 2023 10:44:41 +0200 Subject: [PATCH 196/335] - compressed 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 7bd4ffbcd41..7a2bf067ddd 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -240,7 +240,7 @@ AlwaysSaveTokenMetaDataEnableEpoch = 1 # RuntimeCodeSizeFixEnableEpoch represents the epoch when the code size fix in the VM is enabled - RuntimeCodeSizeFixEnableEpoch = 2 + RuntimeCodeSizeFixEnableEpoch = 1 # BLSMultiSignerEnableEpoch represents the activation epoch for different types of BLS multi-signers BLSMultiSignerEnableEpoch = [ From 78cf2f61630919d1703b299bbb14d937c9fc6824 Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 21 Mar 2023 15:51:13 +0200 Subject: [PATCH 197/335] - proper releases --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index b55229524c5..ab3d86bde39 100644 --- a/go.mod +++ b/go.mod @@ -13,16 +13,16 @@ 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.1.34-0.20230308105332-12c26500c7f7 + github.com/multiversx/mx-chain-core-go v1.1.36 github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.3.14 github.com/multiversx/mx-chain-logger-go v1.0.11 - github.com/multiversx/mx-chain-p2p-go v1.0.13-0.20230308113355-ba992b84110b + github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.38-0.20230308110011-f72eec6f1a08 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230308144027-4c00284edde1 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230308152315-a2b207d23ffb - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78-0.20230308152912-b97bcb50de0b + github.com/multiversx/mx-chain-vm-common-go v1.3.38 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78 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 52c555cfc69..40b320853b0 100644 --- a/go.sum +++ b/go.sum @@ -610,27 +610,27 @@ 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.1.34-0.20230308105332-12c26500c7f7 h1:dHukjD7Atn5TU1JkXN7+Lgxv7RYwl9IvR2tfGPV3GLM= -github.com/multiversx/mx-chain-core-go v1.1.34-0.20230308105332-12c26500c7f7/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.1.36 h1:yI4E6vv2KSn9dTbllyPZJvF9tYweuZnIbX9lTqJCCaU= +github.com/multiversx/mx-chain-core-go v1.1.36/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.3.14 h1:cDaBsY8i2PuCQZ6DMf3LgxB0ocErM3TWlKGGzGqGX7E= github.com/multiversx/mx-chain-es-indexer-go v1.3.14/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= 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-0.20230308113355-ba992b84110b h1:ewqI4G8a4d/dUz9n/ekdTLac5NYhlvnBy5crR4Bl4Cs= -github.com/multiversx/mx-chain-p2p-go v1.0.13-0.20230308113355-ba992b84110b/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2cGV/vPHsnqqbvTA2AN0= +github.com/multiversx/mx-chain-p2p-go v1.0.14 h1:ndrOESrdNyb0AFIqYAZ1yBYJF7cK1skgePO/zTbe/BU= +github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2cGV/vPHsnqqbvTA2AN0= 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.34/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.38-0.20230308110011-f72eec6f1a08 h1:r7ZHBcoPmKWnmLsGLL0lh01gNCVTc56COfXR+SQQsZg= -github.com/multiversx/mx-chain-vm-common-go v1.3.38-0.20230308110011-f72eec6f1a08/go.mod h1:+tr9VOLfAg5MVxjtSrO9QhWJU6nugUFwHWzGmzwBd/E= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230308144027-4c00284edde1 h1:qkMtBeZNQSn2XrFVn36vL1DHTSfryPMZgacqnqDSmFE= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51-0.20230308144027-4c00284edde1/go.mod h1:VcaphqJlrjLDxUGIpfneI8hEkdFTW14wEgMcLrtfDUo= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230308152315-a2b207d23ffb h1:xkU3/MFCBMBgkJcZ+99Y8OqPzvBJ5mDdncyl1e1Dch4= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52-0.20230308152315-a2b207d23ffb/go.mod h1:rjOpaArerItt6z3uFGGwe0XsZN8xrWHAebdBBgic/wg= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78-0.20230308152912-b97bcb50de0b h1:VbP4c/xc7H0IB/0FG29VG/fIb7qW+pkvi5ehj3CCjHo= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78-0.20230308152912-b97bcb50de0b/go.mod h1:8syIEIMFS32/nZdUQG1GPIdICghHmev3xJI3whDtJck= +github.com/multiversx/mx-chain-vm-common-go v1.3.38 h1:tJ9kTkCSveP9NfrenZvGf2goAGjWezDTK9EtTUuqXhM= +github.com/multiversx/mx-chain-vm-common-go v1.3.38/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51 h1:s05qY+a2AxPZKrtlLFAr+EbQhAjGkMfQaUrpyjXq2W8= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51/go.mod h1:5n7maiiveAuQezSdqpvrXLBQEphor9nhPjOhBv/zErQ= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52 h1:lCcElufhtsZuCVH6kZwCTM4JK/SmVjVyJ8M4D/D4TI8= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52/go.mod h1:L8wIeeZUkuBaKBaxBFBNtjDztX9XRQgBmefhl56mfh0= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78 h1:lG0pBfRus/Epzj9D119/E0UdOk3hVsnlIolZftYIjAc= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78/go.mod h1:n/wOsZ9BPXZahknR28TRpgfCLceMNhZ3Y3DiArHDJH4= 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 79840bab9d05cbf185608946b311e037e93217ea Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 21 Mar 2023 16:28:10 +0200 Subject: [PATCH 198/335] use extractBlockInfoIfNewAccount for GetGuardianData as well --- node/node.go | 7 ++++--- node/node_test.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/node/node.go b/node/node.go index ba246e2aa50..f6e04645b05 100644 --- a/node/node.go +++ b/node/node.go @@ -367,10 +367,11 @@ func (n *Node) GetValueForKey(address string, key string, options api.AccountQue func (n *Node) GetGuardianData(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { userAccount, blockInfo, err := n.loadUserAccountHandlerByAddress(address, options) if err != nil { - apiBlockInfo, ok := extractApiBlockInfoIfErrAccountNotFoundAtBlock(err) - if ok { - return api.GuardianData{}, apiBlockInfo, nil + adaptedBlockInfo, isEmptyAccount := extractBlockInfoIfNewAccount(err) + if isEmptyAccount { + return api.GuardianData{}, adaptedBlockInfo, nil } + return api.GuardianData{}, api.BlockInfo{}, err } diff --git a/node/node_test.go b/node/node_test.go index f5f7d25112f..e51c6b88ba6 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4455,7 +4455,7 @@ func TestNode_GetGuardianData(t *testing.T) { require.NotNil(t, err) require.True(t, strings.Contains(err.Error(), "invalid address")) }) - t.Run("error on loadUserAccountHandlerByAddress but extractApiBlockInfoIfErrAccountNotFoundAtBlock ok", func(t *testing.T) { + t.Run("error on loadUserAccountHandlerByAddress but account is new", func(t *testing.T) { providedBlockInfo := holders.NewBlockInfo([]byte{0xaa}, 7, []byte{0xbb}) accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { From f9d7d5aa507ce3ab51197c9e11ed007073ca848e Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 22 Mar 2023 12:08:21 +0200 Subject: [PATCH 199/335] - latest versions --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index ab3d86bde39..42189fc4e61 100644 --- a/go.mod +++ b/go.mod @@ -19,10 +19,10 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.38 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78 + github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 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 40b320853b0..bfdc9299326 100644 --- a/go.sum +++ b/go.sum @@ -623,14 +623,14 @@ github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2 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.34/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.38 h1:tJ9kTkCSveP9NfrenZvGf2goAGjWezDTK9EtTUuqXhM= -github.com/multiversx/mx-chain-vm-common-go v1.3.38/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51 h1:s05qY+a2AxPZKrtlLFAr+EbQhAjGkMfQaUrpyjXq2W8= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51/go.mod h1:5n7maiiveAuQezSdqpvrXLBQEphor9nhPjOhBv/zErQ= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52 h1:lCcElufhtsZuCVH6kZwCTM4JK/SmVjVyJ8M4D/D4TI8= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52/go.mod h1:L8wIeeZUkuBaKBaxBFBNtjDztX9XRQgBmefhl56mfh0= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78 h1:lG0pBfRus/Epzj9D119/E0UdOk3hVsnlIolZftYIjAc= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78/go.mod h1:n/wOsZ9BPXZahknR28TRpgfCLceMNhZ3Y3DiArHDJH4= +github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf h1:1mCRjtB2W8q3VPPwhlL7OZOyTzkpJa8/xmpPIA7JCyQ= +github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc h1:Sk83Pf8lL3RtHpfOisJlvG8uk0LBytScQI1+TthBxEI= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc/go.mod h1:44jBXUBfoBJ7W5gLoLJrOB14pt5TUUJBh6jDc7BaC68= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de h1:wlpWxxf/qJHkLakKQvgebCbOWDm1s0mlYts3X3iLXsg= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de/go.mod h1:/PSbbb+0/HeUlbrsLO1Af9rmPWu5w491vGH/2dnmtrE= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 h1:oo4JFogoglCcRHVU9mM7IRq85Cbz7UDpn7G6+1qGBmQ= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329/go.mod h1:uiinjaJAKIGOA4CaZupv9z6OWwNOJRwyuMUdE9imawQ= 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 49840fca3dd586662a81a40a415742bdea5d7342 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 23 Mar 2023 16:02:21 +0200 Subject: [PATCH 200/335] - added semi-integration test --- integrationTests/vm/txsFee/asyncESDT_test.go | 75 ++++++++++++++++++ .../vm/txsFee/testdata/third/third.wasm | Bin 0 -> 8199 bytes 2 files changed, 75 insertions(+) create mode 100644 integrationTests/vm/txsFee/testdata/third/third.wasm diff --git a/integrationTests/vm/txsFee/asyncESDT_test.go b/integrationTests/vm/txsFee/asyncESDT_test.go index 28415adc9e5..63d566cb1c6 100644 --- a/integrationTests/vm/txsFee/asyncESDT_test.go +++ b/integrationTests/vm/txsFee/asyncESDT_test.go @@ -6,15 +6,18 @@ package txsFee import ( + "context" "encoding/hex" "math/big" "testing" "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/state" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/stretchr/testify/require" ) @@ -474,3 +477,75 @@ func TestSendNFTToContractWith0FunctionNonPayable(t *testing.T) { _, err = testContext.Accounts.Commit() require.Nil(t, err) } + +func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { + testContext, err := vm.CreatePreparedTxProcessorWithVMsMultiShard(0, config.EnableEpochs{}) + require.Nil(t, err) + defer testContext.Close() + + function1 := []byte("add_queued_call") + function2 := []byte("forward_queued_calls") + + egldBalance := big.NewInt(100000000) + ownerAddr := []byte("owner-78901234567890123456789000") + _, _ = vm.CreateAccount(testContext.Accounts, ownerAddr, 0, egldBalance) + + // create an address with ESDT token + sndAddr := []byte("sender-8901234567890123456789000") + + esdtBalance := big.NewInt(100000000) + token := []byte("miiutoken") + utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) + + // 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)) + + testContext.TxFeeHandler.CreateBlockStarted(getZeroGasAndFees()) + utils.CleanAccumulatedIntermediateTransactions(t, testContext) + + // execute first call + gasLimit := uint64(500000) + tx := utils.CreateESDTTransferTx(0, sndAddr, scAddress, token, big.NewInt(5000), gasPrice, gasLimit) + tx.Data = []byte(string(tx.Data) + "@" + hex.EncodeToString(function1) + "@01@" + hex.EncodeToString(scAddress) + "@" + hex.EncodeToString(function2)) + + retCode, err := testContext.TxProcessor.ProcessTransaction(tx) + require.Equal(t, vmcommon.UserError, retCode) + require.Nil(t, err) + + // execute second call + tx = utils.CreateESDTTransferTx(1, sndAddr, scAddress, token, big.NewInt(5000), gasPrice, gasLimit) + tx.Data = []byte(string(tx.Data) + "@" + hex.EncodeToString(function2)) + + retCode, err = testContext.TxProcessor.ProcessTransaction(tx) + require.Equal(t, vmcommon.Ok, retCode) + require.Nil(t, err) + + _, err = testContext.Accounts.Commit() + require.Nil(t, err) + + // try to recreate the data trie + scAccount, err := testContext.Accounts.LoadAccount(scAddress) + require.Nil(t, err) + userScAccount := scAccount.(state.UserAccountHandler) + roothash := userScAccount.GetRootHash() + log.Info("recreating data trie", "roothash", roothash) + + leaves := &common.TrieIteratorChannels{ + LeavesChan: make(chan core.KeyValueHolder, 1), + ErrChan: make(chan error, 1), + } + err = testContext.Accounts.GetAllLeaves(leaves, context.Background(), roothash) + require.Nil(t, err) + + for _ = range leaves.LeavesChan { + // do nothing, just iterate + } + + select { + case err = <-leaves.ErrChan: + require.Nil(t, err) + } +} diff --git a/integrationTests/vm/txsFee/testdata/third/third.wasm b/integrationTests/vm/txsFee/testdata/third/third.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ee7f953b0281b5c5ae490ec67ddd5e29ac1b4559 GIT binary patch literal 8199 zcmb_h+izUQd7qhc_ClUr?#N+mnqulX$5KNkrX^Q0>CkG-S&7vBVv$xZbwaJkBZ^CM zm)u>-5|D~aEEq130(#6t5acO($RAMwEs8!AffE$Hq%DxgKDuZgg4VJ7`^}tPas?S^ zi|Vpx&Ro9vuD|b_Iil9yltKvkt;$WcyDM(WUAfB^euG`#A#Mu%Lq~`X4!Eaq<9Nf0 z2N-^URS(3?-0toJHz|*Yo38#W|5A`P?hf2qTRq?C*p(F#@O^Nzx^w$>+PadyC-Uql zXB~EHD{ZU@#lGjVzJ*S+Ra;FjHEY>`&IZn=ol9wBwR1;EH{Wl9-qW>>jT^O%om7Me z33=kx`<=8c2K+#+0m>^2Ypadg#$2n_Z21+3R@07ct?q25jlL}ow>Lo=l3cX-nm-)j%Q#HWX{&wm(trE z5pn)-CiCg$)_qE_u(7tBiUNneu&<7%Mk-wmrkw*)znJyTx0;((XP2%hUhiFcncn$G z`z->dy8`+Fok_EB8YXU~?Y5U<$XjF~?LcKyCq;?ucIVpm{l+paC5r4GTE3GmuU~0i ztKFy8MUI_ax0qjRtU)!-%$01fZ?x7raEevo^f|V#&&xX-owd1zGmB5T!QpJm+`V*p zr;}c7oJrfA)6GUFz1I;#+^({`k=7d5)6Pz-ai-R(c_xx^+f1*O)##C{3(&LuDbb#%#~DRxYG6KM@tf~ zdhTFX1Y(YZ>oV9i(hk?bW2}q>HGMP=(51;a+9Bi_t{XKYATN4N=)^a{6gI{dU}6e< zpf#byv=UK;ij;}Oo@x|2JcV~7ooWNT>k#{pkcCo6vIOFur1XUF#!V?nG)V*e4vGMO ziGX5u>}U8>Fye3}asyU^jNQ>WyAvJf>?d$3`+}ZGKm^<6M@?w|fqj8%Lw~-Z3nDs1 zUQGgqFjJ2j6_vpfdW8PMC~W*ip$Cna4`;F2uSw%Y9f@eFXEh0fOPEE^Iz>=2BPT`4 z%Iz7!{hee~Cag_|!8VK00QU&3x*JtomkD6MiWO(0Ydy-DE9o!^>_~^U?;uz{DQvgc zzH9eB4Ytu5x!Y>d5cI85-G=ZjD*hW?52H97)MxZ_qYzG?fLLJSq<%fhJYLwprGpE~ zpIHxK03wHIy|d8JLFb0F86yyUq|>7K88>*(xPjcB8z^6S;rF*bimhLe@_{ZVqWaT6 z&;KbHa*Z2@qrX!sx2qmtL*t?eA+d}9vrfDAQ(FFP=-y16W9JxsbzF_WP31(Of&opsDD9|wKGDs<= zqswJUk@(*Wx$a;Z`}~G!j$lo&v8y^5#ZTDvkQ_b4dyBrH&(1|JV3t0b2>VO8fIf#! zguVhdIn?d{d*3gjF=|!m^F1Hcmn+!Z1~Xzf`mK~XA`^fDxs#w+2jX-71^tJ3g(k+3 zEdx8ol>0WM2`0r@B5iOUBKhgo=&u2@F?mXLCnq^L_1jpP)7KwkIENU&26*8LH1gd> z!KYp(;j?8J9}$fl^?5dfBw!kf%lT-9$J5UX-tqHZl`gXeE@lyjER7H$h(r5`%^^0= zJmo(?lP(+!2gm5h;27_H$w9x_^_-te8D^?Ono+aRjno$t3G0A=5ldDK^u`2eLuEp4 zDAp?gxym=_{7xk~7ah)TsR^PlG%;896^x6@gYN5eK;bi}0&uxZ&45&0;rAszrg%#8 zDafZ=7>mm#QVhI^#uEB^7Qv6Bf69bIIYz&r*T*@^2q}rRWQ}nOy8&jyBv0qQSe9L6 zL5opmU=y(qFwW}0e~V%Q&c-NW<)x1Sh>1WN3Ntx)U^n0{A|V8Z&NFYI6V7()LS1$B z82wYz%Q&i!l{qI@k3$Am<_C=OK0Kaust8~$8_s7zQGZQ9ZPnrj4_UrhS$Eb0H_?M0 zKCqS$`eH1g0>r*Z0tU5y1zQ4VLJvUzHitsqzDb}LITwEK8<5vGO0I!DsRP24e$5Ny zaP^%YJk9^#J=K*l8OmkIahm1JZjYq1EPV3V>YaSIX;C?zoVRVdu|{Ipqa73I(E^ zp`$!?M1dEf!T~EN&VD6vDDVO2kk!cQ_y^TJ_vguH;(ffo@xepV@k1{8U4=sK$8IVpxMYltkxX6GpfS}>Td z`|}mvp$}&F?7S5T`-lZR%fq73FQC-;YV?;Zqyxg{9#5=CvVJhUlwfz@r~NkpGWsf7 z$I&1lZs<#RGj;sTt|zRSlbkDFSx*c52J!*>^1knH1QRaLZ;3nQ2s_?8$%%>Jcv4`+ zjcS$C1LIa9XLt=@>^RL#2R;L-UFiUh5-S zZry}>7g<{14CcmxVt3d=bh=~M26%ANW-yR@3=qgw&4-U6{&7;o^hvRSBhm=Z%B(Q< zB^oXr^7&h)t^Y9aT#g&>Hx={XUl{`|m7}wZ;S^V;mOsSK^%gF~=(U+fb9z--KYH zp2BaAzxsrJ(a_M+zyzjEfbAUANnT&ZGE5(%!Aw!# zpfX<&#@Df`wG~NL}B+L&K7!$0Y@@;>sO3k~@DnH!^S) z99E8#1sGm0;4!-n<^Si9D({B$;78tr>DP8WmTK01k{tq&$LxA`ArKsPna_>+Gr_tZ zjR49I2+V303JPs_cSuQ8s`e+Ws1hDO{E;LM^q1pe)q}46Sk$ZTEMn7Y3D*P z2vaqE2DZkz9C6q?m!sWx680yp&i`N{4nGrWBPjz{O}QUzAEM(R&X)Ue7Oy>=#l#-Y zf=Y(7AWEE#K)oNux!eC2^|%7FyaQh=1snkkCv&c(*J9vO0=HziD^zMXoO}1W zkH8g7*tafp>i|ewSQ73pLC-i3@i~0~k@=3NZE*AFogL1B&BuG^cY3gKUgCMu3k({B zmBiy8-36cv03Qqv)Ott%JRx+@DpsZLHjKp1Atz$f!DB+aDS@z);$4&y4(p)bV={bG zKwO8~fJ9H5(3?>m06D{C*&~SfG9Z|n5hp#1_%(GR?6|te3%+sHA%aed@8M45%dxaS zC(aB5XB2KezRA)Q2!o49J;iGegfuUZ060e(jwT|eAnx^_K<5_5#CcBIACiW@7F zK%@_$cmmWzK4Hu~K7m^uJb*=8c$CSGsP0Y&_n-?popUGshSPsCRNZ|WdAJ-8;W8$c zW{4`f#-E$~S>zAUS05hLV|cteid!2{{hYnCZJxmb!0jV}OpE$l!lQ89@+dQ|ZxdPS zsBXa#`NJ(BEUl?!+;%a6yVfuP)wPT(DL9I|ERsX+JR-1xzer>8p%V$AOd@p2{s-}I z5VtxoJ8zQ|^G0?cDDk9BH9DKKHr)+WhMvOD zA%~wseds*YkIs1Qp))4-&>5sMbOsSu1p~Hdv~Ds%^VxT+@LH4GpO$me(2?m3@9xas zF$GgXvf^zWnmlOc^_NDWJjB+td;5b?+|s#X=Mjq?95f%Z;`kDCVjyHx%I<}S*zq$Z z^SDApM#CqJi;Q*)wXfS?I|14QLC_`R9L$b0Zw5U%mg70hL4LV72-HvPn7IHAT+lq(h;$45Dg=8IE zgj0uHgHt+u4^F{dnFt(N0SP2{1VUxN`Ha~S@Fd_qh-Xm3d6o`rf_f~Rcqr2yvih@j zS3Kdwi=vMeZVg!5MZZ>Sjk~ptwH1Tkom5G&*4WzVm`<~4Hku85GF@)ATIq7fGNXgrT4bLXS(ug18lsy*0|kl z`)}HPoXwb9wG~rqwQBdxhWoDFY4YpaQs@3wI(PQcnFHVJ+E0DId*;Wx3ckS&;Xghd ah^<; Date: Thu, 23 Mar 2023 17:29:05 +0200 Subject: [PATCH 201/335] - added concurrency protection --- integrationTests/vm/txsFee/asyncESDT_test.go | 11 +++++-- state/accountsDB.go | 30 +++++++++++-------- state/accountsDB_test.go | 10 +++---- state/dataTriesHolder.go | 10 +++++++ state/export_test.go | 6 ++-- .../storagePruningManager.go | 3 +- trie/node.go | 3 +- trie/patriciaMerkleTrie.go | 2 ++ 8 files changed, 51 insertions(+), 24 deletions(-) diff --git a/integrationTests/vm/txsFee/asyncESDT_test.go b/integrationTests/vm/txsFee/asyncESDT_test.go index 63d566cb1c6..7739e6f0bf3 100644 --- a/integrationTests/vm/txsFee/asyncESDT_test.go +++ b/integrationTests/vm/txsFee/asyncESDT_test.go @@ -494,6 +494,7 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { sndAddr := []byte("sender-8901234567890123456789000") esdtBalance := big.NewInt(100000000) + esdtTransferValue := big.NewInt(5000) token := []byte("miiutoken") utils.CreateAccountWithESDTBalance(t, testContext.Accounts, sndAddr, egldBalance, token, 0, esdtBalance) @@ -508,13 +509,16 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { // execute first call gasLimit := uint64(500000) - tx := utils.CreateESDTTransferTx(0, sndAddr, scAddress, token, big.NewInt(5000), gasPrice, gasLimit) + tx := utils.CreateESDTTransferTx(0, sndAddr, scAddress, token, esdtTransferValue, gasPrice, gasLimit) tx.Data = []byte(string(tx.Data) + "@" + hex.EncodeToString(function1) + "@01@" + hex.EncodeToString(scAddress) + "@" + hex.EncodeToString(function2)) retCode, err := testContext.TxProcessor.ProcessTransaction(tx) require.Equal(t, vmcommon.UserError, retCode) require.Nil(t, err) + utils.CheckESDTBalance(t, testContext, sndAddr, token, esdtBalance) + utils.CheckESDTBalance(t, testContext, scAddress, token, big.NewInt(0)) + // execute second call tx = utils.CreateESDTTransferTx(1, sndAddr, scAddress, token, big.NewInt(5000), gasPrice, gasLimit) tx.Data = []byte(string(tx.Data) + "@" + hex.EncodeToString(function2)) @@ -526,6 +530,9 @@ 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, scAddress, token, esdtTransferValue) + // try to recreate the data trie scAccount, err := testContext.Accounts.LoadAccount(scAddress) require.Nil(t, err) @@ -540,7 +547,7 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { err = testContext.Accounts.GetAllLeaves(leaves, context.Background(), roothash) require.Nil(t, err) - for _ = range leaves.LeavesChan { + for range leaves.LeavesChan { // do nothing, just iterate } diff --git a/state/accountsDB.go b/state/accountsDB.go index 7ff1617e04b..7a9e5fa8049 100644 --- a/state/accountsDB.go +++ b/state/accountsDB.go @@ -509,12 +509,11 @@ func saveCodeEntry(codeHash []byte, entry *CodeEntry, trie Updater, marshalizer return nil } -// LoadDataTrie retrieves and saves the SC data inside accountHandler object. +// loadDataTrieConcurrentSafe retrieves and saves the SC data inside accountHandler object. // Errors if something went wrong -func (adb *AccountsDB) loadDataTrie(accountHandler baseAccountHandler, mainTrie common.Trie) error { - if len(accountHandler.GetRootHash()) == 0 { - return nil - } +func (adb *AccountsDB) loadDataTrieConcurrentSafe(accountHandler baseAccountHandler, mainTrie common.Trie) error { + adb.mutOp.Lock() + defer adb.mutOp.Unlock() dataTrie := adb.dataTries.Get(accountHandler.AddressBytes()) if dataTrie != nil { @@ -522,6 +521,10 @@ func (adb *AccountsDB) loadDataTrie(accountHandler baseAccountHandler, mainTrie return nil } + if len(accountHandler.GetRootHash()) == 0 { + return nil + } + dataTrie, err := mainTrie.Recreate(accountHandler.GetRootHash()) if err != nil { return fmt.Errorf("trie was not found for hash, rootHash = %s, err = %w", hex.EncodeToString(accountHandler.GetRootHash()), err) @@ -702,7 +705,7 @@ func (adb *AccountsDB) LoadAccount(address []byte) (vmcommon.AccountHandler, err baseAcc, ok := acnt.(baseAccountHandler) if ok { - err = adb.loadDataTrie(baseAcc, mainTrie) + err = adb.loadDataTrieConcurrentSafe(baseAcc, mainTrie) if err != nil { return nil, err } @@ -754,7 +757,7 @@ func (adb *AccountsDB) GetExistingAccount(address []byte) (vmcommon.AccountHandl baseAcc, ok := acnt.(baseAccountHandler) if ok { - err = adb.loadDataTrie(baseAcc, mainTrie) + err = adb.loadDataTrieConcurrentSafe(baseAcc, mainTrie) if err != nil { return nil, err } @@ -784,7 +787,7 @@ func (adb *AccountsDB) GetAccountFromBytes(address []byte, accountBytes []byte) return acnt, nil } - err = adb.loadDataTrie(baseAcc, adb.getMainTrie()) + err = adb.loadDataTrieConcurrentSafe(baseAcc, adb.getMainTrie()) if err != nil { return nil, err } @@ -1099,7 +1102,10 @@ func (adb *AccountsDB) journalize(entry JournalEntry) { } adb.entries = append(adb.entries, entry) - log.Trace("accountsDB.Journalize", "new length", len(adb.entries)) + log.Trace("accountsDB.Journalize", + "new length", len(adb.entries), + "entry type", fmt.Sprintf("%T", entry), + ) if len(adb.entries) == 1 { adb.stackDebug = debug.Stack() @@ -1146,12 +1152,12 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { } stats := newSnapshotStatistics(1, 1) - accountMetrics := &accountMetrics{ + accountMetricsInstance := &accountMetrics{ snapshotInProgressKey: common.MetricAccountsSnapshotInProgress, lastSnapshotDurationKey: common.MetricLastAccountsSnapshotDurationSec, snapshotMessage: userTrieSnapshotMsg, } - adb.updateMetricsOnSnapshotStart(accountMetrics) + adb.updateMetricsOnSnapshotStart(accountMetricsInstance) go func() { stats.NewSnapshotStarted() @@ -1164,7 +1170,7 @@ func (adb *AccountsDB) SnapshotState(rootHash []byte) { go adb.syncMissingNodes(missingNodesChannel, stats, adb.trieSyncer) - go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, accountMetrics, epoch) + go adb.processSnapshotCompletion(stats, trieStorageManager, missingNodesChannel, iteratorChannels.ErrChan, rootHash, accountMetricsInstance, epoch) adb.waitForCompletionIfAppropriate(stats) } diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index fb0179db1c3..28f8dbed474 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -698,7 +698,7 @@ func TestAccountsDB_LoadDataNilRootShouldRetNil(t *testing.T) { _, account, adb := generateAddressAccountAccountsDB(tr) // since root is nil, result should be nil and data trie should be nil - err := adb.LoadDataTrie(account) + err := adb.LoadDataTrieConcurrentSafe(account) assert.Nil(t, err) assert.Nil(t, account.DataTrie()) } @@ -715,7 +715,7 @@ func TestAccountsDB_LoadDataBadLengthShouldErr(t *testing.T) { account.SetRootHash([]byte("12345")) // should return error - err := adb.LoadDataTrie(account) + err := adb.LoadDataTrieConcurrentSafe(account) assert.NotNil(t, err) } @@ -733,7 +733,7 @@ func TestAccountsDB_LoadDataMalfunctionTrieShouldErr(t *testing.T) { adb := generateAccountDBFromTrie(mockTrie) // should return error - err := adb.LoadDataTrie(account) + err := adb.LoadDataTrieConcurrentSafe(account) assert.NotNil(t, err) } @@ -751,7 +751,7 @@ func TestAccountsDB_LoadDataNotFoundRootShouldReturnErr(t *testing.T) { account.SetRootHash(rootHash) // should return error - err := adb.LoadDataTrie(account) + err := adb.LoadDataTrieConcurrentSafe(account) assert.NotNil(t, err) fmt.Println(err.Error()) } @@ -795,7 +795,7 @@ func TestAccountsDB_LoadDataWithSomeValuesShouldWork(t *testing.T) { account.SetRootHash(rootHash) // should not return error - err := adb.LoadDataTrie(account) + err := adb.LoadDataTrieConcurrentSafe(account) assert.Nil(t, err) // verify data diff --git a/state/dataTriesHolder.go b/state/dataTriesHolder.go index 4cf51bd9a3d..8333b875fce 100644 --- a/state/dataTriesHolder.go +++ b/state/dataTriesHolder.go @@ -4,6 +4,7 @@ import ( "sync" "github.com/multiversx/mx-chain-go/common" + logger "github.com/multiversx/mx-chain-logger-go" ) type dataTriesHolder struct { @@ -20,6 +21,8 @@ func NewDataTriesHolder() *dataTriesHolder { // Put adds a trie pointer to the tries map func (dth *dataTriesHolder) Put(key []byte, tr common.Trie) { + log.Trace("put trie in data tries holder", "key", key) + dth.mutex.Lock() dth.tries[string(key)] = tr dth.mutex.Unlock() @@ -67,6 +70,13 @@ func (dth *dataTriesHolder) GetAllTries() map[string]common.Trie { // Reset clears the tries map func (dth *dataTriesHolder) Reset() { dth.mutex.Lock() + + if log.GetLevel() == logger.LogTrace { + for key := range dth.tries { + log.Trace("reset data tries holder", "key", key) + } + } + dth.tries = make(map[string]common.Trie) dth.mutex.Unlock() } diff --git a/state/export_test.go b/state/export_test.go index d7b956dd0ec..3ff10d977b2 100644 --- a/state/export_test.go +++ b/state/export_test.go @@ -22,9 +22,9 @@ func (adb *AccountsDB) LoadCode(accountHandler baseAccountHandler) error { return adb.loadCode(accountHandler) } -// LoadDataTrie - -func (adb *AccountsDB) LoadDataTrie(accountHandler baseAccountHandler) error { - return adb.loadDataTrie(accountHandler, adb.getMainTrie()) +// LoadDataTrieConcurrentSafe - +func (adb *AccountsDB) LoadDataTrieConcurrentSafe(accountHandler baseAccountHandler) error { + return adb.loadDataTrieConcurrentSafe(accountHandler, adb.getMainTrie()) } // GetAccount - diff --git a/state/storagePruningManager/storagePruningManager.go b/state/storagePruningManager/storagePruningManager.go index 73d9af30847..2dcf7bad076 100644 --- a/state/storagePruningManager/storagePruningManager.go +++ b/state/storagePruningManager/storagePruningManager.go @@ -3,6 +3,7 @@ package storagePruningManager import ( "bytes" "encoding/hex" + "fmt" "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" @@ -81,7 +82,7 @@ func (spm *storagePruningManager) markForEviction( return err } - logMapWithTrace("MarkForEviction "+string(identifier), "hash", hashes) + logMapWithTrace(fmt.Sprintf("MarkForEviction %d", identifier), "hash", hashes) return nil } diff --git a/trie/node.go b/trie/node.go index 2fc924ef457..cd62c4df2ec 100644 --- a/trie/node.go +++ b/trie/node.go @@ -5,6 +5,7 @@ import ( "context" "encoding/hex" "fmt" + "runtime/debug" "time" "github.com/multiversx/mx-chain-core-go/hashing" @@ -119,7 +120,7 @@ func computeAndSetNodeHash(n node) ([]byte, error) { func getNodeFromDBAndDecode(n []byte, db common.DBWriteCacher, marshalizer marshal.Marshalizer, hasher hashing.Hasher) (node, error) { encChild, err := db.Get(n) if err != nil { - log.Trace(common.GetNodeFromDBErrorString, "error", err, "key", n) + log.Trace(common.GetNodeFromDBErrorString, "error", err, "key", n, "stack trace", string(debug.Stack())) return nil, fmt.Errorf(common.GetNodeFromDBErrorString+" %w for key %v", err, hex.EncodeToString(n)) } diff --git a/trie/patriciaMerkleTrie.go b/trie/patriciaMerkleTrie.go index e6d22323566..59b6d988f59 100644 --- a/trie/patriciaMerkleTrie.go +++ b/trie/patriciaMerkleTrie.go @@ -216,9 +216,11 @@ func (tr *patriciaMerkleTrie) Commit() error { defer tr.mutOperation.Unlock() if tr.root == nil { + log.Trace("trying to commit empty trie") return nil } if !tr.root.isDirty() { + log.Trace("trying to commit clean trie", "root", tr.root.getHash()) return nil } err := tr.root.setRootHash() From d9a1bad9710af955ec8abc0588aaccefc34580f3 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 23 Mar 2023 17:33:40 +0200 Subject: [PATCH 202/335] - linter fix --- integrationTests/vm/txsFee/asyncESDT_test.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/integrationTests/vm/txsFee/asyncESDT_test.go b/integrationTests/vm/txsFee/asyncESDT_test.go index 7739e6f0bf3..a4318ad54f0 100644 --- a/integrationTests/vm/txsFee/asyncESDT_test.go +++ b/integrationTests/vm/txsFee/asyncESDT_test.go @@ -551,8 +551,6 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { // do nothing, just iterate } - select { - case err = <-leaves.ErrChan: - require.Nil(t, err) - } + err = <-leaves.ErrChan + require.Nil(t, err) } From bcf043b5e5bcaf3de3554c35ad4fcdc6a1f551b1 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 23 Mar 2023 17:37:00 +0200 Subject: [PATCH 203/335] add unit tests --- state/accountsDB_test.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index fb0179db1c3..8f623178686 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -2812,6 +2812,34 @@ func TestAccountsDb_Concurrent(t *testing.T) { testAccountMethodsConcurrency(t, adb, accountsAddresses, rootHash) } +func TestAccountsDB_SaveKeyValAfterAccountIsReverted(t *testing.T) { + t.Parallel() + + _, adb := getDefaultTrieAndAccountsDb() + addr := generateRandomByteArray(32) + + acc, _ := adb.LoadAccount(addr) + _ = adb.SaveAccount(acc) + + acc, _ = adb.LoadAccount(addr) + acc.(state.UserAccountHandler).IncreaseNonce(1) + _ = acc.(state.UserAccountHandler).SaveKeyValue([]byte("key"), []byte("value")) + _ = adb.SaveAccount(acc) + + err := adb.RevertToSnapshot(1) + require.Nil(t, err) + + acc, _ = adb.LoadAccount(addr) + _ = acc.(state.UserAccountHandler).SaveKeyValue([]byte("key"), []byte("value")) + _ = adb.SaveAccount(acc) + + _, err = adb.Commit() + + acc, err = adb.LoadAccount(addr) + require.Nil(t, err) + require.NotNil(t, acc) +} + func testAccountMethodsConcurrency( t *testing.T, adb state.AccountsAdapter, From 16822d117d05669f779febb2eed5d9c176d8af4a Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 23 Mar 2023 17:54:11 +0200 Subject: [PATCH 204/335] - linter fix --- state/accountsDB_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/state/accountsDB_test.go b/state/accountsDB_test.go index e7c3a0b1438..644e358abb9 100644 --- a/state/accountsDB_test.go +++ b/state/accountsDB_test.go @@ -2834,6 +2834,7 @@ func TestAccountsDB_SaveKeyValAfterAccountIsReverted(t *testing.T) { _ = adb.SaveAccount(acc) _, err = adb.Commit() + require.Nil(t, err) acc, err = adb.LoadAccount(addr) require.Nil(t, err) From 2ad690e2e0fc0520f3986a3b6086f1b0da6a3696 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 23 Mar 2023 18:14:46 +0200 Subject: [PATCH 205/335] - changed log level --- trie/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/trie/node.go b/trie/node.go index cd62c4df2ec..e248733f6d4 100644 --- a/trie/node.go +++ b/trie/node.go @@ -120,7 +120,7 @@ func computeAndSetNodeHash(n node) ([]byte, error) { func getNodeFromDBAndDecode(n []byte, db common.DBWriteCacher, marshalizer marshal.Marshalizer, hasher hashing.Hasher) (node, error) { encChild, err := db.Get(n) if err != nil { - log.Trace(common.GetNodeFromDBErrorString, "error", err, "key", n, "stack trace", string(debug.Stack())) + log.Warn(common.GetNodeFromDBErrorString, "error", err, "key", n, "stack trace", string(debug.Stack())) return nil, fmt.Errorf(common.GetNodeFromDBErrorString+" %w for key %v", err, hex.EncodeToString(n)) } From ee6bb31e2e06b0b25d44f2cc942efe255c5c4490 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 24 Mar 2023 11:10:07 +0200 Subject: [PATCH 206/335] - fixed log print on getNodeFromDB error --- trie/node.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/trie/node.go b/trie/node.go index e248733f6d4..fd229363a24 100644 --- a/trie/node.go +++ b/trie/node.go @@ -13,6 +13,7 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/trie/keyBuilder" + logger "github.com/multiversx/mx-chain-logger-go" ) const ( @@ -120,7 +121,12 @@ func computeAndSetNodeHash(n node) ([]byte, error) { func getNodeFromDBAndDecode(n []byte, db common.DBWriteCacher, marshalizer marshal.Marshalizer, hasher hashing.Hasher) (node, error) { encChild, err := db.Get(n) if err != nil { - log.Warn(common.GetNodeFromDBErrorString, "error", err, "key", n, "stack trace", string(debug.Stack())) + logLevel := logger.LogWarning + if errors.IsClosingError(err) { + logLevel = logger.LogTrace + } + + log.Log(logLevel, common.GetNodeFromDBErrorString, "error", err, "key", n, "stack trace", string(debug.Stack())) return nil, fmt.Errorf(common.GetNodeFromDBErrorString+" %w for key %v", err, hex.EncodeToString(n)) } From bf672100f8c3469f9071c27de0b5d6cec20989ab Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 24 Mar 2023 11:34:50 +0200 Subject: [PATCH 207/335] - refactored log print + added unit tests --- trie/node.go | 18 ++++++++++---- trie/node_test.go | 62 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 5 deletions(-) diff --git a/trie/node.go b/trie/node.go index fd229363a24..e75c29d2ff3 100644 --- a/trie/node.go +++ b/trie/node.go @@ -121,18 +121,26 @@ func computeAndSetNodeHash(n node) ([]byte, error) { func getNodeFromDBAndDecode(n []byte, db common.DBWriteCacher, marshalizer marshal.Marshalizer, hasher hashing.Hasher) (node, error) { encChild, err := db.Get(n) if err != nil { - logLevel := logger.LogWarning - if errors.IsClosingError(err) { - logLevel = logger.LogTrace - } + treatLogError(log, err, n) - log.Log(logLevel, common.GetNodeFromDBErrorString, "error", err, "key", n, "stack trace", string(debug.Stack())) return nil, fmt.Errorf(common.GetNodeFromDBErrorString+" %w for key %v", err, hex.EncodeToString(n)) } return decodeNode(encChild, marshalizer, hasher) } +func treatLogError(logInstance logger.Logger, err error, key []byte) { + logLevel := logger.LogTrace + extraInfo := make([]interface{}, 0, 6) + extraInfo = append(extraInfo, "error", err, "key", key) + if !errors.IsClosingError(err) { + logLevel = logger.LogWarning + extraInfo = append(extraInfo, "stack trace", string(debug.Stack())) + } + + logInstance.Log(logLevel, common.GetNodeFromDBErrorString, extraInfo...) +} + func resolveIfCollapsed(n node, pos byte, db common.DBWriteCacher) error { err := n.isEmptyOrNil() if err != nil { diff --git a/trie/node_test.go b/trie/node_test.go index dbc30aa4174..3eb3e9ffb51 100644 --- a/trie/node_test.go +++ b/trie/node_test.go @@ -2,6 +2,7 @@ package trie import ( "context" + "errors" "testing" "time" @@ -9,9 +10,13 @@ import ( "github.com/multiversx/mx-chain-core-go/core/atomic" "github.com/multiversx/mx-chain-go/common" dataMock "github.com/multiversx/mx-chain-go/dataRetriever/mock" + mxErrors "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/trie/keyBuilder" + logger "github.com/multiversx/mx-chain-logger-go" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNode_hashChildrenAndNodeBranchNode(t *testing.T) { @@ -623,6 +628,63 @@ func TestShouldStopIfContextDoneBlockingIfBusy(t *testing.T) { }) } +func TestTreatLogError(t *testing.T) { + t.Parallel() + + t.Run("error is not of type of closing error", func(t *testing.T) { + t.Parallel() + + key := []byte("key") + err := errors.New("trie was not found") + wasCalled := false + logInstance := &testscommon.LoggerStub{ + LogCalled: func(logLevel logger.LogLevel, message string, args ...interface{}) { + wasCalled = true + require.Equal(t, logger.LogWarning, logLevel) + require.Equal(t, common.GetNodeFromDBErrorString, message) + require.Equal(t, 6, len(args)) + expectedFirst5Args := []interface{}{"error", err, "key", key, "stack trace"} + require.Equal(t, expectedFirst5Args, args[:5]) + }, + } + + treatLogError(logInstance, err, key) + assert.True(t, wasCalled) + treatLogError(log, err, key) //display only + }) + t.Run("error is of type of closing error", func(t *testing.T) { + t.Parallel() + + key := []byte("key") + numCalled := 0 + var err error + + logInstance := &testscommon.LoggerStub{ + LogCalled: func(logLevel logger.LogLevel, message string, args ...interface{}) { + numCalled++ + require.Equal(t, logger.LogTrace, logLevel) + require.Equal(t, common.GetNodeFromDBErrorString, message) + require.Equal(t, 4, len(args)) + expectedFirst5Args := []interface{}{"error", err, "key", key} + require.Equal(t, expectedFirst5Args, args) + }, + } + + t.Run("db is closed", func(t *testing.T) { + crtCounter := numCalled + err = storage.ErrDBIsClosed + treatLogError(logInstance, err, key) + assert.Equal(t, crtCounter+1, numCalled) + }) + t.Run("context closing", func(t *testing.T) { + crtCounter := numCalled + err = mxErrors.ErrContextClosing + treatLogError(logInstance, err, key) + assert.Equal(t, crtCounter+1, numCalled) + }) + }) +} + func Benchmark_ShouldStopIfContextDoneBlockingIfBusy(b *testing.B) { ctx := context.Background() b.ResetTimer() From cfaaacabaff24a6ddde2285e63d0f9e1ef278cfd Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 24 Mar 2023 17:44:39 +0200 Subject: [PATCH 208/335] - refactored print function --- trie/node.go | 10 +++------ trie/node_test.go | 53 +++++++++++++++++------------------------------ 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/trie/node.go b/trie/node.go index e75c29d2ff3..c69d0a9d484 100644 --- a/trie/node.go +++ b/trie/node.go @@ -130,15 +130,11 @@ func getNodeFromDBAndDecode(n []byte, db common.DBWriteCacher, marshalizer marsh } func treatLogError(logInstance logger.Logger, err error, key []byte) { - logLevel := logger.LogTrace - extraInfo := make([]interface{}, 0, 6) - extraInfo = append(extraInfo, "error", err, "key", key) - if !errors.IsClosingError(err) { - logLevel = logger.LogWarning - extraInfo = append(extraInfo, "stack trace", string(debug.Stack())) + if logInstance.GetLevel() != logger.LogTrace { + return } - logInstance.Log(logLevel, common.GetNodeFromDBErrorString, extraInfo...) + logInstance.Trace(common.GetNodeFromDBErrorString, "error", err, "key", key, "stack trace", string(debug.Stack())) } func resolveIfCollapsed(n node, pos byte, db common.DBWriteCacher) error { diff --git a/trie/node_test.go b/trie/node_test.go index 3eb3e9ffb51..35b5de45d35 100644 --- a/trie/node_test.go +++ b/trie/node_test.go @@ -10,8 +10,6 @@ import ( "github.com/multiversx/mx-chain-core-go/core/atomic" "github.com/multiversx/mx-chain-go/common" dataMock "github.com/multiversx/mx-chain-go/dataRetriever/mock" - mxErrors "github.com/multiversx/mx-chain-go/errors" - "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/trie/keyBuilder" logger "github.com/multiversx/mx-chain-logger-go" @@ -631,57 +629,44 @@ func TestShouldStopIfContextDoneBlockingIfBusy(t *testing.T) { func TestTreatLogError(t *testing.T) { t.Parallel() - t.Run("error is not of type of closing error", func(t *testing.T) { + t.Run("logger instance is not in Trace mode, should not call", func(t *testing.T) { t.Parallel() key := []byte("key") err := errors.New("trie was not found") - wasCalled := false logInstance := &testscommon.LoggerStub{ - LogCalled: func(logLevel logger.LogLevel, message string, args ...interface{}) { - wasCalled = true - require.Equal(t, logger.LogWarning, logLevel) - require.Equal(t, common.GetNodeFromDBErrorString, message) - require.Equal(t, 6, len(args)) - expectedFirst5Args := []interface{}{"error", err, "key", key, "stack trace"} - require.Equal(t, expectedFirst5Args, args[:5]) + GetLevelCalled: func() logger.LogLevel { + return logger.LogDebug + }, + TraceCalled: func(message string, args ...interface{}) { + assert.Fail(t, "should have not called Log") }, } treatLogError(logInstance, err, key) - assert.True(t, wasCalled) treatLogError(log, err, key) //display only }) - t.Run("error is of type of closing error", func(t *testing.T) { + t.Run("logger instance is in Trace mode, should call", func(t *testing.T) { t.Parallel() key := []byte("key") - numCalled := 0 - var err error - + wasCalled := false + err := errors.New("error") logInstance := &testscommon.LoggerStub{ - LogCalled: func(logLevel logger.LogLevel, message string, args ...interface{}) { - numCalled++ - require.Equal(t, logger.LogTrace, logLevel) + GetLevelCalled: func() logger.LogLevel { + return logger.LogTrace + }, + TraceCalled: func(message string, args ...interface{}) { + wasCalled = true require.Equal(t, common.GetNodeFromDBErrorString, message) - require.Equal(t, 4, len(args)) - expectedFirst5Args := []interface{}{"error", err, "key", key} - require.Equal(t, expectedFirst5Args, args) + require.Equal(t, 6, len(args)) + expectedFirst5Args := []interface{}{"error", err, "key", key, "stack trace"} + require.Equal(t, expectedFirst5Args, args[:5]) }, } - t.Run("db is closed", func(t *testing.T) { - crtCounter := numCalled - err = storage.ErrDBIsClosed - treatLogError(logInstance, err, key) - assert.Equal(t, crtCounter+1, numCalled) - }) - t.Run("context closing", func(t *testing.T) { - crtCounter := numCalled - err = mxErrors.ErrContextClosing - treatLogError(logInstance, err, key) - assert.Equal(t, crtCounter+1, numCalled) - }) + treatLogError(logInstance, err, key) + assert.True(t, wasCalled) }) } From 1ab258885cc1162524ac3b2663f383d0f6e1511f Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Mar 2023 12:30:23 +0300 Subject: [PATCH 209/335] - fix rewards broadcast by not filtering out the metachain shard. The metachain nodes will be able to broadcast them without the exception. - fixed a print in miniblock tracker --- .../interceptedRewardTransaction.go | 5 -- .../interceptedRewardTransaction_test.go | 83 +++++++++++++++++++ process/track/miniBlockTrack.go | 2 +- 3 files changed, 84 insertions(+), 6 deletions(-) diff --git a/process/rewardTransaction/interceptedRewardTransaction.go b/process/rewardTransaction/interceptedRewardTransaction.go index 73e19fed81d..e96a3cf0eca 100644 --- a/process/rewardTransaction/interceptedRewardTransaction.go +++ b/process/rewardTransaction/interceptedRewardTransaction.go @@ -82,11 +82,6 @@ func (inRTx *InterceptedRewardTransaction) processFields(rewardTxBuff []byte) er inRTx.rcvShard = inRTx.coordinator.ComputeId(inRTx.rTx.RcvAddr) inRTx.sndShard = core.MetachainShardId - if inRTx.coordinator.SelfId() == core.MetachainShardId { - inRTx.isForCurrentShard = false - return nil - } - isForCurrentShardRecv := inRTx.rcvShard == inRTx.coordinator.SelfId() isForCurrentShardSender := inRTx.sndShard == inRTx.coordinator.SelfId() inRTx.isForCurrentShard = isForCurrentShardRecv || isForCurrentShardSender diff --git a/process/rewardTransaction/interceptedRewardTransaction_test.go b/process/rewardTransaction/interceptedRewardTransaction_test.go index 1fe5c3d1412..7a6698a1e40 100644 --- a/process/rewardTransaction/interceptedRewardTransaction_test.go +++ b/process/rewardTransaction/interceptedRewardTransaction_test.go @@ -1,6 +1,7 @@ package rewardTransaction_test import ( + "bytes" "fmt" "math/big" "testing" @@ -317,6 +318,88 @@ func TestNewInterceptedRewardTransaction_CheckValidityShouldWork(t *testing.T) { assert.Nil(t, err) } +func TestNewInterceptedRewardTransaction_IsForCurrentShard(t *testing.T) { + t.Parallel() + + receiverAddress := []byte("receiver address") + testShardID := uint32(2) + value := big.NewInt(100) + rewTx := rewardTx.RewardTx{ + Round: 0, + Epoch: 0, + Value: value, + RcvAddr: receiverAddress, + } + + mockShardCoordinator := &mock.ShardCoordinatorStub{} + marshalizer := &mock.MarshalizerMock{} + txBuff, _ := marshalizer.Marshal(&rewTx) + t.Run("same shard ID with the receiver should return true", func(t *testing.T) { + mockShardCoordinator.ComputeIdCalled = func(address []byte) uint32 { + if bytes.Equal(address, receiverAddress) { + return testShardID + } + + return 0 + } + mockShardCoordinator.SelfIdCalled = func() uint32 { + return testShardID + } + + irt, err := rewardTransaction.NewInterceptedRewardTransaction( + txBuff, + marshalizer, + &hashingMocks.HasherMock{}, + createMockPubkeyConverter(), + mockShardCoordinator) + assert.Nil(t, err) + + assert.True(t, irt.IsForCurrentShard()) + }) + t.Run("metachain should return true", func(t *testing.T) { + mockShardCoordinator.ComputeIdCalled = func(address []byte) uint32 { + if bytes.Equal(address, receiverAddress) { + return testShardID + } + + return 0 + } + mockShardCoordinator.SelfIdCalled = func() uint32 { + return core.MetachainShardId + } + + irt, err := rewardTransaction.NewInterceptedRewardTransaction( + txBuff, + marshalizer, + &hashingMocks.HasherMock{}, + createMockPubkeyConverter(), + mockShardCoordinator) + assert.Nil(t, err) + assert.True(t, irt.IsForCurrentShard()) + }) + t.Run("different shard should return true", func(t *testing.T) { + mockShardCoordinator.ComputeIdCalled = func(address []byte) uint32 { + if bytes.Equal(address, receiverAddress) { + return testShardID + } + + return 0 + } + mockShardCoordinator.SelfIdCalled = func() uint32 { + return testShardID + 1 // different with the receiver but not metachain + } + + irt, err := rewardTransaction.NewInterceptedRewardTransaction( + txBuff, + marshalizer, + &hashingMocks.HasherMock{}, + createMockPubkeyConverter(), + mockShardCoordinator) + assert.Nil(t, err) + assert.False(t, irt.IsForCurrentShard()) + }) +} + func TestInterceptedRewardTransaction_Type(t *testing.T) { t.Parallel() diff --git a/process/track/miniBlockTrack.go b/process/track/miniBlockTrack.go index 538dbdf0740..900846f67ff 100644 --- a/process/track/miniBlockTrack.go +++ b/process/track/miniBlockTrack.go @@ -73,7 +73,7 @@ func (mbt *miniBlockTrack) receivedMiniBlock(key []byte, value interface{}) { return } - log.Trace("miniBlockTrack.receivedMiniBlock", + log.Debug("received miniblock from network in block tracker", "hash", key, "sender", miniBlock.SenderShardID, "receiver", miniBlock.ReceiverShardID, From 00d3cfdb41693b4c18e7e71c452db9688560319b Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Mar 2023 12:42:40 +0300 Subject: [PATCH 210/335] - fixed test name --- process/rewardTransaction/interceptedRewardTransaction_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/rewardTransaction/interceptedRewardTransaction_test.go b/process/rewardTransaction/interceptedRewardTransaction_test.go index 7a6698a1e40..eba6830841a 100644 --- a/process/rewardTransaction/interceptedRewardTransaction_test.go +++ b/process/rewardTransaction/interceptedRewardTransaction_test.go @@ -377,7 +377,7 @@ func TestNewInterceptedRewardTransaction_IsForCurrentShard(t *testing.T) { assert.Nil(t, err) assert.True(t, irt.IsForCurrentShard()) }) - t.Run("different shard should return true", func(t *testing.T) { + t.Run("different shard should return false", func(t *testing.T) { mockShardCoordinator.ComputeIdCalled = func(address []byte) uint32 { if bytes.Equal(address, receiverAddress) { return testShardID From 6102c135f64e8dc5341f4b8a22498daadebb650c Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Mar 2023 15:53:56 +0300 Subject: [PATCH 211/335] - removed t.Skip from tests --- factory/api/apiResolverFactory_test.go | 4 -- .../bootstrapComponentsHandler_test.go | 18 ----- factory/bootstrap/bootstrapComponents_test.go | 24 ------- .../consensusComponentsHandler_test.go | 9 --- factory/consensus/consensusComponents_test.go | 60 ---------------- factory/core/coreComponentsHandler_test.go | 9 --- factory/core/coreComponents_test.go | 39 ----------- .../crypto/cryptoComponentsHandler_test.go | 15 ---- factory/crypto/cryptoComponents_test.go | 69 ------------------- factory/crypto/multiSignerContainer_test.go | 9 --- factory/data/dataComponentsHandler_test.go | 12 ---- factory/data/dataComponents_test.go | 24 ------- .../network/networkComponentsHandler_test.go | 9 --- factory/network/networkComponents_test.go | 18 ----- .../processing/blockProcessorCreator_test.go | 6 -- .../processComponentsHandler_test.go | 9 --- factory/processing/processComponents_test.go | 9 --- factory/state/stateComponentsHandler_test.go | 15 ---- factory/state/stateComponents_test.go | 15 ---- .../status/statusComponentsHandler_test.go | 12 ---- factory/status/statusComponents_test.go | 27 -------- .../statusCoreComponentsHandler_test.go | 9 --- .../statusCore/statusCoreComponents_test.go | 12 ---- genesis/process/genesisBlockCreator_test.go | 25 ++----- 24 files changed, 5 insertions(+), 453 deletions(-) diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index 7462ae0496e..ac0157c1ba7 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -15,10 +15,6 @@ import ( ) func TestCreateApiResolver(t *testing.T) { - if testing.Short() { - t.Skip("this is not a short test") - } - shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) coreComponents := componentsMock.GetCoreComponents() cryptoComponents := componentsMock.GetCryptoComponents(coreComponents) diff --git a/factory/bootstrap/bootstrapComponentsHandler_test.go b/factory/bootstrap/bootstrapComponentsHandler_test.go index c4934611449..edea9b7ecde 100644 --- a/factory/bootstrap/bootstrapComponentsHandler_test.go +++ b/factory/bootstrap/bootstrapComponentsHandler_test.go @@ -13,9 +13,6 @@ import ( // ------------ Test ManagedBootstrapComponents -------------------- func TestNewManagedBootstrapComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) @@ -27,9 +24,6 @@ func TestNewManagedBootstrapComponents(t *testing.T) { func TestNewBootstrapComponentsFactory_NilFactory(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } mbc, err := bootstrap.NewManagedBootstrapComponents(nil) @@ -39,9 +33,6 @@ func TestNewBootstrapComponentsFactory_NilFactory(t *testing.T) { func TestManagedBootstrapComponents_CheckSubcomponentsNoCreate(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) @@ -53,9 +44,6 @@ func TestManagedBootstrapComponents_CheckSubcomponentsNoCreate(t *testing.T) { func TestManagedBootstrapComponents_Create(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) @@ -70,9 +58,6 @@ func TestManagedBootstrapComponents_Create(t *testing.T) { func TestManagedBootstrapComponents_CreateNilInternalMarshalizer(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() coreComponents := componentsMock.GetDefaultCoreComponents() @@ -87,9 +72,6 @@ func TestManagedBootstrapComponents_CreateNilInternalMarshalizer(t *testing.T) { func TestManagedBootstrapComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() diff --git a/factory/bootstrap/bootstrapComponents_test.go b/factory/bootstrap/bootstrapComponents_test.go index dcbb5a0c8c4..fa4dee8ef82 100644 --- a/factory/bootstrap/bootstrapComponents_test.go +++ b/factory/bootstrap/bootstrapComponents_test.go @@ -13,9 +13,6 @@ import ( // ------------ Test BootstrapComponentsFactory -------------------- func TestNewBootstrapComponentsFactory_OkValuesShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() @@ -27,9 +24,6 @@ func TestNewBootstrapComponentsFactory_OkValuesShouldWork(t *testing.T) { func TestNewBootstrapComponentsFactory_NilCoreComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() args.CoreComponents = nil @@ -42,9 +36,6 @@ func TestNewBootstrapComponentsFactory_NilCoreComponents(t *testing.T) { func TestNewBootstrapComponentsFactory_NilCryptoComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() args.CryptoComponents = nil @@ -57,9 +48,6 @@ func TestNewBootstrapComponentsFactory_NilCryptoComponents(t *testing.T) { func TestNewBootstrapComponentsFactory_NilNetworkComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() args.NetworkComponents = nil @@ -72,9 +60,6 @@ func TestNewBootstrapComponentsFactory_NilNetworkComponents(t *testing.T) { func TestNewBootstrapComponentsFactory_NilWorkingDir(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() args.WorkingDir = "" @@ -87,9 +72,6 @@ func TestNewBootstrapComponentsFactory_NilWorkingDir(t *testing.T) { func TestBootstrapComponentsFactory_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() @@ -103,9 +85,6 @@ func TestBootstrapComponentsFactory_CreateShouldWork(t *testing.T) { func TestBootstrapComponentsFactory_CreateBootstrapDataProviderCreationFail(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() coreComponents := componentsMock.GetDefaultCoreComponents() @@ -122,9 +101,6 @@ func TestBootstrapComponentsFactory_CreateBootstrapDataProviderCreationFail(t *t func TestBootstrapComponentsFactory_CreateEpochStartBootstrapCreationFail(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() coreComponents := componentsMock.GetDefaultCoreComponents() diff --git a/factory/consensus/consensusComponentsHandler_test.go b/factory/consensus/consensusComponentsHandler_test.go index 20b0e5b4e3a..87d28ce6960 100644 --- a/factory/consensus/consensusComponentsHandler_test.go +++ b/factory/consensus/consensusComponentsHandler_test.go @@ -14,9 +14,6 @@ import ( // ------------ Test ManagedConsensusComponentsFactory -------------------- func TestManagedConsensusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -36,9 +33,6 @@ func TestManagedConsensusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) func TestManagedConsensusComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -62,9 +56,6 @@ func TestManagedConsensusComponents_CreateShouldWork(t *testing.T) { func TestManagedConsensusComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) consensusArgs := componentsMock.GetConsensusArgs(shardCoordinator) diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index 0fb97ab3d4f..1fb5291510e 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -24,9 +24,6 @@ import ( // ------------ Test ConsensusComponentsFactory -------------------- func TestNewConsensusComponentsFactory_OkValuesShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -39,9 +36,6 @@ func TestNewConsensusComponentsFactory_OkValuesShouldWork(t *testing.T) { func TestNewConsensusComponentsFactory_NilCoreComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -55,9 +49,6 @@ func TestNewConsensusComponentsFactory_NilCoreComponents(t *testing.T) { func TestNewConsensusComponentsFactory_NilDataComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -71,9 +62,6 @@ func TestNewConsensusComponentsFactory_NilDataComponents(t *testing.T) { func TestNewConsensusComponentsFactory_NilCryptoComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -87,9 +75,6 @@ func TestNewConsensusComponentsFactory_NilCryptoComponents(t *testing.T) { func TestNewConsensusComponentsFactory_NilNetworkComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -103,9 +88,6 @@ func TestNewConsensusComponentsFactory_NilNetworkComponents(t *testing.T) { func TestNewConsensusComponentsFactory_NilProcessComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -119,9 +101,6 @@ func TestNewConsensusComponentsFactory_NilProcessComponents(t *testing.T) { func TestNewConsensusComponentsFactory_NilStateComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -136,9 +115,6 @@ func TestNewConsensusComponentsFactory_NilStateComponents(t *testing.T) { // ------------ Test Old Use Cases -------------------- func TestConsensusComponentsFactory_CreateGenesisBlockNotInitializedShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) consensusArgs := componentsMock.GetConsensusArgs(shardCoordinator) @@ -163,9 +139,6 @@ func TestConsensusComponentsFactory_CreateGenesisBlockNotInitializedShouldErr(t func TestConsensusComponentsFactory_CreateForShard(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -192,9 +165,6 @@ func (wp *wrappedProcessComponents) ShardCoordinator() sharding.Coordinator { func TestConsensusComponentsFactory_CreateForMeta(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -212,9 +182,6 @@ func TestConsensusComponentsFactory_CreateForMeta(t *testing.T) { func TestConsensusComponentsFactory_CreateNilShardCoordinator(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) consensusArgs := componentsMock.GetConsensusArgs(shardCoordinator) @@ -230,9 +197,6 @@ func TestConsensusComponentsFactory_CreateNilShardCoordinator(t *testing.T) { func TestConsensusComponentsFactory_CreateConsensusTopicCreateTopicError(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } localError := errors.New("error") shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -260,9 +224,6 @@ func TestConsensusComponentsFactory_CreateConsensusTopicCreateTopicError(t *test func TestConsensusComponentsFactory_CreateConsensusTopicNilMessageProcessor(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -279,9 +240,6 @@ func TestConsensusComponentsFactory_CreateConsensusTopicNilMessageProcessor(t *t func TestConsensusComponentsFactory_CreateNilSyncTimer(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -297,9 +255,6 @@ func TestConsensusComponentsFactory_CreateNilSyncTimer(t *testing.T) { func TestStartConsensus_ShardBootstrapperNilAccounts(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -315,9 +270,6 @@ func TestStartConsensus_ShardBootstrapperNilAccounts(t *testing.T) { func TestStartConsensus_ShardBootstrapperNilPoolHolder(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) shardCoordinator.CurrentShard = 0 @@ -336,9 +288,6 @@ func TestStartConsensus_ShardBootstrapperNilPoolHolder(t *testing.T) { func TestStartConsensus_MetaBootstrapperNilPoolHolder(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) shardCoordinator.CurrentShard = core.MetachainShardId @@ -365,9 +314,6 @@ func TestStartConsensus_MetaBootstrapperNilPoolHolder(t *testing.T) { func TestStartConsensus_MetaBootstrapperWrongNumberShards(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) args := componentsMock.GetConsensusArgs(shardCoordinator) @@ -384,9 +330,6 @@ func TestStartConsensus_MetaBootstrapperWrongNumberShards(t *testing.T) { func TestStartConsensus_ShardBootstrapperPubKeyToByteArrayError(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } localErr := errors.New("err") shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -406,9 +349,6 @@ func TestStartConsensus_ShardBootstrapperPubKeyToByteArrayError(t *testing.T) { func TestStartConsensus_ShardBootstrapperInvalidConsensusType(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetConsensusArgs(shardCoordinator) diff --git a/factory/core/coreComponentsHandler_test.go b/factory/core/coreComponentsHandler_test.go index c271963a8ea..7c5e3f3ac51 100644 --- a/factory/core/coreComponentsHandler_test.go +++ b/factory/core/coreComponentsHandler_test.go @@ -12,9 +12,6 @@ import ( // ------------ Test ManagedCoreComponents -------------------- func TestManagedCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreArgs := componentsMock.GetCoreArgs() coreArgs.Config.Marshalizer = config.MarshalizerConfig{ @@ -31,9 +28,6 @@ func TestManagedCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { func TestManagedCoreComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreArgs := componentsMock.GetCoreArgs() coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) @@ -75,9 +69,6 @@ func TestManagedCoreComponents_CreateShouldWork(t *testing.T) { func TestManagedCoreComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreArgs := componentsMock.GetCoreArgs() coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) diff --git a/factory/core/coreComponents_test.go b/factory/core/coreComponents_test.go index 6c8981e0812..12b2833d19d 100644 --- a/factory/core/coreComponents_test.go +++ b/factory/core/coreComponents_test.go @@ -14,9 +14,6 @@ import ( func TestNewCoreComponentsFactory_OkValuesShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() ccf, _ := coreComp.NewCoreComponentsFactory(args) @@ -26,9 +23,6 @@ func TestNewCoreComponentsFactory_OkValuesShouldWork(t *testing.T) { func TestCoreComponentsFactory_CreateCoreComponentsNoHasherConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -46,9 +40,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoHasherConfigShouldErr(t *te func TestCoreComponentsFactory_CreateCoreComponentsInvalidHasherConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -69,9 +60,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidHasherConfigShouldErr( func TestCoreComponentsFactory_CreateCoreComponentsNoInternalMarshallerConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -88,9 +76,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoInternalMarshallerConfigSho func TestCoreComponentsFactory_CreateCoreComponentsInvalidInternalMarshallerConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -111,9 +96,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidInternalMarshallerConf func TestCoreComponentsFactory_CreateCoreComponentsNoVmMarshallerConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -134,9 +116,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoVmMarshallerConfigShouldErr func TestCoreComponentsFactory_CreateCoreComponentsInvalidVmMarshallerConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -160,9 +139,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidVmMarshallerConfigShou func TestCoreComponentsFactory_CreateCoreComponentsNoTxSignMarshallerConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -186,9 +162,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoTxSignMarshallerConfigShoul func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignMarshallerConfigShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config = config.Config{ @@ -215,9 +188,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignMarshallerConfig func TestCoreComponentsFactory_CreateCoreComponentsInvalidValPubKeyConverterShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config.ValidatorPubkeyConverter.Type = "invalid" @@ -230,9 +200,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidValPubKeyConverterShou func TestCoreComponentsFactory_CreateCoreComponentsInvalidAddrPubKeyConverterShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() args.Config.AddressPubkeyConverter.Type = "invalid" @@ -245,9 +212,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidAddrPubKeyConverterSho func TestCoreComponentsFactory_CreateCoreComponentsShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() ccf, _ := coreComp.NewCoreComponentsFactory(args) @@ -260,9 +224,6 @@ func TestCoreComponentsFactory_CreateCoreComponentsShouldWork(t *testing.T) { // ------------ Test CoreComponents -------------------- func TestCoreComponents_CloseShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCoreArgs() ccf, _ := coreComp.NewCoreComponentsFactory(args) diff --git a/factory/crypto/cryptoComponentsHandler_test.go b/factory/crypto/cryptoComponentsHandler_test.go index 218f84c43f2..f16e97be957 100644 --- a/factory/crypto/cryptoComponentsHandler_test.go +++ b/factory/crypto/cryptoComponentsHandler_test.go @@ -13,9 +13,6 @@ import ( // ------------ Test ManagedCryptoComponents -------------------- func TestManagedCryptoComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -30,9 +27,6 @@ func TestManagedCryptoComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { func TestManagedCryptoComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -61,9 +55,6 @@ func TestManagedCryptoComponents_CreateShouldWork(t *testing.T) { func TestManagedCryptoComponents_CheckSubcomponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } managedCryptoComponents := getManagedCryptoComponents(t) @@ -73,9 +64,6 @@ func TestManagedCryptoComponents_CheckSubcomponents(t *testing.T) { func TestManagedCryptoComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } managedCryptoComponents := getManagedCryptoComponents(t) @@ -101,9 +89,6 @@ func getManagedCryptoComponents(t *testing.T) factory.CryptoComponentsHandler { func TestManagedCryptoComponents_Clone(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) diff --git a/factory/crypto/cryptoComponents_test.go b/factory/crypto/cryptoComponents_test.go index 1f0496b129f..da1ecf53a5d 100644 --- a/factory/crypto/cryptoComponents_test.go +++ b/factory/crypto/cryptoComponents_test.go @@ -17,9 +17,6 @@ import ( func TestNewCryptoComponentsFactory_NiCoreComponentsHandlerShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetCryptoArgs(nil) ccf, err := cryptoComp.NewCryptoComponentsFactory(args) @@ -29,9 +26,6 @@ func TestNewCryptoComponentsFactory_NiCoreComponentsHandlerShouldErr(t *testing. func TestNewCryptoComponentsFactory_NilPemFileShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -43,9 +37,6 @@ func TestNewCryptoComponentsFactory_NilPemFileShouldErr(t *testing.T) { func TestCryptoComponentsFactory_CreateCryptoParamsNilKeyLoaderShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -58,9 +49,6 @@ func TestCryptoComponentsFactory_CreateCryptoParamsNilKeyLoaderShouldErr(t *test func TestNewCryptoComponentsFactory_OkValsShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -71,9 +59,6 @@ func TestNewCryptoComponentsFactory_OkValsShouldWork(t *testing.T) { func TestNewCryptoComponentsFactory_DisabledSigShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -85,9 +70,6 @@ func TestNewCryptoComponentsFactory_DisabledSigShouldWork(t *testing.T) { func TestNewCryptoComponentsFactory_CreateInvalidConsensusTypeShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -101,9 +83,6 @@ func TestNewCryptoComponentsFactory_CreateInvalidConsensusTypeShouldErr(t *testi func TestCryptoComponentsFactory_CreateShouldErrDueToMissingConfig(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -124,9 +103,6 @@ func TestCryptoComponentsFactory_CreateShouldErrDueToMissingConfig(t *testing.T) func TestCryptoComponentsFactory_CreateInvalidMultiSigHasherShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -141,9 +117,6 @@ func TestCryptoComponentsFactory_CreateInvalidMultiSigHasherShouldErr(t *testing func TestCryptoComponentsFactory_CreateOK(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -156,9 +129,6 @@ func TestCryptoComponentsFactory_CreateOK(t *testing.T) { func TestCryptoComponentsFactory_CreateWithDisabledSig(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -172,9 +142,6 @@ func TestCryptoComponentsFactory_CreateWithDisabledSig(t *testing.T) { func TestCryptoComponentsFactory_CreateWithAutoGenerateKey(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -188,9 +155,6 @@ func TestCryptoComponentsFactory_CreateWithAutoGenerateKey(t *testing.T) { func TestCryptoComponentsFactory_CreateSingleSignerInvalidConsensusTypeShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -206,9 +170,6 @@ func TestCryptoComponentsFactory_CreateSingleSignerInvalidConsensusTypeShouldErr func TestCryptoComponentsFactory_CreateSingleSignerOK(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -223,9 +184,6 @@ func TestCryptoComponentsFactory_CreateSingleSignerOK(t *testing.T) { func TestCryptoComponentsFactory_CreateMultiSignerInvalidConsensusTypeShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -241,9 +199,6 @@ func TestCryptoComponentsFactory_CreateMultiSignerInvalidConsensusTypeShouldErr( func TestCryptoComponentsFactory_CreateMultiSignerOK(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -261,9 +216,6 @@ func TestCryptoComponentsFactory_CreateMultiSignerOK(t *testing.T) { func TestCryptoComponentsFactory_GetSuiteInvalidConsensusTypeShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -279,9 +231,6 @@ func TestCryptoComponentsFactory_GetSuiteInvalidConsensusTypeShouldErr(t *testin func TestCryptoComponentsFactory_GetSuiteOK(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -297,9 +246,6 @@ func TestCryptoComponentsFactory_GetSuiteOK(t *testing.T) { func TestCryptoComponentsFactory_CreateCryptoParamsInvalidPrivateKeyByteArrayShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -316,9 +262,6 @@ func TestCryptoComponentsFactory_CreateCryptoParamsInvalidPrivateKeyByteArraySho func TestCryptoComponentsFactory_CreateCryptoParamsLoadKeysFailShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } expectedError := errors.New("expected error") @@ -337,9 +280,6 @@ func TestCryptoComponentsFactory_CreateCryptoParamsLoadKeysFailShouldErr(t *test func TestCryptoComponentsFactory_CreateCryptoParamsOK(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) @@ -355,9 +295,6 @@ func TestCryptoComponentsFactory_CreateCryptoParamsOK(t *testing.T) { func TestCryptoComponentsFactory_GetSkPkInvalidSkBytesShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } setSk := []byte("zxwY") setPk := []byte(componentsMock.DummyPk) @@ -374,9 +311,6 @@ func TestCryptoComponentsFactory_GetSkPkInvalidSkBytesShouldErr(t *testing.T) { func TestCryptoComponentsFactory_GetSkPkInvalidPkBytesShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } setSk := []byte(componentsMock.DummySk) setPk := "0" @@ -394,9 +328,6 @@ func TestCryptoComponentsFactory_GetSkPkInvalidPkBytesShouldErr(t *testing.T) { func TestCryptoComponentsFactory_GetSkPkOK(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetCryptoArgs(coreComponents) diff --git a/factory/crypto/multiSignerContainer_test.go b/factory/crypto/multiSignerContainer_test.go index 82ed4b0d1a7..6a392b46d72 100644 --- a/factory/crypto/multiSignerContainer_test.go +++ b/factory/crypto/multiSignerContainer_test.go @@ -269,9 +269,6 @@ func TestContainer_sortMultiSignerConfig(t *testing.T) { func Test_getMultiSigHasherFromConfigInvalidHasherShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := createDefaultMultiSignerArgs() args.ConsensusType = "" @@ -284,9 +281,6 @@ func Test_getMultiSigHasherFromConfigInvalidHasherShouldErr(t *testing.T) { func Test_getMultiSigHasherFromConfigMismatchConsensusTypeMultiSigHasher(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := createDefaultMultiSignerArgs() args.MultiSigHasherType = "sha256" @@ -298,9 +292,6 @@ func Test_getMultiSigHasherFromConfigMismatchConsensusTypeMultiSigHasher(t *test func Test_getMultiSigHasherFromConfigOK(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := createDefaultMultiSignerArgs() args.ConsensusType = "bls" diff --git a/factory/data/dataComponentsHandler_test.go b/factory/data/dataComponentsHandler_test.go index f59f99e6948..85c6e84f55a 100644 --- a/factory/data/dataComponentsHandler_test.go +++ b/factory/data/dataComponentsHandler_test.go @@ -13,9 +13,6 @@ import ( // ------------ Test ManagedDataComponents -------------------- func TestManagedDataComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -31,9 +28,6 @@ func TestManagedDataComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { func TestManagedDataComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -54,9 +48,6 @@ func TestManagedDataComponents_CreateShouldWork(t *testing.T) { func TestManagedDataComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -73,9 +64,6 @@ func TestManagedDataComponents_Close(t *testing.T) { func TestManagedDataComponents_Clone(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) diff --git a/factory/data/dataComponents_test.go b/factory/data/dataComponents_test.go index a5de1d1d442..2714951ef7c 100644 --- a/factory/data/dataComponents_test.go +++ b/factory/data/dataComponents_test.go @@ -14,9 +14,6 @@ import ( func TestNewDataComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) coreComponents := componentsMock.GetCoreComponents() @@ -30,9 +27,6 @@ func TestNewDataComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { func TestNewDataComponentsFactory_NilCoreComponentsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetDataArgs(nil, shardCoordinator) @@ -45,9 +39,6 @@ func TestNewDataComponentsFactory_NilCoreComponentsShouldErr(t *testing.T) { func TestNewDataComponentsFactory_NilEpochStartNotifierShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) coreComponents := componentsMock.GetCoreComponents() @@ -61,9 +52,6 @@ func TestNewDataComponentsFactory_NilEpochStartNotifierShouldErr(t *testing.T) { func TestNewDataComponentsFactory_OkValsShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) coreComponents := componentsMock.GetCoreComponents() @@ -75,9 +63,6 @@ func TestNewDataComponentsFactory_OkValsShouldWork(t *testing.T) { func TestDataComponentsFactory_CreateShouldErrDueBadConfig(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) coreComponents := componentsMock.GetCoreComponents() @@ -93,9 +78,6 @@ func TestDataComponentsFactory_CreateShouldErrDueBadConfig(t *testing.T) { func TestDataComponentsFactory_CreateForShardShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -110,9 +92,6 @@ func TestDataComponentsFactory_CreateForShardShouldWork(t *testing.T) { func TestDataComponentsFactory_CreateForMetaShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -129,9 +108,6 @@ func TestDataComponentsFactory_CreateForMetaShouldWork(t *testing.T) { // ------------ Test DataComponents -------------------- func TestManagedDataComponents_CloseShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) diff --git a/factory/network/networkComponentsHandler_test.go b/factory/network/networkComponentsHandler_test.go index e40ca1dcee8..03da0ee915a 100644 --- a/factory/network/networkComponentsHandler_test.go +++ b/factory/network/networkComponentsHandler_test.go @@ -12,9 +12,6 @@ import ( // ------------ Test ManagedNetworkComponents -------------------- func TestManagedNetworkComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } networkArgs := componentsMock.GetNetworkFactoryArgs() networkArgs.P2pConfig.Node.Port = "invalid" @@ -28,9 +25,6 @@ func TestManagedNetworkComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { func TestManagedNetworkComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } networkArgs := componentsMock.GetNetworkFactoryArgs() networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) @@ -58,9 +52,6 @@ func TestManagedNetworkComponents_CreateShouldWork(t *testing.T) { func TestManagedNetworkComponents_CheckSubcomponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } networkArgs := componentsMock.GetNetworkFactoryArgs() networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) diff --git a/factory/network/networkComponents_test.go b/factory/network/networkComponents_test.go index 205d3ed5249..0fdd190aa72 100644 --- a/factory/network/networkComponents_test.go +++ b/factory/network/networkComponents_test.go @@ -15,9 +15,6 @@ import ( func TestNewNetworkComponentsFactory_NilStatusHandlerShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetNetworkFactoryArgs() args.StatusHandler = nil @@ -28,9 +25,6 @@ func TestNewNetworkComponentsFactory_NilStatusHandlerShouldErr(t *testing.T) { func TestNewNetworkComponentsFactory_NilMarshalizerShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetNetworkFactoryArgs() args.Marshalizer = nil @@ -41,9 +35,6 @@ func TestNewNetworkComponentsFactory_NilMarshalizerShouldErr(t *testing.T) { func TestNewNetworkComponentsFactory_OkValsShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetNetworkFactoryArgs() ncf, err := networkComp.NewNetworkComponentsFactory(args) @@ -53,9 +44,6 @@ func TestNewNetworkComponentsFactory_OkValsShouldWork(t *testing.T) { func TestNetworkComponentsFactory_CreateShouldErrDueToBadConfig(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetNetworkFactoryArgs() args.MainConfig = config.Config{} @@ -70,9 +58,6 @@ func TestNetworkComponentsFactory_CreateShouldErrDueToBadConfig(t *testing.T) { func TestNetworkComponentsFactory_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetNetworkFactoryArgs() ncf, _ := networkComp.NewNetworkComponentsFactory(args) @@ -86,9 +71,6 @@ func TestNetworkComponentsFactory_CreateShouldWork(t *testing.T) { // ------------ Test NetworkComponents -------------------- func TestNetworkComponents_CloseShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetNetworkFactoryArgs() ncf, _ := networkComp.NewNetworkComponentsFactory(args) diff --git a/factory/processing/blockProcessorCreator_test.go b/factory/processing/blockProcessorCreator_test.go index 5d85dd26931..2842b92221f 100644 --- a/factory/processing/blockProcessorCreator_test.go +++ b/factory/processing/blockProcessorCreator_test.go @@ -31,9 +31,6 @@ import ( func Test_newBlockProcessorCreatorForShard(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) pcf, err := processComp.NewProcessComponentsFactory(componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator)) @@ -68,9 +65,6 @@ func Test_newBlockProcessorCreatorForShard(t *testing.T) { func Test_newBlockProcessorCreatorForMeta(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardC := mock.NewMultiShardsCoordinatorMock(1) diff --git a/factory/processing/processComponentsHandler_test.go b/factory/processing/processComponentsHandler_test.go index 62965992dcb..b8c00301261 100644 --- a/factory/processing/processComponentsHandler_test.go +++ b/factory/processing/processComponentsHandler_test.go @@ -14,9 +14,6 @@ import ( // ------------ Test TestManagedProcessComponents -------------------- func TestManagedProcessComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) @@ -31,9 +28,6 @@ func TestManagedProcessComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { func TestManagedProcessComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) @@ -147,9 +141,6 @@ func TestManagedProcessComponents_CreateShouldWork(t *testing.T) { func TestManagedProcessComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index d4b3d99c030..ebae3a2c893 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -24,9 +24,6 @@ import ( // ------------ Test TestProcessComponents -------------------- func TestProcessComponents_CloseShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) @@ -42,9 +39,6 @@ func TestProcessComponents_CloseShouldWork(t *testing.T) { func TestProcessComponentsFactory_CreateWithInvalidTxAccumulatorTimeExpectError(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) @@ -60,9 +54,6 @@ func TestProcessComponentsFactory_CreateWithInvalidTxAccumulatorTimeExpectError( func TestProcessComponents_IndexGenesisBlocks(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) diff --git a/factory/state/stateComponentsHandler_test.go b/factory/state/stateComponentsHandler_test.go index d055e80efad..91932d43391 100644 --- a/factory/state/stateComponentsHandler_test.go +++ b/factory/state/stateComponentsHandler_test.go @@ -15,9 +15,6 @@ import ( // ------------ Test ManagedStateComponents -------------------- func TestManagedStateComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -33,9 +30,6 @@ func TestManagedStateComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { func TestManagedStateComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -58,9 +52,6 @@ func TestManagedStateComponents_CreateShouldWork(t *testing.T) { func TestManagedStateComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -77,9 +68,6 @@ func TestManagedStateComponents_Close(t *testing.T) { func TestManagedStateComponents_CheckSubcomponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -95,9 +83,6 @@ func TestManagedStateComponents_CheckSubcomponents(t *testing.T) { func TestManagedStateComponents_Setters(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) diff --git a/factory/state/stateComponents_test.go b/factory/state/stateComponents_test.go index c45259758b7..3dc6ef7aee1 100644 --- a/factory/state/stateComponents_test.go +++ b/factory/state/stateComponents_test.go @@ -12,9 +12,6 @@ import ( func TestNewStateComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -28,9 +25,6 @@ func TestNewStateComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { func TestNewStateComponentsFactory_NilCoreComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -44,9 +38,6 @@ func TestNewStateComponentsFactory_NilCoreComponents(t *testing.T) { func TestNewStateComponentsFactory_ShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -59,9 +50,6 @@ func TestNewStateComponentsFactory_ShouldWork(t *testing.T) { func TestStateComponentsFactory_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -77,9 +65,6 @@ func TestStateComponentsFactory_CreateShouldWork(t *testing.T) { // ------------ Test StateComponents -------------------- func TestStateComponents_CloseShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) diff --git a/factory/status/statusComponentsHandler_test.go b/factory/status/statusComponentsHandler_test.go index 702d911842a..f021cbb4284 100644 --- a/factory/status/statusComponentsHandler_test.go +++ b/factory/status/statusComponentsHandler_test.go @@ -14,9 +14,6 @@ import ( // ------------ Test ManagedStatusComponents -------------------- func TestManagedStatusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -36,9 +33,6 @@ func TestManagedStatusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { func TestManagedStatusComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -56,9 +50,6 @@ func TestManagedStatusComponents_CreateShouldWork(t *testing.T) { func TestManagedStatusComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -73,9 +64,6 @@ func TestManagedStatusComponents_Close(t *testing.T) { func TestManagedStatusComponents_CheckSubcomponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) diff --git a/factory/status/statusComponents_test.go b/factory/status/statusComponents_test.go index 7a1f0ee83ad..3a52d8bf06e 100644 --- a/factory/status/statusComponents_test.go +++ b/factory/status/statusComponents_test.go @@ -18,9 +18,6 @@ import ( func TestNewStatusComponentsFactory_NilCoreComponentsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -32,9 +29,6 @@ func TestNewStatusComponentsFactory_NilCoreComponentsShouldErr(t *testing.T) { func TestNewStatusComponentsFactory_NilNodesCoordinatorShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -46,9 +40,6 @@ func TestNewStatusComponentsFactory_NilNodesCoordinatorShouldErr(t *testing.T) { func TestNewStatusComponentsFactory_NilEpochStartNotifierShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -60,9 +51,6 @@ func TestNewStatusComponentsFactory_NilEpochStartNotifierShouldErr(t *testing.T) func TestNewStatusComponentsFactory_NilNetworkComponentsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -74,9 +62,6 @@ func TestNewStatusComponentsFactory_NilNetworkComponentsShouldErr(t *testing.T) func TestNewStatusComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -88,9 +73,6 @@ func TestNewStatusComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { func TestNewStatusComponents_InvalidRoundDurationShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) coreArgs := componentsMock.GetCoreArgs() @@ -130,9 +112,6 @@ func TestNewStatusComponents_InvalidRoundDurationShouldErr(t *testing.T) { func TestNewStatusComponentsFactory_ShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -143,9 +122,6 @@ func TestNewStatusComponentsFactory_ShouldWork(t *testing.T) { func TestStatusComponentsFactory_Create(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) @@ -160,9 +136,6 @@ func TestStatusComponentsFactory_Create(t *testing.T) { // ------------ Test StatusComponents -------------------- func TestStatusComponents_CloseShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) diff --git a/factory/statusCore/statusCoreComponentsHandler_test.go b/factory/statusCore/statusCoreComponentsHandler_test.go index d6cd676833d..ea12dbcb993 100644 --- a/factory/statusCore/statusCoreComponentsHandler_test.go +++ b/factory/statusCore/statusCoreComponentsHandler_test.go @@ -10,9 +10,6 @@ import ( func TestManagedStatusCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetStatusCoreArgs(componentsMock.GetDefaultCoreComponents()) args.Config.ResourceStats.RefreshIntervalInSec = 0 @@ -29,9 +26,6 @@ func TestManagedStatusCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T func TestManagedStatusCoreComponents_CreateShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) @@ -51,9 +45,6 @@ func TestManagedStatusCoreComponents_CreateShouldWork(t *testing.T) { func TestManagedCoreComponents_Close(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) diff --git a/factory/statusCore/statusCoreComponents_test.go b/factory/statusCore/statusCoreComponents_test.go index 66c5e6c07ea..f54706fe8f0 100644 --- a/factory/statusCore/statusCoreComponents_test.go +++ b/factory/statusCore/statusCoreComponents_test.go @@ -18,9 +18,6 @@ import ( func TestNewStatusCoreComponentsFactory(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } t.Run("nil core components should error", func(t *testing.T) { t.Parallel() @@ -96,9 +93,6 @@ func TestNewStatusCoreComponentsFactory(t *testing.T) { func TestStatusCoreComponentsFactory_InvalidValueShouldErr(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) args.Config = config.Config{ @@ -116,9 +110,6 @@ func TestStatusCoreComponentsFactory_InvalidValueShouldErr(t *testing.T) { func TestStatusCoreComponentsFactory_CreateStatusCoreComponentsShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) sccf, err := statusCore.NewStatusCoreComponentsFactory(args) @@ -132,9 +123,6 @@ func TestStatusCoreComponentsFactory_CreateStatusCoreComponentsShouldWork(t *tes // ------------ Test CoreComponents -------------------- func TestStatusCoreComponents_CloseShouldWork(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) sccf, err := statusCore.NewStatusCoreComponentsFactory(args) diff --git a/genesis/process/genesisBlockCreator_test.go b/genesis/process/genesisBlockCreator_test.go index 067412c9aad..e324446f8b3 100644 --- a/genesis/process/genesisBlockCreator_test.go +++ b/genesis/process/genesisBlockCreator_test.go @@ -1,3 +1,8 @@ +//go:build !race +// +build !race + +// TODO reinstate test after Wasm VM pointer fix + package process import ( @@ -205,11 +210,6 @@ func createMockArgument( } func TestGenesisBlockCreator_CreateGenesisBlockAfterHardForkShouldCreateSCResultingAddresses(t *testing.T) { - // TODO reinstate test after Wasm VM pointer fix - if testing.Short() { - t.Skip("cannot run with -race -short; requires Wasm VM fix") - } - scAddressBytes, _ := hex.DecodeString("00000000000000000500761b8c4a25d3979359223208b412285f635e71300102") initialNodesSetup := &mock.InitialNodesHandlerStub{ InitialNodesInfoCalled: func() (map[uint32][]nodesCoordinator.GenesisNodeInfoHandler, map[uint32][]nodesCoordinator.GenesisNodeInfoHandler) { @@ -270,11 +270,6 @@ func TestGenesisBlockCreator_CreateGenesisBlockAfterHardForkShouldCreateSCResult } func TestGenesisBlockCreator_CreateGenesisBlocksJustDelegationShouldWorkAndDNS(t *testing.T) { - // TODO reinstate test after Wasm VM pointer fix - if testing.Short() { - t.Skip("cannot run with -race -short; requires Wasm VM fix") - } - scAddressBytes, _ := hex.DecodeString("00000000000000000500761b8c4a25d3979359223208b412285f635e71300102") stakedAddr, _ := hex.DecodeString("b00102030405060708090001020304050607080900010203040506070809000b") initialNodesSetup := &mock.InitialNodesHandlerStub{ @@ -319,11 +314,6 @@ func TestGenesisBlockCreator_CreateGenesisBlocksJustDelegationShouldWorkAndDNS(t } func TestGenesisBlockCreator_CreateGenesisBlocksStakingAndDelegationShouldWorkAndDNS(t *testing.T) { - // TODO reinstate test after Wasm VM pointer fix - if testing.Short() { - t.Skip("cannot run with -race -short; requires Wasm VM fix") - } - scAddressBytes, _ := hex.DecodeString("00000000000000000500761b8c4a25d3979359223208b412285f635e71300102") stakedAddr, _ := hex.DecodeString("b00102030405060708090001020304050607080900010203040506070809000b") stakedAddr2, _ := hex.DecodeString("d00102030405060708090001020304050607080900010203040506070809000d") @@ -399,11 +389,6 @@ func TestGenesisBlockCreator_CreateGenesisBlocksStakingAndDelegationShouldWorkAn } func TestGenesisBlockCreator_GetIndexingDataShouldWork(t *testing.T) { - // TODO reinstate test after Wasm VM pointer fix - if testing.Short() { - t.Skip("cannot run with -race -short; requires Wasm VM fix") - } - scAddressBytes, _ := hex.DecodeString("00000000000000000500761b8c4a25d3979359223208b412285f635e71300102") stakedAddr, _ := hex.DecodeString("b00102030405060708090001020304050607080900010203040506070809000b") stakedAddr2, _ := hex.DecodeString("d00102030405060708090001020304050607080900010203040506070809000d") From bbff28a563e8d900765bef28f57cf8b7e672d5cc Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Mar 2023 18:24:42 +0300 Subject: [PATCH 212/335] - added unit tests for the node runner --- node/nodeRunner_test.go | 178 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 node/nodeRunner_test.go diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go new file mode 100644 index 00000000000..deeebe3e8f3 --- /dev/null +++ b/node/nodeRunner_test.go @@ -0,0 +1,178 @@ +//go:build !race +// +build !race + +package node + +import ( + "io/ioutil" + "os/exec" + "path" + "strings" + "syscall" + "testing" + "time" + + "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/config" + logger "github.com/multiversx/mx-chain-logger-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func createConfigs(tb testing.TB) *config.Configs { + tempDir := tb.TempDir() + + originalConfigsPath := "../cmd/node/config" + newConfigsPath := path.Join(tempDir, "config") + + cmd := exec.Command("cp", "-r", originalConfigsPath, newConfigsPath) + err := cmd.Run() + require.Nil(tb, err) + + newGenesisSmartContractsFilename := path.Join(newConfigsPath, "genesisSmartContracts.json") + correctTestPathInGenesisSmartContracts(tb, tempDir, newGenesisSmartContractsFilename) + + apiConfig, err := common.LoadApiConfig(path.Join(newConfigsPath, "api.toml")) + require.Nil(tb, err) + + generalConfig, err := common.LoadMainConfig(path.Join(newConfigsPath, "config.toml")) + require.Nil(tb, err) + + ratingsConfig, err := common.LoadRatingsConfig(path.Join(newConfigsPath, "ratings.toml")) + require.Nil(tb, err) + + economicsConfig, err := common.LoadEconomicsConfig(path.Join(newConfigsPath, "economics.toml")) + require.Nil(tb, err) + + prefsConfig, err := common.LoadPreferencesConfig(path.Join(newConfigsPath, "prefs.toml")) + require.Nil(tb, err) + + p2pConfig, err := common.LoadP2PConfig(path.Join(newConfigsPath, "p2p.toml")) + require.Nil(tb, err) + + externalConfig, err := common.LoadExternalConfig(path.Join(newConfigsPath, "external.toml")) + require.Nil(tb, err) + + systemSCConfig, err := common.LoadSystemSmartContractsConfig(path.Join(newConfigsPath, "systemSmartContractsConfig.toml")) + require.Nil(tb, err) + + epochConfig, err := common.LoadEpochConfig(path.Join(newConfigsPath, "enableEpochs.toml")) + require.Nil(tb, err) + + roundConfig, err := common.LoadRoundConfig(path.Join(newConfigsPath, "enableRounds.toml")) + require.Nil(tb, err) + + // make the node pass the network wait constraints + p2pConfig.Node.MinNumPeersToWaitForOnBootstrap = 0 + p2pConfig.Node.ThresholdMinConnectedPeers = 0 + + return &config.Configs{ + GeneralConfig: generalConfig, + ApiRoutesConfig: apiConfig, + EconomicsConfig: economicsConfig, + SystemSCConfig: systemSCConfig, + RatingsConfig: ratingsConfig, + PreferencesConfig: prefsConfig, + ExternalConfig: externalConfig, + P2pConfig: p2pConfig, + FlagsConfig: &config.ContextFlagsConfig{ + WorkingDir: tempDir, + NoKeyProvided: true, + Version: "test version", + }, + ImportDbConfig: &config.ImportDbConfig{}, + ConfigurationPathsHolder: &config.ConfigurationPathsHolder{ + GasScheduleDirectoryName: path.Join(newConfigsPath, "gasSchedules"), + Nodes: path.Join(newConfigsPath, "nodesSetup.json"), + Genesis: path.Join(newConfigsPath, "genesis.json"), + SmartContracts: newGenesisSmartContractsFilename, + ValidatorKey: "validatorKey.pem", + }, + EpochConfig: epochConfig, + RoundConfig: roundConfig, + } +} + +func correctTestPathInGenesisSmartContracts(tb testing.TB, tempDir string, newGenesisSmartContractsFilename string) { + input, err := ioutil.ReadFile(newGenesisSmartContractsFilename) + require.Nil(tb, err) + + lines := strings.Split(string(input), "\n") + for i, line := range lines { + if strings.Contains(line, "./config") { + lines[i] = strings.Replace(line, "./config", path.Join(tempDir, "config"), 1) + } + } + output := strings.Join(lines, "\n") + err = ioutil.WriteFile(newGenesisSmartContractsFilename, []byte(output), 0644) + require.Nil(tb, err) +} + +func TestNewNodeRunner(t *testing.T) { + t.Parallel() + + t.Run("nil configs should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "nil configs provided" + runner, err := NewNodeRunner(nil) + assert.Nil(t, runner) + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("with valid configs should work", func(t *testing.T) { + t.Parallel() + + configs := createConfigs(t) + runner, err := NewNodeRunner(configs) + assert.NotNil(t, runner) + assert.Nil(t, err) + }) +} + +type applicationRunningTrigger struct { + chanClose chan struct{} +} + +func newApplicationRunningTrigger() *applicationRunningTrigger { + return &applicationRunningTrigger{ + chanClose: make(chan struct{}), + } +} + +func (trigger *applicationRunningTrigger) Write(p []byte) (n int, err error) { + if strings.Contains(string(p), "application is now running") { + log.Info("got signal, trying to gracefully close the node") + close(trigger.chanClose) + } + + return 0, nil +} + +func TestNodeRunner_StartAndCloseNode(t *testing.T) { + t.Parallel() + + configs := createConfigs(t) + runner, _ := NewNodeRunner(configs) + + trigger := newApplicationRunningTrigger() + err := logger.AddLogObserver(trigger, &logger.PlainFormatter{}) + require.Nil(t, err) + + // start a go routine that will send the SIGINT message after 1 minute + go func() { + timeout := time.Minute * 5 + select { + case <-trigger.chanClose: + case <-time.After(timeout): + require.Fail(t, "timeout waiting for application to start") + } + time.Sleep(time.Second) + + log.Info("sending SIGINT to self") + errKill := syscall.Kill(syscall.Getpid(), syscall.SIGINT) + assert.Nil(t, errKill) + }() + + err = runner.Start() + assert.Nil(t, err) +} From 786af3b3bc7e52921bfa879e624985044cb14316 Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Mar 2023 19:52:33 +0300 Subject: [PATCH 213/335] - added unit tests for the node.go --- node/node_test.go | 205 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 203 insertions(+), 2 deletions(-) diff --git a/node/node_test.go b/node/node_test.go index c1d1b47a4a4..22e884cecb2 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -41,6 +41,7 @@ import ( nodeMockFactory "github.com/multiversx/mx-chain-go/node/mock/factory" "github.com/multiversx/mx-chain-go/process" "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/bootstrapMocks" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" @@ -53,7 +54,7 @@ import ( "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" statusHandlerMock "github.com/multiversx/mx-chain-go/testscommon/statusHandler" - "github.com/multiversx/mx-chain-go/testscommon/storage" + mockStorage "github.com/multiversx/mx-chain-go/testscommon/storage" trieMock "github.com/multiversx/mx-chain-go/testscommon/trie" "github.com/multiversx/mx-chain-go/testscommon/txsSenderMock" "github.com/multiversx/mx-chain-go/vm/systemSmartContracts" @@ -4142,6 +4143,206 @@ func TestNode_GetHeartbeats(t *testing.T) { assert.True(t, sameMessages(providedMessages, receivedMessages)) } +func TestNode_Getters(t *testing.T) { + t.Parallel() + + coreComponents := getDefaultCoreComponents() + statusCoreComponents := &factoryTests.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandlerMock.AppStatusHandlerStub{}, + } + cryptoComponents := getDefaultCryptoComponents() + stateComponents := getDefaultStateComponents() + bootstrapComponents := getDefaultBootstrapComponents() + dataComponents := getDefaultDataComponents() + heartbeatComponents := &factoryMock.HeartbeatV2ComponentsStub{} + networkComponents := getDefaultNetworkComponents() + processComponents := getDefaultProcessComponents() + consensusGroupSize := 10 + + n, err := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithStatusCoreComponents(statusCoreComponents), + node.WithCryptoComponents(cryptoComponents), + node.WithStateComponents(stateComponents), + node.WithBootstrapComponents(bootstrapComponents), + node.WithDataComponents(dataComponents), + node.WithHeartbeatV2Components(heartbeatComponents), + node.WithNetworkComponents(networkComponents), + node.WithProcessComponents(processComponents), + node.WithConsensusGroupSize(consensusGroupSize), + node.WithImportMode(true), + ) + require.Nil(t, err) + + //pointer testing + assert.True(t, n.GetCoreComponents() == coreComponents) + assert.True(t, n.GetStatusCoreComponents() == statusCoreComponents) + assert.True(t, n.GetCryptoComponents() == cryptoComponents) + assert.True(t, n.GetStateComponents() == stateComponents) + assert.True(t, n.GetBootstrapComponents() == bootstrapComponents) + assert.True(t, n.GetDataComponents() == dataComponents) + assert.True(t, n.GetHeartbeatV2Components() == heartbeatComponents) + assert.True(t, n.GetNetworkComponents() == networkComponents) + assert.True(t, n.GetProcessComponents() == processComponents) + assert.Equal(t, consensusGroupSize, n.GetConsensusGroupSize()) + assert.True(t, n.IsInImportMode()) +} + +func TestNode_GetEpochStartDataAPI(t *testing.T) { + t.Parallel() + + prevHash := []byte("prevHash") + rootHash := []byte("rootHash") + accumulatedFees := big.NewInt(100) + developerFees := big.NewInt(200) + + dataComponents := getDefaultDataComponents() + blockchain := dataComponents.BlockChain.(*testscommon.ChainHandlerStub) + timestamp := uint64(778899) + shardID := uint32(2) + blockchain.GetGenesisHeaderCalled = func() data.HeaderHandler { + return &block.Header{ + TimeStamp: timestamp, + ShardID: shardID, + PrevHash: prevHash, + RootHash: rootHash, + AccumulatedFees: accumulatedFees, + DeveloperFees: developerFees, + } + } + + bootstrapComponents := getDefaultBootstrapComponents() + shardCoordinator := bootstrapComponents.ShardCoordinator().(*mock.ShardCoordinatorMock) + + coreComponents := getDefaultCoreComponents() + + n, _ := node.NewNode( + node.WithCoreComponents(coreComponents), + node.WithDataComponents(dataComponents), + node.WithBootstrapComponents(bootstrapComponents), + ) + epoch := uint32(37) + nonce := uint64(112233) + round := uint64(445566) + + t.Run("genesis block should work", func(t *testing.T) { + result, err := n.GetEpochStartDataAPI(0) + assert.Nil(t, err) + expectedResult := &common.EpochStartDataAPI{ + Nonce: 0, + Round: 0, + Timestamp: int64(timestamp), + Epoch: 0, + Shard: shardID, + PrevBlockHash: hex.EncodeToString(prevHash), + StateRootHash: hex.EncodeToString(rootHash), + ScheduledRootHash: "", + AccumulatedFees: accumulatedFees.String(), + DeveloperFees: developerFees.String(), + } + assert.Equal(t, expectedResult, result) + }) + t.Run("should work for metachain", func(t *testing.T) { + shardCoordinator.SelfShardId = core.MetachainShardId + + returnedHeader := &block.MetaBlock{ + Nonce: nonce, + Epoch: epoch, + Round: round, + TimeStamp: timestamp, + PrevHash: prevHash, + RootHash: rootHash, + AccumulatedFees: accumulatedFees, + DeveloperFees: developerFees, + } + + headerBytes, err := coreComponents.IntMarsh.Marshal(returnedHeader) + require.Nil(t, err) + + unit := &mockStorage.StorerStub{ + GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { + expectedIdentifier := core.EpochStartIdentifier(epoch) + require.Equal(t, expectedIdentifier, string(key)) + + return headerBytes, nil + }, + } + + storageService := dataComponents.StorageService().(*mockStorage.ChainStorerStub) + storageService.GetStorerCalled = func(unitType dataRetriever.UnitType) (storage.Storer, error) { + require.Equal(t, dataRetriever.MetaBlockUnit, unitType) + return unit, nil + } + + result, err := n.GetEpochStartDataAPI(epoch) + assert.Nil(t, err) + + expectedResult := &common.EpochStartDataAPI{ + Nonce: nonce, + Round: round, + Timestamp: int64(timestamp), + Epoch: epoch, + Shard: core.MetachainShardId, + PrevBlockHash: hex.EncodeToString(prevHash), + StateRootHash: hex.EncodeToString(rootHash), + ScheduledRootHash: "", + AccumulatedFees: accumulatedFees.String(), + DeveloperFees: developerFees.String(), + } + assert.Equal(t, expectedResult, result) + }) + t.Run("should work for shard chain", func(t *testing.T) { + shardCoordinator.SelfShardId = 0 + + returnedHeader := &block.Header{ + Nonce: nonce, + Epoch: epoch, + Round: round, + ShardID: shardID, + TimeStamp: timestamp, + PrevHash: prevHash, + RootHash: rootHash, + AccumulatedFees: accumulatedFees, + DeveloperFees: developerFees, + } + + headerBytes, err := coreComponents.IntMarsh.Marshal(returnedHeader) + require.Nil(t, err) + + unit := &mockStorage.StorerStub{ + GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) { + expectedIdentifier := core.EpochStartIdentifier(epoch) + require.Equal(t, expectedIdentifier, string(key)) + + return headerBytes, nil + }, + } + + storageService := dataComponents.StorageService().(*mockStorage.ChainStorerStub) + storageService.GetStorerCalled = func(unitType dataRetriever.UnitType) (storage.Storer, error) { + require.Equal(t, dataRetriever.BlockHeaderUnit, unitType) + return unit, nil + } + + result, err := n.GetEpochStartDataAPI(epoch) + assert.Nil(t, err) + + expectedResult := &common.EpochStartDataAPI{ + Nonce: nonce, + Round: round, + Timestamp: int64(timestamp), + Epoch: epoch, + Shard: shardID, + PrevBlockHash: hex.EncodeToString(prevHash), + StateRootHash: hex.EncodeToString(rootHash), + ScheduledRootHash: "", + AccumulatedFees: accumulatedFees.String(), + DeveloperFees: developerFees.String(), + } + assert.Equal(t, expectedResult, result) + }) +} + func createMockHeartbeatV2Components(providedMessages []heartbeatData.PubKeyHeartbeat) *factoryMock.HeartbeatV2ComponentsStub { heartbeatV2Components := &factoryMock.HeartbeatV2ComponentsStub{} heartbeatV2Components.MonitorField = &integrationTestsMock.HeartbeatMonitorStub{ @@ -4284,7 +4485,7 @@ func getDefaultDataComponents() *nodeMockFactory.DataComponentsMock { return &nodeMockFactory.DataComponentsMock{ BlockChain: chainHandler, - Store: &storage.ChainStorerStub{}, + Store: &mockStorage.ChainStorerStub{}, DataPool: &dataRetrieverMock.PoolsHolderMock{}, MbProvider: &mock.MiniBlocksProviderStub{}, } From bae8fe113ff8818f69cc96ad1a6d9b83cabcfb7c Mon Sep 17 00:00:00 2001 From: jules01 Date: Tue, 28 Mar 2023 20:55:17 +0300 Subject: [PATCH 214/335] - added tests for metrics.go --- node/metrics/metrics_test.go | 141 +++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index cabb8674c14..6d6bd316a34 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -5,9 +5,12 @@ import ( "strconv" "testing" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -329,3 +332,141 @@ func TestInitRatingsMetrics(t *testing.T) { assert.Equal(t, v, keys[k]) } } + +func TestInitMetrics(t *testing.T) { + t.Parallel() + + appStatusHandler := &statusHandler.AppStatusHandlerStub{} + pubkeyString := "pub key" + nodeType := core.NodeTypeValidator + shardCoordinator := &testscommon.ShardsCoordinatorMock{ + NoShards: 3, + SelfIDCalled: func() uint32 { + return 0 + }, + } + nodesSetup := &testscommon.NodesSetupStub{ + GetShardConsensusGroupSizeCalled: func() uint32 { + return 63 + }, + GetMetaConsensusGroupSizeCalled: func() uint32 { + return 400 + }, + GetRoundDurationCalled: func() uint64 { + return 6000 + }, + MinNumberOfMetaNodesCalled: func() uint32 { + return 401 + }, + MinNumberOfShardNodesCalled: func() uint32 { + return 402 + }, + InitialNodesInfoCalled: func() (map[uint32][]nodesCoordinator.GenesisNodeInfoHandler, map[uint32][]nodesCoordinator.GenesisNodeInfoHandler) { + validators := map[uint32][]nodesCoordinator.GenesisNodeInfoHandler{ + 0: { + &shardingMocks.NodeInfoMock{}, + &shardingMocks.NodeInfoMock{}, + }, + 1: { + &shardingMocks.NodeInfoMock{}, + }, + } + + return validators, make(map[uint32][]nodesCoordinator.GenesisNodeInfoHandler) + }, + GetStartTimeCalled: func() int64 { + return 111111 + }, + } + version := "version" + economicsConfigs := &config.EconomicsConfig{ + RewardsSettings: config.RewardsSettings{ + RewardsConfigByEpoch: []config.EpochRewardSettings{ + { + LeaderPercentage: 2, + }, + }, + }, + GlobalSettings: config.GlobalSettings{ + Denomination: 4, + }, + } + roundsPerEpoch := int64(200) + minTransactionVersion := uint32(1) + + t.Run("nil app status handler should error", func(t *testing.T) { + t.Parallel() + + err := InitMetrics(nil, pubkeyString, nodeType, shardCoordinator, nodesSetup, version, economicsConfigs, roundsPerEpoch, minTransactionVersion) + assert.Equal(t, ErrNilAppStatusHandler, err) + }) + t.Run("nil shard coordinator should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "nil shard coordinator when initializing metrics" + err := InitMetrics(appStatusHandler, pubkeyString, nodeType, nil, nodesSetup, version, economicsConfigs, roundsPerEpoch, minTransactionVersion) + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("nil nodes configs should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "nil nodes config when initializing metrics" + err := InitMetrics(appStatusHandler, pubkeyString, nodeType, shardCoordinator, nil, version, economicsConfigs, roundsPerEpoch, minTransactionVersion) + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("nil economics configs should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "nil economics config when initializing metrics" + err := InitMetrics(appStatusHandler, pubkeyString, nodeType, shardCoordinator, nodesSetup, version, nil, roundsPerEpoch, minTransactionVersion) + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + keys := make(map[string]interface{}) + localStatusHandler := &statusHandler.AppStatusHandlerStub{ + SetUInt64ValueHandler: func(key string, value uint64) { + keys[key] = value + }, + SetStringValueHandler: func(key string, value string) { + keys[key] = value + }, + } + + err := InitMetrics(localStatusHandler, pubkeyString, nodeType, shardCoordinator, nodesSetup, version, economicsConfigs, roundsPerEpoch, minTransactionVersion) + assert.Nil(t, err) + + expectedValues := map[string]interface{}{ + common.MetricPublicKeyBlockSign: pubkeyString, + common.MetricShardId: uint64(shardCoordinator.SelfId()), + common.MetricNumShardsWithoutMetachain: uint64(shardCoordinator.NoShards), + common.MetricNodeType: string(nodeType), + common.MetricRoundTime: uint64(6), + common.MetricAppVersion: version, + common.MetricRoundsPerEpoch: uint64(roundsPerEpoch), + common.MetricCrossCheckBlockHeight: "0", + common.MetricCrossCheckBlockHeight + "_0": uint64(0), + common.MetricCrossCheckBlockHeight + "_1": uint64(0), + common.MetricCrossCheckBlockHeight + "_2": uint64(0), + common.MetricCrossCheckBlockHeightMeta: uint64(0), + common.MetricIsSyncing: uint64(1), + common.MetricLeaderPercentage: fmt.Sprintf("%f", 2.0), + common.MetricDenomination: uint64(4), + common.MetricShardConsensusGroupSize: uint64(63), + common.MetricMetaConsensusGroupSize: uint64(400), + common.MetricNumNodesPerShard: uint64(402), + common.MetricNumMetachainNodes: uint64(401), + common.MetricStartTime: uint64(111111), + common.MetricRoundDuration: uint64(6000), + common.MetricMinTransactionVersion: uint64(1), + common.MetricNumValidators: uint64(2), + common.MetricConsensusGroupSize: uint64(63), + } + + assert.Equal(t, len(expectedValues), len(keys)) + for k, v := range expectedValues { + assert.Equal(t, v, keys[k], fmt.Sprintf("for key %s", k)) + } + }) +} From 25259326ecdc91594391c767ccc24b3135fd9ed2 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 29 Mar 2023 15:59:41 +0300 Subject: [PATCH 215/335] - added more tests, refactored existing code --- node/metrics/metrics.go | 14 ++ node/metrics/metrics_test.go | 44 ++++ node/mock/applicationRunningTrigger.go | 34 +++ node/nodeRunner.go | 63 ++--- node/nodeRunner_test.go | 303 +++++++++++++++++++++++-- 5 files changed, 406 insertions(+), 52 deletions(-) create mode 100644 node/mock/applicationRunningTrigger.go diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index 2071f37cf04..df9ea699f06 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -2,6 +2,7 @@ package metrics import ( "fmt" + "runtime/debug" "sort" "strconv" @@ -10,6 +11,7 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/sharding" + logger "github.com/multiversx/mx-chain-logger-go" ) const millisecondsInSecond = 1000 @@ -18,6 +20,8 @@ const initInt = int64(0) const initString = "" const initZeroString = "0" +var log = logger.GetOrCreate("node/metrics") + // InitBaseMetrics will initialize base, default metrics to 0 values func InitBaseMetrics(appStatusHandler core.AppStatusHandler) error { if check.IfNil(appStatusHandler) { @@ -271,10 +275,20 @@ func InitMetrics( // SaveUint64Metric will save an uint64 metric in status handler func SaveUint64Metric(ash core.AppStatusHandler, key string, value uint64) { + if check.IfNil(ash) { + log.Error("programming error: nil AppStatusHandler in SaveUint64Metric", "stack", string(debug.Stack())) + return + } + ash.SetUInt64Value(key, value) } // SaveStringMetric will save a string metric in status handler func SaveStringMetric(ash core.AppStatusHandler, key, value string) { + if check.IfNil(ash) { + log.Error("programming error: nil AppStatusHandler in SaveStringMetric", "stack", string(debug.Stack())) + return + } + ash.SetStringValue(key, value) } diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 6d6bd316a34..0e4e8ea0b48 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -470,3 +470,47 @@ func TestInitMetrics(t *testing.T) { } }) } + +func TestSaveStringMetric(t *testing.T) { + t.Parallel() + + t.Run("should not panic if appStatusHandler is nil", func(t *testing.T) { + assert.NotPanics(t, func() { + SaveStringMetric(nil, "key", "value") + }) + }) + t.Run("should work", func(t *testing.T) { + wasCalled := false + appStatusHandler := &statusHandler.AppStatusHandlerStub{ + SetStringValueHandler: func(key string, value string) { + wasCalled = true + assert.Equal(t, "key", key) + assert.Equal(t, "value", value) + }, + } + SaveStringMetric(appStatusHandler, "key", "value") + assert.True(t, wasCalled) + }) +} + +func TestSaveUint64Metric(t *testing.T) { + t.Parallel() + + t.Run("should not panic if appStatusHandler is nil", func(t *testing.T) { + assert.NotPanics(t, func() { + SaveUint64Metric(nil, "key", 1) + }) + }) + t.Run("should work", func(t *testing.T) { + wasCalled := false + appStatusHandler := &statusHandler.AppStatusHandlerStub{ + SetUInt64ValueHandler: func(key string, value uint64) { + wasCalled = true + assert.Equal(t, "key", key) + assert.Equal(t, uint64(1), value) + }, + } + SaveUint64Metric(appStatusHandler, "key", 1) + assert.True(t, wasCalled) + }) +} diff --git a/node/mock/applicationRunningTrigger.go b/node/mock/applicationRunningTrigger.go new file mode 100644 index 00000000000..1ab9b23ccf4 --- /dev/null +++ b/node/mock/applicationRunningTrigger.go @@ -0,0 +1,34 @@ +package mock + +import ( + "strings" + + logger "github.com/multiversx/mx-chain-logger-go" +) + +var log = logger.GetOrCreate("node/mock") + +type applicationRunningTrigger struct { + chanClose chan struct{} +} + +// NewApplicationRunningTrigger - +func NewApplicationRunningTrigger() *applicationRunningTrigger { + return &applicationRunningTrigger{ + chanClose: make(chan struct{}), + } +} + +func (trigger *applicationRunningTrigger) Write(p []byte) (n int, err error) { + if strings.Contains(string(p), "application is now running") { + log.Info("got signal, trying to gracefully close the node") + close(trigger.chanClose) + } + + return 0, nil +} + +// ChanClose - +func (trigger *applicationRunningTrigger) ChanClose() chan struct{} { + return trigger.chanClose +} diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 7bbc5941cc1..d8e313d6394 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -66,6 +66,8 @@ import ( logger "github.com/multiversx/mx-chain-logger-go" ) +type nextOperationForNode int + const ( // TODO: remove this after better handling VM versions switching // delayBeforeScQueriesStart represents the delay before the sc query processor should start to allow external queries @@ -74,6 +76,9 @@ const ( maxTimeToClose = 10 * time.Second // SoftRestartMessage is the custom message used when the node does a soft restart operation SoftRestartMessage = "Shuffled out - soft restart" + + nextOperationShouldRestart nextOperationForNode = 1 + nextOperationShouldStop nextOperationForNode = 2 ) // nodeRunner holds the node runner configuration and controls running of a node @@ -509,7 +514,7 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( allowExternalVMQueriesChan := make(chan struct{}) log.Debug("updating the API service after creating the node facade") - ef, err := nr.createApiFacade(currentNode, webServerHandler, gasScheduleNotifier, allowExternalVMQueriesChan) + facadeInstance, err := nr.createApiFacade(currentNode, webServerHandler, gasScheduleNotifier, allowExternalVMQueriesChan) if err != nil { return true, err } @@ -526,20 +531,17 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) - err = waitForSignal( + nextOperation := waitForSignal( sigs, managedCoreComponents.ChanStopNodeProcess(), healthService, - ef, + facadeInstance, webServerHandler, currentNode, goRoutinesNumberStart, ) - if err != nil { - return true, nil - } - return false, nil + return nextOperation == nextOperationShouldStop, nil } func addSyncersToAccountsDB( @@ -923,11 +925,11 @@ func waitForSignal( sigs chan os.Signal, chanStopNodeProcess chan endProcess.ArgEndProcess, healthService closing.Closer, - ef closing.Closer, + facade closing.Closer, httpServer shared.UpgradeableHttpServerHandler, currentNode *Node, goRoutinesNumberStart int, -) error { +) nextOperationForNode { var sig endProcess.ArgEndProcess reshuffled := false wrongConfig := false @@ -949,7 +951,7 @@ func waitForSignal( chanCloseComponents := make(chan struct{}) go func() { - closeAllComponents(healthService, ef, httpServer, currentNode, chanCloseComponents) + closeAllComponents(healthService, facade, httpServer, currentNode, chanCloseComponents) }() select { @@ -960,14 +962,14 @@ func waitForSignal( "error", "closeAllComponents did not finish on time", "stack", goroutines.GetGoRoutines()) - return fmt.Errorf("did NOT close all components gracefully") + return nextOperationShouldStop } if wrongConfig { // hang the node's process because it cannot continue with the current configuration and a restart doesn't // change this behaviour for { - log.Error("wrong configuration. stopped processing", "description", wrongConfigDescription) + log.Error("wrong configuration. stopped the processing and left the node unclosed", "description", wrongConfigDescription) time.Sleep(1 * time.Minute) } } @@ -976,10 +978,10 @@ func waitForSignal( log.Info("=============================" + SoftRestartMessage + "==================================") core.DumpGoRoutinesToLog(goRoutinesNumberStart, log) - return nil + return nextOperationShouldRestart } - return fmt.Errorf("not reshuffled, closing") + return nextOperationShouldStop } func (nr *nodeRunner) logInformation( @@ -1080,18 +1082,19 @@ func (nr *nodeRunner) logSessionInformation( statsFolder, configurationPaths.GasScheduleDirectoryName, []string{ + configurationPaths.ApiRoutes, configurationPaths.MainConfig, configurationPaths.Economics, - configurationPaths.Ratings, - configurationPaths.Preferences, - configurationPaths.P2p, + configurationPaths.Epoch, + configurationPaths.RoundActivation, + configurationPaths.External, configurationPaths.Genesis, + configurationPaths.SmartContracts, configurationPaths.Nodes, - configurationPaths.ApiRoutes, - configurationPaths.External, + configurationPaths.P2p, + configurationPaths.Preferences, + configurationPaths.Ratings, configurationPaths.SystemSC, - configurationPaths.RoundActivation, - configurationPaths.Epoch, }) statsFile := filepath.Join(statsFolder, "session.info") @@ -1572,11 +1575,12 @@ func cleanupStorageIfNecessary(workingDir string, cleanupStorage bool) error { return os.RemoveAll(dbPath) } -func copyConfigToStatsFolder(statsFolder string, gasScheduleFolder string, configs []string) { +func copyConfigToStatsFolder(statsFolder string, gasScheduleDirectory string, configs []string) { err := os.MkdirAll(statsFolder, os.ModePerm) log.LogIfError(err) - err = copyDirectory(gasScheduleFolder, statsFolder) + newGasScheduleDirectory := path.Join(statsFolder, filepath.Base(gasScheduleDirectory)) + err = copyDirectory(gasScheduleDirectory, newGasScheduleDirectory) log.LogIfError(err) for _, configFile := range configs { @@ -1584,7 +1588,6 @@ func copyConfigToStatsFolder(statsFolder string, gasScheduleFolder string, confi } } -// TODO: add some unit tests func copyDirectory(source string, destination string) error { fileDescriptors, err := ioutil.ReadDir(source) if err != nil { @@ -1603,21 +1606,21 @@ func copyDirectory(source string, destination string) error { for _, fd := range fileDescriptors { srcFilePath := path.Join(source, fd.Name()) - dstFilePath := path.Join(destination, fd.Name()) if fd.IsDir() { + dstFilePath := path.Join(destination, filepath.Base(srcFilePath)) err = copyDirectory(srcFilePath, dstFilePath) log.LogIfError(err) } else { - copySingleFile(dstFilePath, srcFilePath) + copySingleFile(destination, srcFilePath) } } return nil } -func copySingleFile(folder string, configFile string) { - fileName := filepath.Base(configFile) +func copySingleFile(destinationDirectory string, sourceFile string) { + fileName := filepath.Base(sourceFile) - source, err := core.OpenFile(configFile) + source, err := core.OpenFile(sourceFile) if err != nil { return } @@ -1628,7 +1631,7 @@ func copySingleFile(folder string, configFile string) { } }() - destPath := filepath.Join(folder, fileName) + destPath := filepath.Join(destinationDirectory, fileName) destination, err := os.Create(destPath) if err != nil { return diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go index deeebe3e8f3..95de455f940 100644 --- a/node/nodeRunner_test.go +++ b/node/nodeRunner_test.go @@ -5,6 +5,7 @@ package node import ( "io/ioutil" + "os" "os/exec" "path" "strings" @@ -12,8 +13,11 @@ import ( "testing" "time" + "github.com/multiversx/mx-chain-core-go/data/endProcess" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/node/mock" + "github.com/multiversx/mx-chain-go/testscommon/api" logger "github.com/multiversx/mx-chain-logger-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -129,32 +133,13 @@ func TestNewNodeRunner(t *testing.T) { }) } -type applicationRunningTrigger struct { - chanClose chan struct{} -} - -func newApplicationRunningTrigger() *applicationRunningTrigger { - return &applicationRunningTrigger{ - chanClose: make(chan struct{}), - } -} - -func (trigger *applicationRunningTrigger) Write(p []byte) (n int, err error) { - if strings.Contains(string(p), "application is now running") { - log.Info("got signal, trying to gracefully close the node") - close(trigger.chanClose) - } - - return 0, nil -} - -func TestNodeRunner_StartAndCloseNode(t *testing.T) { +func TestNodeRunner_StartAndCloseNodeWithShuffleOut(t *testing.T) { t.Parallel() configs := createConfigs(t) runner, _ := NewNodeRunner(configs) - trigger := newApplicationRunningTrigger() + trigger := mock.NewApplicationRunningTrigger() err := logger.AddLogObserver(trigger, &logger.PlainFormatter{}) require.Nil(t, err) @@ -162,7 +147,7 @@ func TestNodeRunner_StartAndCloseNode(t *testing.T) { go func() { timeout := time.Minute * 5 select { - case <-trigger.chanClose: + case <-trigger.ChanClose(): case <-time.After(timeout): require.Fail(t, "timeout waiting for application to start") } @@ -176,3 +161,277 @@ func TestNodeRunner_StartAndCloseNode(t *testing.T) { err = runner.Start() assert.Nil(t, err) } + +func TestCopyDirectory(t *testing.T) { + t.Parallel() + + file1Name := "file1.toml" + file1Contents := []byte("file1") + file2Name := "file2.toml" + file2Contents := []byte("file2") + file3Name := "file3.toml" + file3Contents := []byte("file3") + file4Name := "file4.toml" + file4Contents := []byte("file4") + + tempDir := t.TempDir() + + // generating dummy structure like + // file1 + // src + // +- file2 + // +- dir1 + // +- file3 + // +- dir2 + // +- file4 + + err := ioutil.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) + require.Nil(t, err) + err = ioutil.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) + require.Nil(t, err) + + err = copyDirectory(path.Join(tempDir, "src"), path.Join(tempDir, "dst")) + require.Nil(t, err) + 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)) + require.Nil(t, err) + assert.Equal(t, file1Contents, buff) + + buff, err = ioutil.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)) + require.Nil(t, err) + assert.Equal(t, file3Contents, buff) + + buff, err = ioutil.ReadFile(path.Join(tempDir, "dst", "dir2", file4Name)) + require.Nil(t, err) + assert.Equal(t, file4Contents, buff) +} + +func TestWaitForSignal(t *testing.T) { + t.Parallel() + + closedCalled := make(map[string]struct{}) + healthServiceClosableComponent := &mock.CloserStub{ + CloseCalled: func() error { + closedCalled["healthService"] = struct{}{} + return nil + }, + } + facadeClosableComponent := &mock.CloserStub{ + CloseCalled: func() error { + closedCalled["facade"] = struct{}{} + return nil + }, + } + httpClosableComponent := &api.UpgradeableHttpServerHandlerStub{ + CloseCalled: func() error { + closedCalled["http"] = struct{}{} + return nil + }, + } + internalNodeClosableComponent1 := &mock.CloserStub{ + CloseCalled: func() error { + closedCalled["node closable component 1"] = struct{}{} + return nil + }, + } + internalNodeClosableComponent2 := &mock.CloserStub{ + CloseCalled: func() error { + closedCalled["node closable component 2"] = struct{}{} + return nil + }, + } + n, _ := NewNode() + n.closableComponents = append(n.closableComponents, internalNodeClosableComponent1) + n.closableComponents = append(n.closableComponents, internalNodeClosableComponent2) + + // do not run these tests in parallel as they are using the same map + t.Run("should return nextOperationShouldStop if SIGINT is received", func(t *testing.T) { + closedCalled = make(map[string]struct{}) + stopChan := make(chan endProcess.ArgEndProcess) + sigs := make(chan os.Signal, 1) + + go func() { + time.Sleep(time.Millisecond * 100) // wait for the waitForSignal to start + sigs <- syscall.SIGINT + }() + + nextOperation := waitForSignal( + sigs, + stopChan, + healthServiceClosableComponent, + facadeClosableComponent, + httpClosableComponent, + n, + 1, + ) + + assert.Equal(t, nextOperationShouldStop, nextOperation) + checkCloseCalledMap(t, closedCalled) + }) + t.Run("should return nextOperationShouldRestart if shuffled out is received", func(t *testing.T) { + closedCalled = make(map[string]struct{}) + stopChan := make(chan endProcess.ArgEndProcess, 1) + sigs := make(chan os.Signal) + + go func() { + time.Sleep(time.Millisecond * 100) // wait for the waitForSignal to start + stopChan <- endProcess.ArgEndProcess{ + Reason: common.ShuffledOut, + Description: "test", + } + }() + + nextOperation := waitForSignal( + sigs, + stopChan, + healthServiceClosableComponent, + facadeClosableComponent, + httpClosableComponent, + n, + 1, + ) + + assert.Equal(t, nextOperationShouldRestart, nextOperation) + checkCloseCalledMap(t, closedCalled) + }) + t.Run("wrong configuration should not stop the node", func(t *testing.T) { + closedCalled = make(map[string]struct{}) + stopChan := make(chan endProcess.ArgEndProcess, 1) + sigs := make(chan os.Signal) + + go func() { + time.Sleep(time.Millisecond * 100) // wait for the waitForSignal to start + stopChan <- endProcess.ArgEndProcess{ + Reason: common.WrongConfiguration, + Description: "test", + } + }() + + functionFinished := make(chan struct{}) + go func() { + _ = waitForSignal( + sigs, + stopChan, + healthServiceClosableComponent, + facadeClosableComponent, + httpClosableComponent, + n, + 1, + ) + close(functionFinished) + }() + + select { + case <-functionFinished: + assert.Fail(t, "function should not have finished") + case <-time.After(maxTimeToClose + time.Second*2): + // ok, timeout reached, function did not finish + } + + checkCloseCalledMap(t, closedCalled) + }) + + delayedComponent := &mock.CloserStub{ + CloseCalled: func() error { + time.Sleep(time.Minute) + return nil + }, + } + n.closableComponents = append(n.closableComponents, delayedComponent) + + t.Run("force closing the node when SIGINT is received", func(t *testing.T) { + closedCalled = make(map[string]struct{}) + stopChan := make(chan endProcess.ArgEndProcess) + sigs := make(chan os.Signal, 1) + + go func() { + time.Sleep(time.Millisecond * 100) // wait for the waitForSignal to start + sigs <- syscall.SIGINT + }() + + nextOperation := waitForSignal( + sigs, + stopChan, + healthServiceClosableComponent, + facadeClosableComponent, + httpClosableComponent, + n, + 1, + ) + + // these exceptions appear because the delayedComponent prevented the call of the first 2 components + // as the closable components are called in revered order + exceptions := []string{"node closable component 1", "node closable component 2"} + assert.Equal(t, nextOperationShouldStop, nextOperation) + checkCloseCalledMap(t, closedCalled, exceptions...) + }) + t.Run("force closing the node when shuffle out is received", func(t *testing.T) { + closedCalled = make(map[string]struct{}) + stopChan := make(chan endProcess.ArgEndProcess, 1) + sigs := make(chan os.Signal) + + go func() { + time.Sleep(time.Millisecond * 100) // wait for the waitForSignal to start + stopChan <- endProcess.ArgEndProcess{ + Reason: common.ShuffledOut, + Description: "test", + } + }() + + nextOperation := waitForSignal( + sigs, + stopChan, + healthServiceClosableComponent, + facadeClosableComponent, + httpClosableComponent, + n, + 1, + ) + + // these exceptions appear because the delayedComponent prevented the call of the first 2 components + // as the closable components are called in revered order + exceptions := []string{"node closable component 1", "node closable component 2"} + // in this case, even if the node is shuffled out, it should stop as some components were not closed + assert.Equal(t, nextOperationShouldStop, nextOperation) + checkCloseCalledMap(t, closedCalled, exceptions...) + }) +} + +func checkCloseCalledMap(tb testing.TB, closedCalled map[string]struct{}, exceptions ...string) { + allKeys := []string{"healthService", "facade", "http", "node closable component 1", "node closable component 2"} + numKeys := 0 + for _, key := range allKeys { + if contains(key, exceptions) { + continue + } + + numKeys++ + assert.Contains(tb, closedCalled, key) + } + + assert.Equal(tb, numKeys, len(closedCalled)) +} + +func contains(needle string, haystack []string) bool { + for _, element := range haystack { + if needle == element { + return true + } + } + + return false +} From abb70bc0004fdb9164e4397708cc0bb14d0044b9 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 29 Mar 2023 16:04:07 +0300 Subject: [PATCH 216/335] - added missing stub --- .../api/upgradeableHttpServerHandlerStub.go | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 testscommon/api/upgradeableHttpServerHandlerStub.go diff --git a/testscommon/api/upgradeableHttpServerHandlerStub.go b/testscommon/api/upgradeableHttpServerHandlerStub.go new file mode 100644 index 00000000000..24eb753bb45 --- /dev/null +++ b/testscommon/api/upgradeableHttpServerHandlerStub.go @@ -0,0 +1,42 @@ +package api + +import "github.com/multiversx/mx-chain-go/api/shared" + +// UpgradeableHttpServerHandlerStub - +type UpgradeableHttpServerHandlerStub struct { + StartHttpServerCalled func() error + UpdateFacadeCalled func(facade shared.FacadeHandler) error + CloseCalled func() error +} + +// StartHttpServer - +func (stub *UpgradeableHttpServerHandlerStub) StartHttpServer() error { + if stub.StartHttpServerCalled != nil { + return stub.StartHttpServerCalled() + } + + return nil +} + +// UpdateFacade - +func (stub *UpgradeableHttpServerHandlerStub) UpdateFacade(facade shared.FacadeHandler) error { + if stub.UpdateFacadeCalled != nil { + return stub.UpdateFacadeCalled(facade) + } + + return nil +} + +// Close - +func (stub *UpgradeableHttpServerHandlerStub) Close() error { + if stub.CloseCalled != nil { + return stub.CloseCalled() + } + + return nil +} + +// IsInterfaceNil - +func (stub *UpgradeableHttpServerHandlerStub) IsInterfaceNil() bool { + return stub == nil +} From 4ba64190346a58572705e9300a56f6a0bac2f0be Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 29 Mar 2023 16:19:36 +0300 Subject: [PATCH 217/335] - fixed test name --- node/nodeRunner_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go index 95de455f940..e7de941d13a 100644 --- a/node/nodeRunner_test.go +++ b/node/nodeRunner_test.go @@ -133,7 +133,7 @@ func TestNewNodeRunner(t *testing.T) { }) } -func TestNodeRunner_StartAndCloseNodeWithShuffleOut(t *testing.T) { +func TestNodeRunner_StartAndCloseNodeWith(t *testing.T) { t.Parallel() configs := createConfigs(t) From 12fe487080b92d8b9445907f45b2ae41645a0f68 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 30 Mar 2023 09:50:49 +0300 Subject: [PATCH 218/335] - fix after review - part 1 --- node/mock/applicationRunningTrigger.go | 1 + node/nodeRunner_test.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/node/mock/applicationRunningTrigger.go b/node/mock/applicationRunningTrigger.go index 1ab9b23ccf4..ade030ca801 100644 --- a/node/mock/applicationRunningTrigger.go +++ b/node/mock/applicationRunningTrigger.go @@ -19,6 +19,7 @@ func NewApplicationRunningTrigger() *applicationRunningTrigger { } } +// Write - func (trigger *applicationRunningTrigger) Write(p []byte) (n int, err error) { if strings.Contains(string(p), "application is now running") { log.Info("got signal, trying to gracefully close the node") diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go index e7de941d13a..7349ed20381 100644 --- a/node/nodeRunner_test.go +++ b/node/nodeRunner_test.go @@ -181,7 +181,7 @@ func TestCopyDirectory(t *testing.T) { // src // +- file2 // +- dir1 - // +- file3 + // +- file3 // +- dir2 // +- file4 From 12d8046cf58e15ca2760eef49921ade7fafd00bf Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 30 Mar 2023 11:42:33 +0300 Subject: [PATCH 219/335] - fix after review - part 2 --- node/nodeRunner_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go index 7349ed20381..8174e344581 100644 --- a/node/nodeRunner_test.go +++ b/node/nodeRunner_test.go @@ -133,7 +133,7 @@ func TestNewNodeRunner(t *testing.T) { }) } -func TestNodeRunner_StartAndCloseNodeWith(t *testing.T) { +func TestNodeRunner_StartAndCloseNodeUsingSIGINT(t *testing.T) { t.Parallel() configs := createConfigs(t) @@ -143,7 +143,7 @@ func TestNodeRunner_StartAndCloseNodeWith(t *testing.T) { err := logger.AddLogObserver(trigger, &logger.PlainFormatter{}) require.Nil(t, err) - // start a go routine that will send the SIGINT message after 1 minute + // start a go routine that will send the SIGINT message after 1 second after the node has started go func() { timeout := time.Minute * 5 select { From bf923c74f0ae637581af530d3df3f7ae9264a548 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 30 Mar 2023 15:05:22 +0300 Subject: [PATCH 220/335] - fixes after review - part 3 --- node/metrics/metrics_test.go | 169 +++++++++++++++++++++++++++-------- node/nodeRunner_test.go | 4 +- 2 files changed, 132 insertions(+), 41 deletions(-) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 0e4e8ea0b48..7e2e3d324d8 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -137,49 +137,59 @@ func TestInitConfigMetrics(t *testing.T) { ESDTTransferRoleEnableEpoch: 33, BuiltInFunctionOnMetaEnableEpoch: 34, WaitingListFixEnableEpoch: 35, + MaxNodesChangeEnableEpoch: []config.MaxNodesChangeConfig{ + { + EpochEnable: 0, + MaxNumNodes: 1, + NodesToShufflePerShard: 2, + }, + }, }, } expectedValues := map[string]interface{}{ - "erd_smart_contract_deploy_enable_epoch": uint32(1), - "erd_built_in_functions_enable_epoch": uint32(2), - "erd_relayed_transactions_enable_epoch": uint32(3), - "erd_penalized_too_much_gas_enable_epoch": uint32(4), - "erd_switch_jail_waiting_enable_epoch": uint32(5), - "erd_switch_hysteresis_for_min_nodes_enable_epoch": uint32(6), - "erd_below_signed_threshold_enable_epoch": uint32(7), - "erd_transaction_signed_with_txhash_enable_epoch": uint32(8), - "erd_meta_protection_enable_epoch": uint32(9), - "erd_ahead_of_time_gas_usage_enable_epoch": uint32(10), - "erd_gas_price_modifier_enable_epoch": uint32(11), - "erd_repair_callback_enable_epoch": uint32(12), - "erd_block_gas_and_fee_recheck_enable_epoch": uint32(13), - "erd_staking_v2_enable_epoch": uint32(14), - "erd_stake_enable_epoch": uint32(15), - "erd_double_key_protection_enable_epoch": uint32(16), - "erd_esdt_enable_epoch": uint32(17), - "erd_governance_enable_epoch": uint32(18), - "erd_delegation_manager_enable_epoch": uint32(19), - "erd_delegation_smart_contract_enable_epoch": uint32(20), - "erd_correct_last_unjailed_enable_epoch": uint32(21), - "erd_balance_waiting_lists_enable_epoch": uint32(22), - "erd_return_data_to_last_transfer_enable_epoch": uint32(23), - "erd_sender_in_out_transfer_enable_epoch": uint32(24), - "erd_relayed_transactions_v2_enable_epoch": uint32(25), - "erd_unbond_tokens_v2_enable_epoch": uint32(26), - "erd_save_jailed_always_enable_epoch": uint32(27), - "erd_validator_to_delegation_enable_epoch": uint32(28), - "erd_redelegate_below_min_check_enable_epoch": uint32(29), - "erd_increment_scr_nonce_in_multi_transfer_enable_epoch": uint32(30), - "erd_esdt_multi_transfer_enable_epoch": uint32(31), - "erd_global_mint_burn_disable_epoch": uint32(32), - "erd_esdt_transfer_role_enable_epoch": uint32(33), - "erd_builtin_function_on_meta_enable_epoch": uint32(34), - "erd_waiting_list_fix_enable_epoch": uint32(35), - "erd_max_nodes_change_enable_epoch": nil, - "erd_total_supply": "12345", - "erd_hysteresis": "0.100000", - "erd_adaptivity": "true", + "erd_smart_contract_deploy_enable_epoch": uint32(1), + "erd_built_in_functions_enable_epoch": uint32(2), + "erd_relayed_transactions_enable_epoch": uint32(3), + "erd_penalized_too_much_gas_enable_epoch": uint32(4), + "erd_switch_jail_waiting_enable_epoch": uint32(5), + "erd_switch_hysteresis_for_min_nodes_enable_epoch": uint32(6), + "erd_below_signed_threshold_enable_epoch": uint32(7), + "erd_transaction_signed_with_txhash_enable_epoch": uint32(8), + "erd_meta_protection_enable_epoch": uint32(9), + "erd_ahead_of_time_gas_usage_enable_epoch": uint32(10), + "erd_gas_price_modifier_enable_epoch": uint32(11), + "erd_repair_callback_enable_epoch": uint32(12), + "erd_block_gas_and_fee_recheck_enable_epoch": uint32(13), + "erd_staking_v2_enable_epoch": uint32(14), + "erd_stake_enable_epoch": uint32(15), + "erd_double_key_protection_enable_epoch": uint32(16), + "erd_esdt_enable_epoch": uint32(17), + "erd_governance_enable_epoch": uint32(18), + "erd_delegation_manager_enable_epoch": uint32(19), + "erd_delegation_smart_contract_enable_epoch": uint32(20), + "erd_correct_last_unjailed_enable_epoch": uint32(21), + "erd_balance_waiting_lists_enable_epoch": uint32(22), + "erd_return_data_to_last_transfer_enable_epoch": uint32(23), + "erd_sender_in_out_transfer_enable_epoch": uint32(24), + "erd_relayed_transactions_v2_enable_epoch": uint32(25), + "erd_unbond_tokens_v2_enable_epoch": uint32(26), + "erd_save_jailed_always_enable_epoch": uint32(27), + "erd_validator_to_delegation_enable_epoch": uint32(28), + "erd_redelegate_below_min_check_enable_epoch": uint32(29), + "erd_increment_scr_nonce_in_multi_transfer_enable_epoch": uint32(30), + "erd_esdt_multi_transfer_enable_epoch": uint32(31), + "erd_global_mint_burn_disable_epoch": uint32(32), + "erd_esdt_transfer_role_enable_epoch": uint32(33), + "erd_builtin_function_on_meta_enable_epoch": uint32(34), + "erd_waiting_list_fix_enable_epoch": uint32(35), + "erd_max_nodes_change_enable_epoch": nil, + "erd_total_supply": "12345", + "erd_hysteresis": "0.100000", + "erd_adaptivity": "true", + "erd_max_nodes_change_enable_epoch0_epoch_enable": uint32(0), + "erd_max_nodes_change_enable_epoch0_max_num_nodes": uint32(1), + "erd_max_nodes_change_enable_epoch0_nodes_to_shuffle_per_shard": uint32(2), } economicsConfig := config.EconomicsConfig{ @@ -385,6 +395,9 @@ func TestInitMetrics(t *testing.T) { { LeaderPercentage: 2, }, + { + LeaderPercentage: 2, + }, }, }, GlobalSettings: config.GlobalSettings{ @@ -469,6 +482,84 @@ func TestInitMetrics(t *testing.T) { assert.Equal(t, v, keys[k], fmt.Sprintf("for key %s", k)) } }) + t.Run("should work - metachain", func(t *testing.T) { + t.Parallel() + + keys := make(map[string]interface{}) + localStatusHandler := &statusHandler.AppStatusHandlerStub{ + SetUInt64ValueHandler: func(key string, value uint64) { + keys[key] = value + }, + SetStringValueHandler: func(key string, value string) { + keys[key] = value + }, + } + localShardCoordinator := &testscommon.ShardsCoordinatorMock{ + NoShards: 3, + SelfIDCalled: func() uint32 { + return common.MetachainShardId + }, + } + + err := InitMetrics(localStatusHandler, pubkeyString, nodeType, localShardCoordinator, nodesSetup, version, economicsConfigs, roundsPerEpoch, minTransactionVersion) + assert.Nil(t, err) + + expectedValues := map[string]interface{}{ + common.MetricPublicKeyBlockSign: pubkeyString, + common.MetricShardId: uint64(localShardCoordinator.SelfId()), + common.MetricNumShardsWithoutMetachain: uint64(localShardCoordinator.NoShards), + common.MetricNodeType: string(nodeType), + common.MetricRoundTime: uint64(6), + common.MetricAppVersion: version, + common.MetricRoundsPerEpoch: uint64(roundsPerEpoch), + common.MetricCrossCheckBlockHeight: "0", + common.MetricCrossCheckBlockHeight + "_0": uint64(0), + common.MetricCrossCheckBlockHeight + "_1": uint64(0), + common.MetricCrossCheckBlockHeight + "_2": uint64(0), + common.MetricCrossCheckBlockHeightMeta: uint64(0), + common.MetricIsSyncing: uint64(1), + common.MetricLeaderPercentage: fmt.Sprintf("%f", 2.0), + common.MetricDenomination: uint64(4), + common.MetricShardConsensusGroupSize: uint64(63), + common.MetricMetaConsensusGroupSize: uint64(400), + common.MetricNumNodesPerShard: uint64(402), + common.MetricNumMetachainNodes: uint64(401), + common.MetricStartTime: uint64(111111), + common.MetricRoundDuration: uint64(6000), + common.MetricMinTransactionVersion: uint64(1), + common.MetricNumValidators: uint64(0), + common.MetricConsensusGroupSize: uint64(400), + } + + assert.Equal(t, len(expectedValues), len(keys)) + for k, v := range expectedValues { + assert.Equal(t, v, keys[k], fmt.Sprintf("for key %s", k)) + } + }) + t.Run("should work - invalid shard id", func(t *testing.T) { + t.Parallel() + + keys := make(map[string]interface{}) + localStatusHandler := &statusHandler.AppStatusHandlerStub{ + SetUInt64ValueHandler: func(key string, value uint64) { + keys[key] = value + }, + SetStringValueHandler: func(key string, value string) { + keys[key] = value + }, + } + localShardCoordinator := &testscommon.ShardsCoordinatorMock{ + NoShards: 3, + SelfIDCalled: func() uint32 { + return 10 + }, + } + + err := InitMetrics(localStatusHandler, pubkeyString, nodeType, localShardCoordinator, nodesSetup, version, economicsConfigs, roundsPerEpoch, minTransactionVersion) + assert.Nil(t, err) + + assert.Equal(t, uint64(0), keys[common.MetricConsensusGroupSize]) + }) } func TestSaveStringMetric(t *testing.T) { diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go index 8174e344581..a7dd9dac1a1 100644 --- a/node/nodeRunner_test.go +++ b/node/nodeRunner_test.go @@ -374,7 +374,7 @@ func TestWaitForSignal(t *testing.T) { ) // these exceptions appear because the delayedComponent prevented the call of the first 2 components - // as the closable components are called in revered order + // as the closable components are called in reversed order exceptions := []string{"node closable component 1", "node closable component 2"} assert.Equal(t, nextOperationShouldStop, nextOperation) checkCloseCalledMap(t, closedCalled, exceptions...) @@ -403,7 +403,7 @@ func TestWaitForSignal(t *testing.T) { ) // these exceptions appear because the delayedComponent prevented the call of the first 2 components - // as the closable components are called in revered order + // as the closable components are called in reversed order exceptions := []string{"node closable component 1", "node closable component 2"} // in this case, even if the node is shuffled out, it should stop as some components were not closed assert.Equal(t, nextOperationShouldStop, nextOperation) From 3ad94f235711b9beeee5ed12c9316b0e6cfe7ff2 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 30 Mar 2023 16:56:08 +0300 Subject: [PATCH 221/335] small fixes + extra unittests for factory/api --- factory/api/apiResolverFactory.go | 2 +- factory/api/apiResolverFactory_test.go | 404 +++++++++++++++++- factory/api/export_test.go | 45 ++ process/errors.go | 2 +- statusHandler/errors.go | 2 +- .../factory/coreComponentsHolderStub.go | 374 ++++++++++++++++ update/errors.go | 2 +- 7 files changed, 822 insertions(+), 9 deletions(-) create mode 100644 factory/api/export_test.go create mode 100644 testscommon/factory/coreComponentsHolderStub.go diff --git a/factory/api/apiResolverFactory.go b/factory/api/apiResolverFactory.go index 3c815aecb3e..133de928f63 100644 --- a/factory/api/apiResolverFactory.go +++ b/factory/api/apiResolverFactory.go @@ -408,7 +408,7 @@ func createScQueryElement( queryVirtualMachineConfig := args.generalConfig.VirtualMachine.Querying.VirtualMachineConfig esdtTransferParser, errParser := parsers.NewESDTTransferParser(args.coreComponents.InternalMarshalizer()) if errParser != nil { - return nil, err + return nil, errParser } blockChainHookImpl, errBlockChainHook := hooks.NewBlockChainHookImpl(argsHook) diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index 7462ae0496e..2ad27234e1a 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -1,20 +1,64 @@ package api_test import ( + "strings" + "sync" "testing" + "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/typeConverters" + "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/factory/api" "github.com/multiversx/mx-chain-go/factory/bootstrap" "github.com/multiversx/mx-chain-go/factory/mock" + testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" "github.com/multiversx/mx-chain-go/process/sync/disabled" + "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" + epochNotifierMock "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" + "github.com/multiversx/mx-chain-go/testscommon/factory" + "github.com/multiversx/mx-chain-go/testscommon/genericMocks" + stateMocks "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/stretchr/testify/require" ) -func TestCreateApiResolver(t *testing.T) { +const unreachableStep = 10000 + +type failingSteps struct { + marshallerStepCounter int + marshallerFailingStep int + + enableEpochsHandlerStepCounter int + enableEpochsHandlerFailingStep int + + uint64ByteSliceConvStepCounter int + uint64ByteSliceConvFailingStep int + + addressPublicKeyConverterStepCounter int + addressPublicKeyConverterFailingStep int +} + +func (fs *failingSteps) reset() { + fs.marshallerStepCounter = 0 + fs.marshallerFailingStep = unreachableStep + + fs.enableEpochsHandlerStepCounter = 0 + fs.enableEpochsHandlerFailingStep = unreachableStep + + fs.uint64ByteSliceConvStepCounter = 0 + fs.uint64ByteSliceConvFailingStep = unreachableStep + + fs.addressPublicKeyConverterStepCounter = 0 + fs.addressPublicKeyConverterFailingStep = unreachableStep +} + +func createMockArgs(t *testing.T) *api.ApiResolverArgs { if testing.Short() { t.Skip("this is not a short test") } @@ -37,7 +81,8 @@ func TestCreateApiResolver(t *testing.T) { gasSchedule, _ := common.LoadGasScheduleConfig("../../cmd/node/config/gasSchedules/gasScheduleV1.toml") economicsConfig := testscommon.GetEconomicsConfig() cfg := componentsMock.GetGeneralConfig() - args := &api.ApiResolverArgs{ + + return &api.ApiResolverArgs{ Configs: &config.Configs{ FlagsConfig: &config.ContextFlagsConfig{ WorkingDir: "", @@ -59,8 +104,357 @@ func TestCreateApiResolver(t *testing.T) { Bootstrapper: disabled.NewDisabledBootstrapper(), AllowVMQueriesChan: common.GetClosedUnbufferedChannel(), } +} + +func createFailingMockArgs(t *testing.T, failingSteps *failingSteps) *api.ApiResolverArgs { + args := createMockArgs(t) + coreCompStub := factory.NewCoreComponentsHolderStubFromRealComponent(args.CoreComponents) + + internalMarshaller := args.CoreComponents.InternalMarshalizer() + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + failingSteps.marshallerStepCounter++ + if failingSteps.marshallerStepCounter > failingSteps.marshallerFailingStep { + return nil + } + return internalMarshaller + } + + enableEpochsHandler := args.CoreComponents.EnableEpochsHandler() + coreCompStub.EnableEpochsHandlerCalled = func() common.EnableEpochsHandler { + failingSteps.enableEpochsHandlerStepCounter++ + if failingSteps.enableEpochsHandlerStepCounter > failingSteps.enableEpochsHandlerFailingStep { + return nil + } + return enableEpochsHandler + } + + byteSliceConv := args.CoreComponents.Uint64ByteSliceConverter() + coreCompStub.Uint64ByteSliceConverterCalled = func() typeConverters.Uint64ByteSliceConverter { + failingSteps.uint64ByteSliceConvStepCounter++ + if failingSteps.uint64ByteSliceConvStepCounter > failingSteps.uint64ByteSliceConvFailingStep { + return nil + } + return byteSliceConv + } + + pubKeyConv := args.CoreComponents.AddressPubKeyConverter() + coreCompStub.AddressPubKeyConverterCalled = func() core.PubkeyConverter { + failingSteps.addressPublicKeyConverterStepCounter++ + if failingSteps.addressPublicKeyConverterStepCounter > failingSteps.addressPublicKeyConverterFailingStep { + return nil + } + return pubKeyConv + } + + args.CoreComponents = coreCompStub + return args +} + +func TestCreateApiResolver(t *testing.T) { + t.Parallel() + + t.Run("createScQueryService fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgs(t) + args.Configs.GeneralConfig.VirtualMachine.Querying.NumConcurrentVMs = 0 + apiResolver, err := api.CreateApiResolver(args) + require.True(t, strings.Contains(err.Error(), "VirtualMachine.Querying.NumConcurrentVms")) + require.True(t, check.IfNil(apiResolver)) + }) + + failingStepsInstance := &failingSteps{} + failingArgs := createFailingMockArgs(t, failingStepsInstance) + // do not run these tests in parallel as they all use the same args + t.Run("DecodeAddresses fails causing createScQueryElement error should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.addressPublicKeyConverterFailingStep = 0 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "public key converter")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("DecodeAddresses fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.addressPublicKeyConverterFailingStep = 2 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "public key converter")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("createBuiltinFuncs fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.marshallerFailingStep = 3 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("NewESDTTransferParser fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.marshallerFailingStep = 4 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + println(err.Error()) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshaller")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("NewTxTypeHandler fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.enableEpochsHandlerFailingStep = 4 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "enable epochs handler")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("NewTransactionCostEstimator fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.enableEpochsHandlerFailingStep = 5 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "enable epochs handler")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("createLogsFacade fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.marshallerFailingStep = 5 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("NewOperationDataFieldParser fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.marshallerFailingStep = 6 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("NewAPITransactionProcessor fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.marshallerFailingStep = 7 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("createAPIBlockProcessor fails because createAPIBlockProcessorArgs fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.uint64ByteSliceConvFailingStep = 2 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "uint64")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("createAPIInternalBlockProcessor fails because createAPIBlockProcessorArgs fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.uint64ByteSliceConvFailingStep = 4 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "uint64")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("createAPIBlockProcessorArgs fails because createLogsFacade fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.marshallerFailingStep = 8 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("createAPIBlockProcessorArgs fails because NewAlteredAccountsProvider fails should error", func(t *testing.T) { + failingStepsInstance.reset() + failingStepsInstance.addressPublicKeyConverterFailingStep = 9 + apiResolver, err := api.CreateApiResolver(failingArgs) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "public key converter")) + require.True(t, check.IfNil(apiResolver)) + }) + t.Run("should work", func(t *testing.T) { + failingStepsInstance.reset() // no failure + apiResolver, err := api.CreateApiResolver(failingArgs) + require.Nil(t, err) + require.False(t, check.IfNil(apiResolver)) + }) +} + +func createMockSCQueryElementArgs() api.SCQueryElementArgs { + return api.SCQueryElementArgs{ + GeneralConfig: &config.Config{ + BuiltInFunctions: config.BuiltInFunctionsConfig{ + MaxNumAddressesInTransferRole: 1, + AutomaticCrawlerAddresses: []string{"addr1"}, + }, + SmartContractDataPool: config.CacheConfig{ + Type: "LRU", + Capacity: 100, + }, + }, + EpochConfig: &config.EpochConfig{}, + CoreComponents: &mock.CoreComponentsMock{ + AddrPubKeyConv: &mock.PubkeyConverterStub{ + DecodeCalled: func(humanReadable string) ([]byte, error) { + return []byte(humanReadable), nil + }, + }, + IntMarsh: &testscommon.MarshalizerStub{}, + EpochChangeNotifier: &epochNotifierMock.EpochNotifierStub{}, + EnableEpochsHandlerField: &testscommon.EnableEpochsHandlerStub{}, + UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: &testscommon.NodesSetupStub{}, + Hash: &testscommon.HasherStub{}, + RatingHandler: &testscommon.RaterMock{}, + WasmVMChangeLockerInternal: &sync.RWMutex{}, + }, + StateComponents: &mock.StateComponentsHolderStub{ + AccountsAdapterAPICalled: func() state.AccountsAdapter { + return &stateMocks.AccountsStub{} + }, + PeerAccountsCalled: func() state.AccountsAdapter { + return &stateMocks.AccountsStub{} + }, + }, + DataComponents: &mock.DataComponentsMock{ + Storage: &genericMocks.ChainStorerMock{}, + Blkc: &testscommon.ChainHandlerMock{}, + DataPool: &dataRetriever.PoolsHolderMock{}, + }, + ProcessComponents: &mock.ProcessComponentsMock{ + ShardCoord: &testscommon.ShardsCoordinatorMock{}, + }, + GasScheduleNotifier: &testscommon.GasScheduleNotifierMock{ + LatestGasScheduleCalled: func() map[string]map[string]uint64 { + gasSchedule, _ := common.LoadGasScheduleConfig("../../cmd/node/config/gasSchedules/gasScheduleV1.toml") + return gasSchedule + }, + }, + MessageSigVerifier: &testscommon.MessageSignVerifierMock{}, + SystemSCConfig: &config.SystemSmartContractsConfig{}, + Bootstrapper: testsMocks.NewTestBootstrapperMock(), + AllowVMQueriesChan: make(chan struct{}, 1), + WorkingDir: "", + Index: 0, + } +} + +func TestCreateApiResolver_createScQueryElement(t *testing.T) { + t.Parallel() + + t.Run("DecodeAddresses fails", func(t *testing.T) { + t.Parallel() + + args := createMockSCQueryElementArgs() + args.CoreComponents = &mock.CoreComponentsMock{ + AddrPubKeyConv: nil, + } + scQueryService, err := api.CreateScQueryElement(args) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "public key converter")) + require.Nil(t, scQueryService) + }) + t.Run("createBuiltinFuncs fails", func(t *testing.T) { + t.Parallel() + + args := createMockSCQueryElementArgs() + coreCompMock := args.CoreComponents.(*mock.CoreComponentsMock) + coreCompMock.IntMarsh = nil + scQueryService, err := api.CreateScQueryElement(args) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "marshalizer")) + require.Nil(t, scQueryService) + }) + t.Run("NewCache fails", func(t *testing.T) { + t.Parallel() + + args := createMockSCQueryElementArgs() + args.GeneralConfig.SmartContractDataPool = config.CacheConfig{ + Type: "LRU", + SizeInBytes: 1, + } + scQueryService, err := api.CreateScQueryElement(args) + require.NotNil(t, err) + 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() + + args := createMockSCQueryElementArgs() + args.ProcessComponents = &mock.ProcessComponentsMock{ + ShardCoord: &testscommon.ShardsCoordinatorMock{ + SelfIDCalled: func() uint32 { + return common.MetachainShardId + }, + }, + } + coreCompMock := args.CoreComponents.(*mock.CoreComponentsMock) + coreCompMock.Hash = nil + scQueryService, err := api.CreateScQueryElement(args) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "hasher")) + require.Nil(t, scQueryService) + }) + 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 + scQueryService, err := api.CreateScQueryElement(args) + require.NotNil(t, err) + require.True(t, strings.Contains(strings.ToLower(err.Error()), "hasher")) + require.Nil(t, scQueryService) + }) - apiResolver, err := api.CreateApiResolver(args) - require.Nil(t, err) - require.NotNil(t, apiResolver) } diff --git a/factory/api/export_test.go b/factory/api/export_test.go new file mode 100644 index 00000000000..4ccc5589304 --- /dev/null +++ b/factory/api/export_test.go @@ -0,0 +1,45 @@ +package api + +import ( + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/factory" + "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/vm" +) + +// SCQueryElementArgs - +type SCQueryElementArgs struct { + GeneralConfig *config.Config + EpochConfig *config.EpochConfig + CoreComponents factory.CoreComponentsHolder + StateComponents factory.StateComponentsHolder + DataComponents factory.DataComponentsHolder + ProcessComponents factory.ProcessComponentsHolder + GasScheduleNotifier core.GasScheduleNotifier + MessageSigVerifier vm.MessageSignVerifier + SystemSCConfig *config.SystemSmartContractsConfig + Bootstrapper process.Bootstrapper + AllowVMQueriesChan chan struct{} + WorkingDir string + Index int +} + +// CreateScQueryElement - +func CreateScQueryElement(args SCQueryElementArgs) (process.SCQueryService, error) { + return createScQueryElement(&scQueryElementArgs{ + generalConfig: args.GeneralConfig, + epochConfig: args.EpochConfig, + coreComponents: args.CoreComponents, + stateComponents: args.StateComponents, + dataComponents: args.DataComponents, + processComponents: args.ProcessComponents, + gasScheduleNotifier: args.GasScheduleNotifier, + messageSigVerifier: args.MessageSigVerifier, + systemSCConfig: args.SystemSCConfig, + bootstrapper: args.Bootstrapper, + allowVMQueriesChan: args.AllowVMQueriesChan, + workingDir: args.WorkingDir, + index: args.Index, + }) +} diff --git a/process/errors.go b/process/errors.go index 895634b3599..c44470ad406 100644 --- a/process/errors.go +++ b/process/errors.go @@ -391,7 +391,7 @@ var ErrWrongTypeInMiniBlock = errors.New("type in miniblock is not correct for p var ErrNilTransactionCoordinator = errors.New("transaction coordinator is nil") // ErrNilUint64Converter signals that uint64converter is nil -var ErrNilUint64Converter = errors.New("unit64converter is nil") +var ErrNilUint64Converter = errors.New("uint64converter is nil") // ErrNilSmartContractResultProcessor signals that smart contract result processor is nil var ErrNilSmartContractResultProcessor = errors.New("nil smart contract result processor") diff --git a/statusHandler/errors.go b/statusHandler/errors.go index b90cd6b6539..d3f25cd3a4d 100644 --- a/statusHandler/errors.go +++ b/statusHandler/errors.go @@ -15,7 +15,7 @@ var ErrNilAppStatusHandler = errors.New("appStatusHandler is nil") var ErrNilMarshalizer = errors.New("nil Marshalizer") // ErrNilUint64Converter signals that uint64converter is nil -var ErrNilUint64Converter = errors.New("unit64converter is nil") +var ErrNilUint64Converter = errors.New("uint64converter is nil") // ErrNilStorage signals that a nil storage has been provided var ErrNilStorage = errors.New("nil storage") diff --git a/testscommon/factory/coreComponentsHolderStub.go b/testscommon/factory/coreComponentsHolderStub.go new file mode 100644 index 00000000000..557a7f44c7c --- /dev/null +++ b/testscommon/factory/coreComponentsHolderStub.go @@ -0,0 +1,374 @@ +package factory + +import ( + "time" + + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/data/endProcess" + "github.com/multiversx/mx-chain-core-go/data/typeConverters" + "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/consensus" + "github.com/multiversx/mx-chain-go/factory" + "github.com/multiversx/mx-chain-go/ntp" + "github.com/multiversx/mx-chain-go/process" + "github.com/multiversx/mx-chain-go/sharding" + "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" + "github.com/multiversx/mx-chain-go/storage" +) + +// CoreComponentsHolderStub - +type CoreComponentsHolderStub struct { + InternalMarshalizerCalled func() marshal.Marshalizer + SetInternalMarshalizerCalled func(marshalizer marshal.Marshalizer) error + TxMarshalizerCalled func() marshal.Marshalizer + VmMarshalizerCalled func() marshal.Marshalizer + HasherCalled func() hashing.Hasher + TxSignHasherCalled func() hashing.Hasher + Uint64ByteSliceConverterCalled func() typeConverters.Uint64ByteSliceConverter + AddressPubKeyConverterCalled func() core.PubkeyConverter + ValidatorPubKeyConverterCalled func() core.PubkeyConverter + PathHandlerCalled func() storage.PathManagerHandler + WatchdogCalled func() core.WatchdogTimer + AlarmSchedulerCalled func() core.TimersScheduler + SyncTimerCalled func() ntp.SyncTimer + RoundHandlerCalled func() consensus.RoundHandler + EconomicsDataCalled func() process.EconomicsDataHandler + APIEconomicsDataCalled func() process.EconomicsDataHandler + RatingsDataCalled func() process.RatingsInfoHandler + RaterCalled func() sharding.PeerAccountListAndRatingHandler + GenesisNodesSetupCalled func() sharding.GenesisNodesSetupHandler + NodesShufflerCalled func() nodesCoordinator.NodesShuffler + EpochNotifierCalled func() process.EpochNotifier + EnableRoundsHandlerCalled func() process.EnableRoundsHandler + EpochStartNotifierWithConfirmCalled func() factory.EpochStartNotifierWithConfirm + ChanStopNodeProcessCalled func() chan endProcess.ArgEndProcess + GenesisTimeCalled func() time.Time + ChainIDCalled func() string + MinTransactionVersionCalled func() uint32 + TxVersionCheckerCalled func() process.TxVersionCheckerHandler + EncodedAddressLenCalled func() uint32 + NodeTypeProviderCalled func() core.NodeTypeProviderHandler + WasmVMChangeLockerCalled func() common.Locker + ProcessStatusHandlerCalled func() common.ProcessStatusHandler + HardforkTriggerPubKeyCalled func() []byte + EnableEpochsHandlerCalled func() common.EnableEpochsHandler +} + +// NewCoreComponentsHolderStubFromRealComponent - +func NewCoreComponentsHolderStubFromRealComponent(coreComponents factory.CoreComponentsHolder) *CoreComponentsHolderStub { + return &CoreComponentsHolderStub{ + InternalMarshalizerCalled: coreComponents.InternalMarshalizer, + SetInternalMarshalizerCalled: coreComponents.SetInternalMarshalizer, + TxMarshalizerCalled: coreComponents.TxMarshalizer, + VmMarshalizerCalled: coreComponents.VmMarshalizer, + HasherCalled: coreComponents.Hasher, + TxSignHasherCalled: coreComponents.TxSignHasher, + Uint64ByteSliceConverterCalled: coreComponents.Uint64ByteSliceConverter, + AddressPubKeyConverterCalled: coreComponents.AddressPubKeyConverter, + ValidatorPubKeyConverterCalled: coreComponents.ValidatorPubKeyConverter, + PathHandlerCalled: coreComponents.PathHandler, + WatchdogCalled: coreComponents.Watchdog, + AlarmSchedulerCalled: coreComponents.AlarmScheduler, + SyncTimerCalled: coreComponents.SyncTimer, + RoundHandlerCalled: coreComponents.RoundHandler, + EconomicsDataCalled: coreComponents.EconomicsData, + APIEconomicsDataCalled: coreComponents.APIEconomicsData, + RatingsDataCalled: coreComponents.RatingsData, + RaterCalled: coreComponents.Rater, + GenesisNodesSetupCalled: coreComponents.GenesisNodesSetup, + NodesShufflerCalled: coreComponents.NodesShuffler, + EpochNotifierCalled: coreComponents.EpochNotifier, + EnableRoundsHandlerCalled: coreComponents.EnableRoundsHandler, + EpochStartNotifierWithConfirmCalled: coreComponents.EpochStartNotifierWithConfirm, + ChanStopNodeProcessCalled: coreComponents.ChanStopNodeProcess, + GenesisTimeCalled: coreComponents.GenesisTime, + ChainIDCalled: coreComponents.ChainID, + MinTransactionVersionCalled: coreComponents.MinTransactionVersion, + TxVersionCheckerCalled: coreComponents.TxVersionChecker, + EncodedAddressLenCalled: coreComponents.EncodedAddressLen, + NodeTypeProviderCalled: coreComponents.NodeTypeProvider, + WasmVMChangeLockerCalled: coreComponents.WasmVMChangeLocker, + ProcessStatusHandlerCalled: coreComponents.ProcessStatusHandler, + HardforkTriggerPubKeyCalled: coreComponents.HardforkTriggerPubKey, + EnableEpochsHandlerCalled: coreComponents.EnableEpochsHandler, + } +} + +// InternalMarshalizer - +func (stub *CoreComponentsHolderStub) InternalMarshalizer() marshal.Marshalizer { + if stub.InternalMarshalizerCalled != nil { + return stub.InternalMarshalizerCalled() + } + return nil +} + +// SetInternalMarshalizer - +func (stub *CoreComponentsHolderStub) SetInternalMarshalizer(marshalizer marshal.Marshalizer) error { + if stub.SetInternalMarshalizerCalled != nil { + return stub.SetInternalMarshalizerCalled(marshalizer) + } + return nil +} + +// TxMarshalizer - +func (stub *CoreComponentsHolderStub) TxMarshalizer() marshal.Marshalizer { + if stub.TxMarshalizerCalled != nil { + return stub.TxMarshalizerCalled() + } + return nil +} + +// VmMarshalizer - +func (stub *CoreComponentsHolderStub) VmMarshalizer() marshal.Marshalizer { + if stub.VmMarshalizerCalled != nil { + return stub.VmMarshalizerCalled() + } + return nil +} + +// Hasher - +func (stub *CoreComponentsHolderStub) Hasher() hashing.Hasher { + if stub.HasherCalled != nil { + return stub.HasherCalled() + } + return nil +} + +// TxSignHasher - +func (stub *CoreComponentsHolderStub) TxSignHasher() hashing.Hasher { + if stub.TxSignHasherCalled != nil { + return stub.TxSignHasherCalled() + } + return nil +} + +// Uint64ByteSliceConverter - +func (stub *CoreComponentsHolderStub) Uint64ByteSliceConverter() typeConverters.Uint64ByteSliceConverter { + if stub.Uint64ByteSliceConverterCalled != nil { + return stub.Uint64ByteSliceConverterCalled() + } + return nil +} + +// AddressPubKeyConverter - +func (stub *CoreComponentsHolderStub) AddressPubKeyConverter() core.PubkeyConverter { + if stub.AddressPubKeyConverterCalled != nil { + return stub.AddressPubKeyConverterCalled() + } + return nil +} + +// ValidatorPubKeyConverter - +func (stub *CoreComponentsHolderStub) ValidatorPubKeyConverter() core.PubkeyConverter { + if stub.ValidatorPubKeyConverterCalled != nil { + return stub.ValidatorPubKeyConverterCalled() + } + return nil +} + +// PathHandler - +func (stub *CoreComponentsHolderStub) PathHandler() storage.PathManagerHandler { + if stub.PathHandlerCalled != nil { + return stub.PathHandlerCalled() + } + return nil +} + +// Watchdog - +func (stub *CoreComponentsHolderStub) Watchdog() core.WatchdogTimer { + if stub.WatchdogCalled != nil { + return stub.WatchdogCalled() + } + return nil +} + +// AlarmScheduler - +func (stub *CoreComponentsHolderStub) AlarmScheduler() core.TimersScheduler { + if stub.AlarmSchedulerCalled != nil { + return stub.AlarmSchedulerCalled() + } + return nil +} + +// SyncTimer - +func (stub *CoreComponentsHolderStub) SyncTimer() ntp.SyncTimer { + if stub.SyncTimerCalled != nil { + return stub.SyncTimerCalled() + } + return nil +} + +// RoundHandler - +func (stub *CoreComponentsHolderStub) RoundHandler() consensus.RoundHandler { + if stub.RoundHandlerCalled != nil { + return stub.RoundHandlerCalled() + } + return nil +} + +// EconomicsData - +func (stub *CoreComponentsHolderStub) EconomicsData() process.EconomicsDataHandler { + if stub.EconomicsDataCalled != nil { + return stub.EconomicsDataCalled() + } + return nil +} + +// APIEconomicsData - +func (stub *CoreComponentsHolderStub) APIEconomicsData() process.EconomicsDataHandler { + if stub.APIEconomicsDataCalled != nil { + return stub.APIEconomicsDataCalled() + } + return nil +} + +// RatingsData - +func (stub *CoreComponentsHolderStub) RatingsData() process.RatingsInfoHandler { + if stub.RatingsDataCalled != nil { + return stub.RatingsDataCalled() + } + return nil +} + +// Rater - +func (stub *CoreComponentsHolderStub) Rater() sharding.PeerAccountListAndRatingHandler { + if stub.RaterCalled != nil { + return stub.RaterCalled() + } + return nil +} + +// GenesisNodesSetup - +func (stub *CoreComponentsHolderStub) GenesisNodesSetup() sharding.GenesisNodesSetupHandler { + if stub.GenesisNodesSetupCalled != nil { + return stub.GenesisNodesSetupCalled() + } + return nil +} + +// NodesShuffler - +func (stub *CoreComponentsHolderStub) NodesShuffler() nodesCoordinator.NodesShuffler { + if stub.NodesShufflerCalled != nil { + return stub.NodesShufflerCalled() + } + return nil +} + +// EpochNotifier - +func (stub *CoreComponentsHolderStub) EpochNotifier() process.EpochNotifier { + if stub.EpochNotifierCalled != nil { + return stub.EpochNotifierCalled() + } + return nil +} + +// EnableRoundsHandler - +func (stub *CoreComponentsHolderStub) EnableRoundsHandler() process.EnableRoundsHandler { + if stub.EnableRoundsHandlerCalled != nil { + return stub.EnableRoundsHandlerCalled() + } + return nil +} + +// EpochStartNotifierWithConfirm - +func (stub *CoreComponentsHolderStub) EpochStartNotifierWithConfirm() factory.EpochStartNotifierWithConfirm { + if stub.EpochStartNotifierWithConfirmCalled != nil { + return stub.EpochStartNotifierWithConfirmCalled() + } + return nil +} + +// ChanStopNodeProcess - +func (stub *CoreComponentsHolderStub) ChanStopNodeProcess() chan endProcess.ArgEndProcess { + if stub.ChanStopNodeProcessCalled != nil { + return stub.ChanStopNodeProcessCalled() + } + return nil +} + +// GenesisTime - +func (stub *CoreComponentsHolderStub) GenesisTime() time.Time { + if stub.GenesisTimeCalled != nil { + return stub.GenesisTimeCalled() + } + return time.Unix(0, 0) +} + +// ChainID - +func (stub *CoreComponentsHolderStub) ChainID() string { + if stub.ChainIDCalled != nil { + return stub.ChainIDCalled() + } + return "" +} + +// MinTransactionVersion - +func (stub *CoreComponentsHolderStub) MinTransactionVersion() uint32 { + if stub.MinTransactionVersionCalled != nil { + return stub.MinTransactionVersionCalled() + } + return 0 +} + +// TxVersionChecker - +func (stub *CoreComponentsHolderStub) TxVersionChecker() process.TxVersionCheckerHandler { + if stub.TxVersionCheckerCalled != nil { + return stub.TxVersionCheckerCalled() + } + return nil +} + +// EncodedAddressLen - +func (stub *CoreComponentsHolderStub) EncodedAddressLen() uint32 { + if stub.EncodedAddressLenCalled != nil { + return stub.EncodedAddressLenCalled() + } + return 0 +} + +// NodeTypeProvider - +func (stub *CoreComponentsHolderStub) NodeTypeProvider() core.NodeTypeProviderHandler { + if stub.NodeTypeProviderCalled != nil { + return stub.NodeTypeProviderCalled() + } + return nil +} + +// WasmVMChangeLocker - +func (stub *CoreComponentsHolderStub) WasmVMChangeLocker() common.Locker { + if stub.WasmVMChangeLockerCalled != nil { + return stub.WasmVMChangeLockerCalled() + } + return nil +} + +// ProcessStatusHandler - +func (stub *CoreComponentsHolderStub) ProcessStatusHandler() common.ProcessStatusHandler { + if stub.ProcessStatusHandlerCalled != nil { + return stub.ProcessStatusHandlerCalled() + } + return nil +} + +// HardforkTriggerPubKey - +func (stub *CoreComponentsHolderStub) HardforkTriggerPubKey() []byte { + if stub.HardforkTriggerPubKeyCalled != nil { + return stub.HardforkTriggerPubKeyCalled() + } + return nil +} + +// EnableEpochsHandler - +func (stub *CoreComponentsHolderStub) EnableEpochsHandler() common.EnableEpochsHandler { + if stub.EnableEpochsHandlerCalled != nil { + return stub.EnableEpochsHandlerCalled() + } + return nil +} + +// IsInterfaceNil - +func (stub *CoreComponentsHolderStub) IsInterfaceNil() bool { + return stub == nil +} diff --git a/update/errors.go b/update/errors.go index 41d306f7c79..60dc5ee405a 100644 --- a/update/errors.go +++ b/update/errors.go @@ -63,7 +63,7 @@ var ErrNilMarshalizer = errors.New("nil Marshalizer") var ErrNilHeaderValidator = errors.New("nil header validator") // ErrNilUint64Converter signals that uint64converter is nil -var ErrNilUint64Converter = errors.New("unit64converter is nil") +var ErrNilUint64Converter = errors.New("uint64converter is nil") // ErrNilDataPoolHolder signals that the data pool holder is nil var ErrNilDataPoolHolder = errors.New("nil data pool holder") From 6558fdb90debe0c89632f1b3c1afa812fd3b3052 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 30 Mar 2023 18:53:13 +0300 Subject: [PATCH 222/335] small fixes + extra unittests for factory/bootstrap part 1 --- errors/errors.go | 3 + factory/bootstrap/bootstrapComponents.go | 3 - .../bootstrapComponentsHandler_test.go | 26 +- factory/bootstrap/bootstrapComponents_test.go | 326 ++++++++++++------ factory/bootstrap/shardingFactory.go | 16 +- 5 files changed, 253 insertions(+), 121 deletions(-) diff --git a/errors/errors.go b/errors/errors.go index b9b526eb95b..1384e01fe9b 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -541,3 +541,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") + +// ErrNilLogger signals that a nil logger instance has been provided +var ErrNilLogger = errors.New("nil logger") diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index e0f6ae2b110..2f8ca5f2e69 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -82,9 +82,6 @@ func NewBootstrapComponentsFactory(args BootstrapComponentsFactoryArgs) (*bootst if args.WorkingDir == "" { return nil, errors.ErrInvalidWorkingDir } - if check.IfNil(args.StatusCoreComponents) { - return nil, errors.ErrNilStatusCoreComponents - } if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { return nil, errors.ErrNilAppStatusHandler } diff --git a/factory/bootstrap/bootstrapComponentsHandler_test.go b/factory/bootstrap/bootstrapComponentsHandler_test.go index c4934611449..dc489d1cb88 100644 --- a/factory/bootstrap/bootstrapComponentsHandler_test.go +++ b/factory/bootstrap/bootstrapComponentsHandler_test.go @@ -4,9 +4,12 @@ import ( "errors" "testing" + "github.com/multiversx/mx-chain-core-go/core/check" errorsErd "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/factory/bootstrap" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -33,11 +36,11 @@ func TestNewBootstrapComponentsFactory_NilFactory(t *testing.T) { mbc, err := bootstrap.NewManagedBootstrapComponents(nil) - require.Nil(t, mbc) + require.True(t, check.IfNil(mbc)) require.Equal(t, errorsErd.ErrNilBootstrapComponentsFactory, err) } -func TestManagedBootstrapComponents_CheckSubcomponentsNoCreate(t *testing.T) { +func TestManagedBootstrapComponents_MethodsNoCreate(t *testing.T) { t.Parallel() if testing.Short() { t.Skip("this is not a short test") @@ -47,11 +50,15 @@ func TestManagedBootstrapComponents_CheckSubcomponentsNoCreate(t *testing.T) { bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) mbc, _ := bootstrap.NewManagedBootstrapComponents(bcf) err := mbc.CheckSubcomponents() - require.Equal(t, errorsErd.ErrNilBootstrapComponentsHolder, err) + + assert.Nil(t, mbc.EpochStartBootstrapper()) + assert.Nil(t, mbc.EpochBootstrapParams()) + assert.Nil(t, mbc.Close()) + assert.Equal(t, factory.BootstrapComponentsName, mbc.String()) } -func TestManagedBootstrapComponents_Create(t *testing.T) { +func TestManagedBootstrapComponents_MethodsCreate(t *testing.T) { t.Parallel() if testing.Short() { t.Skip("this is not a short test") @@ -66,6 +73,17 @@ func TestManagedBootstrapComponents_Create(t *testing.T) { err = mbc.CheckSubcomponents() require.Nil(t, err) + + assert.NotNil(t, mbc.EpochStartBootstrapper()) + params := mbc.EpochBootstrapParams() + assert.False(t, check.IfNil(params)) + assert.Equal(t, uint32(0), params.Epoch()) + assert.Equal(t, uint32(0), params.SelfShardID()) + assert.Equal(t, uint32(2), params.NumOfShards()) + assert.Nil(t, params.NodesConfig()) + + assert.Nil(t, mbc.Close()) + assert.Equal(t, factory.BootstrapComponentsName, mbc.String()) } func TestManagedBootstrapComponents_CreateNilInternalMarshalizer(t *testing.T) { diff --git a/factory/bootstrap/bootstrapComponents_test.go b/factory/bootstrap/bootstrapComponents_test.go index dcbb5a0c8c4..563502ec06d 100644 --- a/factory/bootstrap/bootstrapComponents_test.go +++ b/factory/bootstrap/bootstrapComponents_test.go @@ -1,140 +1,248 @@ package bootstrap_test import ( + "bytes" "errors" + "strings" "testing" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-go/config" errorsErd "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory/bootstrap" + "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/factory" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -// ------------ Test BootstrapComponentsFactory -------------------- -func TestNewBootstrapComponentsFactory_OkValuesShouldWork(t *testing.T) { +func TestNewBootstrapComponentsFactory(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() - - bcf, err := bootstrap.NewBootstrapComponentsFactory(args) - - require.NotNil(t, bcf) - require.Nil(t, err) -} - -func TestNewBootstrapComponentsFactory_NilCoreComponents(t *testing.T) { - t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } - - args := componentsMock.GetBootStrapFactoryArgs() - args.CoreComponents = nil - - bcf, err := bootstrap.NewBootstrapComponentsFactory(args) - - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilCoreComponentsHolder, err) -} - -func TestNewBootstrapComponentsFactory_NilCryptoComponents(t *testing.T) { - t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } - - args := componentsMock.GetBootStrapFactoryArgs() - args.CryptoComponents = nil - - bcf, err := bootstrap.NewBootstrapComponentsFactory(args) - - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilCryptoComponentsHolder, err) -} - -func TestNewBootstrapComponentsFactory_NilNetworkComponents(t *testing.T) { - t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } - - args := componentsMock.GetBootStrapFactoryArgs() - args.NetworkComponents = nil - - bcf, err := bootstrap.NewBootstrapComponentsFactory(args) - - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilNetworkComponentsHolder, err) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + bcf, err := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + require.Nil(t, err) + }) + t.Run("nil core components should error", func(t *testing.T) { + t.Parallel() + + argsCopy := args + argsCopy.CoreComponents = nil + bcf, err := bootstrap.NewBootstrapComponentsFactory(argsCopy) + require.Nil(t, bcf) + require.Equal(t, errorsErd.ErrNilCoreComponentsHolder, err) + }) + t.Run("nil crypto components should error", func(t *testing.T) { + t.Parallel() + + argsCopy := args + argsCopy.CryptoComponents = nil + bcf, err := bootstrap.NewBootstrapComponentsFactory(argsCopy) + require.Nil(t, bcf) + require.Equal(t, errorsErd.ErrNilCryptoComponentsHolder, err) + }) + t.Run("nil network components should error", func(t *testing.T) { + t.Parallel() + + argsCopy := args + argsCopy.NetworkComponents = nil + bcf, err := bootstrap.NewBootstrapComponentsFactory(argsCopy) + require.Nil(t, bcf) + require.Equal(t, errorsErd.ErrNilNetworkComponentsHolder, err) + }) + t.Run("nil status core components should error", func(t *testing.T) { + t.Parallel() + + argsCopy := args + argsCopy.StatusCoreComponents = nil + bcf, err := bootstrap.NewBootstrapComponentsFactory(argsCopy) + require.Nil(t, bcf) + require.Equal(t, errorsErd.ErrNilStatusCoreComponents, err) + }) + t.Run("nil trie sync statistics should error", func(t *testing.T) { + t.Parallel() + + argsCopy := args + argsCopy.StatusCoreComponents = &factory.StatusCoreComponentsStub{ + TrieSyncStatisticsField: nil, + } + bcf, err := bootstrap.NewBootstrapComponentsFactory(argsCopy) + require.Nil(t, bcf) + require.Equal(t, errorsErd.ErrNilTrieSyncStatistics, err) + }) + t.Run("nil app status handler should error", func(t *testing.T) { + t.Parallel() + + argsCopy := args + argsCopy.StatusCoreComponents = &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: nil, + TrieSyncStatisticsField: &testscommon.SizeSyncStatisticsHandlerStub{}, + } + bcf, err := bootstrap.NewBootstrapComponentsFactory(argsCopy) + require.Nil(t, bcf) + require.Equal(t, errorsErd.ErrNilAppStatusHandler, err) + }) + t.Run("empty working dir should error", func(t *testing.T) { + t.Parallel() + + argsCopy := args + argsCopy.WorkingDir = "" + bcf, err := bootstrap.NewBootstrapComponentsFactory(argsCopy) + require.Nil(t, bcf) + require.Equal(t, errorsErd.ErrInvalidWorkingDir, err) + }) } -func TestNewBootstrapComponentsFactory_NilWorkingDir(t *testing.T) { +func TestBootstrapComponentsFactory_Create(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } - args := componentsMock.GetBootStrapFactoryArgs() - args.WorkingDir = "" - - bcf, err := bootstrap.NewBootstrapComponentsFactory(args) - - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrInvalidWorkingDir, err) + // TODO: add tests for createLatestStorageDataProvider and createUnitOpener failure + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, err) + require.NotNil(t, bc) + }) + t.Run("ProcessDestinationShardAsObserver fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + args.PrefConfig.Preferences.DestinationShardAsObserver = "" + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.True(t, strings.Contains(err.Error(), "DestinationShardAsObserver")) + }) + t.Run("NewCache fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + args.Config.Versions.Cache = config.CacheConfig{ + Type: "LRU", + SizeInBytes: 1, + } + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.True(t, strings.Contains(err.Error(), "LRU")) + }) + t.Run("NewHeaderVersionHandler fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + args.Config.Versions.DefaultVersion = string(bytes.Repeat([]byte("a"), 20)) + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.NotNil(t, err) + }) + t.Run("NewHeaderIntegrityVerifier fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + coreComponents := componentsMock.GetDefaultCoreComponents() + coreComponents.ChainIdCalled = func() string { + return "" + } + args.CoreComponents = coreComponents + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.NotNil(t, err) + }) + t.Run("CreateShardCoordinator fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + coreComponents := componentsMock.GetDefaultCoreComponents() + coreComponents.NodesConfig = nil + args.CoreComponents = coreComponents + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.NotNil(t, err) + }) + t.Run("NewBootstrapDataProvider fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + coreComponents := componentsMock.GetDefaultCoreComponents() + args.CoreComponents = coreComponents + coreComponents.IntMarsh = nil + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.True(t, errors.Is(err, errorsErd.ErrNewBootstrapDataProvider)) + }) + t.Run("import db mode - NewStorageEpochStartBootstrap fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + coreComponents := componentsMock.GetDefaultCoreComponents() + args.CoreComponents = coreComponents + coreComponents.RatingHandler = nil + args.ImportDbConfig.IsImportDBMode = true + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.True(t, errors.Is(err, errorsErd.ErrNewStorageEpochStartBootstrap)) + }) + t.Run("NewStorageEpochStartBootstrap fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + coreComponents := componentsMock.GetDefaultCoreComponents() + args.CoreComponents = coreComponents + coreComponents.RatingHandler = nil + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) + + bc, err := bcf.Create() + require.Nil(t, bc) + require.True(t, errors.Is(err, errorsErd.ErrNewEpochStartBootstrap)) + }) } - -func TestBootstrapComponentsFactory_CreateShouldWork(t *testing.T) { +func TestBootstrapComponents(t *testing.T) { t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } args := componentsMock.GetBootStrapFactoryArgs() - bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + require.NotNil(t, bcf) bc, err := bcf.Create() - require.Nil(t, err) require.NotNil(t, bc) -} - -func TestBootstrapComponentsFactory_CreateBootstrapDataProviderCreationFail(t *testing.T) { - t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } - args := componentsMock.GetBootStrapFactoryArgs() - coreComponents := componentsMock.GetDefaultCoreComponents() - args.CoreComponents = coreComponents - - bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) - - coreComponents.IntMarsh = nil - bc, err := bcf.Create() - - require.Nil(t, bc) - require.True(t, errors.Is(err, errorsErd.ErrNewBootstrapDataProvider)) -} - -func TestBootstrapComponentsFactory_CreateEpochStartBootstrapCreationFail(t *testing.T) { - t.Parallel() - if testing.Short() { - t.Skip("this is not a short test") - } - - args := componentsMock.GetBootStrapFactoryArgs() - coreComponents := componentsMock.GetDefaultCoreComponents() - args.CoreComponents = coreComponents - - bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) - - coreComponents.RatingHandler = nil - bc, err := bcf.Create() + assert.Equal(t, core.NodeTypeObserver, bc.NodeType()) + assert.False(t, check.IfNil(bc.ShardCoordinator())) + assert.False(t, check.IfNil(bc.HeaderVersionHandler())) + assert.False(t, check.IfNil(bc.VersionedHeaderFactory())) + assert.False(t, check.IfNil(bc.HeaderIntegrityVerifier())) - require.Nil(t, bc) - require.True(t, errors.Is(err, errorsErd.ErrNewEpochStartBootstrap)) + require.Nil(t, bc.Close()) } diff --git a/factory/bootstrap/shardingFactory.go b/factory/bootstrap/shardingFactory.go index 262ad7f8d06..59a706fb2c0 100644 --- a/factory/bootstrap/shardingFactory.go +++ b/factory/bootstrap/shardingFactory.go @@ -1,11 +1,11 @@ package bootstrap import ( - "errors" "fmt" "time" "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/closing" "github.com/multiversx/mx-chain-core-go/data/endProcess" "github.com/multiversx/mx-chain-core-go/hashing" @@ -14,6 +14,7 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/epochStart" + errErd "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" @@ -29,6 +30,15 @@ func CreateShardCoordinator( prefsConfig config.PreferencesConfig, log logger.Logger, ) (sharding.Coordinator, core.NodeType, error) { + if check.IfNil(nodesConfig) { + return nil, "", errErd.ErrNilNodesConfig + } + if pubKey == nil { + return nil, "", errErd.ErrNilPublicKey + } + if check.IfNil(log) { + return nil, "", errErd.ErrNilLogger + } selfShardId, err := getShardIdFromNodePubKey(pubKey, nodesConfig) nodeType := core.NodeTypeValidator @@ -71,10 +81,6 @@ func CreateShardCoordinator( } func getShardIdFromNodePubKey(pubKey crypto.PublicKey, nodesConfig sharding.GenesisNodesSetupHandler) (uint32, error) { - if pubKey == nil { - return 0, errors.New("nil public key") - } - publicKey, err := pubKey.ToByteArray() if err != nil { return 0, err From df51a93d93a8f810fcb6ee8c64f9dd3ce942c9eb Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 30 Mar 2023 20:15:45 +0300 Subject: [PATCH 223/335] - minor refactoring in storage package - added unit tests --- storage/cache/cache_test.go | 165 ++++++ storage/database/db_test.go | 73 +++ .../directoryhandler/directoryReader_test.go | 178 ++++-- storage/disabled/errorDisabledPersister.go | 57 ++ .../disabled/errorDisabledPersister_test.go | 91 +++ storage/factory/disabledPersister.go | 52 -- storage/factory/openStorage_test.go | 47 ++ storage/factory/persisterFactory.go | 3 +- storage/factory/persisterFactory_test.go | 90 +++ ...rerFactory.go => storageServiceFactory.go} | 52 +- storage/factory/storageServiceFactory_test.go | 528 ++++++++++++++++++ storage/latestData/latestDataProvider_test.go | 8 + storage/mock/storedDataFactoryStub.go | 20 + storage/pathmanager/pathManager_test.go | 33 +- storage/pruning/pruningStorer_test.go | 164 ++++++ storage/pruning/triePruningStorer_test.go | 31 + storage/storageunit/storageunit_test.go | 173 ++++++ storage/txcache/txcache_test.go | 97 ++++ 18 files changed, 1728 insertions(+), 134 deletions(-) create mode 100644 storage/cache/cache_test.go create mode 100644 storage/database/db_test.go create mode 100644 storage/disabled/errorDisabledPersister.go create mode 100644 storage/disabled/errorDisabledPersister_test.go delete mode 100644 storage/factory/disabledPersister.go create mode 100644 storage/factory/persisterFactory_test.go rename storage/factory/{pruningStorerFactory.go => storageServiceFactory.go} (93%) create mode 100644 storage/factory/storageServiceFactory_test.go create mode 100644 storage/mock/storedDataFactoryStub.go create mode 100644 storage/storageunit/storageunit_test.go create mode 100644 storage/txcache/txcache_test.go diff --git a/storage/cache/cache_test.go b/storage/cache/cache_test.go new file mode 100644 index 00000000000..99a1731e5cb --- /dev/null +++ b/storage/cache/cache_test.go @@ -0,0 +1,165 @@ +package cache + +import ( + "testing" + "time" + + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/stretchr/testify/assert" +) + +func TestNewTimeCache_ShouldWork(t *testing.T) { + t.Parallel() + + instance := NewTimeCache(0) + assert.NotNil(t, instance) +} + +func TestNewTimeCacher(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + args := ArgTimeCacher{ + DefaultSpan: time.Second - time.Nanosecond, + CacheExpiry: time.Second, + } + + instance, err := NewTimeCacher(args) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := ArgTimeCacher{ + DefaultSpan: time.Second, + CacheExpiry: time.Second, + } + + instance, err := NewTimeCacher(args) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) +} + +func TestNewLRUCache(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewLRUCache(0) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewLRUCache(1) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) +} + +func TestNewPeerTimeCache(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewPeerTimeCache(nil) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewPeerTimeCache(&testscommon.TimeCacheStub{}) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) +} + +func TestNewCapacityLRU(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewCapacityLRU(0, 1) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewCapacityLRU(1, 1) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) +} + +func TestNewLRUCacheWithEviction(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewLRUCacheWithEviction(0, nil) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + t.Run("nil handler should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewLRUCacheWithEviction(1, nil) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) + t.Run("with handler should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewLRUCacheWithEviction(1, func(key interface{}, value interface{}) {}) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) + }) +} + +func TestNewImmunityCache(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + config := CacheConfig{ + MaxNumBytes: 0, + MaxNumItems: 0, + NumChunks: 0, + Name: "test", + NumItemsToPreemptivelyEvict: 0, + } + instance, err := NewImmunityCache(config) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + config := CacheConfig{ + MaxNumBytes: 4, + MaxNumItems: 4, + NumChunks: 1, + Name: "test", + NumItemsToPreemptivelyEvict: 1, + } + instance, err := NewImmunityCache(config) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) +} diff --git a/storage/database/db_test.go b/storage/database/db_test.go new file mode 100644 index 00000000000..d04aaa2a78d --- /dev/null +++ b/storage/database/db_test.go @@ -0,0 +1,73 @@ +package database + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewMemDB(t *testing.T) { + t.Parallel() + + instance := NewMemDB() + assert.NotNil(t, instance) +} + +func TestNewlruDB(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewlruDB(0) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewlruDB(1) + assert.NotNil(t, instance) + assert.Nil(t, err) + }) +} + +func TestNewLevelDB(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewLevelDB(t.TempDir(), 0, 0, 0) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewLevelDB(t.TempDir(), 1, 1, 1) + assert.NotNil(t, instance) + assert.Nil(t, err) + _ = instance.Close() + }) +} + +func TestNewSerialDB(t *testing.T) { + t.Parallel() + + t.Run("invalid argument should error", func(t *testing.T) { + t.Parallel() + + instance, err := NewSerialDB(t.TempDir(), 0, 0, 0) + assert.Nil(t, instance) + assert.NotNil(t, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + instance, err := NewSerialDB(t.TempDir(), 1, 1, 1) + assert.NotNil(t, instance) + assert.Nil(t, err) + _ = instance.Close() + }) +} diff --git a/storage/directoryhandler/directoryReader_test.go b/storage/directoryhandler/directoryReader_test.go index 36be200c69d..f3a66a30529 100644 --- a/storage/directoryhandler/directoryReader_test.go +++ b/storage/directoryhandler/directoryReader_test.go @@ -1,74 +1,158 @@ package directoryhandler import ( + "fmt" "os" "path/filepath" "testing" + "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" ) -func TestDirectoryReaderListFilesAsString(t *testing.T) { - t.Parallel() +const invalidPath = "\\/\\/\\/\\/" - dirName := t.TempDir() +func TestNewDirectoryReader(t *testing.T) { + t.Parallel() - file1 := "file1" - file2 := "file2" - dir1 := "dir1" - _, _ = os.Create(filepath.Join(dirName, file1)) - _, _ = os.Create(filepath.Join(dirName, file2)) - _ = os.Mkdir(filepath.Join(dirName, dir1), os.ModePerm) + instance := NewDirectoryReader() + assert.NotNil(t, instance) + assert.False(t, check.IfNil(instance)) +} - dirReader := NewDirectoryReader() +func TestDirectoryReaderListFilesAsString(t *testing.T) { + t.Parallel() - filesName, err := dirReader.ListFilesAsString(dirName) - assert.Nil(t, err) - assert.Equal(t, 2, len(filesName)) - assert.True(t, contains(filesName, file1)) - assert.True(t, contains(filesName, file2)) + t.Run("invalid path should error", func(t *testing.T) { + t.Parallel() + + dirReader := NewDirectoryReader() + + filesName, err := dirReader.ListFilesAsString(invalidPath) + assert.NotNil(t, err) + assert.Equal(t, "*fs.PathError", fmt.Sprintf("%T", err)) + assert.Nil(t, filesName) + }) + t.Run("empty directory should error", func(t *testing.T) { + t.Parallel() + + dirReader := NewDirectoryReader() + + filesName, err := dirReader.ListFilesAsString(t.TempDir()) + expectedErrorString := "no file in provided directory" + assert.Equal(t, expectedErrorString, err.Error()) + assert.Nil(t, filesName) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + dirName := t.TempDir() + + file1 := "file1" + file2 := "file2" + dir1 := "dir1" + _, _ = os.Create(filepath.Join(dirName, file1)) + _, _ = os.Create(filepath.Join(dirName, file2)) + _ = os.Mkdir(filepath.Join(dirName, dir1), os.ModePerm) + + dirReader := NewDirectoryReader() + + filesName, err := dirReader.ListFilesAsString(dirName) + assert.Nil(t, err) + assert.Equal(t, 2, len(filesName)) + assert.True(t, contains(filesName, file1)) + assert.True(t, contains(filesName, file2)) + }) } func TestDirectoryReaderListDirectoriesAsString(t *testing.T) { t.Parallel() - dirName := t.TempDir() - - file1 := "file1" - file2 := "file2" - dir1 := "dir1" - _, _ = os.Create(filepath.Join(dirName, file1)) - _, _ = os.Create(filepath.Join(dirName, file2)) - _ = os.Mkdir(filepath.Join(dirName, dir1), os.ModePerm) - - dirReader := NewDirectoryReader() - - directoriesNames, err := dirReader.ListDirectoriesAsString(dirName) - assert.Nil(t, err) - assert.Equal(t, 1, len(directoriesNames)) - assert.True(t, contains(directoriesNames, dir1)) + t.Run("invalid path should error", func(t *testing.T) { + t.Parallel() + + dirReader := NewDirectoryReader() + + directoriesNames, err := dirReader.ListDirectoriesAsString(invalidPath) + assert.NotNil(t, err) + assert.Equal(t, "*fs.PathError", fmt.Sprintf("%T", err)) + assert.Nil(t, directoriesNames) + }) + t.Run("empty directory should error", func(t *testing.T) { + t.Parallel() + + dirReader := NewDirectoryReader() + + directoriesNames, err := dirReader.ListDirectoriesAsString(t.TempDir()) + expectedErrorString := "no sub-directory in provided directory" + assert.Equal(t, expectedErrorString, err.Error()) + assert.Nil(t, directoriesNames) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + dirName := t.TempDir() + + file1 := "file1" + file2 := "file2" + dir1 := "dir1" + _, _ = os.Create(filepath.Join(dirName, file1)) + _, _ = os.Create(filepath.Join(dirName, file2)) + _ = os.Mkdir(filepath.Join(dirName, dir1), os.ModePerm) + + dirReader := NewDirectoryReader() + + directoriesNames, err := dirReader.ListDirectoriesAsString(dirName) + assert.Nil(t, err) + assert.Equal(t, 1, len(directoriesNames)) + assert.True(t, contains(directoriesNames, dir1)) + }) } func TestDirectoryReaderListAllAsString(t *testing.T) { t.Parallel() - dirName := t.TempDir() - - file1 := "file1" - file2 := "file2" - dir1 := "dir1" - _, _ = os.Create(filepath.Join(dirName, file1)) - _, _ = os.Create(filepath.Join(dirName, file2)) - _ = os.Mkdir(filepath.Join(dirName, dir1), os.ModePerm) - - dirReader := NewDirectoryReader() - - allNames, err := dirReader.ListAllAsString(dirName) - assert.Nil(t, err) - assert.Equal(t, 3, len(allNames)) - assert.True(t, contains(allNames, file1)) - assert.True(t, contains(allNames, file2)) - assert.True(t, contains(allNames, dir1)) + t.Run("invalid path should error", func(t *testing.T) { + t.Parallel() + + dirReader := NewDirectoryReader() + + allNames, err := dirReader.ListAllAsString(invalidPath) + assert.NotNil(t, err) + assert.Equal(t, "*fs.PathError", fmt.Sprintf("%T", err)) + assert.Nil(t, allNames) + }) + t.Run("empty directory should error", func(t *testing.T) { + t.Parallel() + + dirReader := NewDirectoryReader() + + allNames, err := dirReader.ListAllAsString(t.TempDir()) + expectedErrorString := "no file or directory in provided directory" + assert.Equal(t, expectedErrorString, err.Error()) + assert.Nil(t, allNames) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + dirName := t.TempDir() + + file1 := "file1" + file2 := "file2" + dir1 := "dir1" + _, _ = os.Create(filepath.Join(dirName, file1)) + _, _ = os.Create(filepath.Join(dirName, file2)) + _ = os.Mkdir(filepath.Join(dirName, dir1), os.ModePerm) + + dirReader := NewDirectoryReader() + + allNames, err := dirReader.ListAllAsString(dirName) + assert.Nil(t, err) + assert.Equal(t, 3, len(allNames)) + assert.True(t, contains(allNames, file1)) + assert.True(t, contains(allNames, file2)) + assert.True(t, contains(allNames, dir1)) + }) } func contains(s []string, e string) bool { diff --git a/storage/disabled/errorDisabledPersister.go b/storage/disabled/errorDisabledPersister.go new file mode 100644 index 00000000000..5ea67e4bfb0 --- /dev/null +++ b/storage/disabled/errorDisabledPersister.go @@ -0,0 +1,57 @@ +package disabled + +import ( + "fmt" +) + +type errorDisabledPersister struct { +} + +// NewErrorDisabledPersister returns a new instance of this disabled persister that errors on all operations +func NewErrorDisabledPersister() *errorDisabledPersister { + return &errorDisabledPersister{} +} + +// Put returns error +func (disabled *errorDisabledPersister) Put(_, _ []byte) error { + return fmt.Errorf("disabledPersister.Put") +} + +// Get returns error +func (disabled *errorDisabledPersister) Get(_ []byte) ([]byte, error) { + return nil, fmt.Errorf("disabledPersister.Get") +} + +// Has returns error +func (disabled *errorDisabledPersister) Has(_ []byte) error { + return fmt.Errorf("disabledPersister.Has") +} + +// Close returns error +func (disabled *errorDisabledPersister) Close() error { + return fmt.Errorf("disabledPersister.Close") +} + +// Remove returns error +func (disabled *errorDisabledPersister) Remove(_ []byte) error { + return fmt.Errorf("disabledPersister.Remove") +} + +// Destroy does nothing +func (disabled *errorDisabledPersister) Destroy() error { + return fmt.Errorf("disabledPersister.Destroy") +} + +// DestroyClosed returns error +func (disabled *errorDisabledPersister) DestroyClosed() error { + return fmt.Errorf("disabledPersister.DestroyClosed") +} + +// RangeKeys does nothing +func (disabled *errorDisabledPersister) RangeKeys(_ func(key []byte, val []byte) bool) { +} + +// IsInterfaceNil returns true if there is no value under the interface +func (disabled *errorDisabledPersister) IsInterfaceNil() bool { + return disabled == nil +} diff --git a/storage/disabled/errorDisabledPersister_test.go b/storage/disabled/errorDisabledPersister_test.go new file mode 100644 index 00000000000..1e429091026 --- /dev/null +++ b/storage/disabled/errorDisabledPersister_test.go @@ -0,0 +1,91 @@ +package disabled + +import "github.com/multiversx/mx-chain-core-go/core/check" + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewErrorDisabledPersister(t *testing.T) { + t.Parallel() + + disabled := NewErrorDisabledPersister() + assert.False(t, check.IfNil(disabled)) +} + +func TestErrorDisabledPersister_MethodsShouldError(t *testing.T) { + t.Parallel() + + disabled := NewErrorDisabledPersister() + t.Run("Put should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "disabledPersister.Put" + err := disabled.Put(nil, nil) + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("Get should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "disabledPersister.Get" + value, err := disabled.Get(nil) + assert.Equal(t, expectedErrorString, err.Error()) + assert.Nil(t, value) + }) + t.Run("Has should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "disabledPersister.Has" + err := disabled.Has(nil) + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("Close should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "disabledPersister.Close" + err := disabled.Close() + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("Remove should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "disabledPersister.Remove" + err := disabled.Remove(nil) + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("Destroy should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "disabledPersister.Destroy" + err := disabled.Destroy() + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("DestroyClosed should error", func(t *testing.T) { + t.Parallel() + + expectedErrorString := "disabledPersister.DestroyClosed" + err := disabled.DestroyClosed() + assert.Equal(t, expectedErrorString, err.Error()) + }) +} + +func TestErrorDisabledPersister_RangeKeys(t *testing.T) { + t.Parallel() + + disabled := NewErrorDisabledPersister() + t.Run("nil handler should not panic", func(t *testing.T) { + t.Parallel() + + assert.NotPanics(t, func() { + disabled.RangeKeys(nil) + }) + }) + t.Run("handler should not be called", func(t *testing.T) { + disabled.RangeKeys(func(key []byte, val []byte) bool { + assert.Fail(t, "should have not called the handler") + return false + }) + }) +} diff --git a/storage/factory/disabledPersister.go b/storage/factory/disabledPersister.go deleted file mode 100644 index 66a6390387b..00000000000 --- a/storage/factory/disabledPersister.go +++ /dev/null @@ -1,52 +0,0 @@ -package factory - -import ( - "fmt" -) - -type disabledPersister struct { -} - -// Put returns error -func (dp *disabledPersister) Put(_, _ []byte) error { - return fmt.Errorf("disabledPersister.Put") -} - -// Get returns error -func (dp *disabledPersister) Get(_ []byte) ([]byte, error) { - return nil, fmt.Errorf("disabledPersister.Get") -} - -// Has returns error -func (dp *disabledPersister) Has(_ []byte) error { - return fmt.Errorf("disabledPersister.Has") -} - -// Close returns error -func (dp *disabledPersister) Close() error { - return fmt.Errorf("disabledPersister.Close") -} - -// Remove returns error -func (dp *disabledPersister) Remove(_ []byte) error { - return fmt.Errorf("disabledPersister.Remove") -} - -// Destroy does nothing -func (dp *disabledPersister) Destroy() error { - return fmt.Errorf("disabledPersister.Destroy") -} - -// DestroyClosed returns error -func (dp *disabledPersister) DestroyClosed() error { - return fmt.Errorf("disabledPersister.DestroyClosed") -} - -// RangeKeys does nothing -func (dp *disabledPersister) RangeKeys(_ func(key []byte, val []byte) bool) { -} - -// IsInterfaceNil returns true if there is no value under the interface -func (dp *disabledPersister) IsInterfaceNil() bool { - return dp == nil -} diff --git a/storage/factory/openStorage_test.go b/storage/factory/openStorage_test.go index 8340db9c563..147772885b1 100644 --- a/storage/factory/openStorage_test.go +++ b/storage/factory/openStorage_test.go @@ -140,5 +140,52 @@ func TestGetMostRecentBootstrapStorageUnit(t *testing.T) { storer, err := suoh.GetMostRecentStorageUnit(generalConfig.BootstrapStorage.DB) assert.NoError(t, err) assert.NotNil(t, storer) +} + +func TestStorageUnitOpenHandler_OpenDB(t *testing.T) { + t.Parallel() + + tempDir := t.TempDir() + args := createMockArgsOpenStorageUnits() + args.LatestStorageDataProvider = &mock.LatestStorageDataProviderStub{ + GetParentDirectoryCalled: func() string { + return tempDir + }, + } + suoh, _ := NewStorageUnitOpenHandler(args) + + // do not run these in parallel as they are using the same temp dir + t.Run("create DB fails, should error", func(t *testing.T) { + dbConfig := config.DBConfig{ + FilePath: "Test", + Type: "invalid DB type", + BatchDelaySeconds: 5, + MaxBatchSize: 100, + MaxOpenFiles: 10, + UseTmpAsFilePath: false, + } + + storerInstance, err := suoh.OpenDB(dbConfig, 0, 0) + assert.NotNil(t, err) + expectedErrorString := "not supported db type" + assert.Equal(t, expectedErrorString, err.Error()) + assert.True(t, check.IfNil(storerInstance)) + }) + t.Run("should work", func(t *testing.T) { + dbConfig := config.DBConfig{ + FilePath: "Test", + Type: "LvlDBSerial", + BatchDelaySeconds: 5, + MaxBatchSize: 100, + MaxOpenFiles: 10, + UseTmpAsFilePath: false, + } + + storerInstance, err := suoh.OpenDB(dbConfig, 0, 0) + assert.Nil(t, err) + assert.False(t, check.IfNil(storerInstance)) + + _ = storerInstance.Close() + }) } diff --git a/storage/factory/persisterFactory.go b/storage/factory/persisterFactory.go index 7bfb8cee594..55b3d45806a 100644 --- a/storage/factory/persisterFactory.go +++ b/storage/factory/persisterFactory.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/storage/database" + "github.com/multiversx/mx-chain-go/storage/disabled" "github.com/multiversx/mx-chain-go/storage/storageunit" ) @@ -47,7 +48,7 @@ func (pf *PersisterFactory) Create(path string) (storage.Persister, error) { // CreateDisabled will return a new disabled persister func (pf *PersisterFactory) CreateDisabled() storage.Persister { - return &disabledPersister{} + return disabled.NewErrorDisabledPersister() } // IsInterfaceNil returns true if there is no value under the interface diff --git a/storage/factory/persisterFactory_test.go b/storage/factory/persisterFactory_test.go new file mode 100644 index 00000000000..3443c5941fe --- /dev/null +++ b/storage/factory/persisterFactory_test.go @@ -0,0 +1,90 @@ +package factory + +import ( + "fmt" + "testing" + + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/storage" + "github.com/stretchr/testify/assert" +) + +func createDBConfig(dbType string) config.DBConfig { + return config.DBConfig{ + FilePath: "TEST", + Type: dbType, + BatchDelaySeconds: 5, + MaxBatchSize: 100, + MaxOpenFiles: 10, + UseTmpAsFilePath: false, + } +} + +func TestNewPersisterFactory(t *testing.T) { + t.Parallel() + + factoryInstance := NewPersisterFactory(createDBConfig("LvlDB")) + assert.False(t, check.IfNil(factoryInstance)) +} + +func TestPersisterFactory_Create(t *testing.T) { + t.Parallel() + + t.Run("empty path should error", func(t *testing.T) { + t.Parallel() + + factoryInstance := NewPersisterFactory(createDBConfig("LvlDB")) + persisterInstance, err := factoryInstance.Create("") + assert.True(t, check.IfNil(persisterInstance)) + expectedErrString := "invalid file path" + assert.Equal(t, expectedErrString, err.Error()) + }) + t.Run("unknown type should error", func(t *testing.T) { + t.Parallel() + + factoryInstance := NewPersisterFactory(createDBConfig("invalid type")) + persisterInstance, err := factoryInstance.Create(t.TempDir()) + assert.True(t, check.IfNil(persisterInstance)) + assert.Equal(t, storage.ErrNotSupportedDBType, err) + }) + t.Run("for LvlDB should work", func(t *testing.T) { + t.Parallel() + + factoryInstance := NewPersisterFactory(createDBConfig("LvlDB")) + persisterInstance, err := factoryInstance.Create(t.TempDir()) + assert.Nil(t, err) + assert.False(t, check.IfNil(persisterInstance)) + assert.Equal(t, "*leveldb.DB", fmt.Sprintf("%T", persisterInstance)) + _ = persisterInstance.Close() + }) + t.Run("for LvlDBSerial should work", func(t *testing.T) { + t.Parallel() + + factoryInstance := NewPersisterFactory(createDBConfig("LvlDBSerial")) + persisterInstance, err := factoryInstance.Create(t.TempDir()) + assert.Nil(t, err) + assert.False(t, check.IfNil(persisterInstance)) + assert.Equal(t, "*leveldb.SerialDB", fmt.Sprintf("%T", persisterInstance)) + _ = persisterInstance.Close() + }) + t.Run("for MemoryDB should work", func(t *testing.T) { + t.Parallel() + + factoryInstance := NewPersisterFactory(createDBConfig("MemoryDB")) + persisterInstance, err := factoryInstance.Create(t.TempDir()) + assert.Nil(t, err) + assert.False(t, check.IfNil(persisterInstance)) + assert.Equal(t, "*memorydb.DB", fmt.Sprintf("%T", persisterInstance)) + _ = persisterInstance.Close() + }) +} + +func TestPersisterFactory_CreateDisabled(t *testing.T) { + t.Parallel() + + factoryInstance := NewPersisterFactory(createDBConfig("LvlDB")) + persisterInstance := factoryInstance.CreateDisabled() + assert.False(t, check.IfNil(persisterInstance)) + assert.Equal(t, "*disabled.errorDisabledPersister", fmt.Sprintf("%T", persisterInstance)) +} diff --git a/storage/factory/pruningStorerFactory.go b/storage/factory/storageServiceFactory.go similarity index 93% rename from storage/factory/pruningStorerFactory.go rename to storage/factory/storageServiceFactory.go index 34293aaf9f3..7e0d89399b1 100644 --- a/storage/factory/pruningStorerFactory.go +++ b/storage/factory/storageServiceFactory.go @@ -121,56 +121,56 @@ func (psf *StorageServiceFactory) createAndAddBaseStorageUnits( txUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.TxStorage, disabledCustomDatabaseRemover) txUnit, err := psf.createPruningPersister(txUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for TxStorage", err) } store.AddStorer(dataRetriever.TransactionUnit, txUnit) unsignedTxUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.UnsignedTransactionStorage, disabledCustomDatabaseRemover) unsignedTxUnit, err := psf.createPruningPersister(unsignedTxUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for UnsignedTransactionStorage", err) } store.AddStorer(dataRetriever.UnsignedTransactionUnit, unsignedTxUnit) rewardTxUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.RewardTxStorage, disabledCustomDatabaseRemover) rewardTxUnit, err := psf.createPruningPersister(rewardTxUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for RewardTxStorage", err) } store.AddStorer(dataRetriever.RewardTransactionUnit, rewardTxUnit) receiptsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ReceiptsStorage, disabledCustomDatabaseRemover) receiptsUnit, err := psf.createPruningPersister(receiptsUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for ReceiptsStorage", err) } store.AddStorer(dataRetriever.ReceiptsUnit, receiptsUnit) scheduledSCRsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.ScheduledSCRsStorage, disabledCustomDatabaseRemover) scheduledSCRsUnit, err := psf.createPruningPersister(scheduledSCRsUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for ScheduledSCRsStorage", err) } store.AddStorer(dataRetriever.ScheduledSCRsUnit, scheduledSCRsUnit) bootstrapUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BootstrapStorage, disabledCustomDatabaseRemover) bootstrapUnit, err := psf.createPruningPersister(bootstrapUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for BootstrapStorage", err) } store.AddStorer(dataRetriever.BootstrapUnit, bootstrapUnit) miniBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MiniBlocksStorage, disabledCustomDatabaseRemover) miniBlockUnit, err := psf.createPruningPersister(miniBlockUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for MiniBlocksStorage", err) } store.AddStorer(dataRetriever.MiniBlockUnit, miniBlockUnit) metaBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.MetaBlockStorage, disabledCustomDatabaseRemover) metaBlockUnit, err := psf.createPruningPersister(metaBlockUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for MetaBlockStorage", err) } store.AddStorer(dataRetriever.MetaBlockUnit, metaBlockUnit) @@ -182,34 +182,34 @@ func (psf *StorageServiceFactory) createAndAddBaseStorageUnits( GetCacherFromConfig(psf.generalConfig.MetaHdrNonceHashStorage.Cache), metaHdrHashNonceUnitConfig) if err != nil { - return err + return fmt.Errorf("%w for MetaHdrNonceHashStorage", err) } store.AddStorer(dataRetriever.MetaHdrNonceHashDataUnit, metaHdrHashNonceUnit) headerUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.BlockHeaderStorage, disabledCustomDatabaseRemover) headerUnit, err := psf.createPruningPersister(headerUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for BlockHeaderStorage", err) } store.AddStorer(dataRetriever.BlockHeaderUnit, headerUnit) userAccountsUnit, err := psf.createTriePruningStorer(psf.generalConfig.AccountsTrieStorage, customDatabaseRemover) if err != nil { - return err + return fmt.Errorf("%w for AccountsTrieStorage", err) } store.AddStorer(dataRetriever.UserAccountsUnit, userAccountsUnit) userAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.AccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) userAccountsCheckpointsUnit, err := psf.createPruningPersister(userAccountsCheckpointsUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for AccountsTrieCheckpointsStorage", err) } store.AddStorer(dataRetriever.UserAccountsCheckpointsUnit, userAccountsCheckpointsUnit) peerAccountsCheckpointsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerAccountsTrieCheckpointsStorage, disabledCustomDatabaseRemover) peerAccountsCheckpointsUnit, err := psf.createPruningPersister(peerAccountsCheckpointsUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for PeerAccountsTrieCheckpointsStorage", err) } store.AddStorer(dataRetriever.PeerAccountsCheckpointsUnit, peerAccountsCheckpointsUnit) @@ -221,7 +221,7 @@ func (psf *StorageServiceFactory) createAndAddBaseStorageUnits( GetCacherFromConfig(psf.generalConfig.StatusMetricsStorage.Cache), statusMetricsDbConfig) if err != nil { - return err + return fmt.Errorf("%w for StatusMetricsStorage", err) } store.AddStorer(dataRetriever.StatusMetricsUnit, statusMetricsStorageUnit) @@ -255,7 +255,7 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService GetCacherFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.Cache), shardHdrHashNonceConfig) if err != nil { - return nil, err + return nil, fmt.Errorf("%w for ShardHdrNonceHashStorage", err) } store := dataRetriever.NewChainStorer() @@ -267,14 +267,14 @@ func (psf *StorageServiceFactory) CreateForShard() (dataRetriever.StorageService peerAccountsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerAccountsTrieStorage, customDatabaseRemover) peerAccountsUnit, err := psf.createTrieUnit(psf.generalConfig.PeerAccountsTrieStorage, peerAccountsUnitArgs) if err != nil { - return nil, err + return nil, fmt.Errorf("%w for PeerAccountsTrieStorage", err) } store.AddStorer(dataRetriever.PeerAccountsUnit, peerAccountsUnit) peerBlockUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.PeerBlockBodyStorage, disabledCustomDatabaseRemover) peerBlockUnit, err := psf.createPruningPersister(peerBlockUnitArgs) if err != nil { - return nil, err + return nil, fmt.Errorf("%w for PeerBlockBodyStorage", err) } store.AddStorer(dataRetriever.PeerChangesUnit, peerBlockUnit) @@ -320,7 +320,7 @@ func (psf *StorageServiceFactory) CreateForMeta() (dataRetriever.StorageService, GetCacherFromConfig(psf.generalConfig.ShardHdrNonceHashStorage.Cache), shardHdrHashNonceConfig) if err != nil { - return nil, err + return nil, fmt.Errorf("%w for ShardHdrNonceHashStorage on shard %d", err, i) } } @@ -395,7 +395,7 @@ func (psf *StorageServiceFactory) setupLogsAndEventsStorer(chainStorer *dataRetr txLogsUnitArgs := psf.createPruningStorerArgs(psf.generalConfig.LogsAndEvents.TxLogsStorage, disabled.NewDisabledCustomDatabaseRemover()) txLogsUnit, err = psf.createPruningPersister(txLogsUnitArgs) if err != nil { - return err + return fmt.Errorf("%w for LogsAndEvents.TxLogsStorage", err) } } @@ -416,7 +416,7 @@ func (psf *StorageServiceFactory) setupDbLookupExtensions(chainStorer *dataRetri eventsHashesByTxHashStorerArgs := psf.createPruningStorerArgs(eventsHashesByTxHashConfig, disabled.NewDisabledCustomDatabaseRemover()) eventsHashesByTxHashPruningStorer, err := psf.createPruningPersister(eventsHashesByTxHashStorerArgs) if err != nil { - return err + return fmt.Errorf("%w for DbLookupExtensions.ResultsHashesByTxHashStorageConfig", err) } chainStorer.AddStorer(dataRetriever.ResultsHashesByTxHashUnit, eventsHashesByTxHashPruningStorer) @@ -426,7 +426,7 @@ func (psf *StorageServiceFactory) setupDbLookupExtensions(chainStorer *dataRetri miniblocksMetadataPruningStorerArgs := psf.createPruningStorerArgs(miniblocksMetadataConfig, disabled.NewDisabledCustomDatabaseRemover()) miniblocksMetadataPruningStorer, err := psf.createPruningPersister(miniblocksMetadataPruningStorerArgs) if err != nil { - return err + return fmt.Errorf("%w for DbLookupExtensions.MiniblocksMetadataStorageConfig", err) } chainStorer.AddStorer(dataRetriever.MiniblocksMetadataUnit, miniblocksMetadataPruningStorer) @@ -438,7 +438,7 @@ func (psf *StorageServiceFactory) setupDbLookupExtensions(chainStorer *dataRetri miniblockHashByTxHashCacherConfig := GetCacherFromConfig(miniblockHashByTxHashConfig.Cache) miniblockHashByTxHashUnit, err := storageunit.NewStorageUnitFromConf(miniblockHashByTxHashCacherConfig, miniblockHashByTxHashDbConfig) if err != nil { - return err + return fmt.Errorf("%w for DbLookupExtensions.MiniblockHashByTxHashStorageConfig", err) } chainStorer.AddStorer(dataRetriever.MiniblockHashByTxHashUnit, miniblockHashByTxHashUnit) @@ -450,7 +450,7 @@ func (psf *StorageServiceFactory) setupDbLookupExtensions(chainStorer *dataRetri blockHashByRoundCacherConfig := GetCacherFromConfig(blockHashByRoundConfig.Cache) blockHashByRoundUnit, err := storageunit.NewStorageUnitFromConf(blockHashByRoundCacherConfig, blockHashByRoundDBConfig) if err != nil { - return err + return fmt.Errorf("%w for DbLookupExtensions.RoundHashStorageConfig", err) } chainStorer.AddStorer(dataRetriever.RoundHdrHashDataUnit, blockHashByRoundUnit) @@ -462,7 +462,7 @@ func (psf *StorageServiceFactory) setupDbLookupExtensions(chainStorer *dataRetri epochByHashCacherConfig := GetCacherFromConfig(epochByHashConfig.Cache) epochByHashUnit, err := storageunit.NewStorageUnitFromConf(epochByHashCacherConfig, epochByHashDbConfig) if err != nil { - return err + return fmt.Errorf("%w for DbLookupExtensions.EpochByHashStorageConfig", err) } chainStorer.AddStorer(dataRetriever.EpochByHashUnit, epochByHashUnit) @@ -473,7 +473,7 @@ func (psf *StorageServiceFactory) setupDbLookupExtensions(chainStorer *dataRetri esdtSuppliesCacherConfig := GetCacherFromConfig(esdtSuppliesConfig.Cache) esdtSuppliesUnit, err := storageunit.NewStorageUnitFromConf(esdtSuppliesCacherConfig, esdtSuppliesDbConfig) if err != nil { - return err + return fmt.Errorf("%w for DbLookupExtensions.ESDTSuppliesStorageConfig", err) } chainStorer.AddStorer(dataRetriever.ESDTSuppliesUnit, esdtSuppliesUnit) @@ -528,7 +528,7 @@ func (psf *StorageServiceFactory) createTrieEpochRootHashStorerIfNeeded() (stora GetCacherFromConfig(psf.generalConfig.TrieEpochRootHashStorage.Cache), trieEpochRootHashDbConfig) if err != nil { - return nil, err + return nil, fmt.Errorf("%w for TrieEpochRootHashStorage", err) } return trieEpochRootHashStorageUnit, nil diff --git a/storage/factory/storageServiceFactory_test.go b/storage/factory/storageServiceFactory_test.go new file mode 100644 index 00000000000..cda7e0c408a --- /dev/null +++ b/storage/factory/storageServiceFactory_test.go @@ -0,0 +1,528 @@ +package factory + +import ( + "testing" + + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/storage" + "github.com/multiversx/mx-chain-go/storage/mock" + "github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func createMockArgument(t *testing.T) StorageServiceFactoryArgs { + pathMan, err := CreatePathManagerFromSinglePathString(t.TempDir()) + require.Nil(t, err) + + return StorageServiceFactoryArgs{ + Config: config.Config{ + StateTriesConfig: config.StateTriesConfig{ + SnapshotsEnabled: true, + }, + StoragePruning: config.StoragePruningConfig{ + Enabled: true, + NumActivePersisters: 3, + NumEpochsToKeep: 4, + ObserverCleanOldEpochsData: true, + }, + ShardHdrNonceHashStorage: createMockStorageConfig("ShardHdrNonceHashStorage"), + TxStorage: createMockStorageConfig("TxStorage"), + UnsignedTransactionStorage: createMockStorageConfig("UnsignedTransactionStorage"), + RewardTxStorage: createMockStorageConfig("RewardTxStorage"), + ReceiptsStorage: createMockStorageConfig("ReceiptsStorage"), + ScheduledSCRsStorage: createMockStorageConfig("ScheduledSCRsStorage"), + BootstrapStorage: createMockStorageConfig("BootstrapStorage"), + MiniBlocksStorage: createMockStorageConfig("MiniBlocksStorage"), + MetaBlockStorage: createMockStorageConfig("MetaBlockStorage"), + MetaHdrNonceHashStorage: createMockStorageConfig("MetaHdrNonceHashStorage"), + BlockHeaderStorage: createMockStorageConfig("BlockHeaderStorage"), + AccountsTrieStorage: createMockStorageConfig("AccountsTrieStorage"), + AccountsTrieCheckpointsStorage: createMockStorageConfig("AccountsTrieCheckpointsStorage"), + PeerAccountsTrieStorage: createMockStorageConfig("PeerAccountsTrieStorage"), + PeerAccountsTrieCheckpointsStorage: createMockStorageConfig("PeerAccountsTrieCheckpointsStorage"), + StatusMetricsStorage: createMockStorageConfig("StatusMetricsStorage"), + PeerBlockBodyStorage: createMockStorageConfig("PeerBlockBodyStorage"), + TrieEpochRootHashStorage: createMockStorageConfig("TrieEpochRootHashStorage"), + DbLookupExtensions: config.DbLookupExtensionsConfig{ + Enabled: true, + DbLookupMaxActivePersisters: 10, + MiniblocksMetadataStorageConfig: createMockStorageConfig("MiniblocksMetadataStorage"), + MiniblockHashByTxHashStorageConfig: createMockStorageConfig("MiniblockHashByTxHashStorage"), + EpochByHashStorageConfig: createMockStorageConfig("EpochByHashStorage"), + ResultsHashesByTxHashStorageConfig: createMockStorageConfig("ResultsHashesByTxHashStorage"), + ESDTSuppliesStorageConfig: createMockStorageConfig("ESDTSuppliesStorage"), + RoundHashStorageConfig: createMockStorageConfig("RoundHashStorage"), + }, + LogsAndEvents: config.LogsAndEventsConfig{ + SaveInStorageEnabled: true, + TxLogsStorage: createMockStorageConfig("TxLogsStorage"), + }, + }, + PrefsConfig: config.PreferencesConfig{}, + ShardCoordinator: &mock.ShardCoordinatorMock{ + NumShards: 3, + }, + PathManager: pathMan, + EpochStartNotifier: &mock.EpochStartNotifierStub{}, + NodeTypeProvider: &nodeTypeProviderMock.NodeTypeProviderStub{ + GetTypeCalled: func() core.NodeType { + return core.NodeTypeObserver + }, + }, + StorageType: ProcessStorageService, + CurrentEpoch: 0, + CreateTrieEpochRootHashStorer: true, + } +} + +func createMockStorageConfig(dbName string) config.StorageConfig { + return config.StorageConfig{ + Cache: config.CacheConfig{ + Type: "LRU", + Capacity: 1000, + }, + DB: config.DBConfig{ + FilePath: dbName, + Type: "LvlDBSerial", + BatchDelaySeconds: 5, + MaxBatchSize: 100, + MaxOpenFiles: 10, + }, + } +} + +func TestNewStorageServiceFactory(t *testing.T) { + t.Parallel() + + t.Run("invalid StoragePruning.NumActivePersisters should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.StoragePruning.NumActivePersisters = 0 + storageServiceFactory, err := NewStorageServiceFactory(args) + assert.Equal(t, storage.ErrInvalidNumberOfActivePersisters, err) + assert.Nil(t, storageServiceFactory) + }) + t.Run("nil shard coordinator should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.ShardCoordinator = nil + storageServiceFactory, err := NewStorageServiceFactory(args) + assert.Equal(t, storage.ErrNilShardCoordinator, err) + assert.Nil(t, storageServiceFactory) + }) + t.Run("nil path manager should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.PathManager = nil + storageServiceFactory, err := NewStorageServiceFactory(args) + assert.Equal(t, storage.ErrNilPathManager, err) + assert.Nil(t, storageServiceFactory) + }) + t.Run("nil epoch start notifier should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.EpochStartNotifier = nil + storageServiceFactory, err := NewStorageServiceFactory(args) + assert.Equal(t, storage.ErrNilEpochStartNotifier, err) + assert.Nil(t, storageServiceFactory) + }) + t.Run("invalid number of epochs to save should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.StoragePruning.NumEpochsToKeep = 1 + storageServiceFactory, err := NewStorageServiceFactory(args) + assert.Equal(t, storage.ErrInvalidNumberOfEpochsToSave, err) + assert.Nil(t, storageServiceFactory) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + storageServiceFactory, err := NewStorageServiceFactory(args) + assert.Nil(t, err) + assert.NotNil(t, storageServiceFactory) + }) +} + +func TestStorageServiceFactory_CreateForShard(t *testing.T) { + t.Parallel() + + expectedErrForCacheString := "not supported cache type" + + t.Run("wrong config for ShardHdrNonceHashStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.ShardHdrNonceHashStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for ShardHdrNonceHashStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for TxStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.TxStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for TxStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for UnsignedTransactionStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.UnsignedTransactionStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for UnsignedTransactionStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for RewardTxStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.RewardTxStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for RewardTxStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for ReceiptsStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.ReceiptsStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for ReceiptsStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for ScheduledSCRsStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.ScheduledSCRsStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for ScheduledSCRsStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for BootstrapStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.BootstrapStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for BootstrapStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for MiniBlocksStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.MiniBlocksStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for MiniBlocksStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for MetaBlockStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.MetaBlockStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for MetaBlockStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for MetaHdrNonceHashStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.MetaHdrNonceHashStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for MetaHdrNonceHashStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for BlockHeaderStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.BlockHeaderStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for BlockHeaderStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for AccountsTrieStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.AccountsTrieStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for AccountsTrieStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for AccountsTrieCheckpointsStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.AccountsTrieCheckpointsStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for AccountsTrieCheckpointsStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for PeerAccountsTrieStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.PeerAccountsTrieStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for PeerAccountsTrieStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for PeerAccountsTrieCheckpointsStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.PeerAccountsTrieCheckpointsStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for PeerAccountsTrieCheckpointsStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for StatusMetricsStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.StatusMetricsStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for StatusMetricsStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for PeerBlockBodyStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.PeerBlockBodyStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for PeerBlockBodyStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for TrieEpochRootHashStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.TrieEpochRootHashStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for TrieEpochRootHashStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for DbLookupExtensions.MiniblocksMetadataStorageConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.MiniblocksMetadataStorageConfig.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for DbLookupExtensions.MiniblocksMetadataStorageConfig", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for DbLookupExtensions.MiniblockHashByTxHashStorageConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.MiniblockHashByTxHashStorageConfig.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for DbLookupExtensions.MiniblockHashByTxHashStorageConfig", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for DbLookupExtensions.EpochByHashStorageConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.EpochByHashStorageConfig.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for DbLookupExtensions.EpochByHashStorageConfig", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for DbLookupExtensions.ResultsHashesByTxHashStorageConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.ResultsHashesByTxHashStorageConfig.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for DbLookupExtensions.ResultsHashesByTxHashStorageConfig", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for DbLookupExtensions.ESDTSuppliesStorageConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.ESDTSuppliesStorageConfig.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for DbLookupExtensions.ESDTSuppliesStorageConfig", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for DbLookupExtensions.RoundHashStorageConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.RoundHashStorageConfig.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for DbLookupExtensions.RoundHashStorageConfig", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for LogsAndEvents.TxLogsStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.LogsAndEvents.TxLogsStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Equal(t, expectedErrForCacheString+" for LogsAndEvents.TxLogsStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Nil(t, err) + assert.False(t, check.IfNil(storageService)) + allStorers := storageService.GetAllStorers() + expectedStorers := 25 + assert.Equal(t, expectedStorers, len(allStorers)) + _ = storageService.CloseAll() + }) + t.Run("should work without DbLookupExtensions", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.Enabled = false + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Nil(t, err) + assert.False(t, check.IfNil(storageService)) + allStorers := storageService.GetAllStorers() + numDBLookupExtensionUnits := 6 + expectedStorers := 25 - numDBLookupExtensionUnits + assert.Equal(t, expectedStorers, len(allStorers)) + _ = storageService.CloseAll() + }) + t.Run("should work without TrieEpochRootHashStorage", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.CreateTrieEpochRootHashStorer = false + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Nil(t, err) + assert.False(t, check.IfNil(storageService)) + allStorers := storageService.GetAllStorers() + expectedStorers := 25 // we still have a storer for trie epoch root hash + assert.Equal(t, expectedStorers, len(allStorers)) + _ = storageService.CloseAll() + }) + t.Run("should work if the snapshots are not enabled", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.StateTriesConfig.SnapshotsEnabled = false + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForShard() + assert.Nil(t, err) + assert.False(t, check.IfNil(storageService)) + allStorers := storageService.GetAllStorers() + expectedStorers := 25 + assert.Equal(t, expectedStorers, len(allStorers)) + _ = storageService.CloseAll() + }) +} + +func TestStorageServiceFactory_CreateForMeta(t *testing.T) { + t.Parallel() + + expectedErrForCacheString := "not supported cache type" + + t.Run("wrong config for ShardHdrNonceHashStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.ShardHdrNonceHashStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForMeta() + assert.Equal(t, expectedErrForCacheString+" for ShardHdrNonceHashStorage on shard 0", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for AccountsTrieStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.AccountsTrieStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForMeta() + assert.Equal(t, expectedErrForCacheString+" for AccountsTrieStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for DbLookupExtensions.RoundHashStorageConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.DbLookupExtensions.RoundHashStorageConfig.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForMeta() + assert.Equal(t, expectedErrForCacheString+" for DbLookupExtensions.RoundHashStorageConfig", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("wrong config for LogsAndEvents.TxLogsStorage should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + args.Config.LogsAndEvents.TxLogsStorage.Cache.Type = "" + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForMeta() + assert.Equal(t, expectedErrForCacheString+" for LogsAndEvents.TxLogsStorage", err.Error()) + assert.True(t, check.IfNil(storageService)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := createMockArgument(t) + storageServiceFactory, _ := NewStorageServiceFactory(args) + storageService, err := storageServiceFactory.CreateForMeta() + assert.Nil(t, err) + assert.False(t, check.IfNil(storageService)) + allStorers := storageService.GetAllStorers() + missingStorers := 2 // PeerChangesUnit and ShardHdrNonceHashDataUnit + numShardHdrStorage := 3 + expectedStorers := 25 - missingStorers + numShardHdrStorage + assert.Equal(t, expectedStorers, len(allStorers)) + _ = storageService.CloseAll() + }) +} diff --git a/storage/latestData/latestDataProvider_test.go b/storage/latestData/latestDataProvider_test.go index ebdbc31d178..8494f2257a2 100644 --- a/storage/latestData/latestDataProvider_test.go +++ b/storage/latestData/latestDataProvider_test.go @@ -28,6 +28,14 @@ func TestNewLatestDataProvider_ShouldWork(t *testing.T) { require.NoError(t, err) } +func TestLatestDataProvider_GetParentDirectory(t *testing.T) { + t.Parallel() + + args := getLatestDataProviderArgs() + ldp, _ := NewLatestDataProvider(args) + assert.Equal(t, args.ParentDir, ldp.GetParentDirectory()) +} + func TestGetShardsFromDirectory(t *testing.T) { t.Parallel() diff --git a/storage/mock/storedDataFactoryStub.go b/storage/mock/storedDataFactoryStub.go new file mode 100644 index 00000000000..1716f67b461 --- /dev/null +++ b/storage/mock/storedDataFactoryStub.go @@ -0,0 +1,20 @@ +package mock + +// StoredDataFactoryStub - +type StoredDataFactoryStub struct { + CreateEmptyCalled func() interface{} +} + +// CreateEmpty - +func (sdf *StoredDataFactoryStub) CreateEmpty() interface{} { + if sdf.CreateEmptyCalled != nil { + return sdf.CreateEmptyCalled() + } + + return nil +} + +// IsInterfaceNil - +func (sdf *StoredDataFactoryStub) IsInterfaceNil() bool { + return sdf == nil +} diff --git a/storage/pathmanager/pathManager_test.go b/storage/pathmanager/pathManager_test.go index 061b536ffd1..ae50921a106 100644 --- a/storage/pathmanager/pathManager_test.go +++ b/storage/pathmanager/pathManager_test.go @@ -3,6 +3,7 @@ package pathmanager_test import ( "testing" + "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/storage/pathmanager" "github.com/stretchr/testify/assert" ) @@ -11,7 +12,7 @@ func TestNewPathManager_EmptyPruningPathTemplateShouldErr(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("", "shard_[S]/[I]", "db") - assert.Nil(t, pm) + assert.True(t, check.IfNil(pm)) assert.Equal(t, pathmanager.ErrEmptyPruningPathTemplate, err) } @@ -19,15 +20,23 @@ func TestNewPathManager_EmptyStaticPathTemplateShouldErr(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "", "db") - assert.Nil(t, pm) + assert.True(t, check.IfNil(pm)) assert.Equal(t, pathmanager.ErrEmptyStaticPathTemplate, err) } +func TestNewPathManager_EmptyDBPathTemplateShouldErr(t *testing.T) { + t.Parallel() + + pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]/[I]", "") + assert.True(t, check.IfNil(pm)) + assert.Equal(t, pathmanager.ErrInvalidDatabasePath, err) +} + func TestNewPathManager_InvalidPruningPathTemplate_NoShardPlaceholder_ShouldErr(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard/[I]", "shard_[S]/[I]", "db") - assert.Nil(t, pm) + assert.True(t, check.IfNil(pm)) assert.Equal(t, pathmanager.ErrInvalidPruningPathTemplate, err) } @@ -35,7 +44,7 @@ func TestNewPathManager_InvalidPruningPathTemplate_NoEpochPlaceholder_ShouldErr( t.Parallel() pm, err := pathmanager.NewPathManager("epoch/shard_[S]/[I]", "shard_[S]/[I]", "db") - assert.Nil(t, pm) + assert.True(t, check.IfNil(pm)) assert.Equal(t, pathmanager.ErrInvalidPruningPathTemplate, err) } @@ -43,7 +52,7 @@ func TestNewPathManager_InvalidPathPruningTemplate_NoIdentifierPlaceholder_Shoul t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]", "shard_[S]/[I]", "db") - assert.Nil(t, pm) + assert.True(t, check.IfNil(pm)) assert.Equal(t, pathmanager.ErrInvalidPruningPathTemplate, err) } @@ -51,7 +60,7 @@ func TestNewPathManager_InvalidStaticPathTemplate_NoShardPlaceholder_ShouldErr(t t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard/[I]", "db") - assert.Nil(t, pm) + assert.True(t, check.IfNil(pm)) assert.Equal(t, pathmanager.ErrInvalidStaticPathTemplate, err) } @@ -59,7 +68,7 @@ func TestNewPathManager_InvalidStaticPathTemplate_NoIdentifierPlaceholder_Should t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]", "db") - assert.Nil(t, pm) + assert.True(t, check.IfNil(pm)) assert.Equal(t, pathmanager.ErrInvalidStaticPathTemplate, err) } @@ -67,10 +76,18 @@ func TestNewPathManager_OkValsShouldWork(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]/[I]", "db") - assert.NotNil(t, pm) + assert.False(t, check.IfNil(pm)) assert.Nil(t, err) } +func TestPathManager_DatabasePath(t *testing.T) { + t.Parallel() + + dbPath := "db" + pm, _ := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]/[I]", dbPath) + assert.Equal(t, dbPath, pm.DatabasePath()) +} + func TestPathManager_PathForEpoch(t *testing.T) { t.Parallel() diff --git a/storage/pruning/pruningStorer_test.go b/storage/pruning/pruningStorer_test.go index 0ac4f7cf71f..7b2b9ae47bc 100644 --- a/storage/pruning/pruningStorer_test.go +++ b/storage/pruning/pruningStorer_test.go @@ -1148,3 +1148,167 @@ func TestPruningStorer_ConcurrentOperations(t *testing.T) { // if the "resource temporary unavailable" occurs, this test will take longer than this to execute require.True(t, elapsedTime < 100*time.Second) } + +func TestPruningStorer_RangeKeys(t *testing.T) { + t.Parallel() + + args := getDefaultArgs() + ps, _ := pruning.NewPruningStorer(args) + + t.Run("should not panic with nil handler", func(t *testing.T) { + t.Parallel() + + assert.NotPanics(t, func() { + ps.RangeKeys(nil) + }) + }) + t.Run("should not call handler", func(t *testing.T) { + t.Parallel() + + ps.RangeKeys(func(key []byte, val []byte) bool { + assert.Fail(t, "should not have called handler") + return false + }) + }) +} + +func TestPruningStorer_GetOldestEpoch(t *testing.T) { + t.Parallel() + + t.Run("should return error if no persisters are found", func(t *testing.T) { + t.Parallel() + + epochsData := pruning.EpochArgs{ + NumOfEpochsToKeep: 0, + NumOfActivePersisters: 0, + } + + args := getDefaultArgs() + args.PersistersTracker = pruning.NewPersistersTracker(epochsData) + ps, _ := pruning.NewPruningStorer(args) + + epoch, err := ps.GetOldestEpoch() + assert.NotNil(t, err) + assert.Zero(t, epoch) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + epochsData := pruning.EpochArgs{ + NumOfEpochsToKeep: 2, + NumOfActivePersisters: 2, + StartingEpoch: 5, + } + + args := getDefaultArgs() + args.PersistersTracker = pruning.NewPersistersTracker(epochsData) + args.EpochsData = epochsData + ps, _ := pruning.NewPruningStorer(args) + + epoch, err := ps.GetOldestEpoch() + assert.Nil(t, err) + expectedEpoch := uint32(4) // 5 and 4 are the active epochs + assert.Equal(t, expectedEpoch, epoch) + }) +} + +func TestPruningStorer_PutInEpoch(t *testing.T) { + t.Parallel() + + epochsData := pruning.EpochArgs{ + NumOfEpochsToKeep: 2, + NumOfActivePersisters: 2, + StartingEpoch: 5, + } + args := getDefaultArgs() + args.PersistersTracker = pruning.NewPersistersTracker(epochsData) + args.EpochsData = epochsData + ps, _ := pruning.NewPruningStorer(args) + + t.Run("if the epoch is not handled, should error", func(t *testing.T) { + t.Parallel() + + err := ps.PutInEpoch([]byte("key"), []byte("value"), 3) // only 4 and 5 are handled + expectedErrorString := "put in epoch: persister for epoch 3 not found" + assert.Equal(t, expectedErrorString, err.Error()) + }) + t.Run("put in existing epochs", func(t *testing.T) { + t.Parallel() + + key4 := []byte("key4") + value4 := []byte("value4") + key5 := []byte("key5") + value5 := []byte("value5") + + err := ps.PutInEpoch(key4, value4, 4) + assert.Nil(t, err) + + err = ps.PutInEpoch(key5, value5, 5) + assert.Nil(t, err) + + t.Run("get from their respective epochs should work", func(t *testing.T) { + ps.ClearCache() + recovered4, errGet := ps.GetFromEpoch(key4, 4) + assert.Nil(t, errGet) + assert.Equal(t, value4, recovered4) + + ps.ClearCache() + recovered5, errGet := ps.GetFromEpoch(key5, 5) + assert.Nil(t, errGet) + assert.Equal(t, value5, recovered5) + }) + t.Run("get from wrong epochs should error", func(t *testing.T) { + ps.ClearCache() + result, errGet := ps.GetFromEpoch(key4, 3) + expectedErrorString := fmt.Sprintf("key %x not found in id", key4) + assert.Equal(t, expectedErrorString, errGet.Error()) + assert.Nil(t, result) + + ps.ClearCache() + result, errGet = ps.GetFromEpoch(key4, 5) + expectedErrorString = fmt.Sprintf("key %x not found in id", key4) + assert.Equal(t, expectedErrorString, errGet.Error()) + assert.Nil(t, result) + }) + }) +} + +func TestPruningStorer_RemoveFromCurrentEpoch(t *testing.T) { + t.Parallel() + + epochsData := pruning.EpochArgs{ + NumOfEpochsToKeep: 2, + NumOfActivePersisters: 2, + StartingEpoch: 5, + } + args := getDefaultArgs() + args.PersistersTracker = pruning.NewPersistersTracker(epochsData) + args.EpochsData = epochsData + ps, _ := pruning.NewPruningStorer(args) + + // current epoch is 5 + key := []byte("key") + value := []byte("value") + + // put in epoch 4 + _ = ps.PutInEpoch(key, value, 4) + // put in epoch 5 + _ = ps.PutInEpoch(key, value, 5) + + // remove from epoch 5 + err := ps.RemoveFromCurrentEpoch(key) + assert.Nil(t, err) + + // get from epoch 5 should error + ps.ClearCache() + result, errGet := ps.GetFromEpoch(key, 5) + expectedErrorString := fmt.Sprintf("key %x not found in id", key) + assert.Equal(t, expectedErrorString, errGet.Error()) + assert.Nil(t, result) + + // get from epoch 4 should work + ps.ClearCache() + recovered, errGet := ps.GetFromEpoch(key, 4) + assert.Nil(t, errGet) + assert.Equal(t, value, recovered) +} diff --git a/storage/pruning/triePruningStorer_test.go b/storage/pruning/triePruningStorer_test.go index dad280f364d..c4b04f02f5b 100644 --- a/storage/pruning/triePruningStorer_test.go +++ b/storage/pruning/triePruningStorer_test.go @@ -350,3 +350,34 @@ func TestTriePruningStorer_KeepMoreDbsOpenIfNecessary(t *testing.T) { err = tps.Close() assert.Nil(t, err) } + +func TestTriePruningStorer_GetLatestStorageEpoch(t *testing.T) { + t.Parallel() + + epochsData := pruning.EpochArgs{ + NumOfEpochsToKeep: 2, + NumOfActivePersisters: 2, + StartingEpoch: 5, + } + args := getDefaultArgs() + args.PersistersTracker = pruning.NewPersistersTracker(epochsData) + + t.Run("no active db should error", func(t *testing.T) { + t.Parallel() + + tps, _ := pruning.NewTriePruningStorer(args) + latestEpoch, err := tps.GetLatestStorageEpoch() + expectedErrString := "there are no active persisters" + assert.Equal(t, expectedErrString, err.Error()) + assert.Zero(t, latestEpoch) + }) + t.Run("no active db should error", func(t *testing.T) { + t.Parallel() + + tps, _ := pruning.NewTriePruningStorer(args) + _ = tps.ChangeEpochSimple(5) + latestEpoch, err := tps.GetLatestStorageEpoch() + assert.Nil(t, err) + assert.Equal(t, uint32(5), latestEpoch) + }) +} diff --git a/storage/storageunit/storageunit_test.go b/storage/storageunit/storageunit_test.go new file mode 100644 index 00000000000..d66669dc5c9 --- /dev/null +++ b/storage/storageunit/storageunit_test.go @@ -0,0 +1,173 @@ +package storageunit_test + +import ( + "path" + "testing" + + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-go/storage/mock" + "github.com/multiversx/mx-chain-go/storage/storageunit" + "github.com/multiversx/mx-chain-storage-go/common" + + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/stretchr/testify/assert" +) + +func TestNewStorageUnit(t *testing.T) { + t.Parallel() + + cacher := &testscommon.CacherStub{} + persister := &mock.PersisterStub{} + + t.Run("nil cacher should error", func(t *testing.T) { + t.Parallel() + + unit, err := storageunit.NewStorageUnit(nil, persister) + assert.True(t, check.IfNil(unit)) + assert.Equal(t, common.ErrNilCacher, err) + }) + t.Run("nil persister should error", func(t *testing.T) { + t.Parallel() + + unit, err := storageunit.NewStorageUnit(cacher, nil) + assert.True(t, check.IfNil(unit)) + assert.Equal(t, common.ErrNilPersister, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + unit, err := storageunit.NewStorageUnit(cacher, persister) + assert.False(t, check.IfNil(unit)) + assert.Nil(t, err) + }) +} + +func TestNewCache(t *testing.T) { + t.Parallel() + + t.Run("wrong config should error", func(t *testing.T) { + t.Parallel() + + cfg := storageunit.CacheConfig{ + Type: "invalid type", + Capacity: 100, + } + cache, err := storageunit.NewCache(cfg) + assert.True(t, check.IfNil(cache)) + assert.Equal(t, common.ErrNotSupportedCacheType, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + cfg := storageunit.CacheConfig{ + Type: "LRU", + Capacity: 100, + } + cache, err := storageunit.NewCache(cfg) + assert.False(t, check.IfNil(cache)) + assert.Nil(t, err) + }) +} + +func TestNewDB(t *testing.T) { + t.Parallel() + + t.Run("wrong config should error", func(t *testing.T) { + t.Parallel() + + args := storageunit.ArgDB{ + DBType: "invalid type", + Path: "TEST", + BatchDelaySeconds: 5, + MaxBatchSize: 10, + MaxOpenFiles: 10, + } + db, err := storageunit.NewDB(args) + assert.True(t, check.IfNil(db)) + assert.Equal(t, common.ErrNotSupportedDBType, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := storageunit.ArgDB{ + DBType: "LvlDBSerial", + Path: path.Join(t.TempDir(), "TEST"), + BatchDelaySeconds: 5, + MaxBatchSize: 10, + MaxOpenFiles: 10, + } + db, err := storageunit.NewDB(args) + assert.False(t, check.IfNil(db)) + assert.Nil(t, err) + _ = db.Close() + }) +} + +func TestNewStorageUnitFromConf(t *testing.T) { + t.Parallel() + + dbConfig := storageunit.DBConfig{ + FilePath: path.Join(t.TempDir(), "TEST"), + Type: "LvlDBSerial", + BatchDelaySeconds: 5, + MaxBatchSize: 10, + MaxOpenFiles: 10, + } + + t.Run("invalid config should error", func(t *testing.T) { + t.Parallel() + + cacheConfig := storageunit.CacheConfig{ + Type: "invalid type", + Capacity: 100, + } + + unit, err := storageunit.NewStorageUnitFromConf(cacheConfig, dbConfig) + assert.True(t, check.IfNil(unit)) + assert.Equal(t, common.ErrNotSupportedCacheType, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + cacheConfig := storageunit.CacheConfig{ + Type: "LRU", + Capacity: 100, + } + + unit, err := storageunit.NewStorageUnitFromConf(cacheConfig, dbConfig) + assert.False(t, check.IfNil(unit)) + assert.Nil(t, err) + _ = unit.Close() + }) +} + +func TestNewNilStorer(t *testing.T) { + t.Parallel() + + unit := storageunit.NewNilStorer() + assert.False(t, check.IfNil(unit)) +} + +func TestNewStorageCacherAdapter(t *testing.T) { + t.Parallel() + + cacher := &mock.AdaptedSizedLruCacheStub{} + db := &mock.PersisterStub{} + storedDataFactory := &mock.StoredDataFactoryStub{} + marshaller := &testscommon.MarshalizerStub{} + + t.Run("nil parameter should error", func(t *testing.T) { + t.Parallel() + + adaptor, err := storageunit.NewStorageCacherAdapter(nil, db, storedDataFactory, marshaller) + assert.True(t, check.IfNil(adaptor)) + assert.Equal(t, common.ErrNilCacher, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + adaptor, err := storageunit.NewStorageCacherAdapter(cacher, db, storedDataFactory, marshaller) + assert.False(t, check.IfNil(adaptor)) + assert.Nil(t, err) + }) +} diff --git a/storage/txcache/txcache_test.go b/storage/txcache/txcache_test.go new file mode 100644 index 00000000000..574b6bd3b7d --- /dev/null +++ b/storage/txcache/txcache_test.go @@ -0,0 +1,97 @@ +package txcache + +import ( + "strings" + "testing" + + "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-go/testscommon/txcachemocks" + "github.com/multiversx/mx-chain-storage-go/common" + "github.com/stretchr/testify/assert" +) + +func TestNewTxCache(t *testing.T) { + t.Parallel() + + t.Run("nil parameter should error", func(t *testing.T) { + t.Parallel() + + cfg := ConfigSourceMe{ + Name: "test", + NumChunks: 1, + NumBytesThreshold: 1000, + NumBytesPerSenderThreshold: 100, + CountThreshold: 10, + CountPerSenderThreshold: 100, + NumSendersToPreemptivelyEvict: 1, + } + + cache, err := NewTxCache(cfg, nil) + assert.True(t, check.IfNil(cache)) + assert.Equal(t, common.ErrNilTxGasHandler, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + cfg := ConfigSourceMe{ + Name: "test", + NumChunks: 1, + NumBytesThreshold: 1000, + NumBytesPerSenderThreshold: 100, + CountThreshold: 10, + CountPerSenderThreshold: 100, + NumSendersToPreemptivelyEvict: 1, + } + + cache, err := NewTxCache(cfg, &txcachemocks.TxGasHandlerMock{ + GasProcessingDivisor: 1, + MinimumGasPrice: 1, + MinimumGasMove: 1, + }) + assert.False(t, check.IfNil(cache)) + assert.Nil(t, err) + }) +} + +func TestNewDisabledCache(t *testing.T) { + t.Parallel() + + cache := NewDisabledCache() + assert.False(t, check.IfNil(cache)) +} + +func TestNewCrossTxCache(t *testing.T) { + t.Parallel() + + t.Run("invalid config should error", func(t *testing.T) { + t.Parallel() + + cfg := ConfigDestinationMe{ + Name: "", + NumChunks: 1, + MaxNumItems: 100, + MaxNumBytes: 1000, + NumItemsToPreemptivelyEvict: 1, + } + + cache, err := NewCrossTxCache(cfg) + assert.True(t, check.IfNil(cache)) + assert.ErrorIs(t, err, common.ErrInvalidConfig) + assert.True(t, strings.Contains(err.Error(), "config.Name is invalid")) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + cfg := ConfigDestinationMe{ + Name: "test", + NumChunks: 1, + MaxNumItems: 100, + MaxNumBytes: 1000, + NumItemsToPreemptivelyEvict: 1, + } + + cache, err := NewCrossTxCache(cfg) + assert.False(t, check.IfNil(cache)) + assert.Nil(t, err) + }) +} From a378c74146c735647ad8c302c4f56095bc58e5be Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 31 Mar 2023 16:48:42 +0300 Subject: [PATCH 224/335] fix after review: - minor refactoring in storage package - reworked the IsInterfaceNil tests - moved stub, fixed comments & tests --- factory/bootstrap/bootstrapComponents.go | 7 ++-- storage/clean/oldDataCleanerProvider_test.go | 14 ++++++-- storage/clean/oldDatabaseCleaner_test.go | 21 ++++++++---- .../customDatabaseRemover_test.go | 12 ++++++- .../directoryhandler/directoryReader_test.go | 13 +++++++- storage/disabled/errorDisabledPersister.go | 2 +- .../disabled/errorDisabledPersister_test.go | 18 ++++++++-- storage/factory/bootstrapDataProvider_test.go | 14 ++++++-- storage/factory/openStorage.go | 4 +-- storage/factory/openStorage_test.go | 33 ++++++++++++------- storage/factory/persisterFactory_test.go | 15 +++++++-- storage/latestData/latestDataProvider_test.go | 12 ++++++- storage/pathmanager/pathManager_test.go | 29 +++++++++++----- .../pruning/fullHistoryPruningStorer_test.go | 17 +++++++++- .../pruning/fullHistoryTriePruningStorer.go | 5 +++ .../fullHistoryTriePruningStorer_test.go | 18 +++++++++- storage/pruning/persistersTracker_test.go | 13 +++++++- storage/pruning/pruningStorer_test.go | 33 ++++++++++++------- storage/pruning/triePersistersTracker_test.go | 13 +++++++- storage/pruning/triePruningStorer_test.go | 15 +++++++-- storage/storageunit/storageunit_test.go | 15 +++++---- storage/txcache/txcache_test.go | 11 +++---- .../storage}/storedDataFactoryStub.go | 2 +- 23 files changed, 257 insertions(+), 79 deletions(-) rename {storage/mock => testscommon/storage}/storedDataFactoryStub.go (95%) diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index e0f6ae2b110..98ce0bab147 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -162,15 +162,12 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { return nil, err } - unitOpener, err := createUnitOpener( + unitOpener := createUnitOpener( bootstrapDataProvider, latestStorageDataProvider, storage.DefaultEpochString, storage.DefaultShardString, ) - if err != nil { - return nil, err - } dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() @@ -329,7 +326,7 @@ func createUnitOpener( latestDataFromStorageProvider storage.LatestStorageDataProviderHandler, defaultEpochString string, defaultShardString string, -) (storage.UnitOpenerHandler, error) { +) storage.UnitOpenerHandler { argsStorageUnitOpener := storageFactory.ArgsNewOpenStorageUnits{ BootstrapDataProvider: bootstrapDataProvider, LatestStorageDataProvider: latestDataFromStorageProvider, diff --git a/storage/clean/oldDataCleanerProvider_test.go b/storage/clean/oldDataCleanerProvider_test.go index 8bd4f873556..288c18f57a8 100644 --- a/storage/clean/oldDataCleanerProvider_test.go +++ b/storage/clean/oldDataCleanerProvider_test.go @@ -15,7 +15,7 @@ func TestNewOldDataCleanerProvider_NilNodeTypeProviderShouldErr(t *testing.T) { t.Parallel() odcp, err := NewOldDataCleanerProvider(nil, config.StoragePruningConfig{}) - require.True(t, check.IfNil(odcp)) + require.Nil(t, odcp) require.Equal(t, storage.ErrNilNodeTypeProvider, err) } @@ -24,7 +24,7 @@ func TestNewOldDataCleanerProvider_ShouldWork(t *testing.T) { odcp, err := NewOldDataCleanerProvider(&nodeTypeProviderMock.NodeTypeProviderStub{}, config.StoragePruningConfig{}) require.NoError(t, err) - require.False(t, check.IfNil(odcp)) + require.NotNil(t, odcp) } func TestOldDataCleanerProvider_ShouldCleanShouldReturnObserverIfInvalidNodeType(t *testing.T) { @@ -70,3 +70,13 @@ func TestOldDataCleanerProvider_ShouldClean(t *testing.T) { } require.False(t, odcp.ShouldClean()) } + +func TestOldDataCleanerProvider_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var odcp *oldDataCleanerProvider + require.True(t, check.IfNil(odcp)) + + odcp, _ = NewOldDataCleanerProvider(&nodeTypeProviderMock.NodeTypeProviderStub{}, config.StoragePruningConfig{}) + require.False(t, check.IfNil(odcp)) +} diff --git a/storage/clean/oldDatabaseCleaner_test.go b/storage/clean/oldDatabaseCleaner_test.go index b839bf3dca3..108b8c3d5dc 100644 --- a/storage/clean/oldDatabaseCleaner_test.go +++ b/storage/clean/oldDatabaseCleaner_test.go @@ -12,6 +12,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/mock" "github.com/multiversx/mx-chain-go/testscommon" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -68,9 +69,9 @@ func TestNewOldDatabaseCleaner(t *testing.T) { odc, err := NewOldDatabaseCleaner(args) require.Equal(t1, tt.expectedErr, err) if err == nil { - require.False(t1, check.IfNil(odc)) + assert.NotNil(t1, odc) } else { - require.True(t1, check.IfNil(odc)) + assert.Nil(t1, odc) } }) } @@ -100,7 +101,6 @@ func TestOldDatabaseCleaner_EpochChangeShouldErrIfOldestEpochComputationFails(t odc, _ := NewOldDatabaseCleaner(args) odc.pathRemover = fileRemover odc.directoryReader = directoryReader - require.False(t, check.IfNil(odc)) handlerFunc.EpochStartAction(&block.Header{Epoch: 5}) require.False(t, fileRemoverWasCalled) @@ -132,7 +132,6 @@ func TestOldDatabaseCleaner_EpochChangeDirectoryReadFailsShouldNotRemove(t *test odc, _ := NewOldDatabaseCleaner(args) odc.pathRemover = fileRemover odc.directoryReader = directoryReader - require.False(t, check.IfNil(odc)) handlerFunc.EpochStartAction(&block.Header{Epoch: 5}) require.False(t, fileRemoverWasCalled) @@ -164,7 +163,6 @@ func TestOldDatabaseCleaner_EpochChangeNoEpochDirectory(t *testing.T) { odc, _ := NewOldDatabaseCleaner(args) odc.pathRemover = fileRemover odc.directoryReader = directoryReader - require.False(t, check.IfNil(odc)) handlerFunc.EpochStartAction(&block.Header{Epoch: 5}) require.False(t, fileRemoverWasCalled) @@ -199,7 +197,6 @@ func TestOldDatabaseCleaner_EpochChangeShouldNotRemoveIfNewOldestEpochIsOlder(t odc, _ := NewOldDatabaseCleaner(args) odc.pathRemover = fileRemover odc.directoryReader = directoryReader - require.False(t, check.IfNil(odc)) handlerFunc.EpochStartAction(&block.Header{Epoch: 5}) require.Empty(t, removedFiles) @@ -243,7 +240,6 @@ func TestOldDatabaseCleaner_EpochChange(t *testing.T) { odc, _ := NewOldDatabaseCleaner(args) odc.pathRemover = fileRemover odc.directoryReader = directoryReader - require.False(t, check.IfNil(odc)) handlerFunc.EpochStartAction(&block.Header{Epoch: 5}) require.Empty(t, removedFiles) @@ -283,3 +279,14 @@ func createMockArgs() ArgsOldDatabaseCleaner { OldDataCleanerProvider: &testscommon.OldDataCleanerProviderStub{}, } } + +func TestOldDatabaseCleaner_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var odc *oldDatabaseCleaner + require.True(t, check.IfNil(odc)) + + args := createMockArgs() + odc, _ = NewOldDatabaseCleaner(args) + require.False(t, check.IfNil(odc)) +} diff --git a/storage/databaseremover/customDatabaseRemover_test.go b/storage/databaseremover/customDatabaseRemover_test.go index 0ff730c4583..8e5f4d75a68 100644 --- a/storage/databaseremover/customDatabaseRemover_test.go +++ b/storage/databaseremover/customDatabaseRemover_test.go @@ -26,7 +26,7 @@ func TestCustomDatabaseRemover(t *testing.T) { cdr, err := NewCustomDatabaseRemover(createCfgWithPattern(",")) require.True(t, errors.Is(err, errEmptyPatternArgument)) - require.True(t, check.IfNil(cdr)) + require.Nil(t, cdr) }) t.Run("invalid pattern argument, should error", func(t *testing.T) { @@ -89,3 +89,13 @@ func createCfgWithPattern(pattern string) config.StoragePruningConfig { AccountsTrieSkipRemovalCustomPattern: pattern, } } + +func TestCustomDatabaseRemover_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var cdr *customDatabaseRemover + require.True(t, check.IfNil(cdr)) + + cdr, _ = NewCustomDatabaseRemover(createCfgWithPattern("%2,%3")) + require.False(t, check.IfNil(cdr)) +} diff --git a/storage/directoryhandler/directoryReader_test.go b/storage/directoryhandler/directoryReader_test.go index f3a66a30529..425be4462ef 100644 --- a/storage/directoryhandler/directoryReader_test.go +++ b/storage/directoryhandler/directoryReader_test.go @@ -8,6 +8,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) const invalidPath = "\\/\\/\\/\\/" @@ -17,7 +18,7 @@ func TestNewDirectoryReader(t *testing.T) { instance := NewDirectoryReader() assert.NotNil(t, instance) - assert.False(t, check.IfNil(instance)) + assert.NotNil(t, instance) } func TestDirectoryReaderListFilesAsString(t *testing.T) { @@ -155,6 +156,16 @@ func TestDirectoryReaderListAllAsString(t *testing.T) { }) } +func TestDirectoryReader_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var dr *directoryReader + require.True(t, check.IfNil(dr)) + + dr = NewDirectoryReader() + require.False(t, check.IfNil(dr)) +} + func contains(s []string, e string) bool { for _, a := range s { if a == e { diff --git a/storage/disabled/errorDisabledPersister.go b/storage/disabled/errorDisabledPersister.go index 5ea67e4bfb0..9877bc01899 100644 --- a/storage/disabled/errorDisabledPersister.go +++ b/storage/disabled/errorDisabledPersister.go @@ -37,7 +37,7 @@ func (disabled *errorDisabledPersister) Remove(_ []byte) error { return fmt.Errorf("disabledPersister.Remove") } -// Destroy does nothing +// Destroy returns error func (disabled *errorDisabledPersister) Destroy() error { return fmt.Errorf("disabledPersister.Destroy") } diff --git a/storage/disabled/errorDisabledPersister_test.go b/storage/disabled/errorDisabledPersister_test.go index 1e429091026..5d05d3401e2 100644 --- a/storage/disabled/errorDisabledPersister_test.go +++ b/storage/disabled/errorDisabledPersister_test.go @@ -1,18 +1,18 @@ package disabled -import "github.com/multiversx/mx-chain-core-go/core/check" - import ( "testing" + "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewErrorDisabledPersister(t *testing.T) { t.Parallel() disabled := NewErrorDisabledPersister() - assert.False(t, check.IfNil(disabled)) + assert.NotNil(t, disabled) } func TestErrorDisabledPersister_MethodsShouldError(t *testing.T) { @@ -83,9 +83,21 @@ func TestErrorDisabledPersister_RangeKeys(t *testing.T) { }) }) t.Run("handler should not be called", func(t *testing.T) { + t.Parallel() + disabled.RangeKeys(func(key []byte, val []byte) bool { assert.Fail(t, "should have not called the handler") return false }) }) } + +func TestErrorDisabledPersister_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var edp *errorDisabledPersister + require.True(t, check.IfNil(edp)) + + edp = NewErrorDisabledPersister() + require.False(t, check.IfNil(edp)) +} diff --git a/storage/factory/bootstrapDataProvider_test.go b/storage/factory/bootstrapDataProvider_test.go index 22564130082..6f28356f234 100644 --- a/storage/factory/bootstrapDataProvider_test.go +++ b/storage/factory/bootstrapDataProvider_test.go @@ -18,7 +18,7 @@ func TestNewBootstrapDataProvider_NilMarshalizerShouldErr(t *testing.T) { t.Parallel() bdp, err := NewBootstrapDataProvider(nil) - require.True(t, check.IfNil(bdp)) + require.Nil(t, bdp) require.Equal(t, storage.ErrNilMarshalizer, err) } @@ -26,7 +26,7 @@ func TestNewBootstrapDataProvider_OkValuesShouldWork(t *testing.T) { t.Parallel() bdp, err := NewBootstrapDataProvider(&mock.MarshalizerMock{}) - require.False(t, check.IfNil(bdp)) + require.NotNil(t, bdp) require.NoError(t, err) } @@ -93,3 +93,13 @@ func TestBootstrapDataProvider_LoadForPath_ShouldWork(t *testing.T) { require.NotNil(t, storer) require.Equal(t, expectedBD, bootstrapData) } + +func TestBootstrapDataProvider_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var bdp *bootstrapDataProvider + require.True(t, check.IfNil(bdp)) + + bdp, _ = NewBootstrapDataProvider(&mock.MarshalizerMock{}) + require.False(t, check.IfNil(bdp)) +} diff --git a/storage/factory/openStorage.go b/storage/factory/openStorage.go index cfd0e9e3c5b..1d4aa93fe9c 100644 --- a/storage/factory/openStorage.go +++ b/storage/factory/openStorage.go @@ -30,7 +30,7 @@ type openStorageUnits struct { } // NewStorageUnitOpenHandler creates an openStorageUnits component -func NewStorageUnitOpenHandler(args ArgsNewOpenStorageUnits) (*openStorageUnits, error) { +func NewStorageUnitOpenHandler(args ArgsNewOpenStorageUnits) *openStorageUnits { o := &openStorageUnits{ defaultEpochString: args.DefaultEpochString, defaultShardString: args.DefaultShardString, @@ -38,7 +38,7 @@ func NewStorageUnitOpenHandler(args ArgsNewOpenStorageUnits) (*openStorageUnits, latestStorageDataProvider: args.LatestStorageDataProvider, } - return o, nil + return o } // GetMostRecentStorageUnit will open bootstrap storage unit diff --git a/storage/factory/openStorage_test.go b/storage/factory/openStorage_test.go index 147772885b1..195708fee87 100644 --- a/storage/factory/openStorage_test.go +++ b/storage/factory/openStorage_test.go @@ -11,6 +11,7 @@ import ( "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/storage/mock" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func createMockArgsOpenStorageUnits() ArgsNewOpenStorageUnits { @@ -25,10 +26,8 @@ func createMockArgsOpenStorageUnits() ArgsNewOpenStorageUnits { func TestNewStorageUnitOpenHandler(t *testing.T) { t.Parallel() - suoh, err := NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) - - assert.NoError(t, err) - assert.False(t, check.IfNil(suoh)) + suoh := NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) + assert.NotNil(t, suoh) } func TestGetMostUpToDateDirectory(t *testing.T) { @@ -47,7 +46,7 @@ func TestGetMostUpToDateDirectory(t *testing.T) { } }, } - suoh, _ := NewStorageUnitOpenHandler(args) + suoh := NewStorageUnitOpenHandler(args) shardIDsStr := []string{"0", "1"} path := "currPath" @@ -66,7 +65,7 @@ func TestGetMostRecentBootstrapStorageUnit_GetShardsFromDirectoryErr(t *testing. return nil, localErr }, } - suoh, _ := NewStorageUnitOpenHandler(args) + suoh := NewStorageUnitOpenHandler(args) storer, err := suoh.GetMostRecentStorageUnit(config.DBConfig{}) assert.Nil(t, storer) @@ -82,7 +81,7 @@ func TestGetMostRecentBootstrapStorageUnit_CannotGetMostUpToDateDirectory(t *tes return []string{"0", "1"}, nil }, } - suoh, _ := NewStorageUnitOpenHandler(args) + suoh := NewStorageUnitOpenHandler(args) storer, err := suoh.GetMostRecentStorageUnit(config.DBConfig{}) assert.Nil(t, storer) @@ -109,7 +108,7 @@ func TestGetMostRecentBootstrapStorageUnit_CannotCreatePersister(t *testing.T) { }, nil, nil }, } - suoh, _ := NewStorageUnitOpenHandler(args) + suoh := NewStorageUnitOpenHandler(args) storer, err := suoh.GetMostRecentStorageUnit(config.DBConfig{}) assert.Nil(t, storer) @@ -135,7 +134,7 @@ func TestGetMostRecentBootstrapStorageUnit(t *testing.T) { }, nil, nil }, } - suoh, _ := NewStorageUnitOpenHandler(args) + suoh := NewStorageUnitOpenHandler(args) storer, err := suoh.GetMostRecentStorageUnit(generalConfig.BootstrapStorage.DB) assert.NoError(t, err) @@ -152,7 +151,7 @@ func TestStorageUnitOpenHandler_OpenDB(t *testing.T) { return tempDir }, } - suoh, _ := NewStorageUnitOpenHandler(args) + suoh := NewStorageUnitOpenHandler(args) // do not run these in parallel as they are using the same temp dir t.Run("create DB fails, should error", func(t *testing.T) { @@ -169,7 +168,7 @@ func TestStorageUnitOpenHandler_OpenDB(t *testing.T) { assert.NotNil(t, err) expectedErrorString := "not supported db type" assert.Equal(t, expectedErrorString, err.Error()) - assert.True(t, check.IfNil(storerInstance)) + assert.Nil(t, storerInstance) }) t.Run("should work", func(t *testing.T) { dbConfig := config.DBConfig{ @@ -183,9 +182,19 @@ func TestStorageUnitOpenHandler_OpenDB(t *testing.T) { storerInstance, err := suoh.OpenDB(dbConfig, 0, 0) assert.Nil(t, err) - assert.False(t, check.IfNil(storerInstance)) + assert.NotNil(t, storerInstance) _ = storerInstance.Close() }) } + +func TestOldDataCleanerProvider_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var osu *openStorageUnits + require.True(t, check.IfNil(osu)) + + osu = NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) + require.False(t, check.IfNil(osu)) +} diff --git a/storage/factory/persisterFactory_test.go b/storage/factory/persisterFactory_test.go index 3443c5941fe..6b373032622 100644 --- a/storage/factory/persisterFactory_test.go +++ b/storage/factory/persisterFactory_test.go @@ -8,6 +8,7 @@ import ( "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/storage" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func createDBConfig(dbType string) config.DBConfig { @@ -25,7 +26,7 @@ func TestNewPersisterFactory(t *testing.T) { t.Parallel() factoryInstance := NewPersisterFactory(createDBConfig("LvlDB")) - assert.False(t, check.IfNil(factoryInstance)) + assert.NotNil(t, check.IfNil(factoryInstance)) } func TestPersisterFactory_Create(t *testing.T) { @@ -85,6 +86,16 @@ func TestPersisterFactory_CreateDisabled(t *testing.T) { factoryInstance := NewPersisterFactory(createDBConfig("LvlDB")) persisterInstance := factoryInstance.CreateDisabled() - assert.False(t, check.IfNil(persisterInstance)) + assert.NotNil(t, persisterInstance) assert.Equal(t, "*disabled.errorDisabledPersister", fmt.Sprintf("%T", persisterInstance)) } + +func TestPersisterFactory_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var pf *PersisterFactory + require.True(t, check.IfNil(pf)) + + pf = NewPersisterFactory(config.DBConfig{}) + require.False(t, check.IfNil(pf)) +} diff --git a/storage/latestData/latestDataProvider_test.go b/storage/latestData/latestDataProvider_test.go index 8494f2257a2..181deb707e1 100644 --- a/storage/latestData/latestDataProvider_test.go +++ b/storage/latestData/latestDataProvider_test.go @@ -24,7 +24,7 @@ func TestNewLatestDataProvider_ShouldWork(t *testing.T) { t.Parallel() ldp, err := NewLatestDataProvider(getLatestDataProviderArgs()) - require.False(t, check.IfNil(ldp)) + require.NotNil(t, ldp) require.NoError(t, err) } @@ -374,3 +374,13 @@ func TestFullHistoryLoadEpochStartRoundMetachain(t *testing.T) { assert.NoError(t, err) assert.Equal(t, startRound, round) } + +func TestLatestDataProvider_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var ldp *latestDataProvider + require.True(t, check.IfNil(ldp)) + + ldp, _ = NewLatestDataProvider(getLatestDataProviderArgs()) + require.False(t, check.IfNil(ldp)) +} diff --git a/storage/pathmanager/pathManager_test.go b/storage/pathmanager/pathManager_test.go index ae50921a106..9c1e4e92857 100644 --- a/storage/pathmanager/pathManager_test.go +++ b/storage/pathmanager/pathManager_test.go @@ -6,13 +6,14 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/storage/pathmanager" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewPathManager_EmptyPruningPathTemplateShouldErr(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("", "shard_[S]/[I]", "db") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrEmptyPruningPathTemplate, err) } @@ -20,7 +21,7 @@ func TestNewPathManager_EmptyStaticPathTemplateShouldErr(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "", "db") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrEmptyStaticPathTemplate, err) } @@ -28,7 +29,7 @@ func TestNewPathManager_EmptyDBPathTemplateShouldErr(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]/[I]", "") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrInvalidDatabasePath, err) } @@ -36,7 +37,7 @@ func TestNewPathManager_InvalidPruningPathTemplate_NoShardPlaceholder_ShouldErr( t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard/[I]", "shard_[S]/[I]", "db") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrInvalidPruningPathTemplate, err) } @@ -44,7 +45,7 @@ func TestNewPathManager_InvalidPruningPathTemplate_NoEpochPlaceholder_ShouldErr( t.Parallel() pm, err := pathmanager.NewPathManager("epoch/shard_[S]/[I]", "shard_[S]/[I]", "db") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrInvalidPruningPathTemplate, err) } @@ -52,7 +53,7 @@ func TestNewPathManager_InvalidPathPruningTemplate_NoIdentifierPlaceholder_Shoul t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]", "shard_[S]/[I]", "db") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrInvalidPruningPathTemplate, err) } @@ -60,7 +61,7 @@ func TestNewPathManager_InvalidStaticPathTemplate_NoShardPlaceholder_ShouldErr(t t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard/[I]", "db") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrInvalidStaticPathTemplate, err) } @@ -68,7 +69,7 @@ func TestNewPathManager_InvalidStaticPathTemplate_NoIdentifierPlaceholder_Should t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]", "db") - assert.True(t, check.IfNil(pm)) + assert.Nil(t, pm) assert.Equal(t, pathmanager.ErrInvalidStaticPathTemplate, err) } @@ -76,7 +77,7 @@ func TestNewPathManager_OkValsShouldWork(t *testing.T) { t.Parallel() pm, err := pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]/[I]", "db") - assert.False(t, check.IfNil(pm)) + assert.NotNil(t, pm) assert.Nil(t, err) } @@ -168,3 +169,13 @@ func TestPathManager_PathForStatic(t *testing.T) { }) } } + +func TestPathManager_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var pm *pathmanager.PathManager + require.True(t, check.IfNil(pm)) + + pm, _ = pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]/[I]", "db") + require.False(t, check.IfNil(pm)) +} diff --git a/storage/pruning/fullHistoryPruningStorer_test.go b/storage/pruning/fullHistoryPruningStorer_test.go index 24adc389f9b..f86b118e1fe 100644 --- a/storage/pruning/fullHistoryPruningStorer_test.go +++ b/storage/pruning/fullHistoryPruningStorer_test.go @@ -34,7 +34,7 @@ func TestNewFullHistoryPruningStorer_OkValsShouldWork(t *testing.T) { } fhps, err := pruning.NewFullHistoryPruningStorer(fhArgs) - assert.False(t, check.IfNil(fhps)) + assert.NotNil(t, fhps) assert.Nil(t, err) } @@ -383,3 +383,18 @@ func TestFullHistoryPruningStorer_ConcurrentOperations(t *testing.T) { // if the "resource temporary unavailable" occurs, this test will take longer than this to execute require.True(t, elapsedTime < 100*time.Second) } + +func TestFullHistoryPruningStorer_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var fhps *pruning.FullHistoryPruningStorer + require.True(t, check.IfNil(fhps)) + + args := getDefaultArgs() + fhArgs := pruning.FullHistoryStorerArgs{ + StorerArgs: args, + NumOfOldActivePersisters: 10, + } + fhps, _ = pruning.NewFullHistoryPruningStorer(fhArgs) + require.False(t, check.IfNil(fhps)) +} diff --git a/storage/pruning/fullHistoryTriePruningStorer.go b/storage/pruning/fullHistoryTriePruningStorer.go index 092e9aaa1b1..63a0d9f1ba6 100644 --- a/storage/pruning/fullHistoryTriePruningStorer.go +++ b/storage/pruning/fullHistoryTriePruningStorer.go @@ -55,3 +55,8 @@ func (fhtps *fullHistoryTriePruningStorer) PutInEpoch(key []byte, data []byte, e func (fhtps *fullHistoryTriePruningStorer) Close() error { return fhtps.storerWithEpochOperations.Close() } + +// IsInterfaceNil returns true if there is no value under the interface +func (fhtps *fullHistoryTriePruningStorer) IsInterfaceNil() bool { + return fhtps == nil +} diff --git a/storage/pruning/fullHistoryTriePruningStorer_test.go b/storage/pruning/fullHistoryTriePruningStorer_test.go index e9f2196c93d..094cf96ea61 100644 --- a/storage/pruning/fullHistoryTriePruningStorer_test.go +++ b/storage/pruning/fullHistoryTriePruningStorer_test.go @@ -8,6 +8,7 @@ import ( "github.com/multiversx/mx-chain-go/storage/pruning" "github.com/multiversx/mx-chain-go/testscommon/storage" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewFullHistoryTriePruningStorer(t *testing.T) { @@ -20,7 +21,7 @@ func TestNewFullHistoryTriePruningStorer(t *testing.T) { } fhps, err := pruning.NewFullHistoryTriePruningStorer(fhArgs) assert.Nil(t, err) - assert.False(t, check.IfNil(fhps)) + assert.NotNil(t, fhps) } func TestFullHistoryTriePruningStorer_CallsMethodsFromUndelyingFHPS(t *testing.T) { @@ -118,3 +119,18 @@ func TestFullHistoryTriePruningStorer_CallsMethodsFromUndelyingFHPS(t *testing.T assert.True(t, closeCalled) }) } + +func TestFullHistoryTriePruningStorer_IsInterfaceNil(t *testing.T) { + t.Parallel() + + fhtps, _ := pruning.NewFullHistoryTriePruningStorer(pruning.FullHistoryStorerArgs{}) + require.True(t, check.IfNil(fhtps)) + + args := getDefaultArgs() + fhArgs := pruning.FullHistoryStorerArgs{ + StorerArgs: args, + NumOfOldActivePersisters: 10, + } + fhtps, _ = pruning.NewFullHistoryTriePruningStorer(fhArgs) + require.False(t, check.IfNil(fhtps)) +} diff --git a/storage/pruning/persistersTracker_test.go b/storage/pruning/persistersTracker_test.go index 7c19c61f8a1..c524e7e2ce2 100644 --- a/storage/pruning/persistersTracker_test.go +++ b/storage/pruning/persistersTracker_test.go @@ -5,6 +5,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func getArgs() EpochArgs { @@ -19,7 +20,7 @@ func TestNewPersistersTracker(t *testing.T) { t.Parallel() pt := NewPersistersTracker(getArgs()) - assert.False(t, check.IfNil(pt)) + assert.NotNil(t, pt) assert.Equal(t, int64(7), pt.oldestEpochKeep) assert.Equal(t, int64(8), pt.oldestEpochActive) } @@ -43,3 +44,13 @@ func TestPersistersTracker_ShouldClosePersister(t *testing.T) { assert.False(t, pt.ShouldClosePersister(8)) assert.True(t, pt.ShouldClosePersister(7)) } + +func TestPersistersTracker_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var npt *normalPersistersTracker + require.True(t, check.IfNil(npt)) + + npt = NewPersistersTracker(getArgs()) + require.False(t, check.IfNil(npt)) +} diff --git a/storage/pruning/pruningStorer_test.go b/storage/pruning/pruningStorer_test.go index 7b2b9ae47bc..f46cb0cabcd 100644 --- a/storage/pruning/pruningStorer_test.go +++ b/storage/pruning/pruningStorer_test.go @@ -132,7 +132,7 @@ func TestNewPruningStorer_InvalidNumberOfActivePersistersShouldErr(t *testing.T) ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrInvalidNumberOfPersisters, err) } @@ -144,7 +144,7 @@ func TestNewPruningStorer_NilPersistersTrackerShouldErr(t *testing.T) { ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrNilPersistersTracker, err) } @@ -157,7 +157,7 @@ func TestNewPruningStorer_NumEpochKeepLowerThanNumActiveShouldErr(t *testing.T) ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrEpochKeepIsLowerThanNumActive, err) } @@ -168,7 +168,7 @@ func TestNewPruningStorer_NilEpochStartHandlerShouldErr(t *testing.T) { args.Notifier = nil ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrNilEpochStartNotifier, err) } @@ -179,7 +179,7 @@ func TestNewPruningStorer_NilShardCoordinatorShouldErr(t *testing.T) { args.ShardCoordinator = nil ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrNilShardCoordinator, err) } @@ -190,7 +190,7 @@ func TestNewPruningStorer_NilPathManagerShouldErr(t *testing.T) { args.PathManager = nil ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrNilPathManager, err) } @@ -201,7 +201,7 @@ func TestNewPruningStorer_NilOldDataCleanerProviderShouldErr(t *testing.T) { args.OldDataCleanerProvider = nil ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrNilOldDataCleanerProvider, err) } @@ -212,7 +212,7 @@ func TestNewPruningStorer_NilCustomDatabaseRemoverProviderShouldErr(t *testing.T args.CustomDatabaseRemover = nil ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrNilCustomDatabaseRemover, err) } @@ -223,7 +223,7 @@ func TestNewPruningStorer_NilPersisterFactoryShouldErr(t *testing.T) { args.PersisterFactory = nil ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrNilPersisterFactory, err) } @@ -234,7 +234,7 @@ func TestNewPruningStorer_CacheSizeLowerThanBatchSizeShouldErr(t *testing.T) { args.MaxBatchSize = 11 ps, err := pruning.NewPruningStorer(args) - assert.True(t, check.IfNil(ps)) + assert.Nil(t, ps) assert.Equal(t, storage.ErrCacheSizeIsLowerThanBatchSize, err) } @@ -244,7 +244,7 @@ func TestNewPruningStorer_OkValsShouldWork(t *testing.T) { args := getDefaultArgs() ps, err := pruning.NewPruningStorer(args) - assert.False(t, check.IfNil(ps)) + assert.NotNil(t, ps) assert.Nil(t, err) assert.False(t, ps.IsInterfaceNil()) } @@ -1312,3 +1312,14 @@ func TestPruningStorer_RemoveFromCurrentEpoch(t *testing.T) { assert.Nil(t, errGet) assert.Equal(t, value, recovered) } + +func TestPruningStorer_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var ps *pruning.PruningStorer + require.True(t, check.IfNil(ps)) + + args := getDefaultArgs() + ps, _ = pruning.NewPruningStorer(args) + require.False(t, check.IfNil(ps)) +} diff --git a/storage/pruning/triePersistersTracker_test.go b/storage/pruning/triePersistersTracker_test.go index 08b379188ca..89beb2a5da7 100644 --- a/storage/pruning/triePersistersTracker_test.go +++ b/storage/pruning/triePersistersTracker_test.go @@ -8,13 +8,14 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/storage/mock" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestNewTriePersistersTracker(t *testing.T) { t.Parallel() pt := NewTriePersisterTracker(getArgs()) - assert.False(t, check.IfNil(pt)) + assert.NotNil(t, pt) assert.Equal(t, int64(7), pt.oldestEpochKeep) assert.Equal(t, int64(8), pt.oldestEpochActive) assert.Equal(t, 0, pt.numDbsMarkedAsActive) @@ -137,3 +138,13 @@ func TestTriePersistersTracker_ShouldClosePersister(t *testing.T) { assert.False(t, pt.ShouldClosePersister(8)) } + +func TestTriePersistersTracker_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var tpt *triePersistersTracker + require.True(t, check.IfNil(tpt)) + + tpt = NewTriePersisterTracker(getArgs()) + require.False(t, check.IfNil(tpt)) +} diff --git a/storage/pruning/triePruningStorer_test.go b/storage/pruning/triePruningStorer_test.go index c4b04f02f5b..4e1829e0768 100644 --- a/storage/pruning/triePruningStorer_test.go +++ b/storage/pruning/triePruningStorer_test.go @@ -27,7 +27,7 @@ func TestNewTriePruningStorer(t *testing.T) { emptyAndInvalidConfig := pruning.StorerArgs{} tps, err := pruning.NewTriePruningStorer(emptyAndInvalidConfig) require.Error(t, err) - require.True(t, check.IfNil(tps)) + require.Nil(t, tps) }) t.Run("should work", func(t *testing.T) { @@ -36,7 +36,7 @@ func TestNewTriePruningStorer(t *testing.T) { args := getDefaultArgs() ps, err := pruning.NewTriePruningStorer(args) require.NoError(t, err) - require.False(t, check.IfNil(ps)) + require.NotNil(t, ps) }) } @@ -381,3 +381,14 @@ func TestTriePruningStorer_GetLatestStorageEpoch(t *testing.T) { assert.Equal(t, uint32(5), latestEpoch) }) } + +func TestTriePruningStorer_IsInterfaceNil(t *testing.T) { + t.Parallel() + + tps, _ := pruning.NewTriePruningStorer(pruning.StorerArgs{}) + require.True(t, check.IfNil(tps)) + + args := getDefaultArgs() + tps, _ = pruning.NewTriePruningStorer(args) + require.False(t, check.IfNil(tps)) +} diff --git a/storage/storageunit/storageunit_test.go b/storage/storageunit/storageunit_test.go index d66669dc5c9..9b9b125fa7e 100644 --- a/storage/storageunit/storageunit_test.go +++ b/storage/storageunit/storageunit_test.go @@ -7,6 +7,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/storage/mock" "github.com/multiversx/mx-chain-go/storage/storageunit" + "github.com/multiversx/mx-chain-go/testscommon/storage" "github.com/multiversx/mx-chain-storage-go/common" "github.com/multiversx/mx-chain-go/testscommon" @@ -23,21 +24,21 @@ func TestNewStorageUnit(t *testing.T) { t.Parallel() unit, err := storageunit.NewStorageUnit(nil, persister) - assert.True(t, check.IfNil(unit)) + assert.Nil(t, unit) assert.Equal(t, common.ErrNilCacher, err) }) t.Run("nil persister should error", func(t *testing.T) { t.Parallel() unit, err := storageunit.NewStorageUnit(cacher, nil) - assert.True(t, check.IfNil(unit)) + assert.Nil(t, unit) assert.Equal(t, common.ErrNilPersister, err) }) t.Run("should work", func(t *testing.T) { t.Parallel() unit, err := storageunit.NewStorageUnit(cacher, persister) - assert.False(t, check.IfNil(unit)) + assert.NotNil(t, unit) assert.Nil(t, err) }) } @@ -123,7 +124,7 @@ func TestNewStorageUnitFromConf(t *testing.T) { } unit, err := storageunit.NewStorageUnitFromConf(cacheConfig, dbConfig) - assert.True(t, check.IfNil(unit)) + assert.Nil(t, unit) assert.Equal(t, common.ErrNotSupportedCacheType, err) }) t.Run("should work", func(t *testing.T) { @@ -135,7 +136,7 @@ func TestNewStorageUnitFromConf(t *testing.T) { } unit, err := storageunit.NewStorageUnitFromConf(cacheConfig, dbConfig) - assert.False(t, check.IfNil(unit)) + assert.NotNil(t, unit) assert.Nil(t, err) _ = unit.Close() }) @@ -145,7 +146,7 @@ func TestNewNilStorer(t *testing.T) { t.Parallel() unit := storageunit.NewNilStorer() - assert.False(t, check.IfNil(unit)) + assert.NotNil(t, unit) } func TestNewStorageCacherAdapter(t *testing.T) { @@ -153,7 +154,7 @@ func TestNewStorageCacherAdapter(t *testing.T) { cacher := &mock.AdaptedSizedLruCacheStub{} db := &mock.PersisterStub{} - storedDataFactory := &mock.StoredDataFactoryStub{} + storedDataFactory := &storage.StoredDataFactoryStub{} marshaller := &testscommon.MarshalizerStub{} t.Run("nil parameter should error", func(t *testing.T) { diff --git a/storage/txcache/txcache_test.go b/storage/txcache/txcache_test.go index 574b6bd3b7d..cd0ded4f133 100644 --- a/storage/txcache/txcache_test.go +++ b/storage/txcache/txcache_test.go @@ -4,7 +4,6 @@ import ( "strings" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/testscommon/txcachemocks" "github.com/multiversx/mx-chain-storage-go/common" "github.com/stretchr/testify/assert" @@ -27,7 +26,7 @@ func TestNewTxCache(t *testing.T) { } cache, err := NewTxCache(cfg, nil) - assert.True(t, check.IfNil(cache)) + assert.Nil(t, cache) assert.Equal(t, common.ErrNilTxGasHandler, err) }) t.Run("should work", func(t *testing.T) { @@ -48,7 +47,7 @@ func TestNewTxCache(t *testing.T) { MinimumGasPrice: 1, MinimumGasMove: 1, }) - assert.False(t, check.IfNil(cache)) + assert.NotNil(t, cache) assert.Nil(t, err) }) } @@ -57,7 +56,7 @@ func TestNewDisabledCache(t *testing.T) { t.Parallel() cache := NewDisabledCache() - assert.False(t, check.IfNil(cache)) + assert.NotNil(t, cache) } func TestNewCrossTxCache(t *testing.T) { @@ -75,7 +74,7 @@ func TestNewCrossTxCache(t *testing.T) { } cache, err := NewCrossTxCache(cfg) - assert.True(t, check.IfNil(cache)) + assert.Nil(t, cache) assert.ErrorIs(t, err, common.ErrInvalidConfig) assert.True(t, strings.Contains(err.Error(), "config.Name is invalid")) }) @@ -91,7 +90,7 @@ func TestNewCrossTxCache(t *testing.T) { } cache, err := NewCrossTxCache(cfg) - assert.False(t, check.IfNil(cache)) + assert.NotNil(t, cache) assert.Nil(t, err) }) } diff --git a/storage/mock/storedDataFactoryStub.go b/testscommon/storage/storedDataFactoryStub.go similarity index 95% rename from storage/mock/storedDataFactoryStub.go rename to testscommon/storage/storedDataFactoryStub.go index 1716f67b461..ef4d7f91902 100644 --- a/storage/mock/storedDataFactoryStub.go +++ b/testscommon/storage/storedDataFactoryStub.go @@ -1,4 +1,4 @@ -package mock +package storage // StoredDataFactoryStub - type StoredDataFactoryStub struct { From 2b50da17b6f78ae5170065d681499417f9e95e69 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 31 Mar 2023 17:56:30 +0300 Subject: [PATCH 225/335] more tests --- errors/errors.go | 3 + factory/bootstrap/shardingFactory.go | 21 +- factory/bootstrap/shardingFactory_test.go | 661 ++++++++++++++++++++++ testscommon/shuffleOutCloserStub.go | 30 + 4 files changed, 714 insertions(+), 1 deletion(-) create mode 100644 factory/bootstrap/shardingFactory_test.go create mode 100644 testscommon/shuffleOutCloserStub.go diff --git a/errors/errors.go b/errors/errors.go index 1384e01fe9b..2f19ffdfd42 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -544,3 +544,6 @@ var ErrNilGenesisNodesSetupHandler = errors.New("nil genesis nodes setup handler // ErrNilLogger signals that a nil logger instance has been provided var ErrNilLogger = errors.New("nil logger") + +// ErrNilShuffleOutCloser signals that a nil shuffler out closer has been provided +var ErrNilShuffleOutCloser = errors.New("nil shuffler out closer") diff --git a/factory/bootstrap/shardingFactory.go b/factory/bootstrap/shardingFactory.go index 59a706fb2c0..632bd872ec1 100644 --- a/factory/bootstrap/shardingFactory.go +++ b/factory/bootstrap/shardingFactory.go @@ -31,7 +31,7 @@ func CreateShardCoordinator( log logger.Logger, ) (sharding.Coordinator, core.NodeType, error) { if check.IfNil(nodesConfig) { - return nil, "", errErd.ErrNilNodesConfig + return nil, "", errErd.ErrNilGenesisNodesSetupHandler } if pubKey == nil { return nil, "", errErd.ErrNilPublicKey @@ -114,6 +114,21 @@ func CreateNodesCoordinator( enableEpochsHandler common.EnableEpochsHandler, validatorInfoCacher epochStart.ValidatorInfoCacher, ) (nodesCoordinator.NodesCoordinator, error) { + if check.IfNil(nodeShufflerOut) { + return nil, errErd.ErrNilShuffleOutCloser + } + if check.IfNil(nodesConfig) { + return nil, errErd.ErrNilGenesisNodesSetupHandler + } + if check.IfNil(epochStartNotifier) { + return nil, errErd.ErrNilEpochStartNotifier + } + if check.IfNil(pubKey) { + return nil, errErd.ErrNilPublicKey + } + if check.IfNil(bootstrapParameters) { + return nil, errErd.ErrNilBootstrapParamsHandler + } if chanNodeStop == nil { return nil, nodesCoordinator.ErrNilNodeStopChannel } @@ -225,6 +240,10 @@ func CreateNodesShuffleOut( chanStopNodeProcess chan endProcess.ArgEndProcess, ) (factory.ShuffleOutCloser, error) { + if check.IfNil(nodesConfig) { + return nil, errErd.ErrNilGenesisNodesSetupHandler + } + maxThresholdEpochDuration := epochConfig.MaxShuffledOutRestartThreshold if !(maxThresholdEpochDuration >= 0.0 && maxThresholdEpochDuration <= 1.0) { return nil, fmt.Errorf("invalid max threshold for shuffled out handler") diff --git a/factory/bootstrap/shardingFactory_test.go b/factory/bootstrap/shardingFactory_test.go new file mode 100644 index 00000000000..36846a14bea --- /dev/null +++ b/factory/bootstrap/shardingFactory_test.go @@ -0,0 +1,661 @@ +package bootstrap + +import ( + "errors" + "strings" + "testing" + + "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/endProcess" + "github.com/multiversx/mx-chain-go/config" + errErd "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/integrationTests/mock" + "github.com/multiversx/mx-chain-go/sharding" + "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/bootstrapMocks" + "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" + "github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock" + "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" + "github.com/multiversx/mx-chain-go/testscommon/storage" + validatorInfoCacherMocks "github.com/multiversx/mx-chain-go/testscommon/validatorInfoCacher" + "github.com/stretchr/testify/require" +) + +var expectedErr = errors.New("expected error") + +func TestCreateShardCoordinator(t *testing.T) { + t.Parallel() + + t.Run("nil nodes config should error", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator(nil, nil, config.PreferencesConfig{}, nil) + require.Equal(t, errErd.ErrNilGenesisNodesSetupHandler, err) + require.Empty(t, nodeType) + require.True(t, check.IfNil(shardC)) + }) + t.Run("nil pub key should error", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator(&testscommon.NodesSetupStub{}, nil, config.PreferencesConfig{}, nil) + require.Equal(t, errErd.ErrNilPublicKey, err) + require.Empty(t, nodeType) + require.True(t, check.IfNil(shardC)) + }) + t.Run("nil logger should error", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator(&testscommon.NodesSetupStub{}, &cryptoMocks.PublicKeyStub{}, config.PreferencesConfig{}, nil) + require.Equal(t, errErd.ErrNilLogger, err) + require.Empty(t, nodeType) + require.True(t, check.IfNil(shardC)) + }) + t.Run("getShardIdFromNodePubKey fails should error", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator( + &testscommon.NodesSetupStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return nil, expectedErr + }, + }, + config.PreferencesConfig{}, + &testscommon.LoggerStub{}, + ) + require.Equal(t, expectedErr, err) + require.Empty(t, nodeType) + require.True(t, check.IfNil(shardC)) + }) + t.Run("public key not in genesis - ProcessDestinationShardAsObserver fails should error", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator( + &testscommon.NodesSetupStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return nil, sharding.ErrPublicKeyNotFoundInGenesis // force this error here + }, + }, + config.PreferencesConfig{ + DestinationShardAsObserver: "", // ProcessDestinationShardAsObserver fails + }, + &testscommon.LoggerStub{}, + ) + require.NotNil(t, err) + require.Empty(t, nodeType) + require.True(t, check.IfNil(shardC)) + }) + t.Run("public key not in genesis, destination shard disabled - ToByteArray fails should error", func(t *testing.T) { + t.Parallel() + + counter := 0 + shardC, nodeType, err := CreateShardCoordinator( + &testscommon.NodesSetupStub{ + GetShardIDForPubKeyCalled: func(pubKey []byte) (uint32, error) { + return 0, sharding.ErrPublicKeyNotFoundInGenesis // force this error + }, + }, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + counter++ + if counter > 1 { + return nil, expectedErr + } + return []byte("public key"), nil + }, + }, + config.PreferencesConfig{ + DestinationShardAsObserver: "disabled", // force if branch + }, + &testscommon.LoggerStub{}, + ) + require.NotNil(t, err) + require.True(t, errors.Is(err, expectedErr)) + require.Equal(t, core.NodeTypeObserver, nodeType) + require.True(t, check.IfNil(shardC)) + }) + t.Run("public key not in genesis, destination shard disabled - should work", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator( + &testscommon.NodesSetupStub{ + GetShardIDForPubKeyCalled: func(pubKey []byte) (uint32, error) { + return 0, sharding.ErrPublicKeyNotFoundInGenesis // force this error + }, + NumberOfShardsCalled: func() uint32 { + return 2 + }, + }, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return []byte("public key"), nil + }, + }, + config.PreferencesConfig{ + DestinationShardAsObserver: "disabled", // for coverage + }, + &testscommon.LoggerStub{}, + ) + require.Nil(t, err) + require.Equal(t, core.NodeTypeObserver, nodeType) + require.False(t, check.IfNil(shardC)) + }) + t.Run("metachain but 0 shards should error", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator( + &testscommon.NodesSetupStub{ + GetShardIDForPubKeyCalled: func(pubKey []byte) (uint32, error) { + return core.MetachainShardId, nil + }, + NumberOfShardsCalled: func() uint32 { + return 0 + }, + }, + &cryptoMocks.PublicKeyStub{}, + config.PreferencesConfig{}, + &testscommon.LoggerStub{}, + ) + require.NotNil(t, err) + require.Empty(t, nodeType) + require.True(t, check.IfNil(shardC)) + }) + t.Run("metachain should work", func(t *testing.T) { + t.Parallel() + + shardC, nodeType, err := CreateShardCoordinator( + &testscommon.NodesSetupStub{ + GetShardIDForPubKeyCalled: func(pubKey []byte) (uint32, error) { + return core.MetachainShardId, nil + }, + }, + &cryptoMocks.PublicKeyStub{}, + config.PreferencesConfig{}, + &testscommon.LoggerStub{}, + ) + require.Nil(t, err) + require.Equal(t, core.NodeTypeValidator, nodeType) + require.False(t, check.IfNil(shardC)) + }) +} + +func TestCreateNodesCoordinator(t *testing.T) { + t.Parallel() + + t.Run("nil nodes shuffler out closer should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + nil, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{}, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{}, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.Equal(t, errErd.ErrNilShuffleOutCloser, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("nil nodes config should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + nil, + config.PreferencesConfig{}, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{}, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.Equal(t, errErd.ErrNilGenesisNodesSetupHandler, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("nil epoch start notifier should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{}, + nil, + &cryptoMocks.PublicKeyStub{}, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.Equal(t, errErd.ErrNilEpochStartNotifier, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("nil pub key should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{}, + &mock.EpochStartNotifierStub{}, + nil, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.Equal(t, errErd.ErrNilPublicKey, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("nil bootstrap params should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{}, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{}, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + nil, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.Equal(t, errErd.ErrNilBootstrapParamsHandler, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("nil chan should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{}, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{}, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + nil, + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.Equal(t, nodesCoordinator.ErrNilNodeStopChannel, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("invalid shard should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{ + DestinationShardAsObserver: "", + }, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{}, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.NotNil(t, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("destination shard disabled - ToByteArray fails should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{ + DestinationShardAsObserver: "disabled", + }, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return nil, expectedErr + }, + }, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.True(t, errors.Is(err, expectedErr)) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("ToByteArray fails should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{ + DestinationShardAsObserver: "0", + }, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return nil, expectedErr + }, + }, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.True(t, errors.Is(err, expectedErr)) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("NewShuffledOutTrigger fails should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{ + DestinationShardAsObserver: "0", + }, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return nil, nil // no error but nil pub key to force NewShuffledOutTrigger to fail + }, + }, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.NotNil(t, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("NewIndexHashedNodesCoordinator fails should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{ + DestinationShardAsObserver: "0", + }, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return []byte("public key"), nil + }, + }, + nil, // force NewIndexHashedNodesCoordinator to fail + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{}, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.NotNil(t, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("NewIndexHashedNodesCoordinator fails should error", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{ + DestinationShardAsObserver: "0", + }, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return []byte("public key"), nil + }, + }, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + nil, // force NewIndexHashedNodesCoordinatorWithRater to fail + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{ + NodesConfigCalled: func() *nodesCoordinator.NodesCoordinatorRegistry { + return &nodesCoordinator.NodesCoordinatorRegistry{ + EpochsConfig: map[string]*nodesCoordinator.EpochValidators{ + "0": { + EligibleValidators: map[string][]*nodesCoordinator.SerializableValidator{ + "4294967295": { + { + PubKey: []byte("pk1"), + Chances: 1, + Index: 0, + }, + }, + }, + WaitingValidators: map[string][]*nodesCoordinator.SerializableValidator{}, + LeavingValidators: map[string][]*nodesCoordinator.SerializableValidator{}, + }, + }, + CurrentEpoch: 0, + } + }, + }, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.NotNil(t, err) + require.True(t, check.IfNil(nodesC)) + }) + t.Run("should work with nodes config", func(t *testing.T) { + t.Parallel() + + nodesC, err := CreateNodesCoordinator( + &testscommon.ShuffleOutCloserStub{}, + &testscommon.NodesSetupStub{}, + config.PreferencesConfig{ + DestinationShardAsObserver: "disabled", + }, + &mock.EpochStartNotifierStub{}, + &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return []byte("public key"), nil + }, + }, + &testscommon.MarshalizerStub{}, + &testscommon.HasherStub{}, + &testscommon.RaterMock{}, + &storage.StorerStub{}, + &shardingMocks.NodeShufflerMock{}, + 0, + &bootstrapMocks.BootstrapParamsHandlerMock{ + NodesConfigCalled: func() *nodesCoordinator.NodesCoordinatorRegistry { + return &nodesCoordinator.NodesCoordinatorRegistry{ + EpochsConfig: map[string]*nodesCoordinator.EpochValidators{ + "0": { + EligibleValidators: map[string][]*nodesCoordinator.SerializableValidator{ + "4294967295": { + { + PubKey: []byte("pk1"), + Chances: 1, + Index: 0, + }, + }, + }, + WaitingValidators: map[string][]*nodesCoordinator.SerializableValidator{}, + LeavingValidators: map[string][]*nodesCoordinator.SerializableValidator{}, + }, + }, + CurrentEpoch: 0, + } + }, + }, + 0, + make(chan endProcess.ArgEndProcess, 1), + &nodeTypeProviderMock.NodeTypeProviderStub{}, + &testscommon.EnableEpochsHandlerStub{}, + &validatorInfoCacherMocks.ValidatorInfoCacherStub{}, + ) + require.Nil(t, err) + require.False(t, check.IfNil(nodesC)) + }) +} + +func TestCreateNodesShuffleOut(t *testing.T) { + t.Parallel() + + t.Run("nil nodes config should error", func(t *testing.T) { + t.Parallel() + + shuffler, err := CreateNodesShuffleOut(nil, config.EpochStartConfig{}, make(chan endProcess.ArgEndProcess, 1)) + require.Equal(t, errErd.ErrNilGenesisNodesSetupHandler, err) + require.True(t, check.IfNil(shuffler)) + }) + t.Run("invalid MaxShuffledOutRestartThreshold should error", func(t *testing.T) { + t.Parallel() + + shuffler, err := CreateNodesShuffleOut( + &testscommon.NodesSetupStub{}, + config.EpochStartConfig{ + MaxShuffledOutRestartThreshold: 5.0, + }, + make(chan endProcess.ArgEndProcess, 1), + ) + require.True(t, strings.Contains(err.Error(), "invalid max threshold for shuffled out handler")) + require.True(t, check.IfNil(shuffler)) + }) + t.Run("invalid MaxShuffledOutRestartThreshold should error", func(t *testing.T) { + t.Parallel() + + shuffler, err := CreateNodesShuffleOut( + &testscommon.NodesSetupStub{}, + config.EpochStartConfig{ + MinShuffledOutRestartThreshold: 5.0, + }, + make(chan endProcess.ArgEndProcess, 1), + ) + require.True(t, strings.Contains(err.Error(), "invalid min threshold for shuffled out handler")) + require.True(t, check.IfNil(shuffler)) + }) + t.Run("NewShuffleOutCloser fails should error", func(t *testing.T) { + t.Parallel() + + shuffler, err := CreateNodesShuffleOut( + &testscommon.NodesSetupStub{}, + config.EpochStartConfig{}, + nil, // force NewShuffleOutCloser to fail + ) + require.NotNil(t, err) + require.True(t, check.IfNil(shuffler)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + shuffler, err := CreateNodesShuffleOut( + &testscommon.NodesSetupStub{ + GetRoundDurationCalled: func() uint64 { + return 4000 + }, + }, + config.EpochStartConfig{ + RoundsPerEpoch: 200, + MinShuffledOutRestartThreshold: 0.05, + MaxShuffledOutRestartThreshold: 0.25, + }, + make(chan endProcess.ArgEndProcess, 1), + ) + require.Nil(t, err) + require.False(t, check.IfNil(shuffler)) + }) +} diff --git a/testscommon/shuffleOutCloserStub.go b/testscommon/shuffleOutCloserStub.go new file mode 100644 index 00000000000..b2b82e31aec --- /dev/null +++ b/testscommon/shuffleOutCloserStub.go @@ -0,0 +1,30 @@ +package testscommon + +import "github.com/multiversx/mx-chain-core-go/data/endProcess" + +// ShuffleOutCloserStub - +type ShuffleOutCloserStub struct { + EndOfProcessingHandlerCalled func(event endProcess.ArgEndProcess) error + CloseCalled func() error +} + +// EndOfProcessingHandler - +func (stub *ShuffleOutCloserStub) EndOfProcessingHandler(event endProcess.ArgEndProcess) error { + if stub.EndOfProcessingHandlerCalled != nil { + return stub.EndOfProcessingHandlerCalled(event) + } + return nil +} + +// IsInterfaceNil - +func (stub *ShuffleOutCloserStub) IsInterfaceNil() bool { + return stub == nil +} + +// Close - +func (stub *ShuffleOutCloserStub) Close() error { + if stub.CloseCalled != nil { + return stub.CloseCalled() + } + return nil +} From 56bf14189c690e71ad05b869de2e7acad00175b2 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 31 Mar 2023 18:37:09 +0300 Subject: [PATCH 226/335] - refactored the IsInterfaceNil tests --- node/external/logs/logsFacade_test.go | 21 +++++++++++++--- node/external/nodeApiResolver_test.go | 13 +++++++++- .../timemachine/fee/feeComputer_test.go | 17 ++++++++++++- node/node_test.go | 12 ++++++++- .../delegatedListProcessor_test.go | 25 +++++++++++-------- .../directStakedListProcessor_test.go | 25 +++++++++++-------- 6 files changed, 87 insertions(+), 26 deletions(-) diff --git a/node/external/logs/logsFacade_test.go b/node/external/logs/logsFacade_test.go index f277ea811f6..61da4911aa8 100644 --- a/node/external/logs/logsFacade_test.go +++ b/node/external/logs/logsFacade_test.go @@ -23,7 +23,7 @@ func TestNewLogsFacade(t *testing.T) { facade, err := NewLogsFacade(arguments) require.ErrorIs(t, err, errCannotCreateLogsFacade) require.ErrorContains(t, err, core.ErrNilStore.Error()) - require.True(t, check.IfNil(facade)) + require.Nil(t, facade) }) t.Run("NilMarshaller", func(t *testing.T) { @@ -36,7 +36,7 @@ func TestNewLogsFacade(t *testing.T) { facade, err := NewLogsFacade(arguments) require.ErrorIs(t, err, errCannotCreateLogsFacade) require.ErrorContains(t, err, core.ErrNilMarshalizer.Error()) - require.True(t, check.IfNil(facade)) + require.Nil(t, facade) }) t.Run("NilPubKeyConverter", func(t *testing.T) { @@ -49,7 +49,7 @@ func TestNewLogsFacade(t *testing.T) { facade, err := NewLogsFacade(arguments) require.ErrorIs(t, err, errCannotCreateLogsFacade) require.ErrorContains(t, err, core.ErrNilPubkeyConverter.Error()) - require.True(t, check.IfNil(facade)) + require.Nil(t, facade) }) } @@ -144,3 +144,18 @@ func TestLogsFacade_IncludeLogsInTransactionsShouldWork(t *testing.T) { require.Nil(t, transactions[2].Logs) require.Equal(t, "fourth", transactions[3].Logs.Events[0].Identifier) } + +func TestLogsFacade_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var lf *logsFacade + require.True(t, check.IfNil(lf)) + + arguments := ArgsNewLogsFacade{ + StorageService: genericMocks.NewChainStorerMock(7), + Marshaller: &marshal.GogoProtoMarshalizer{}, + PubKeyConverter: testscommon.NewPubkeyConverterMock(32), + } + lf, _ = NewLogsFacade(arguments) + require.False(t, check.IfNil(lf)) +} diff --git a/node/external/nodeApiResolver_test.go b/node/external/nodeApiResolver_test.go index 0f4528ba2c7..2efe85f6db7 100644 --- a/node/external/nodeApiResolver_test.go +++ b/node/external/nodeApiResolver_test.go @@ -127,7 +127,7 @@ func TestNewNodeApiResolver_ShouldWork(t *testing.T) { nar, err := external.NewNodeApiResolver(arg) assert.Nil(t, err) - assert.False(t, check.IfNil(nar)) + assert.NotNil(t, nar) } func TestNodeApiResolver_CloseShouldReturnNil(t *testing.T) { @@ -676,3 +676,14 @@ func TestNodeApiResolver_GetGasConfigs(t *testing.T) { _ = nar.GetGasConfigs() require.True(t, wasCalled) } + +func TestNodeApiResolver_IsInterfaceNil(t *testing.T) { + t.Parallel() + + nar, _ := external.NewNodeApiResolver(external.ArgNodeApiResolver{}) + require.True(t, check.IfNil(nar)) + + arg := createMockArgs() + nar, _ = external.NewNodeApiResolver(arg) + require.False(t, check.IfNil(nar)) +} diff --git a/node/external/timemachine/fee/feeComputer_test.go b/node/external/timemachine/fee/feeComputer_test.go index 14e11af7792..889d0d3a4c9 100644 --- a/node/external/timemachine/fee/feeComputer_test.go +++ b/node/external/timemachine/fee/feeComputer_test.go @@ -24,7 +24,7 @@ func TestNewFeeComputer(t *testing.T) { computer, err := NewFeeComputer(arguments) require.Equal(t, process.ErrNilBuiltInFunctionsCostHandler, err) - require.True(t, check.IfNil(computer)) + require.Nil(t, computer) }) t.Run("AllArgumentsProvided", func(t *testing.T) { @@ -216,3 +216,18 @@ func TestFeeComputer_InHighConcurrency(t *testing.T) { wg.Wait() } + +func TestFullHistoryPruningStorer_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var fc *feeComputer + require.True(t, check.IfNil(fc)) + + arguments := ArgsNewFeeComputer{ + BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, + EconomicsConfig: testscommon.GetEconomicsConfig(), + } + + fc, _ = NewFeeComputer(arguments) + require.False(t, check.IfNil(fc)) +} diff --git a/node/node_test.go b/node/node_test.go index 22e884cecb2..bbc8026ee5f 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -133,7 +133,7 @@ func TestNewNode(t *testing.T) { n, err := node.NewNode() assert.Nil(t, err) - assert.False(t, check.IfNil(n)) + assert.NotNil(t, n) } func TestNewNode_NilOptionShouldError(t *testing.T) { @@ -4504,3 +4504,13 @@ func getDefaultBootstrapComponents() *mainFactoryMocks.BootstrapComponentsStub { HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, } } + +func TestNode_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var n *node.Node + require.True(t, check.IfNil(n)) + + n, _ = node.NewNode() + require.False(t, check.IfNil(n)) +} diff --git a/node/trieIterators/delegatedListProcessor_test.go b/node/trieIterators/delegatedListProcessor_test.go index 090f8ce68e1..81c9209257c 100644 --- a/node/trieIterators/delegatedListProcessor_test.go +++ b/node/trieIterators/delegatedListProcessor_test.go @@ -42,24 +42,19 @@ func TestNewDelegatedListProcessor(t *testing.T) { }, exError: ErrNilAccountsAdapter, }, - { - name: "ShouldWork", - argsFunc: func() ArgTrieIteratorProcessor { - return createMockArgs() - }, - exError: nil, - }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - _, err := NewDelegatedListProcessor(tt.argsFunc()) + dlp, err := NewDelegatedListProcessor(tt.argsFunc()) require.True(t, errors.Is(err, tt.exError)) + require.Nil(t, dlp) }) } - dlp, _ := NewDelegatedListProcessor(createMockArgs()) - assert.False(t, check.IfNil(dlp)) + dlp, err := NewDelegatedListProcessor(createMockArgs()) + require.NotNil(t, dlp) + require.Nil(t, err) } func TestDelegatedListProc_GetDelegatorsListGetAllContractAddressesFailsShouldErr(t *testing.T) { @@ -217,6 +212,16 @@ func TestDelegatedListProc_GetDelegatorsListShouldWork(t *testing.T) { assert.Equal(t, []*api.Delegator{&expectedDelegator1, &expectedDelegator2}, delegatorsValues) } +func TestDelegatedListProcessor_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var dlp *delegatedListProcessor + require.True(t, check.IfNil(dlp)) + + dlp, _ = NewDelegatedListProcessor(createMockArgs()) + require.False(t, check.IfNil(dlp)) +} + func createDelegationScAccount(address []byte, leaves [][]byte, rootHash []byte, timeSleep time.Duration) state.UserAccountHandler { acc, _ := state.NewUserAccount(address) acc.SetDataTrie(&trieMock.TrieStub{ diff --git a/node/trieIterators/directStakedListProcessor_test.go b/node/trieIterators/directStakedListProcessor_test.go index 18b0bba952d..36b4297c8c3 100644 --- a/node/trieIterators/directStakedListProcessor_test.go +++ b/node/trieIterators/directStakedListProcessor_test.go @@ -41,24 +41,19 @@ func TestNewDirectStakedListProcessor(t *testing.T) { }, exError: ErrNilAccountsAdapter, }, - { - name: "ShouldWork", - argsFunc: func() ArgTrieIteratorProcessor { - return createMockArgs() - }, - exError: nil, - }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - _, err := NewDirectStakedListProcessor(tt.argsFunc()) + dslp, err := NewDirectStakedListProcessor(tt.argsFunc()) require.True(t, errors.Is(err, tt.exError)) + require.Nil(t, dslp) }) } - dslp, _ := NewDirectStakedListProcessor(createMockArgs()) - assert.False(t, check.IfNil(dslp)) + dslp, err := NewDirectStakedListProcessor(createMockArgs()) + require.NotNil(t, dslp) + require.Nil(t, err) } func TestDirectStakedListProc_GetDelegatorsListContextShouldTimeout(t *testing.T) { @@ -171,3 +166,13 @@ func createValidatorScAccount(address []byte, leaves [][]byte, rootHash []byte, return acc } + +func TestDirectStakedListProcessor_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var dslp *directStakedListProcessor + require.True(t, check.IfNil(dslp)) + + dslp, _ = NewDirectStakedListProcessor(createMockArgs()) + require.False(t, check.IfNil(dslp)) +} From d4ab76fd0a8678060e725ae2dd2c9c69d6c0e42f Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 31 Mar 2023 18:47:28 +0300 Subject: [PATCH 227/335] - fixed test name --- node/external/timemachine/fee/feeComputer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/external/timemachine/fee/feeComputer_test.go b/node/external/timemachine/fee/feeComputer_test.go index 889d0d3a4c9..33581dbc338 100644 --- a/node/external/timemachine/fee/feeComputer_test.go +++ b/node/external/timemachine/fee/feeComputer_test.go @@ -217,7 +217,7 @@ func TestFeeComputer_InHighConcurrency(t *testing.T) { wg.Wait() } -func TestFullHistoryPruningStorer_IsInterfaceNil(t *testing.T) { +func TestFeeComputer_IsInterfaceNil(t *testing.T) { t.Parallel() var fc *feeComputer From a42b0a66bb9ca260645dcc51d3679e5f0e4e7448 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 31 Mar 2023 20:38:32 +0300 Subject: [PATCH 228/335] refactor part 2 for the IsInterfaceNil tests --- storage/clean/oldDataCleanerProvider_test.go | 5 ++--- storage/clean/oldDatabaseCleaner_test.go | 5 ++--- storage/databaseremover/customDatabaseRemover_test.go | 5 ++--- storage/directoryhandler/directoryReader_test.go | 5 ++--- storage/disabled/errorDisabledPersister_test.go | 5 ++--- storage/disabled/persister_test.go | 3 +-- storage/disabled/storer_test.go | 3 +-- storage/factory/bootstrapDataProvider_test.go | 5 ++--- storage/factory/openStorage_test.go | 5 ++--- storage/factory/persisterFactory_test.go | 6 +++--- storage/latestData/latestDataProvider_test.go | 5 ++--- storage/pathmanager/pathManager_test.go | 5 ++--- storage/pruning/fullHistoryPruningStorer_test.go | 5 ++--- storage/pruning/fullHistoryTriePruningStorer_test.go | 5 ++--- storage/pruning/persistersTracker_test.go | 5 ++--- storage/pruning/pruningStorer_test.go | 5 ++--- storage/pruning/triePersistersTracker_test.go | 5 ++--- storage/pruning/triePruningStorer_test.go | 5 ++--- 18 files changed, 35 insertions(+), 52 deletions(-) diff --git a/storage/clean/oldDataCleanerProvider_test.go b/storage/clean/oldDataCleanerProvider_test.go index 288c18f57a8..9f6b8443de7 100644 --- a/storage/clean/oldDataCleanerProvider_test.go +++ b/storage/clean/oldDataCleanerProvider_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/multiversx/mx-chain-core-go/core" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock" @@ -75,8 +74,8 @@ func TestOldDataCleanerProvider_IsInterfaceNil(t *testing.T) { t.Parallel() var odcp *oldDataCleanerProvider - require.True(t, check.IfNil(odcp)) + require.True(t, odcp.IsInterfaceNil()) odcp, _ = NewOldDataCleanerProvider(&nodeTypeProviderMock.NodeTypeProviderStub{}, config.StoragePruningConfig{}) - require.False(t, check.IfNil(odcp)) + require.False(t, odcp.IsInterfaceNil()) } diff --git a/storage/clean/oldDatabaseCleaner_test.go b/storage/clean/oldDatabaseCleaner_test.go index 108b8c3d5dc..85736c33b18 100644 --- a/storage/clean/oldDatabaseCleaner_test.go +++ b/storage/clean/oldDatabaseCleaner_test.go @@ -4,7 +4,6 @@ import ( "errors" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/epochStart" @@ -284,9 +283,9 @@ func TestOldDatabaseCleaner_IsInterfaceNil(t *testing.T) { t.Parallel() var odc *oldDatabaseCleaner - require.True(t, check.IfNil(odc)) + require.True(t, odc.IsInterfaceNil()) args := createMockArgs() odc, _ = NewOldDatabaseCleaner(args) - require.False(t, check.IfNil(odc)) + require.False(t, odc.IsInterfaceNil()) } diff --git a/storage/databaseremover/customDatabaseRemover_test.go b/storage/databaseremover/customDatabaseRemover_test.go index 8e5f4d75a68..907508d6a89 100644 --- a/storage/databaseremover/customDatabaseRemover_test.go +++ b/storage/databaseremover/customDatabaseRemover_test.go @@ -4,7 +4,6 @@ import ( "errors" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/config" "github.com/stretchr/testify/require" ) @@ -94,8 +93,8 @@ func TestCustomDatabaseRemover_IsInterfaceNil(t *testing.T) { t.Parallel() var cdr *customDatabaseRemover - require.True(t, check.IfNil(cdr)) + require.True(t, cdr.IsInterfaceNil()) cdr, _ = NewCustomDatabaseRemover(createCfgWithPattern("%2,%3")) - require.False(t, check.IfNil(cdr)) + require.False(t, cdr.IsInterfaceNil()) } diff --git a/storage/directoryhandler/directoryReader_test.go b/storage/directoryhandler/directoryReader_test.go index 425be4462ef..fb4a6a077c6 100644 --- a/storage/directoryhandler/directoryReader_test.go +++ b/storage/directoryhandler/directoryReader_test.go @@ -6,7 +6,6 @@ import ( "path/filepath" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -160,10 +159,10 @@ func TestDirectoryReader_IsInterfaceNil(t *testing.T) { t.Parallel() var dr *directoryReader - require.True(t, check.IfNil(dr)) + require.True(t, dr.IsInterfaceNil()) dr = NewDirectoryReader() - require.False(t, check.IfNil(dr)) + require.False(t, dr.IsInterfaceNil()) } func contains(s []string, e string) bool { diff --git a/storage/disabled/errorDisabledPersister_test.go b/storage/disabled/errorDisabledPersister_test.go index 5d05d3401e2..407f7ea4ddd 100644 --- a/storage/disabled/errorDisabledPersister_test.go +++ b/storage/disabled/errorDisabledPersister_test.go @@ -3,7 +3,6 @@ package disabled import ( "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -96,8 +95,8 @@ func TestErrorDisabledPersister_IsInterfaceNil(t *testing.T) { t.Parallel() var edp *errorDisabledPersister - require.True(t, check.IfNil(edp)) + require.True(t, edp.IsInterfaceNil()) edp = NewErrorDisabledPersister() - require.False(t, check.IfNil(edp)) + require.False(t, edp.IsInterfaceNil()) } diff --git a/storage/disabled/persister_test.go b/storage/disabled/persister_test.go index aee9666f98e..2b8e53d5ef1 100644 --- a/storage/disabled/persister_test.go +++ b/storage/disabled/persister_test.go @@ -4,7 +4,6 @@ import ( "fmt" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/storage" "github.com/stretchr/testify/assert" ) @@ -20,7 +19,7 @@ func TestPersister_MethodsDoNotPanic(t *testing.T) { }() p := NewPersister() - assert.False(t, check.IfNil(p)) + assert.False(t, p.IsInterfaceNil()) assert.Nil(t, p.Put(nil, nil)) assert.Equal(t, storage.ErrKeyNotFound, p.Has(nil)) assert.Nil(t, p.Close()) diff --git a/storage/disabled/storer_test.go b/storage/disabled/storer_test.go index f7dd2a8a840..95fb7811fad 100644 --- a/storage/disabled/storer_test.go +++ b/storage/disabled/storer_test.go @@ -4,7 +4,6 @@ import ( "fmt" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-storage-go/common" "github.com/stretchr/testify/assert" ) @@ -20,7 +19,7 @@ func TestStorer_MethodsDoNotPanic(t *testing.T) { }() s := NewStorer() - assert.False(t, check.IfNil(s)) + assert.False(t, s.IsInterfaceNil()) assert.Nil(t, s.Put(nil, nil)) assert.Nil(t, s.PutInEpoch(nil, nil, 0)) assert.Nil(t, s.Has(nil)) diff --git a/storage/factory/bootstrapDataProvider_test.go b/storage/factory/bootstrapDataProvider_test.go index 6f28356f234..46e622fa980 100644 --- a/storage/factory/bootstrapDataProvider_test.go +++ b/storage/factory/bootstrapDataProvider_test.go @@ -5,7 +5,6 @@ import ( "strconv" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/process/block/bootstrapStorage" "github.com/multiversx/mx-chain-go/storage" @@ -98,8 +97,8 @@ func TestBootstrapDataProvider_IsInterfaceNil(t *testing.T) { t.Parallel() var bdp *bootstrapDataProvider - require.True(t, check.IfNil(bdp)) + require.True(t, bdp.IsInterfaceNil()) bdp, _ = NewBootstrapDataProvider(&mock.MarshalizerMock{}) - require.False(t, check.IfNil(bdp)) + require.False(t, bdp.IsInterfaceNil()) } diff --git a/storage/factory/openStorage_test.go b/storage/factory/openStorage_test.go index 195708fee87..78bee78c57e 100644 --- a/storage/factory/openStorage_test.go +++ b/storage/factory/openStorage_test.go @@ -5,7 +5,6 @@ import ( "strings" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/process/block/bootstrapStorage" "github.com/multiversx/mx-chain-go/storage" @@ -193,8 +192,8 @@ func TestOldDataCleanerProvider_IsInterfaceNil(t *testing.T) { t.Parallel() var osu *openStorageUnits - require.True(t, check.IfNil(osu)) + require.True(t, osu.IsInterfaceNil()) osu = NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) - require.False(t, check.IfNil(osu)) + require.False(t, osu.IsInterfaceNil()) } diff --git a/storage/factory/persisterFactory_test.go b/storage/factory/persisterFactory_test.go index 6b373032622..3aee6a0132e 100644 --- a/storage/factory/persisterFactory_test.go +++ b/storage/factory/persisterFactory_test.go @@ -26,7 +26,7 @@ func TestNewPersisterFactory(t *testing.T) { t.Parallel() factoryInstance := NewPersisterFactory(createDBConfig("LvlDB")) - assert.NotNil(t, check.IfNil(factoryInstance)) + assert.NotNil(t, factoryInstance) } func TestPersisterFactory_Create(t *testing.T) { @@ -94,8 +94,8 @@ func TestPersisterFactory_IsInterfaceNil(t *testing.T) { t.Parallel() var pf *PersisterFactory - require.True(t, check.IfNil(pf)) + require.True(t, pf.IsInterfaceNil()) pf = NewPersisterFactory(config.DBConfig{}) - require.False(t, check.IfNil(pf)) + require.False(t, pf.IsInterfaceNil()) } diff --git a/storage/latestData/latestDataProvider_test.go b/storage/latestData/latestDataProvider_test.go index 181deb707e1..035a521b8a2 100644 --- a/storage/latestData/latestDataProvider_test.go +++ b/storage/latestData/latestDataProvider_test.go @@ -8,7 +8,6 @@ import ( "testing" "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/config" @@ -379,8 +378,8 @@ func TestLatestDataProvider_IsInterfaceNil(t *testing.T) { t.Parallel() var ldp *latestDataProvider - require.True(t, check.IfNil(ldp)) + require.True(t, ldp.IsInterfaceNil()) ldp, _ = NewLatestDataProvider(getLatestDataProviderArgs()) - require.False(t, check.IfNil(ldp)) + require.False(t, ldp.IsInterfaceNil()) } diff --git a/storage/pathmanager/pathManager_test.go b/storage/pathmanager/pathManager_test.go index 9c1e4e92857..c29c9f01b2c 100644 --- a/storage/pathmanager/pathManager_test.go +++ b/storage/pathmanager/pathManager_test.go @@ -3,7 +3,6 @@ package pathmanager_test import ( "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/storage/pathmanager" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -174,8 +173,8 @@ func TestPathManager_IsInterfaceNil(t *testing.T) { t.Parallel() var pm *pathmanager.PathManager - require.True(t, check.IfNil(pm)) + require.True(t, pm.IsInterfaceNil()) pm, _ = pathmanager.NewPathManager("epoch_[E]/shard_[S]/[I]", "shard_[S]/[I]", "db") - require.False(t, check.IfNil(pm)) + require.False(t, pm.IsInterfaceNil()) } diff --git a/storage/pruning/fullHistoryPruningStorer_test.go b/storage/pruning/fullHistoryPruningStorer_test.go index f86b118e1fe..62c2d0c3b8c 100644 --- a/storage/pruning/fullHistoryPruningStorer_test.go +++ b/storage/pruning/fullHistoryPruningStorer_test.go @@ -10,7 +10,6 @@ import ( "testing" "time" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/core/random" storageCore "github.com/multiversx/mx-chain-core-go/storage" "github.com/multiversx/mx-chain-go/config" @@ -388,7 +387,7 @@ func TestFullHistoryPruningStorer_IsInterfaceNil(t *testing.T) { t.Parallel() var fhps *pruning.FullHistoryPruningStorer - require.True(t, check.IfNil(fhps)) + require.True(t, fhps.IsInterfaceNil()) args := getDefaultArgs() fhArgs := pruning.FullHistoryStorerArgs{ @@ -396,5 +395,5 @@ func TestFullHistoryPruningStorer_IsInterfaceNil(t *testing.T) { NumOfOldActivePersisters: 10, } fhps, _ = pruning.NewFullHistoryPruningStorer(fhArgs) - require.False(t, check.IfNil(fhps)) + require.False(t, fhps.IsInterfaceNil()) } diff --git a/storage/pruning/fullHistoryTriePruningStorer_test.go b/storage/pruning/fullHistoryTriePruningStorer_test.go index 094cf96ea61..9994c35c464 100644 --- a/storage/pruning/fullHistoryTriePruningStorer_test.go +++ b/storage/pruning/fullHistoryTriePruningStorer_test.go @@ -3,7 +3,6 @@ package pruning_test import ( "testing" - "github.com/multiversx/mx-chain-core-go/core/check" storageCore "github.com/multiversx/mx-chain-core-go/storage" "github.com/multiversx/mx-chain-go/storage/pruning" "github.com/multiversx/mx-chain-go/testscommon/storage" @@ -124,7 +123,7 @@ func TestFullHistoryTriePruningStorer_IsInterfaceNil(t *testing.T) { t.Parallel() fhtps, _ := pruning.NewFullHistoryTriePruningStorer(pruning.FullHistoryStorerArgs{}) - require.True(t, check.IfNil(fhtps)) + require.True(t, fhtps.IsInterfaceNil()) args := getDefaultArgs() fhArgs := pruning.FullHistoryStorerArgs{ @@ -132,5 +131,5 @@ func TestFullHistoryTriePruningStorer_IsInterfaceNil(t *testing.T) { NumOfOldActivePersisters: 10, } fhtps, _ = pruning.NewFullHistoryTriePruningStorer(fhArgs) - require.False(t, check.IfNil(fhtps)) + require.False(t, fhtps.IsInterfaceNil()) } diff --git a/storage/pruning/persistersTracker_test.go b/storage/pruning/persistersTracker_test.go index c524e7e2ce2..0c19e51ce8a 100644 --- a/storage/pruning/persistersTracker_test.go +++ b/storage/pruning/persistersTracker_test.go @@ -3,7 +3,6 @@ package pruning import ( "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -49,8 +48,8 @@ func TestPersistersTracker_IsInterfaceNil(t *testing.T) { t.Parallel() var npt *normalPersistersTracker - require.True(t, check.IfNil(npt)) + require.True(t, npt.IsInterfaceNil()) npt = NewPersistersTracker(getArgs()) - require.False(t, check.IfNil(npt)) + require.False(t, npt.IsInterfaceNil()) } diff --git a/storage/pruning/pruningStorer_test.go b/storage/pruning/pruningStorer_test.go index f46cb0cabcd..113eaf6ab26 100644 --- a/storage/pruning/pruningStorer_test.go +++ b/storage/pruning/pruningStorer_test.go @@ -15,7 +15,6 @@ import ( "testing" "time" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/core/random" "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-go/config" @@ -1317,9 +1316,9 @@ func TestPruningStorer_IsInterfaceNil(t *testing.T) { t.Parallel() var ps *pruning.PruningStorer - require.True(t, check.IfNil(ps)) + require.True(t, ps.IsInterfaceNil()) args := getDefaultArgs() ps, _ = pruning.NewPruningStorer(args) - require.False(t, check.IfNil(ps)) + require.False(t, ps.IsInterfaceNil()) } diff --git a/storage/pruning/triePersistersTracker_test.go b/storage/pruning/triePersistersTracker_test.go index 89beb2a5da7..a813b4c4d77 100644 --- a/storage/pruning/triePersistersTracker_test.go +++ b/storage/pruning/triePersistersTracker_test.go @@ -4,7 +4,6 @@ import ( "bytes" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/storage/mock" "github.com/stretchr/testify/assert" @@ -143,8 +142,8 @@ func TestTriePersistersTracker_IsInterfaceNil(t *testing.T) { t.Parallel() var tpt *triePersistersTracker - require.True(t, check.IfNil(tpt)) + require.True(t, tpt.IsInterfaceNil()) tpt = NewTriePersisterTracker(getArgs()) - require.False(t, check.IfNil(tpt)) + require.False(t, tpt.IsInterfaceNil()) } diff --git a/storage/pruning/triePruningStorer_test.go b/storage/pruning/triePruningStorer_test.go index 4e1829e0768..e5544fd4147 100644 --- a/storage/pruning/triePruningStorer_test.go +++ b/storage/pruning/triePruningStorer_test.go @@ -4,7 +4,6 @@ import ( "strings" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/storage/mock" @@ -386,9 +385,9 @@ func TestTriePruningStorer_IsInterfaceNil(t *testing.T) { t.Parallel() tps, _ := pruning.NewTriePruningStorer(pruning.StorerArgs{}) - require.True(t, check.IfNil(tps)) + require.True(t, tps.IsInterfaceNil()) args := getDefaultArgs() tps, _ = pruning.NewTriePruningStorer(args) - require.False(t, check.IfNil(tps)) + require.False(t, tps.IsInterfaceNil()) } From b9953f4242eaaf5b34b31127ee01cf117caaaea6 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 31 Mar 2023 20:43:54 +0300 Subject: [PATCH 229/335] refactor part 2 for the IsInterfaceNil tests --- node/external/logs/logsFacade_test.go | 5 ++--- node/external/nodeApiResolver_test.go | 5 ++--- node/external/timemachine/fee/feeComputer_test.go | 5 ++--- node/node_test.go | 4 ++-- node/trieIterators/delegatedListProcessor_test.go | 5 ++--- node/trieIterators/directStakedListProcessor_test.go | 5 ++--- 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/node/external/logs/logsFacade_test.go b/node/external/logs/logsFacade_test.go index 61da4911aa8..21d11f99c59 100644 --- a/node/external/logs/logsFacade_test.go +++ b/node/external/logs/logsFacade_test.go @@ -4,7 +4,6 @@ import ( "testing" "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/transaction" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/testscommon" @@ -149,7 +148,7 @@ func TestLogsFacade_IsInterfaceNil(t *testing.T) { t.Parallel() var lf *logsFacade - require.True(t, check.IfNil(lf)) + require.True(t, lf.IsInterfaceNil()) arguments := ArgsNewLogsFacade{ StorageService: genericMocks.NewChainStorerMock(7), @@ -157,5 +156,5 @@ func TestLogsFacade_IsInterfaceNil(t *testing.T) { PubKeyConverter: testscommon.NewPubkeyConverterMock(32), } lf, _ = NewLogsFacade(arguments) - require.False(t, check.IfNil(lf)) + require.False(t, lf.IsInterfaceNil()) } diff --git a/node/external/nodeApiResolver_test.go b/node/external/nodeApiResolver_test.go index 2efe85f6db7..1132c7bbdcf 100644 --- a/node/external/nodeApiResolver_test.go +++ b/node/external/nodeApiResolver_test.go @@ -7,7 +7,6 @@ import ( "math/big" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/common" @@ -681,9 +680,9 @@ func TestNodeApiResolver_IsInterfaceNil(t *testing.T) { t.Parallel() nar, _ := external.NewNodeApiResolver(external.ArgNodeApiResolver{}) - require.True(t, check.IfNil(nar)) + require.True(t, nar.IsInterfaceNil()) arg := createMockArgs() nar, _ = external.NewNodeApiResolver(arg) - require.False(t, check.IfNil(nar)) + require.False(t, nar.IsInterfaceNil()) } diff --git a/node/external/timemachine/fee/feeComputer_test.go b/node/external/timemachine/fee/feeComputer_test.go index 33581dbc338..fb91db19049 100644 --- a/node/external/timemachine/fee/feeComputer_test.go +++ b/node/external/timemachine/fee/feeComputer_test.go @@ -6,7 +6,6 @@ import ( "sync" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/data/transaction" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/process" @@ -221,7 +220,7 @@ func TestFeeComputer_IsInterfaceNil(t *testing.T) { t.Parallel() var fc *feeComputer - require.True(t, check.IfNil(fc)) + require.True(t, fc.IsInterfaceNil()) arguments := ArgsNewFeeComputer{ BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, @@ -229,5 +228,5 @@ func TestFeeComputer_IsInterfaceNil(t *testing.T) { } fc, _ = NewFeeComputer(arguments) - require.False(t, check.IfNil(fc)) + require.False(t, fc.IsInterfaceNil()) } diff --git a/node/node_test.go b/node/node_test.go index bbc8026ee5f..057bc262b17 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -4509,8 +4509,8 @@ func TestNode_IsInterfaceNil(t *testing.T) { t.Parallel() var n *node.Node - require.True(t, check.IfNil(n)) + require.True(t, n.IsInterfaceNil()) n, _ = node.NewNode() - require.False(t, check.IfNil(n)) + require.False(t, n.IsInterfaceNil()) } diff --git a/node/trieIterators/delegatedListProcessor_test.go b/node/trieIterators/delegatedListProcessor_test.go index 81c9209257c..c51b926ce59 100644 --- a/node/trieIterators/delegatedListProcessor_test.go +++ b/node/trieIterators/delegatedListProcessor_test.go @@ -9,7 +9,6 @@ import ( "testing" "time" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/core/keyValStorage" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-go/common" @@ -216,10 +215,10 @@ func TestDelegatedListProcessor_IsInterfaceNil(t *testing.T) { t.Parallel() var dlp *delegatedListProcessor - require.True(t, check.IfNil(dlp)) + require.True(t, dlp.IsInterfaceNil()) dlp, _ = NewDelegatedListProcessor(createMockArgs()) - require.False(t, check.IfNil(dlp)) + require.False(t, dlp.IsInterfaceNil()) } func createDelegationScAccount(address []byte, leaves [][]byte, rootHash []byte, timeSleep time.Duration) state.UserAccountHandler { diff --git a/node/trieIterators/directStakedListProcessor_test.go b/node/trieIterators/directStakedListProcessor_test.go index 36b4297c8c3..a56311d9108 100644 --- a/node/trieIterators/directStakedListProcessor_test.go +++ b/node/trieIterators/directStakedListProcessor_test.go @@ -9,7 +9,6 @@ import ( "testing" "time" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/core/keyValStorage" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-go/common" @@ -171,8 +170,8 @@ func TestDirectStakedListProcessor_IsInterfaceNil(t *testing.T) { t.Parallel() var dslp *directStakedListProcessor - require.True(t, check.IfNil(dslp)) + require.True(t, dslp.IsInterfaceNil()) dslp, _ = NewDirectStakedListProcessor(createMockArgs()) - require.False(t, check.IfNil(dslp)) + require.False(t, dslp.IsInterfaceNil()) } From a709d26a7783097664b42ba914213de61c5856b0 Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 3 Apr 2023 10:32:11 +0300 Subject: [PATCH 230/335] - fixed test name --- storage/pruning/triePruningStorer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/pruning/triePruningStorer_test.go b/storage/pruning/triePruningStorer_test.go index e5544fd4147..b3deebb98c2 100644 --- a/storage/pruning/triePruningStorer_test.go +++ b/storage/pruning/triePruningStorer_test.go @@ -370,7 +370,7 @@ func TestTriePruningStorer_GetLatestStorageEpoch(t *testing.T) { assert.Equal(t, expectedErrString, err.Error()) assert.Zero(t, latestEpoch) }) - t.Run("no active db should error", func(t *testing.T) { + t.Run("with at least one active DB should work", func(t *testing.T) { t.Parallel() tps, _ := pruning.NewTriePruningStorer(args) From a19d18ad0666d0fc8ffc9c5b3e04f5492418bc1c Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 3 Apr 2023 12:38:44 +0300 Subject: [PATCH 231/335] updated tests for IsInterfaceNil --- .../bootstrapComponentsHandler_test.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/factory/bootstrap/bootstrapComponentsHandler_test.go b/factory/bootstrap/bootstrapComponentsHandler_test.go index 54b8fec1ef9..cf1a7a83a1e 100644 --- a/factory/bootstrap/bootstrapComponentsHandler_test.go +++ b/factory/bootstrap/bootstrapComponentsHandler_test.go @@ -4,7 +4,6 @@ import ( "errors" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" errorsErd "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/factory/bootstrap" @@ -30,7 +29,7 @@ func TestNewBootstrapComponentsFactory_NilFactory(t *testing.T) { mbc, err := bootstrap.NewManagedBootstrapComponents(nil) - require.True(t, check.IfNil(mbc)) + require.Nil(t, mbc) require.Equal(t, errorsErd.ErrNilBootstrapComponentsFactory, err) } @@ -64,7 +63,7 @@ func TestManagedBootstrapComponents_MethodsCreate(t *testing.T) { assert.NotNil(t, mbc.EpochStartBootstrapper()) params := mbc.EpochBootstrapParams() - assert.False(t, check.IfNil(params)) + require.NotNil(t, mbc) assert.Equal(t, uint32(0), params.Epoch()) assert.Equal(t, uint32(0), params.SelfShardID()) assert.Equal(t, uint32(2), params.NumOfShards()) @@ -102,3 +101,15 @@ func TestManagedBootstrapComponents_Close(t *testing.T) { _ = mbc.Close() require.Nil(t, mbc.EpochBootstrapParams()) } + +func TestManagedBootstrapComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + args := componentsMock.GetBootStrapFactoryArgs() + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) + mbc, _ := bootstrap.NewManagedBootstrapComponents(nil) + require.True(t, mbc.IsInterfaceNil()) + + mbc, _ = bootstrap.NewManagedBootstrapComponents(bcf) + require.False(t, mbc.IsInterfaceNil()) +} From 5acd29c451456b58428d6cac9ce20401a3f06187 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Mon, 3 Apr 2023 12:45:29 +0300 Subject: [PATCH 232/335] fix integration test after merge --- integrationTests/vm/txsFee/asyncESDT_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/txsFee/asyncESDT_test.go b/integrationTests/vm/txsFee/asyncESDT_test.go index a4318ad54f0..1f802023506 100644 --- a/integrationTests/vm/txsFee/asyncESDT_test.go +++ b/integrationTests/vm/txsFee/asyncESDT_test.go @@ -13,6 +13,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/errChan" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/integrationTests/vm" "github.com/multiversx/mx-chain-go/integrationTests/vm/txsFee/utils" @@ -542,7 +543,7 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { leaves := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, 1), - ErrChan: make(chan error, 1), + ErrChan: errChan.NewErrChanWrapper(), } err = testContext.Accounts.GetAllLeaves(leaves, context.Background(), roothash) require.Nil(t, err) @@ -551,6 +552,6 @@ func TestAsyncESDTCallForThirdContractShouldWork(t *testing.T) { // do nothing, just iterate } - err = <-leaves.ErrChan + err = leaves.ErrChan.ReadFromChanNonBlocking() require.Nil(t, err) } From c4c5b268dcf2539165148f9d55ede6b7070ceba5 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 3 Apr 2023 13:37:32 +0300 Subject: [PATCH 233/335] improved coverage on factory/core and factory/crypto --- factory/core/coreComponentsHandler_test.go | 178 +++++++++++----- factory/core/coreComponents_test.go | 110 ++++++++++ factory/crypto/cryptoComponents.go | 10 + factory/crypto/cryptoComponentsHandler.go | 4 + .../crypto/cryptoComponentsHandler_test.go | 200 +++++++++++------- 5 files changed, 371 insertions(+), 131 deletions(-) diff --git a/factory/core/coreComponentsHandler_test.go b/factory/core/coreComponentsHandler_test.go index 7c5e3f3ac51..daffc8d6e24 100644 --- a/factory/core/coreComponentsHandler_test.go +++ b/factory/core/coreComponentsHandler_test.go @@ -2,80 +2,144 @@ package core_test import ( "testing" + "time" "github.com/multiversx/mx-chain-go/config" + errErd "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" coreComp "github.com/multiversx/mx-chain-go/factory/core" + "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" ) -// ------------ Test ManagedCoreComponents -------------------- -func TestManagedCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestManagedCoreComponents(t *testing.T) { t.Parallel() - coreArgs := componentsMock.GetCoreArgs() - coreArgs.Config.Marshalizer = config.MarshalizerConfig{ - Type: "invalid_marshalizer_type", - SizeCheckDelta: 0, - } - coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) - managedCoreComponents, err := coreComp.NewManagedCoreComponents(coreComponentsFactory) - require.NoError(t, err) - err = managedCoreComponents.Create() - require.Error(t, err) - require.Nil(t, managedCoreComponents.InternalMarshalizer()) -} + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() -func TestManagedCoreComponents_CreateShouldWork(t *testing.T) { - t.Parallel() + managedCoreComponents, err := coreComp.NewManagedCoreComponents(nil) + require.Equal(t, errErd.ErrNilCoreComponentsFactory, err) + require.Nil(t, managedCoreComponents) + }) + t.Run("invalid args should error", func(t *testing.T) { + t.Parallel() - coreArgs := componentsMock.GetCoreArgs() - coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) - managedCoreComponents, err := coreComp.NewManagedCoreComponents(coreComponentsFactory) - require.NoError(t, err) - require.Nil(t, managedCoreComponents.Hasher()) - require.Nil(t, managedCoreComponents.InternalMarshalizer()) - require.Nil(t, managedCoreComponents.VmMarshalizer()) - require.Nil(t, managedCoreComponents.TxMarshalizer()) - require.Nil(t, managedCoreComponents.Uint64ByteSliceConverter()) - require.Nil(t, managedCoreComponents.AddressPubKeyConverter()) - require.Nil(t, managedCoreComponents.ValidatorPubKeyConverter()) - require.Nil(t, managedCoreComponents.PathHandler()) - require.Equal(t, "", managedCoreComponents.ChainID()) - require.Nil(t, managedCoreComponents.AddressPubKeyConverter()) - require.Nil(t, managedCoreComponents.EnableRoundsHandler()) - require.Nil(t, managedCoreComponents.WasmVMChangeLocker()) - require.Nil(t, managedCoreComponents.ProcessStatusHandler()) - require.True(t, len(managedCoreComponents.HardforkTriggerPubKey()) == 0) + coreArgs := componentsMock.GetCoreArgs() + coreArgs.Config.Marshalizer = config.MarshalizerConfig{ + Type: "invalid_marshalizer_type", + SizeCheckDelta: 0, + } + coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) + managedCoreComponents, err := coreComp.NewManagedCoreComponents(coreComponentsFactory) + require.NoError(t, err) + err = managedCoreComponents.Create() + require.Error(t, err) + require.Nil(t, managedCoreComponents.InternalMarshalizer()) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() - err = managedCoreComponents.Create() - require.NoError(t, err) - require.NotNil(t, managedCoreComponents.Hasher()) - require.NotNil(t, managedCoreComponents.InternalMarshalizer()) - require.NotNil(t, managedCoreComponents.VmMarshalizer()) - require.NotNil(t, managedCoreComponents.TxMarshalizer()) - require.NotNil(t, managedCoreComponents.Uint64ByteSliceConverter()) - require.NotNil(t, managedCoreComponents.AddressPubKeyConverter()) - require.NotNil(t, managedCoreComponents.ValidatorPubKeyConverter()) - require.NotNil(t, managedCoreComponents.PathHandler()) - require.NotEqual(t, "", managedCoreComponents.ChainID()) - require.NotNil(t, managedCoreComponents.AddressPubKeyConverter()) - require.NotNil(t, managedCoreComponents.EnableRoundsHandler()) - require.NotNil(t, managedCoreComponents.WasmVMChangeLocker()) - require.NotNil(t, managedCoreComponents.ProcessStatusHandler()) - expectedBytes, _ := managedCoreComponents.ValidatorPubKeyConverter().Decode(componentsMock.DummyPk) - require.Equal(t, expectedBytes, managedCoreComponents.HardforkTriggerPubKey()) + coreArgs := componentsMock.GetCoreArgs() + coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) + managedCoreComponents, err := coreComp.NewManagedCoreComponents(coreComponentsFactory) + require.NoError(t, err) + require.Equal(t, errErd.ErrNilCoreComponents, managedCoreComponents.CheckSubcomponents()) + require.Nil(t, managedCoreComponents.Hasher()) + require.Nil(t, managedCoreComponents.InternalMarshalizer()) + require.Nil(t, managedCoreComponents.VmMarshalizer()) + require.Nil(t, managedCoreComponents.TxMarshalizer()) + require.Nil(t, managedCoreComponents.Uint64ByteSliceConverter()) + require.Nil(t, managedCoreComponents.AddressPubKeyConverter()) + require.Nil(t, managedCoreComponents.ValidatorPubKeyConverter()) + require.Nil(t, managedCoreComponents.PathHandler()) + require.Equal(t, "", managedCoreComponents.ChainID()) + require.Nil(t, managedCoreComponents.AddressPubKeyConverter()) + require.Nil(t, managedCoreComponents.EnableRoundsHandler()) + require.Nil(t, managedCoreComponents.WasmVMChangeLocker()) + require.Nil(t, managedCoreComponents.ProcessStatusHandler()) + require.True(t, len(managedCoreComponents.HardforkTriggerPubKey()) == 0) + require.Nil(t, managedCoreComponents.TxSignHasher()) + require.Zero(t, managedCoreComponents.MinTransactionVersion()) + require.Nil(t, managedCoreComponents.TxVersionChecker()) + require.Zero(t, managedCoreComponents.EncodedAddressLen()) + require.Nil(t, managedCoreComponents.AlarmScheduler()) + require.Nil(t, managedCoreComponents.SyncTimer()) + require.Equal(t, time.Time{}, managedCoreComponents.GenesisTime()) + require.Nil(t, managedCoreComponents.Watchdog()) + require.Nil(t, managedCoreComponents.EconomicsData()) + require.Nil(t, managedCoreComponents.APIEconomicsData()) + require.Nil(t, managedCoreComponents.RatingsData()) + require.Nil(t, managedCoreComponents.Rater()) + require.Nil(t, managedCoreComponents.GenesisNodesSetup()) + require.Nil(t, managedCoreComponents.RoundHandler()) + require.Nil(t, managedCoreComponents.NodesShuffler()) + require.Nil(t, managedCoreComponents.EpochNotifier()) + require.Nil(t, managedCoreComponents.EpochStartNotifierWithConfirm()) + require.Nil(t, managedCoreComponents.ChanStopNodeProcess()) + require.Nil(t, managedCoreComponents.NodeTypeProvider()) + require.Nil(t, managedCoreComponents.EnableEpochsHandler()) + + err = managedCoreComponents.Create() + require.NoError(t, err) + require.Nil(t, managedCoreComponents.CheckSubcomponents()) + require.NotNil(t, managedCoreComponents.Hasher()) + require.NotNil(t, managedCoreComponents.InternalMarshalizer()) + require.NotNil(t, managedCoreComponents.VmMarshalizer()) + require.NotNil(t, managedCoreComponents.TxMarshalizer()) + require.NotNil(t, managedCoreComponents.Uint64ByteSliceConverter()) + require.NotNil(t, managedCoreComponents.AddressPubKeyConverter()) + require.NotNil(t, managedCoreComponents.ValidatorPubKeyConverter()) + require.NotNil(t, managedCoreComponents.PathHandler()) + require.NotEqual(t, "", managedCoreComponents.ChainID()) + require.NotNil(t, managedCoreComponents.AddressPubKeyConverter()) + require.NotNil(t, managedCoreComponents.EnableRoundsHandler()) + require.NotNil(t, managedCoreComponents.WasmVMChangeLocker()) + require.NotNil(t, managedCoreComponents.ProcessStatusHandler()) + expectedBytes, _ := managedCoreComponents.ValidatorPubKeyConverter().Decode(componentsMock.DummyPk) + require.Equal(t, expectedBytes, managedCoreComponents.HardforkTriggerPubKey()) + require.NotNil(t, managedCoreComponents.TxSignHasher()) + require.NotZero(t, managedCoreComponents.MinTransactionVersion()) + require.NotNil(t, managedCoreComponents.TxVersionChecker()) + require.NotZero(t, managedCoreComponents.EncodedAddressLen()) + require.NotNil(t, managedCoreComponents.AlarmScheduler()) + require.NotNil(t, managedCoreComponents.SyncTimer()) + require.NotNil(t, managedCoreComponents.GenesisTime()) + require.NotNil(t, managedCoreComponents.Watchdog()) + require.NotNil(t, managedCoreComponents.EconomicsData()) + require.NotNil(t, managedCoreComponents.APIEconomicsData()) + require.NotNil(t, managedCoreComponents.RatingsData()) + require.NotNil(t, managedCoreComponents.Rater()) + require.NotNil(t, managedCoreComponents.GenesisNodesSetup()) + require.NotNil(t, managedCoreComponents.RoundHandler()) + require.NotNil(t, managedCoreComponents.NodesShuffler()) + require.NotNil(t, managedCoreComponents.EpochNotifier()) + require.NotNil(t, managedCoreComponents.EpochStartNotifierWithConfirm()) + require.NotNil(t, managedCoreComponents.ChanStopNodeProcess()) + require.NotNil(t, managedCoreComponents.NodeTypeProvider()) + require.NotNil(t, managedCoreComponents.EnableEpochsHandler()) + require.Nil(t, managedCoreComponents.SetInternalMarshalizer(&testscommon.MarshalizerStub{})) + + require.Equal(t, factory.CoreComponentsName, managedCoreComponents.String()) + + err = managedCoreComponents.Close() + require.NoError(t, err) + err = managedCoreComponents.Create() + require.NoError(t, err) + }) } -func TestManagedCoreComponents_Close(t *testing.T) { +func TestManagedCoreComponents_IsInterfaceNil(t *testing.T) { t.Parallel() + managedCoreComponents, err := coreComp.NewManagedCoreComponents(nil) + require.Equal(t, errErd.ErrNilCoreComponentsFactory, err) + require.True(t, managedCoreComponents.IsInterfaceNil()) + coreArgs := componentsMock.GetCoreArgs() coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) - managedCoreComponents, _ := coreComp.NewManagedCoreComponents(coreComponentsFactory) - err := managedCoreComponents.Close() - require.NoError(t, err) - err = managedCoreComponents.Create() + managedCoreComponents, err = coreComp.NewManagedCoreComponents(coreComponentsFactory) require.NoError(t, err) - + require.False(t, managedCoreComponents.IsInterfaceNil()) } diff --git a/factory/core/coreComponents_test.go b/factory/core/coreComponents_test.go index 12b2833d19d..0c1b42f26f4 100644 --- a/factory/core/coreComponents_test.go +++ b/factory/core/coreComponents_test.go @@ -186,6 +186,20 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignMarshallerConfig require.True(t, errors.Is(err, errorsErd.ErrMarshalizerCreation)) } +func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignHasherConfigShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.Config.TxSignHasher = config.TypeConfig{ + Type: "invalid", + } + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.True(t, errors.Is(err, errorsErd.ErrHasherCreation)) +} + func TestCoreComponentsFactory_CreateCoreComponentsInvalidValPubKeyConverterShouldErr(t *testing.T) { t.Parallel() @@ -210,6 +224,90 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidAddrPubKeyConverterSho require.True(t, errors.Is(err, state.ErrInvalidPubkeyConverterType)) } +func TestCoreComponentsFactory_CreateCoreComponentsNilChanStopNodeProcessShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.ChanStopNodeProcess = nil + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.NotNil(t, err) +} + +func TestCoreComponentsFactory_CreateCoreComponentsInvalidRoundConfigShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.RoundConfig = config.RoundConfig{} + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.NotNil(t, err) +} + +func TestCoreComponentsFactory_CreateCoreComponentsInvalidGasScheduleShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.EpochConfig = config.EpochConfig{} + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.NotNil(t, err) +} + +func TestCoreComponentsFactory_CreateCoreComponentsInvalidGenesisMaxNumberOfShardsShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.Config.GeneralSettings.GenesisMaxNumberOfShards = 0 + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.NotNil(t, err) +} + +func TestCoreComponentsFactory_CreateCoreComponentsInvalidEconomicsConfigShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.EconomicsConfig = config.EconomicsConfig{} + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.NotNil(t, err) +} + +func TestCoreComponentsFactory_CreateCoreComponentsInvalidRatingsConfigShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.RatingsConfig = config.RatingsConfig{} + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.NotNil(t, err) +} + +func TestCoreComponentsFactory_CreateCoreComponentsInvalidHardforkPubKeyShouldErr(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.Config.Hardfork.PublicKeyToListenFrom = "invalid" + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.Nil(t, cc) + require.NotNil(t, err) +} + func TestCoreComponentsFactory_CreateCoreComponentsShouldWork(t *testing.T) { t.Parallel() @@ -221,6 +319,18 @@ func TestCoreComponentsFactory_CreateCoreComponentsShouldWork(t *testing.T) { require.NotNil(t, cc) } +func TestCoreComponentsFactory_CreateCoreComponentsShouldWorkAfterHardfork(t *testing.T) { + t.Parallel() + + args := componentsMock.GetCoreArgs() + args.Config.Hardfork.AfterHardFork = true + ccf, _ := coreComp.NewCoreComponentsFactory(args) + + cc, err := ccf.Create() + require.NoError(t, err) + require.NotNil(t, cc) +} + // ------------ Test CoreComponents -------------------- func TestCoreComponents_CloseShouldWork(t *testing.T) { t.Parallel() diff --git a/factory/crypto/cryptoComponents.go b/factory/crypto/cryptoComponents.go index f709d03c39a..4caeaee15ee 100644 --- a/factory/crypto/cryptoComponents.go +++ b/factory/crypto/cryptoComponents.go @@ -271,6 +271,11 @@ func (ccf *cryptoComponentsFactory) readCryptoParams(keygen crypto.KeyGenerator) return nil, err } + cp.privateKeyBytes, err = cp.privateKey.ToByteArray() + if err != nil { + return nil, err + } + cp.publicKey = cp.privateKey.GeneratePublic() if len(readPk) > 0 { cp.publicKeyBytes, err = cp.publicKey.ToByteArray() @@ -302,6 +307,11 @@ func (ccf *cryptoComponentsFactory) generateCryptoParams(keygen crypto.KeyGenera cp.privateKey, cp.publicKey = keygen.GeneratePair() var err error + cp.privateKeyBytes, err = cp.privateKey.ToByteArray() + if err != nil { + return nil, err + } + cp.publicKeyBytes, err = cp.publicKey.ToByteArray() if err != nil { return nil, err diff --git a/factory/crypto/cryptoComponentsHandler.go b/factory/crypto/cryptoComponentsHandler.go index 3756becf2db..78ccc8f2587 100644 --- a/factory/crypto/cryptoComponentsHandler.go +++ b/factory/crypto/cryptoComponentsHandler.go @@ -255,6 +255,10 @@ func (mcc *managedCryptoComponents) MultiSignerContainer() cryptoCommon.MultiSig // SetMultiSignerContainer sets the multiSigner container in the crypto components func (mcc *managedCryptoComponents) SetMultiSignerContainer(ms cryptoCommon.MultiSignerContainer) error { + if check.IfNil(ms) { + return errors.ErrNilMultiSignerContainer + } + mcc.mutCryptoComponents.Lock() mcc.multiSignerContainer = ms mcc.mutCryptoComponents.Unlock() diff --git a/factory/crypto/cryptoComponentsHandler_test.go b/factory/crypto/cryptoComponentsHandler_test.go index f16e97be957..201f7c2ba69 100644 --- a/factory/crypto/cryptoComponentsHandler_test.go +++ b/factory/crypto/cryptoComponentsHandler_test.go @@ -1,90 +1,127 @@ package crypto_test import ( + "strings" "testing" - "github.com/multiversx/mx-chain-go/errors" + erdErrors "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" cryptoComp "github.com/multiversx/mx-chain-go/factory/crypto" + "github.com/multiversx/mx-chain-go/integrationTests/mock" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" ) -// ------------ Test ManagedCryptoComponents -------------------- -func TestManagedCryptoComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestManagedCryptoComponents(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - args := componentsMock.GetCryptoArgs(coreComponents) - args.Config.Consensus.Type = "invalid" - cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) - managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) - require.NoError(t, err) - err = managedCryptoComponents.Create() - require.Error(t, err) - require.Nil(t, managedCryptoComponents.BlockSignKeyGen()) -} - -func TestManagedCryptoComponents_CreateShouldWork(t *testing.T) { - t.Parallel() - - coreComponents := componentsMock.GetCoreComponents() - args := componentsMock.GetCryptoArgs(coreComponents) - cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) - managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) - require.NoError(t, err) - require.Nil(t, managedCryptoComponents.TxSingleSigner()) - require.Nil(t, managedCryptoComponents.BlockSigner()) - require.Nil(t, managedCryptoComponents.MultiSignerContainer()) - require.Nil(t, managedCryptoComponents.BlockSignKeyGen()) - require.Nil(t, managedCryptoComponents.TxSignKeyGen()) - require.Nil(t, managedCryptoComponents.MessageSignVerifier()) - - err = managedCryptoComponents.Create() - require.NoError(t, err) - require.NotNil(t, managedCryptoComponents.TxSingleSigner()) - require.NotNil(t, managedCryptoComponents.BlockSigner()) - require.NotNil(t, managedCryptoComponents.MultiSignerContainer()) - multiSigner, errGet := managedCryptoComponents.MultiSignerContainer().GetMultiSigner(0) - require.NotNil(t, multiSigner) - require.Nil(t, errGet) - require.NotNil(t, managedCryptoComponents.BlockSignKeyGen()) - require.NotNil(t, managedCryptoComponents.TxSignKeyGen()) - require.NotNil(t, managedCryptoComponents.MessageSignVerifier()) -} - -func TestManagedCryptoComponents_CheckSubcomponents(t *testing.T) { - t.Parallel() - - managedCryptoComponents := getManagedCryptoComponents(t) - - err := managedCryptoComponents.CheckSubcomponents() - require.NoError(t, err) -} - -func TestManagedCryptoComponents_Close(t *testing.T) { - t.Parallel() - - managedCryptoComponents := getManagedCryptoComponents(t) - - err := managedCryptoComponents.Close() - require.NoError(t, err) - multiSigner, errGet := managedCryptoComponents.GetMultiSigner(0) - require.Nil(t, multiSigner) - require.Equal(t, errors.ErrNilCryptoComponentsHolder, errGet) -} - -func getManagedCryptoComponents(t *testing.T) factory.CryptoComponentsHandler { - coreComponents := componentsMock.GetCoreComponents() - args := componentsMock.GetCryptoArgs(coreComponents) - cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) - require.NotNil(t, cryptoComponentsFactory) - managedCryptoComponents, _ := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) - require.NotNil(t, managedCryptoComponents) - err := managedCryptoComponents.Create() - require.NoError(t, err) - - return managedCryptoComponents + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() + + managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(nil) + require.Equal(t, erdErrors.ErrNilCryptoComponentsFactory, err) + require.Nil(t, managedCryptoComponents) + }) + t.Run("invalid args should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetCryptoArgs(coreComponents) + args.Config.Consensus.Type = "invalid" + cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) + managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) + require.NoError(t, err) + err = managedCryptoComponents.Create() + require.Error(t, err) + require.Nil(t, managedCryptoComponents.BlockSignKeyGen()) + }) + t.Run("pub key mismatch", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetCryptoArgs(coreComponents) + args.Config.Consensus.Type = "disabled" + cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) + managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) + require.NoError(t, err) + err = managedCryptoComponents.Create() + require.True(t, strings.Contains(err.Error(), erdErrors.ErrPublicKeyMismatch.Error())) + }) + t.Run("should work with activateBLSPubKeyMessageVerification", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetCryptoArgs(coreComponents) + args.ActivateBLSPubKeyMessageVerification = true + cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) + managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) + require.NoError(t, err) + err = managedCryptoComponents.Create() + require.NoError(t, err) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetCryptoArgs(coreComponents) + cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) + managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) + require.NoError(t, err) + require.Equal(t, erdErrors.ErrNilCryptoComponents, managedCryptoComponents.CheckSubcomponents()) + require.Nil(t, managedCryptoComponents.TxSingleSigner()) + require.Nil(t, managedCryptoComponents.BlockSigner()) + require.Nil(t, managedCryptoComponents.MultiSignerContainer()) + require.Nil(t, managedCryptoComponents.BlockSignKeyGen()) + require.Nil(t, managedCryptoComponents.TxSignKeyGen()) + require.Nil(t, managedCryptoComponents.MessageSignVerifier()) + require.Nil(t, managedCryptoComponents.PublicKey()) + require.Nil(t, managedCryptoComponents.PrivateKey()) + require.Nil(t, managedCryptoComponents.P2pPrivateKey()) + require.Nil(t, managedCryptoComponents.P2pPublicKey()) + require.Empty(t, managedCryptoComponents.PublicKeyString()) + require.Nil(t, managedCryptoComponents.PublicKeyBytes()) + require.Nil(t, managedCryptoComponents.P2pPrivateKey()) + require.Nil(t, managedCryptoComponents.PrivateKeyBytes()) + require.Nil(t, managedCryptoComponents.P2pSingleSigner()) + require.Nil(t, managedCryptoComponents.PeerSignatureHandler()) + require.Nil(t, managedCryptoComponents.P2pKeyGen()) + multiSigner, errGet := managedCryptoComponents.GetMultiSigner(0) + require.Nil(t, multiSigner) + require.Equal(t, erdErrors.ErrNilCryptoComponentsHolder, errGet) + + err = managedCryptoComponents.Create() + require.NoError(t, err) + require.Nil(t, managedCryptoComponents.CheckSubcomponents()) + require.NotNil(t, managedCryptoComponents.TxSingleSigner()) + require.NotNil(t, managedCryptoComponents.BlockSigner()) + require.NotNil(t, managedCryptoComponents.MultiSignerContainer()) + multiSigner, errGet = managedCryptoComponents.GetMultiSigner(0) + require.NotNil(t, multiSigner) + require.Nil(t, errGet) + require.NotNil(t, managedCryptoComponents.BlockSignKeyGen()) + require.NotNil(t, managedCryptoComponents.TxSignKeyGen()) + require.NotNil(t, managedCryptoComponents.MessageSignVerifier()) + require.NotNil(t, managedCryptoComponents.PublicKey()) + require.NotNil(t, managedCryptoComponents.PrivateKey()) + require.NotNil(t, managedCryptoComponents.P2pPrivateKey()) + require.NotNil(t, managedCryptoComponents.P2pPublicKey()) + require.NotEmpty(t, managedCryptoComponents.PublicKeyString()) + require.NotNil(t, managedCryptoComponents.PublicKeyBytes()) + require.NotNil(t, managedCryptoComponents.PrivateKeyBytes()) + require.Equal(t, erdErrors.ErrNilMultiSignerContainer, managedCryptoComponents.SetMultiSignerContainer(nil)) + require.Nil(t, managedCryptoComponents.SetMultiSignerContainer(&mock.CryptoComponentsStub{})) + require.NotNil(t, managedCryptoComponents.P2pSingleSigner()) + require.NotNil(t, managedCryptoComponents.PeerSignatureHandler()) + require.NotNil(t, managedCryptoComponents.P2pKeyGen()) + + require.Equal(t, factory.CryptoComponentsName, managedCryptoComponents.String()) + + err = managedCryptoComponents.Close() + require.NoError(t, err) + + err = managedCryptoComponents.Close() + require.NoError(t, err) + }) } func TestManagedCryptoComponents_Clone(t *testing.T) { @@ -108,3 +145,18 @@ func TestManagedCryptoComponents_Clone(t *testing.T) { clonedAfterClose := managedCryptoComponents.Clone() require.Equal(t, managedCryptoComponents, clonedAfterClose) } + +func TestNewManagedCryptoComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(nil) + require.Equal(t, erdErrors.ErrNilCryptoComponentsFactory, err) + require.True(t, managedCryptoComponents.IsInterfaceNil()) + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetCryptoArgs(coreComponents) + cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) + managedCryptoComponents, err = cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) + require.NoError(t, err) + require.False(t, managedCryptoComponents.IsInterfaceNil()) +} From 518510ad17ee6bc853b597df1f3f1067ab80fe1e Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 3 Apr 2023 15:34:23 +0300 Subject: [PATCH 234/335] latest indexer --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ab3d86bde39..558f20605f3 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-core-go v1.1.36 github.com/multiversx/mx-chain-crypto-go v1.2.6 - github.com/multiversx/mx-chain-es-indexer-go v1.3.14 + github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403101118-0fdba1d67275 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 diff --git a/go.sum b/go.sum index 40b320853b0..93d28ad0184 100644 --- a/go.sum +++ b/go.sum @@ -614,8 +614,8 @@ github.com/multiversx/mx-chain-core-go v1.1.36 h1:yI4E6vv2KSn9dTbllyPZJvF9tYweuZ github.com/multiversx/mx-chain-core-go v1.1.36/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.3.14 h1:cDaBsY8i2PuCQZ6DMf3LgxB0ocErM3TWlKGGzGqGX7E= -github.com/multiversx/mx-chain-es-indexer-go v1.3.14/go.mod h1:IV42GfhkqQ5vVO0OzGaF/ejp8TQrLkNo4LSB3TPnVhg= +github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403101118-0fdba1d67275 h1:a6M2lZ3pUxCme19jUPKdvEU/1CfR0kunfJjf4Do/rcc= +github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403101118-0fdba1d67275/go.mod h1:L+fDNDm1z6lia9EeyveilwrM6J0qEi/LwBjrGFMbsVs= 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.14 h1:ndrOESrdNyb0AFIqYAZ1yBYJF7cK1skgePO/zTbe/BU= From 46bf22e3db48594c43bdddf19f0800f7d3b1057a Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 3 Apr 2023 15:58:42 +0300 Subject: [PATCH 235/335] latest indexer and vm common --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 558f20605f3..27a07e40074 100644 --- a/go.mod +++ b/go.mod @@ -15,11 +15,11 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-core-go v1.1.36 github.com/multiversx/mx-chain-crypto-go v1.2.6 - github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403101118-0fdba1d67275 + github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403125654-57b739a6710c github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.38 + github.com/multiversx/mx-chain-vm-common-go v1.3.39 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78 diff --git a/go.sum b/go.sum index 93d28ad0184..5e0055030ed 100644 --- a/go.sum +++ b/go.sum @@ -614,17 +614,17 @@ github.com/multiversx/mx-chain-core-go v1.1.36 h1:yI4E6vv2KSn9dTbllyPZJvF9tYweuZ github.com/multiversx/mx-chain-core-go v1.1.36/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.3.15-0.20230403101118-0fdba1d67275 h1:a6M2lZ3pUxCme19jUPKdvEU/1CfR0kunfJjf4Do/rcc= -github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403101118-0fdba1d67275/go.mod h1:L+fDNDm1z6lia9EeyveilwrM6J0qEi/LwBjrGFMbsVs= +github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403125654-57b739a6710c h1:weP4YVnMKNIUqMdFsxVp/J9BTZD2RuUsF+oUToeF+ro= +github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403125654-57b739a6710c/go.mod h1:7npwCXMXDjNRllUzLbXaR8CoBC8H+8c0J9wGQL2raKk= 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.14 h1:ndrOESrdNyb0AFIqYAZ1yBYJF7cK1skgePO/zTbe/BU= github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2cGV/vPHsnqqbvTA2AN0= 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.34/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.38 h1:tJ9kTkCSveP9NfrenZvGf2goAGjWezDTK9EtTUuqXhM= github.com/multiversx/mx-chain-vm-common-go v1.3.38/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-common-go v1.3.39 h1:6yC/vqwA5o8POeHTmFnbeH2b0wT17izA5PeSulNIZY8= +github.com/multiversx/mx-chain-vm-common-go v1.3.39/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51 h1:s05qY+a2AxPZKrtlLFAr+EbQhAjGkMfQaUrpyjXq2W8= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51/go.mod h1:5n7maiiveAuQezSdqpvrXLBQEphor9nhPjOhBv/zErQ= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52 h1:lCcElufhtsZuCVH6kZwCTM4JK/SmVjVyJ8M4D/D4TI8= From 9e8fe1a03a1ae922c1b3e058299c3a665ed0be1b Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Mon, 3 Apr 2023 16:29:21 +0300 Subject: [PATCH 236/335] fixes after merge --- go.sum | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/go.sum b/go.sum index 5e0055030ed..728ca2bfe42 100644 --- a/go.sum +++ b/go.sum @@ -622,15 +622,15 @@ github.com/multiversx/mx-chain-p2p-go v1.0.14 h1:ndrOESrdNyb0AFIqYAZ1yBYJF7cK1sk github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2cGV/vPHsnqqbvTA2AN0= 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.38/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-common-go v1.3.39 h1:6yC/vqwA5o8POeHTmFnbeH2b0wT17izA5PeSulNIZY8= github.com/multiversx/mx-chain-vm-common-go v1.3.39/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51 h1:s05qY+a2AxPZKrtlLFAr+EbQhAjGkMfQaUrpyjXq2W8= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.51/go.mod h1:5n7maiiveAuQezSdqpvrXLBQEphor9nhPjOhBv/zErQ= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52 h1:lCcElufhtsZuCVH6kZwCTM4JK/SmVjVyJ8M4D/D4TI8= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.52/go.mod h1:L8wIeeZUkuBaKBaxBFBNtjDztX9XRQgBmefhl56mfh0= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78 h1:lG0pBfRus/Epzj9D119/E0UdOk3hVsnlIolZftYIjAc= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.78/go.mod h1:n/wOsZ9BPXZahknR28TRpgfCLceMNhZ3Y3DiArHDJH4= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc h1:Sk83Pf8lL3RtHpfOisJlvG8uk0LBytScQI1+TthBxEI= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc/go.mod h1:44jBXUBfoBJ7W5gLoLJrOB14pt5TUUJBh6jDc7BaC68= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de h1:wlpWxxf/qJHkLakKQvgebCbOWDm1s0mlYts3X3iLXsg= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de/go.mod h1:/PSbbb+0/HeUlbrsLO1Af9rmPWu5w491vGH/2dnmtrE= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 h1:oo4JFogoglCcRHVU9mM7IRq85Cbz7UDpn7G6+1qGBmQ= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329/go.mod h1:uiinjaJAKIGOA4CaZupv9z6OWwNOJRwyuMUdE9imawQ= 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 53442144194249a9854aabf75ed4e7a65c8027ed Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 3 Apr 2023 16:34:53 +0300 Subject: [PATCH 237/335] updated mx-chain-core-go to latest --- api/groups/transactionGroup_test.go | 11 +++++++---- go.mod | 2 +- go.sum | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/api/groups/transactionGroup_test.go b/api/groups/transactionGroup_test.go index adceb6f4892..3052f52ecdc 100644 --- a/api/groups/transactionGroup_test.go +++ b/api/groups/transactionGroup_test.go @@ -135,13 +135,15 @@ func TestGetTransaction_WithCorrectHashShouldReturnTransaction(t *testing.T) { value := "10" txData := []byte("data") hash := "hash" + guardian := "guardian" facade := mock.FacadeStub{ GetTransactionHandler: func(hash string, withEvents bool) (i *dataTx.ApiTransactionResult, e error) { return &dataTx.ApiTransactionResult{ - Sender: sender, - Receiver: receiver, - Data: txData, - Value: value, + Sender: sender, + Receiver: receiver, + Data: txData, + Value: value, + GuardianAddr: guardian, }, nil }, } @@ -164,6 +166,7 @@ func TestGetTransaction_WithCorrectHashShouldReturnTransaction(t *testing.T) { assert.Equal(t, receiver, txResp.Receiver) assert.Equal(t, value, txResp.Value) assert.Equal(t, txData, txResp.Data) + assert.Equal(t, guardian, txResp.GuardianAddr) } func TestGetTransaction_WithUnknownHashShouldReturnNil(t *testing.T) { diff --git a/go.mod b/go.mod index 42189fc4e61..b7c62ad211b 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.1.36 + github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98 github.com/multiversx/mx-chain-crypto-go v1.2.6 github.com/multiversx/mx-chain-es-indexer-go v1.3.14 github.com/multiversx/mx-chain-logger-go v1.0.11 diff --git a/go.sum b/go.sum index bfdc9299326..1f4efdecdfa 100644 --- a/go.sum +++ b/go.sum @@ -610,8 +610,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.1.36 h1:yI4E6vv2KSn9dTbllyPZJvF9tYweuZnIbX9lTqJCCaU= github.com/multiversx/mx-chain-core-go v1.1.36/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98 h1:+V7ce6GpFS0heu2pDukhh/ETMCGSx7dJUlNMWyIGgh4= +github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98/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.3.14 h1:cDaBsY8i2PuCQZ6DMf3LgxB0ocErM3TWlKGGzGqGX7E= From 7eca2eec1b3c25f0b026ee3f59132ef5f268ab88 Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 3 Apr 2023 17:45:39 +0300 Subject: [PATCH 238/335] - fixed tests after merge --- factory/api/apiResolverFactory_test.go | 25 ++-- factory/api/export_test.go | 54 +++++---- .../timemachine/fee/feeComputer_test.go | 114 ++++++------------ 3 files changed, 83 insertions(+), 110 deletions(-) diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index b4113165776..24c157a1c3f 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -15,6 +15,7 @@ import ( "github.com/multiversx/mx-chain-go/factory/bootstrap" "github.com/multiversx/mx-chain-go/factory/mock" testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" + "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/sync/disabled" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon" @@ -24,6 +25,7 @@ import ( epochNotifierMock "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/multiversx/mx-chain-go/testscommon/genericMocks" + "github.com/multiversx/mx-chain-go/testscommon/guardianMocks" stateMocks "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/stretchr/testify/require" ) @@ -59,7 +61,6 @@ func (fs *failingSteps) reset() { } func createMockArgs(t *testing.T) *api.ApiResolverArgs { - shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) coreComponents := componentsMock.GetCoreComponents() cryptoComponents := componentsMock.GetCryptoComponents(coreComponents) @@ -327,18 +328,28 @@ func createMockSCQueryElementArgs() api.SCQueryElementArgs { return gasSchedule }, }, - MessageSigVerifier: &testscommon.MessageSignVerifierMock{}, - SystemSCConfig: &config.SystemSmartContractsConfig{}, - Bootstrapper: testsMocks.NewTestBootstrapperMock(), - AllowVMQueriesChan: make(chan struct{}, 1), - WorkingDir: "", - Index: 0, + MessageSigVerifier: &testscommon.MessageSignVerifierMock{}, + SystemSCConfig: &config.SystemSmartContractsConfig{}, + Bootstrapper: testsMocks.NewTestBootstrapperMock(), + AllowVMQueriesChan: make(chan struct{}, 1), + WorkingDir: "", + Index: 0, + GuardedAccountHandler: &guardianMocks.GuardedAccountHandlerStub{}, } } func TestCreateApiResolver_createScQueryElement(t *testing.T) { t.Parallel() + t.Run("nil guardian handler should error", func(t *testing.T) { + t.Parallel() + + args := createMockSCQueryElementArgs() + args.GuardedAccountHandler = nil + scQueryService, err := api.CreateScQueryElement(args) + require.Equal(t, process.ErrNilGuardedAccountHandler, err) + require.Nil(t, scQueryService) + }) t.Run("DecodeAddresses fails", func(t *testing.T) { t.Parallel() diff --git a/factory/api/export_test.go b/factory/api/export_test.go index 4ccc5589304..85a5c6f08b6 100644 --- a/factory/api/export_test.go +++ b/factory/api/export_test.go @@ -10,36 +10,38 @@ import ( // SCQueryElementArgs - type SCQueryElementArgs struct { - GeneralConfig *config.Config - EpochConfig *config.EpochConfig - CoreComponents factory.CoreComponentsHolder - StateComponents factory.StateComponentsHolder - DataComponents factory.DataComponentsHolder - ProcessComponents factory.ProcessComponentsHolder - GasScheduleNotifier core.GasScheduleNotifier - MessageSigVerifier vm.MessageSignVerifier - SystemSCConfig *config.SystemSmartContractsConfig - Bootstrapper process.Bootstrapper - AllowVMQueriesChan chan struct{} - WorkingDir string - Index int + GeneralConfig *config.Config + EpochConfig *config.EpochConfig + CoreComponents factory.CoreComponentsHolder + StateComponents factory.StateComponentsHolder + DataComponents factory.DataComponentsHolder + ProcessComponents factory.ProcessComponentsHolder + GasScheduleNotifier core.GasScheduleNotifier + MessageSigVerifier vm.MessageSignVerifier + SystemSCConfig *config.SystemSmartContractsConfig + Bootstrapper process.Bootstrapper + AllowVMQueriesChan chan struct{} + WorkingDir string + Index int + GuardedAccountHandler process.GuardedAccountHandler } // CreateScQueryElement - func CreateScQueryElement(args SCQueryElementArgs) (process.SCQueryService, error) { return createScQueryElement(&scQueryElementArgs{ - generalConfig: args.GeneralConfig, - epochConfig: args.EpochConfig, - coreComponents: args.CoreComponents, - stateComponents: args.StateComponents, - dataComponents: args.DataComponents, - processComponents: args.ProcessComponents, - gasScheduleNotifier: args.GasScheduleNotifier, - messageSigVerifier: args.MessageSigVerifier, - systemSCConfig: args.SystemSCConfig, - bootstrapper: args.Bootstrapper, - allowVMQueriesChan: args.AllowVMQueriesChan, - workingDir: args.WorkingDir, - index: args.Index, + generalConfig: args.GeneralConfig, + epochConfig: args.EpochConfig, + coreComponents: args.CoreComponents, + stateComponents: args.StateComponents, + dataComponents: args.DataComponents, + processComponents: args.ProcessComponents, + gasScheduleNotifier: args.GasScheduleNotifier, + messageSigVerifier: args.MessageSigVerifier, + systemSCConfig: args.SystemSCConfig, + bootstrapper: args.Bootstrapper, + allowVMQueriesChan: args.AllowVMQueriesChan, + workingDir: args.WorkingDir, + index: args.Index, + guardedAccountHandler: args.GuardedAccountHandler, }) } diff --git a/node/external/timemachine/fee/feeComputer_test.go b/node/external/timemachine/fee/feeComputer_test.go index f582af8b6ff..bff68baef98 100644 --- a/node/external/timemachine/fee/feeComputer_test.go +++ b/node/external/timemachine/fee/feeComputer_test.go @@ -14,44 +14,44 @@ import ( "github.com/stretchr/testify/require" ) +func createMockFeeComputerArgs() ArgsNewFeeComputer { + return ArgsNewFeeComputer{ + BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, + EconomicsConfig: testscommon.GetEconomicsConfig(), + EnableEpochsConfig: config.EnableEpochs{ + PenalizedTooMuchGasEnableEpoch: 124, + GasPriceModifierEnableEpoch: 180, + }, + TxVersionChecker: &testscommon.TxVersionCheckerStub{}, + } +} + func TestNewFeeComputer(t *testing.T) { - t.Run("NilBuiltInFunctionsCostHandler", func(t *testing.T) { - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: nil, - EconomicsConfig: testscommon.GetEconomicsConfig(), - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - } - - computer, err := NewFeeComputer(arguments) + t.Run("nil builtin function cost handler should error", func(t *testing.T) { + args := createMockFeeComputerArgs() + args.BuiltInFunctionsCostHandler = nil + computer, err := NewFeeComputer(args) require.Equal(t, process.ErrNilBuiltInFunctionsCostHandler, err) require.Nil(t, computer) }) - + t.Run("nil tx version checker should error", func(t *testing.T) { + args := createMockFeeComputerArgs() + args.TxVersionChecker = nil + computer, err := NewFeeComputer(args) + require.Equal(t, process.ErrNilTransactionVersionChecker, err) + require.Nil(t, computer) + }) t.Run("AllArgumentsProvided", func(t *testing.T) { - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, - EconomicsConfig: testscommon.GetEconomicsConfig(), - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - } - - computer, err := NewFeeComputer(arguments) + args := createMockFeeComputerArgs() + computer, err := NewFeeComputer(args) require.Nil(t, err) require.NotNil(t, computer) }) } func TestFeeComputer_ComputeGasUsedAndFeeBasedOnRefundValue(t *testing.T) { - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, - EconomicsConfig: testscommon.GetEconomicsConfig(), - EnableEpochsConfig: config.EnableEpochs{ - PenalizedTooMuchGasEnableEpoch: 124, - GasPriceModifierEnableEpoch: 180, - }, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - } - - computer, _ := NewFeeComputer(arguments) + args := createMockFeeComputerArgs() + computer, _ := NewFeeComputer(args) contract, _ := hex.DecodeString("000000000000000000010000000000000000000000000000000000000000abba") @@ -78,17 +78,8 @@ func TestFeeComputer_ComputeGasUsedAndFeeBasedOnRefundValue(t *testing.T) { } func TestFeeComputer_ComputeFeeBasedOnGasUsed(t *testing.T) { - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, - EconomicsConfig: testscommon.GetEconomicsConfig(), - EnableEpochsConfig: config.EnableEpochs{ - PenalizedTooMuchGasEnableEpoch: 124, - GasPriceModifierEnableEpoch: 180, - }, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - } - - computer, _ := NewFeeComputer(arguments) + args := createMockFeeComputerArgs() + computer, _ := NewFeeComputer(args) contract, _ := hex.DecodeString("000000000000000000010000000000000000000000000000000000000000abba") @@ -113,17 +104,8 @@ func TestFeeComputer_ComputeFeeBasedOnGasUsed(t *testing.T) { } func TestFeeComputer_ComputeGasLimit(t *testing.T) { - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, - EconomicsConfig: testscommon.GetEconomicsConfig(), - EnableEpochsConfig: config.EnableEpochs{ - PenalizedTooMuchGasEnableEpoch: 124, - GasPriceModifierEnableEpoch: 180, - }, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - } - - computer, _ := NewFeeComputer(arguments) + args := createMockFeeComputerArgs() + computer, _ := NewFeeComputer(args) contract, _ := hex.DecodeString("000000000000000000010000000000000000000000000000000000000000abba") @@ -147,19 +129,10 @@ func TestFeeComputer_ComputeGasLimit(t *testing.T) { } func TestFeeComputer_ComputeTransactionFeeShouldWorkForDifferentEpochs(t *testing.T) { - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, - EconomicsConfig: testscommon.GetEconomicsConfig(), - EnableEpochsConfig: config.EnableEpochs{ - PenalizedTooMuchGasEnableEpoch: 124, - GasPriceModifierEnableEpoch: 180, - }, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - } - + args := createMockFeeComputerArgs() contract, _ := hex.DecodeString("000000000000000000010000000000000000000000000000000000000000abba") - computer, _ := NewFeeComputer(arguments) + computer, _ := NewFeeComputer(args) checkComputedFee(t, "50000000000000", computer, 0, 80000, 1000000000, "", nil) checkComputedFee(t, "57500000000000", computer, 0, 80000, 1000000000, "hello", nil) @@ -190,17 +163,8 @@ func checkComputedFee(t *testing.T, expectedFee string, computer *feeComputer, e } func TestFeeComputer_InHighConcurrency(t *testing.T) { - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, - EconomicsConfig: testscommon.GetEconomicsConfig(), - EnableEpochsConfig: config.EnableEpochs{ - PenalizedTooMuchGasEnableEpoch: 124, - GasPriceModifierEnableEpoch: 180, - }, - TxVersionChecker: &testscommon.TxVersionCheckerStub{}, - } - - computer, _ := NewFeeComputer(arguments) + args := createMockFeeComputerArgs() + computer, _ := NewFeeComputer(args) n := 1000 wg := sync.WaitGroup{} @@ -229,11 +193,7 @@ func TestFeeComputer_IsInterfaceNil(t *testing.T) { var fc *feeComputer require.True(t, fc.IsInterfaceNil()) - arguments := ArgsNewFeeComputer{ - BuiltInFunctionsCostHandler: &testscommon.BuiltInCostHandlerStub{}, - EconomicsConfig: testscommon.GetEconomicsConfig(), - } - - fc, _ = NewFeeComputer(arguments) + args := createMockFeeComputerArgs() + fc, _ = NewFeeComputer(args) require.False(t, fc.IsInterfaceNil()) } From d6272d7841a6b18e1e4473f140e9f2e8b989bd5d Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 3 Apr 2023 17:53:39 +0300 Subject: [PATCH 239/335] fixes after review + extra tests --- .../bootstrapComponentsHandler_test.go | 4 +- factory/bootstrap/bootstrapComponents_test.go | 1 - factory/bootstrap/shardingFactory.go | 2 +- storage/errors.go | 9 ++ storage/factory/openStorage.go | 8 ++ storage/factory/openStorage_test.go | 92 ++++++++++++++++++- storage/latestData/latestDataProvider.go | 8 ++ storage/latestData/latestDataProvider_test.go | 39 +++++++- 8 files changed, 150 insertions(+), 13 deletions(-) diff --git a/factory/bootstrap/bootstrapComponentsHandler_test.go b/factory/bootstrap/bootstrapComponentsHandler_test.go index cf1a7a83a1e..572e920d895 100644 --- a/factory/bootstrap/bootstrapComponentsHandler_test.go +++ b/factory/bootstrap/bootstrapComponentsHandler_test.go @@ -105,11 +105,11 @@ func TestManagedBootstrapComponents_Close(t *testing.T) { func TestManagedBootstrapComponents_IsInterfaceNil(t *testing.T) { t.Parallel() - args := componentsMock.GetBootStrapFactoryArgs() - bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) mbc, _ := bootstrap.NewManagedBootstrapComponents(nil) require.True(t, mbc.IsInterfaceNil()) + args := componentsMock.GetBootStrapFactoryArgs() + bcf, _ := bootstrap.NewBootstrapComponentsFactory(args) mbc, _ = bootstrap.NewManagedBootstrapComponents(bcf) require.False(t, mbc.IsInterfaceNil()) } diff --git a/factory/bootstrap/bootstrapComponents_test.go b/factory/bootstrap/bootstrapComponents_test.go index 563502ec06d..7754c1a2bdd 100644 --- a/factory/bootstrap/bootstrapComponents_test.go +++ b/factory/bootstrap/bootstrapComponents_test.go @@ -102,7 +102,6 @@ func TestNewBootstrapComponentsFactory(t *testing.T) { func TestBootstrapComponentsFactory_Create(t *testing.T) { t.Parallel() - // TODO: add tests for createLatestStorageDataProvider and createUnitOpener failure t.Run("should work", func(t *testing.T) { t.Parallel() diff --git a/factory/bootstrap/shardingFactory.go b/factory/bootstrap/shardingFactory.go index 632bd872ec1..32d5504292d 100644 --- a/factory/bootstrap/shardingFactory.go +++ b/factory/bootstrap/shardingFactory.go @@ -33,7 +33,7 @@ func CreateShardCoordinator( if check.IfNil(nodesConfig) { return nil, "", errErd.ErrNilGenesisNodesSetupHandler } - if pubKey == nil { + if check.IfNil(pubKey) { return nil, "", errErd.ErrNilPublicKey } if check.IfNil(log) { diff --git a/storage/errors.go b/storage/errors.go index fdf1e7075d8..320c10d0843 100644 --- a/storage/errors.go +++ b/storage/errors.go @@ -88,6 +88,15 @@ var ErrEpochKeepIsLowerThanNumActive = errors.New("num epochs to keep is lower t // ErrNilPersistersTracker signals that a nil persisters tracker has been provided var ErrNilPersistersTracker = errors.New("nil persisters tracker provided") +// ErrNilLatestStorageDataProvider signals that a nil latest storage data provider has been provided +var ErrNilLatestStorageDataProvider = errors.New("nil latest storage data provider") + +// ErrNilBootstrapDataProvider signals that a nil bootstrap data provider has been provided +var ErrNilBootstrapDataProvider = errors.New("nil bootstrap data provider") + +// ErrNilDirectoryReader signals that a nil directory reader has been provided +var ErrNilDirectoryReader = errors.New("nil directory reader") + // IsNotFoundInStorageErr returns whether an error is a "not found in storage" error. // Currently, "item not found" storage errors are untyped (thus not distinguishable from others). E.g. see "pruningStorer.go". // As a workaround, we test the error message for a match. diff --git a/storage/factory/openStorage.go b/storage/factory/openStorage.go index cfd0e9e3c5b..2f02327cc02 100644 --- a/storage/factory/openStorage.go +++ b/storage/factory/openStorage.go @@ -5,6 +5,7 @@ import ( "path/filepath" "time" + "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/process/block/bootstrapStorage" "github.com/multiversx/mx-chain-go/storage" @@ -31,6 +32,13 @@ type openStorageUnits struct { // NewStorageUnitOpenHandler creates an openStorageUnits component func NewStorageUnitOpenHandler(args ArgsNewOpenStorageUnits) (*openStorageUnits, error) { + if check.IfNil(args.BootstrapDataProvider) { + return nil, storage.ErrNilBootstrapDataProvider + } + if check.IfNil(args.LatestStorageDataProvider) { + return nil, storage.ErrNilLatestStorageDataProvider + } + o := &openStorageUnits{ defaultEpochString: args.DefaultEpochString, defaultShardString: args.DefaultShardString, diff --git a/storage/factory/openStorage_test.go b/storage/factory/openStorage_test.go index 8340db9c563..7048127f703 100644 --- a/storage/factory/openStorage_test.go +++ b/storage/factory/openStorage_test.go @@ -5,12 +5,12 @@ import ( "strings" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/process/block/bootstrapStorage" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/storage/mock" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func createMockArgsOpenStorageUnits() ArgsNewOpenStorageUnits { @@ -25,10 +25,31 @@ func createMockArgsOpenStorageUnits() ArgsNewOpenStorageUnits { func TestNewStorageUnitOpenHandler(t *testing.T) { t.Parallel() - suoh, err := NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) - - assert.NoError(t, err) - assert.False(t, check.IfNil(suoh)) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + suoh, err := NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) + assert.NoError(t, err) + assert.NotNil(t, suoh) + }) + t.Run("nil BootstrapDataProvider should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgsOpenStorageUnits() + args.BootstrapDataProvider = nil + suoh, err := NewStorageUnitOpenHandler(args) + assert.Equal(t, storage.ErrNilBootstrapDataProvider, err) + assert.Nil(t, suoh) + }) + t.Run("nil LatestStorageDataProvider should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgsOpenStorageUnits() + args.LatestStorageDataProvider = nil + suoh, err := NewStorageUnitOpenHandler(args) + assert.Equal(t, storage.ErrNilLatestStorageDataProvider, err) + assert.Nil(t, suoh) + }) } func TestGetMostUpToDateDirectory(t *testing.T) { @@ -56,6 +77,23 @@ func TestGetMostUpToDateDirectory(t *testing.T) { assert.Equal(t, shardIDsStr[1], dirName) } +func TestGetMostRecentBootstrapStorageUnit_GetParentDirAndLastEpochErr(t *testing.T) { + t.Parallel() + + localErr := errors.New("localErr") + args := createMockArgsOpenStorageUnits() + args.LatestStorageDataProvider = &mock.LatestStorageDataProviderStub{ + GetParentDirAndLastEpochCalled: func() (string, uint32, error) { + return "", 0, localErr + }, + } + suoh, _ := NewStorageUnitOpenHandler(args) + + storer, err := suoh.GetMostRecentStorageUnit(config.DBConfig{}) + assert.Nil(t, storer) + assert.Equal(t, localErr, err) +} + func TestGetMostRecentBootstrapStorageUnit_GetShardsFromDirectoryErr(t *testing.T) { t.Parallel() @@ -140,5 +178,49 @@ func TestGetMostRecentBootstrapStorageUnit(t *testing.T) { storer, err := suoh.GetMostRecentStorageUnit(generalConfig.BootstrapStorage.DB) assert.NoError(t, err) assert.NotNil(t, storer) +} + +func TestOpenStorageUnits_OpenDB(t *testing.T) { + t.Parallel() + + t.Run("should work", func(t *testing.T) { + args := createMockArgsOpenStorageUnits() + suoh, _ := NewStorageUnitOpenHandler(args) + + cfg := config.DBConfig{ + FilePath: t.TempDir(), + Type: "MemoryDB", + BatchDelaySeconds: 1, + MaxBatchSize: 1, + MaxOpenFiles: 10, + } + db, err := suoh.OpenDB(cfg, 0, 0) + require.Nil(t, err) + require.Nil(t, db.Close()) + }) + t.Run("invalid config should error", func(t *testing.T) { + args := createMockArgsOpenStorageUnits() + suoh, _ := NewStorageUnitOpenHandler(args) + + cfg := config.DBConfig{ + FilePath: t.TempDir(), + Type: "invalid", + BatchDelaySeconds: 1, + MaxBatchSize: 1, + MaxOpenFiles: 10, + } + db, err := suoh.OpenDB(cfg, 0, 0) + require.NotNil(t, err) + require.Nil(t, db) + }) +} + +func TestOpenStorageUnits_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var osu *openStorageUnits + assert.True(t, osu.IsInterfaceNil()) + osu, _ = NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) + assert.False(t, osu.IsInterfaceNil()) } diff --git a/storage/latestData/latestDataProvider.go b/storage/latestData/latestDataProvider.go index 44902dc9ae1..d372f81b43c 100644 --- a/storage/latestData/latestDataProvider.go +++ b/storage/latestData/latestDataProvider.go @@ -9,6 +9,7 @@ import ( "strings" "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/block" "github.com/multiversx/mx-chain-core-go/marshal" @@ -53,6 +54,13 @@ type latestDataProvider struct { // NewLatestDataProvider returns a new instance of latestDataProvider func NewLatestDataProvider(args ArgsLatestDataProvider) (*latestDataProvider, error) { + if check.IfNil(args.DirectoryReader) { + return nil, storage.ErrNilDirectoryReader + } + if check.IfNil(args.BootstrapDataProvider) { + return nil, storage.ErrNilBootstrapDataProvider + } + return &latestDataProvider{ generalConfig: args.GeneralConfig, parentDir: args.ParentDir, diff --git a/storage/latestData/latestDataProvider_test.go b/storage/latestData/latestDataProvider_test.go index ebdbc31d178..8fdb808998b 100644 --- a/storage/latestData/latestDataProvider_test.go +++ b/storage/latestData/latestDataProvider_test.go @@ -8,7 +8,6 @@ import ( "testing" "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/config" @@ -23,9 +22,31 @@ import ( func TestNewLatestDataProvider_ShouldWork(t *testing.T) { t.Parallel() - ldp, err := NewLatestDataProvider(getLatestDataProviderArgs()) - require.False(t, check.IfNil(ldp)) - require.NoError(t, err) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + ldp, err := NewLatestDataProvider(getLatestDataProviderArgs()) + require.NotNil(t, ldp) + require.NoError(t, err) + }) + t.Run("nil DirectoryReader should error", func(t *testing.T) { + t.Parallel() + + args := getLatestDataProviderArgs() + args.DirectoryReader = nil + ldp, err := NewLatestDataProvider(args) + require.Nil(t, ldp) + require.Equal(t, storage.ErrNilDirectoryReader, err) + }) + t.Run("nil BootstrapDataProvider should error", func(t *testing.T) { + t.Parallel() + + args := getLatestDataProviderArgs() + args.BootstrapDataProvider = nil + ldp, err := NewLatestDataProvider(args) + require.Nil(t, ldp) + require.Equal(t, storage.ErrNilBootstrapDataProvider, err) + }) } func TestGetShardsFromDirectory(t *testing.T) { @@ -366,3 +387,13 @@ func TestFullHistoryLoadEpochStartRoundMetachain(t *testing.T) { assert.NoError(t, err) assert.Equal(t, startRound, round) } + +func TestLatestDataProvider_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var ldp *latestDataProvider + assert.True(t, ldp.IsInterfaceNil()) + + ldp, _ = NewLatestDataProvider(getLatestDataProviderArgs()) + assert.False(t, ldp.IsInterfaceNil()) +} From d430c0acc80e9c3ca836ae8a8754dcbaee397115 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 3 Apr 2023 18:37:53 +0300 Subject: [PATCH 240/335] improved coverage on factory/data --- factory/consensus/consensusComponents_test.go | 2 +- factory/data/dataComponents.go | 9 - factory/data/dataComponentsHandler.go | 8 +- factory/data/dataComponentsHandler_test.go | 111 +++++-- factory/data/dataComponents_test.go | 290 ++++++++++++------ factory/interface.go | 2 +- factory/mock/dataComponentsMock.go | 3 +- genesis/mock/dataComponentsMock.go | 3 +- genesis/process/argGenesisBlockCreator.go | 2 +- genesis/process/genesisBlockCreator.go | 5 +- integrationTests/mock/dataComponentsStub.go | 3 +- integrationTests/testInitializer.go | 2 +- node/mock/factory/dataComponentsStub.go | 3 +- 13 files changed, 309 insertions(+), 134 deletions(-) diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index 1fb5291510e..e33b12d33cb 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -123,7 +123,7 @@ func TestConsensusComponentsFactory_CreateGenesisBlockNotInitializedShouldErr(t dataComponents := consensusArgs.DataComponents - dataComponents.SetBlockchain(&testscommon.ChainHandlerStub{ + _ = dataComponents.SetBlockchain(&testscommon.ChainHandlerStub{ GetGenesisHeaderHashCalled: func() []byte { return nil }, diff --git a/factory/data/dataComponents.go b/factory/data/dataComponents.go index d2032acd193..ca089b622f7 100644 --- a/factory/data/dataComponents.go +++ b/factory/data/dataComponents.go @@ -62,21 +62,12 @@ func NewDataComponentsFactory(args DataComponentsFactoryArgs) (*dataComponentsFa if check.IfNil(args.Core) { return nil, errors.ErrNilCoreComponents } - if check.IfNil(args.Core.PathHandler()) { - return nil, errors.ErrNilPathHandler - } if check.IfNil(args.EpochStartNotifier) { return nil, errors.ErrNilEpochStartNotifier } - if check.IfNil(args.Core.EconomicsData()) { - return nil, errors.ErrNilEconomicsHandler - } if check.IfNil(args.StatusCore) { return nil, errors.ErrNilStatusCoreComponents } - if check.IfNil(args.StatusCore.AppStatusHandler()) { - return nil, errors.ErrNilAppStatusHandler - } return &dataComponentsFactory{ config: args.Config, diff --git a/factory/data/dataComponentsHandler.go b/factory/data/dataComponentsHandler.go index 019633511e1..0c7c3501893 100644 --- a/factory/data/dataComponentsHandler.go +++ b/factory/data/dataComponentsHandler.go @@ -103,10 +103,16 @@ func (mdc *managedDataComponents) Blockchain() data.ChainHandler { } // SetBlockchain sets the blockchain subcomponent -func (mdc *managedDataComponents) SetBlockchain(chain data.ChainHandler) { +func (mdc *managedDataComponents) SetBlockchain(chain data.ChainHandler) error { + if check.IfNil(chain) { + return errors.ErrNilBlockChainHandler + } + mdc.mutDataComponents.Lock() mdc.blkc = chain mdc.mutDataComponents.Unlock() + + return nil } // StorageService returns the storage service diff --git a/factory/data/dataComponentsHandler_test.go b/factory/data/dataComponentsHandler_test.go index 85c6e84f55a..00af88f3e60 100644 --- a/factory/data/dataComponentsHandler_test.go +++ b/factory/data/dataComponentsHandler_test.go @@ -4,46 +4,83 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" + errErd "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" dataComp "github.com/multiversx/mx-chain-go/factory/data" "github.com/multiversx/mx-chain-go/factory/mock" + "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" ) -// ------------ Test ManagedDataComponents -------------------- -func TestManagedDataComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestNewManagedDataComponents(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} - dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) - managedDataComponents, err := dataComp.NewManagedDataComponents(dataComponentsFactory) - require.NoError(t, err) - err = managedDataComponents.Create() - require.Error(t, err) - require.Nil(t, managedDataComponents.Blockchain()) + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() + + managedDataComponents, err := dataComp.NewManagedDataComponents(nil) + require.Equal(t, errErd.ErrNilDataComponentsFactory, err) + require.Nil(t, managedDataComponents) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) + managedDataComponents, err := dataComp.NewManagedDataComponents(dataComponentsFactory) + require.Nil(t, err) + require.NotNil(t, managedDataComponents) + }) } -func TestManagedDataComponents_CreateShouldWork(t *testing.T) { +func TestManagedDataComponents_Create(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) - managedDataComponents, err := dataComp.NewManagedDataComponents(dataComponentsFactory) - require.NoError(t, err) - require.Nil(t, managedDataComponents.Blockchain()) - require.Nil(t, managedDataComponents.StorageService()) - require.Nil(t, managedDataComponents.Datapool()) + t.Run("invalid config should error", func(t *testing.T) { + t.Parallel() - err = managedDataComponents.Create() - require.NoError(t, err) - require.NotNil(t, managedDataComponents.Blockchain()) - require.NotNil(t, managedDataComponents.StorageService()) - require.NotNil(t, managedDataComponents.Datapool()) + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} + dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) + managedDataComponents, err := dataComp.NewManagedDataComponents(dataComponentsFactory) + require.NoError(t, err) + err = managedDataComponents.Create() + require.Error(t, err) + require.Nil(t, managedDataComponents.Blockchain()) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) + managedDataComponents, err := dataComp.NewManagedDataComponents(dataComponentsFactory) + require.NoError(t, err) + require.Equal(t, errErd.ErrNilDataComponents, managedDataComponents.CheckSubcomponents()) + require.Nil(t, managedDataComponents.Blockchain()) + require.Nil(t, managedDataComponents.StorageService()) + require.Nil(t, managedDataComponents.Datapool()) + require.Nil(t, managedDataComponents.MiniBlocksProvider()) + + err = managedDataComponents.Create() + require.NoError(t, err) + require.NotNil(t, managedDataComponents.Blockchain()) + require.NotNil(t, managedDataComponents.StorageService()) + require.NotNil(t, managedDataComponents.Datapool()) + require.NotNil(t, managedDataComponents.MiniBlocksProvider()) + require.Nil(t, managedDataComponents.CheckSubcomponents()) + + require.Equal(t, errErd.ErrNilBlockChainHandler, managedDataComponents.SetBlockchain(nil)) + require.Nil(t, managedDataComponents.SetBlockchain(&testscommon.ChainHandlerMock{})) + + require.Equal(t, factory.DataComponentsName, managedDataComponents.String()) + }) } func TestManagedDataComponents_Close(t *testing.T) { @@ -59,7 +96,9 @@ func TestManagedDataComponents_Close(t *testing.T) { err = managedDataComponents.Close() require.NoError(t, err) - require.Nil(t, managedDataComponents.Blockchain()) + + err = managedDataComponents.Close() + require.NoError(t, err) } func TestManagedDataComponents_Clone(t *testing.T) { @@ -82,3 +121,19 @@ func TestManagedDataComponents_Clone(t *testing.T) { clonedAfterClose := managedDataComponents.Clone() require.Equal(t, managedDataComponents, clonedAfterClose) } + +func TestManagedDataComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedDataComponents, err := dataComp.NewManagedDataComponents(nil) + require.Equal(t, errErd.ErrNilDataComponentsFactory, err) + require.True(t, managedDataComponents.IsInterfaceNil()) + + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) + managedDataComponents, err = dataComp.NewManagedDataComponents(dataComponentsFactory) + require.NoError(t, err) + require.False(t, managedDataComponents.IsInterfaceNil()) +} diff --git a/factory/data/dataComponents_test.go b/factory/data/dataComponents_test.go index 2714951ef7c..197c9277614 100644 --- a/factory/data/dataComponents_test.go +++ b/factory/data/dataComponents_test.go @@ -1,111 +1,227 @@ package data_test import ( + "errors" "testing" "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/config" - "github.com/multiversx/mx-chain-go/errors" + erdErrors "github.com/multiversx/mx-chain-go/errors" dataComp "github.com/multiversx/mx-chain-go/factory/data" "github.com/multiversx/mx-chain-go/factory/mock" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/stretchr/testify/require" ) -func TestNewDataComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { +func TestNewDataComponentsFactory(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - coreComponents := componentsMock.GetCoreComponents() - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - args.ShardCoordinator = nil - - dcf, err := dataComp.NewDataComponentsFactory(args) - require.Nil(t, dcf) - require.Equal(t, errors.ErrNilShardCoordinator, err) -} - -func TestNewDataComponentsFactory_NilCoreComponentsShouldErr(t *testing.T) { - t.Parallel() - - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetDataArgs(nil, shardCoordinator) - args.Core = nil - - dcf, err := dataComp.NewDataComponentsFactory(args) - require.Nil(t, dcf) - require.Equal(t, errors.ErrNilCoreComponents, err) -} - -func TestNewDataComponentsFactory_NilEpochStartNotifierShouldErr(t *testing.T) { - t.Parallel() - - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - coreComponents := componentsMock.GetCoreComponents() - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - args.EpochStartNotifier = nil - - dcf, err := dataComp.NewDataComponentsFactory(args) - require.Nil(t, dcf) - require.Equal(t, errors.ErrNilEpochStartNotifier, err) -} - -func TestNewDataComponentsFactory_OkValsShouldWork(t *testing.T) { - t.Parallel() - - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - coreComponents := componentsMock.GetCoreComponents() - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - dcf, err := dataComp.NewDataComponentsFactory(args) - require.NoError(t, err) - require.NotNil(t, dcf) + t.Run("nil shard coordinator should error", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.ShardCoordinator = nil + + dcf, err := dataComp.NewDataComponentsFactory(args) + require.Nil(t, dcf) + require.Equal(t, erdErrors.ErrNilShardCoordinator, err) + }) + t.Run("nil core components should error", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(nil, shardCoordinator) + args.Core = nil + + dcf, err := dataComp.NewDataComponentsFactory(args) + require.Nil(t, dcf) + require.Equal(t, erdErrors.ErrNilCoreComponents, err) + }) + t.Run("nil epoch start notifier should error", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.EpochStartNotifier = nil + + dcf, err := dataComp.NewDataComponentsFactory(args) + require.Nil(t, dcf) + require.Equal(t, erdErrors.ErrNilEpochStartNotifier, err) + }) + t.Run("nil status core components should error", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.StatusCore = nil + + dcf, err := dataComp.NewDataComponentsFactory(args) + require.Nil(t, dcf) + require.Equal(t, erdErrors.ErrNilStatusCoreComponents, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + require.NotNil(t, dcf) + }) } -func TestDataComponentsFactory_CreateShouldErrDueBadConfig(t *testing.T) { +func TestDataComponentsFactory_Create(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - coreComponents := componentsMock.GetCoreComponents() - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} - dcf, err := dataComp.NewDataComponentsFactory(args) - require.NoError(t, err) - - dc, err := dcf.Create() - require.Error(t, err) - require.Nil(t, dc) -} - -func TestDataComponentsFactory_CreateForShardShouldWork(t *testing.T) { - t.Parallel() - - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - dcf, err := dataComp.NewDataComponentsFactory(args) - - require.NoError(t, err) - dc, err := dcf.Create() - require.NoError(t, err) - require.NotNil(t, dc) -} - -func TestDataComponentsFactory_CreateForMetaShouldWork(t *testing.T) { - t.Parallel() - - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - shardCoordinator.CurrentShard = core.MetachainShardId - args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - - dcf, err := dataComp.NewDataComponentsFactory(args) - require.NoError(t, err) - dc, err := dcf.Create() - require.NoError(t, err) - require.NotNil(t, dc) + t.Run("NewBlockChain returns error for shard", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.StatusCore = &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: nil, + } + args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + + dc, err := dcf.Create() + require.Error(t, err) + require.Nil(t, dc) + }) + t.Run("NewBlockChain returns error for meta", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + shardCoordinator.CurrentShard = core.MetachainShardId + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.StatusCore = &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: nil, + } + args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + + dc, err := dcf.Create() + require.Error(t, err) + require.Nil(t, dc) + }) + t.Run("createBlockChainFromConfig returns error", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + shardCoordinator.CurrentShard = 12345 + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + + dc, err := dcf.Create() + require.Equal(t, erdErrors.ErrBlockchainCreation, err) + require.Nil(t, dc) + }) + t.Run("NewStorageServiceFactory returns error", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.Config.StoragePruning.NumActivePersisters = 0 + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + + dc, err := dcf.Create() + require.Error(t, err) + require.Nil(t, dc) + }) + t.Run("createDataStoreFromConfig fails for shard due to bad config", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + + dc, err := dcf.Create() + require.Error(t, err) + require.Nil(t, dc) + }) + t.Run("createDataStoreFromConfig fails, invalid shard", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + cnt := 0 + shardCoordinator.SelfIDCalled = func() uint32 { + cnt++ + if cnt > 1 { + return 12345 + } + return 0 + } + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.Config.ShardHdrNonceHashStorage = config.StorageConfig{} + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + + dc, err := dcf.Create() + require.Equal(t, erdErrors.ErrDataStoreCreation, err) + require.Nil(t, dc) + }) + t.Run("NewDataPoolFromConfig fails should error", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + args.Config.TxBlockBodyDataPool.Type = "invalid" + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + + dc, err := dcf.Create() + require.True(t, errors.Is(err, erdErrors.ErrDataPoolCreation)) + require.Nil(t, dc) + }) + t.Run("should work for shard", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + dcf, err := dataComp.NewDataComponentsFactory(args) + + require.NoError(t, err) + dc, err := dcf.Create() + require.NoError(t, err) + require.NotNil(t, dc) + }) + t.Run("should work for meta", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + shardCoordinator.CurrentShard = core.MetachainShardId + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + + dcf, err := dataComp.NewDataComponentsFactory(args) + require.NoError(t, err) + dc, err := dcf.Create() + require.NoError(t, err) + require.NotNil(t, dc) + }) } -// ------------ Test DataComponents -------------------- func TestManagedDataComponents_CloseShouldWork(t *testing.T) { t.Parallel() diff --git a/factory/interface.go b/factory/interface.go index 004634703b8..fe6ea4144e9 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -210,7 +210,7 @@ type MiniBlockProvider interface { // DataComponentsHolder holds the data components type DataComponentsHolder interface { Blockchain() data.ChainHandler - SetBlockchain(chain data.ChainHandler) + SetBlockchain(chain data.ChainHandler) error StorageService() dataRetriever.StorageService Datapool() dataRetriever.PoolsHolder MiniBlocksProvider() MiniBlockProvider diff --git a/factory/mock/dataComponentsMock.go b/factory/mock/dataComponentsMock.go index e39f62c3fbe..aeac7aa6823 100644 --- a/factory/mock/dataComponentsMock.go +++ b/factory/mock/dataComponentsMock.go @@ -50,8 +50,9 @@ func (dcm *DataComponentsMock) EconomicsHandler() factory.EconomicsHandler { } // SetBlockchain - -func (dcm *DataComponentsMock) SetBlockchain(chain data.ChainHandler) { +func (dcm *DataComponentsMock) SetBlockchain(chain data.ChainHandler) error { dcm.Blkc = chain + return nil } // IsInterfaceNil - diff --git a/genesis/mock/dataComponentsMock.go b/genesis/mock/dataComponentsMock.go index f4e24bd4420..be38cf0e884 100644 --- a/genesis/mock/dataComponentsMock.go +++ b/genesis/mock/dataComponentsMock.go @@ -52,8 +52,9 @@ func (dcm *DataComponentsMock) MiniBlocksProvider() MiniBlockProvider { } // SetBlockchain - -func (dcm *DataComponentsMock) SetBlockchain(chain data.ChainHandler) { +func (dcm *DataComponentsMock) SetBlockchain(chain data.ChainHandler) error { dcm.Blkc = chain + return nil } // IsInterfaceNil - diff --git a/genesis/process/argGenesisBlockCreator.go b/genesis/process/argGenesisBlockCreator.go index e6166457673..bd1df7c8cef 100644 --- a/genesis/process/argGenesisBlockCreator.go +++ b/genesis/process/argGenesisBlockCreator.go @@ -34,7 +34,7 @@ type dataComponentsHandler interface { StorageService() dataRetriever.StorageService Blockchain() data.ChainHandler Datapool() dataRetriever.PoolsHolder - SetBlockchain(chain data.ChainHandler) + SetBlockchain(chain data.ChainHandler) error Clone() interface{} IsInterfaceNil() bool } diff --git a/genesis/process/genesisBlockCreator.go b/genesis/process/genesisBlockCreator.go index ba898b40414..ac1d247d3c0 100644 --- a/genesis/process/genesisBlockCreator.go +++ b/genesis/process/genesisBlockCreator.go @@ -357,7 +357,10 @@ func (gbc *genesisBlockCreator) createHeaders( return fmt.Errorf("'%w' while generating genesis block for metachain", err) } - metaArgsGenesisBlockCreator.Data.SetBlockchain(chain) + err = metaArgsGenesisBlockCreator.Data.SetBlockchain(chain) + if err != nil { + return fmt.Errorf("'%w' while setting blockchain for metachain", err) + } genesisBlock, scResults, gbc.initialIndexingData[shardID], err = CreateMetaGenesisBlock( metaArgsGenesisBlockCreator, mapBodies[core.MetachainShardId], diff --git a/integrationTests/mock/dataComponentsStub.go b/integrationTests/mock/dataComponentsStub.go index cd06d64ddb2..d23f6b9080b 100644 --- a/integrationTests/mock/dataComponentsStub.go +++ b/integrationTests/mock/dataComponentsStub.go @@ -42,10 +42,11 @@ func (dcs *DataComponentsStub) Blockchain() data.ChainHandler { } // SetBlockchain - -func (dcs *DataComponentsStub) SetBlockchain(chain data.ChainHandler) { +func (dcs *DataComponentsStub) SetBlockchain(chain data.ChainHandler) error { dcs.mutDcm.Lock() dcs.BlockChain = chain dcs.mutDcm.Unlock() + return nil } // StorageService - diff --git a/integrationTests/testInitializer.go b/integrationTests/testInitializer.go index a44cf3c6828..d118eb4183a 100644 --- a/integrationTests/testInitializer.go +++ b/integrationTests/testInitializer.go @@ -822,7 +822,7 @@ func CreateGenesisMetaBlock( argsMetaGenesis.ShardCoordinator = newShardCoordinator argsMetaGenesis.Accounts = newAccounts - argsMetaGenesis.Data.SetBlockchain(newBlkc) + _ = argsMetaGenesis.Data.SetBlockchain(newBlkc) dataComponents.DataPool = newDataPool } diff --git a/node/mock/factory/dataComponentsStub.go b/node/mock/factory/dataComponentsStub.go index b39a58f6309..67d40cfbd99 100644 --- a/node/mock/factory/dataComponentsStub.go +++ b/node/mock/factory/dataComponentsStub.go @@ -42,10 +42,11 @@ func (dcm *DataComponentsMock) Blockchain() data.ChainHandler { } // SetBlockchain - -func (dcm *DataComponentsMock) SetBlockchain(chain data.ChainHandler) { +func (dcm *DataComponentsMock) SetBlockchain(chain data.ChainHandler) error { dcm.mutDcm.Lock() dcm.BlockChain = chain dcm.mutDcm.Unlock() + return nil } // StorageService - From 289e6d6a95e132f5fbdbcf7e3b0af0a77f5cd6d9 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 4 Apr 2023 08:58:55 +0300 Subject: [PATCH 241/335] fixes after review --- .../bootstrapComponentsHandler_test.go | 8 ++-- factory/bootstrap/bootstrapComponents_test.go | 14 +++--- factory/core/coreComponentsHandler_test.go | 26 +++++++---- factory/core/coreComponents_test.go | 20 ++++---- factory/crypto/cryptoComponents.go | 11 ----- factory/crypto/cryptoComponentsHandler.go | 12 ----- .../crypto/cryptoComponentsHandler_test.go | 44 +++++++++++++----- factory/data/dataComponentsHandler_test.go | 46 ++++++++++++++----- factory/data/dataComponents_test.go | 16 +++---- factory/interface.go | 1 - factory/mock/cryptoComponentsMock.go | 7 --- integrationTests/mock/cryptoComponentsStub.go | 7 --- integrationTests/testProcessorNode.go | 1 - node/mock/factory/cryptoComponentsStub.go | 7 --- node/nodeTesting_test.go | 1 - testscommon/components/default.go | 1 - 16 files changed, 115 insertions(+), 107 deletions(-) diff --git a/factory/bootstrap/bootstrapComponentsHandler_test.go b/factory/bootstrap/bootstrapComponentsHandler_test.go index edea9b7ecde..2d7fcee560f 100644 --- a/factory/bootstrap/bootstrapComponentsHandler_test.go +++ b/factory/bootstrap/bootstrapComponentsHandler_test.go @@ -4,7 +4,7 @@ import ( "errors" "testing" - errorsErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory/bootstrap" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" @@ -28,7 +28,7 @@ func TestNewBootstrapComponentsFactory_NilFactory(t *testing.T) { mbc, err := bootstrap.NewManagedBootstrapComponents(nil) require.Nil(t, mbc) - require.Equal(t, errorsErd.ErrNilBootstrapComponentsFactory, err) + require.Equal(t, errorsMx.ErrNilBootstrapComponentsFactory, err) } func TestManagedBootstrapComponents_CheckSubcomponentsNoCreate(t *testing.T) { @@ -39,7 +39,7 @@ func TestManagedBootstrapComponents_CheckSubcomponentsNoCreate(t *testing.T) { mbc, _ := bootstrap.NewManagedBootstrapComponents(bcf) err := mbc.CheckSubcomponents() - require.Equal(t, errorsErd.ErrNilBootstrapComponentsHolder, err) + require.Equal(t, errorsMx.ErrNilBootstrapComponentsHolder, err) } func TestManagedBootstrapComponents_Create(t *testing.T) { @@ -67,7 +67,7 @@ func TestManagedBootstrapComponents_CreateNilInternalMarshalizer(t *testing.T) { coreComponents.IntMarsh = nil err := mbc.Create() - require.True(t, errors.Is(err, errorsErd.ErrBootstrapDataComponentsFactoryCreate)) + require.True(t, errors.Is(err, errorsMx.ErrBootstrapDataComponentsFactoryCreate)) } func TestManagedBootstrapComponents_Close(t *testing.T) { diff --git a/factory/bootstrap/bootstrapComponents_test.go b/factory/bootstrap/bootstrapComponents_test.go index fa4dee8ef82..f6db74e743e 100644 --- a/factory/bootstrap/bootstrapComponents_test.go +++ b/factory/bootstrap/bootstrapComponents_test.go @@ -4,7 +4,7 @@ import ( "errors" "testing" - errorsErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory/bootstrap" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" @@ -31,7 +31,7 @@ func TestNewBootstrapComponentsFactory_NilCoreComponents(t *testing.T) { bcf, err := bootstrap.NewBootstrapComponentsFactory(args) require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilCoreComponentsHolder, err) + require.Equal(t, errorsMx.ErrNilCoreComponentsHolder, err) } func TestNewBootstrapComponentsFactory_NilCryptoComponents(t *testing.T) { @@ -43,7 +43,7 @@ func TestNewBootstrapComponentsFactory_NilCryptoComponents(t *testing.T) { bcf, err := bootstrap.NewBootstrapComponentsFactory(args) require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilCryptoComponentsHolder, err) + require.Equal(t, errorsMx.ErrNilCryptoComponentsHolder, err) } func TestNewBootstrapComponentsFactory_NilNetworkComponents(t *testing.T) { @@ -55,7 +55,7 @@ func TestNewBootstrapComponentsFactory_NilNetworkComponents(t *testing.T) { bcf, err := bootstrap.NewBootstrapComponentsFactory(args) require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilNetworkComponentsHolder, err) + require.Equal(t, errorsMx.ErrNilNetworkComponentsHolder, err) } func TestNewBootstrapComponentsFactory_NilWorkingDir(t *testing.T) { @@ -67,7 +67,7 @@ func TestNewBootstrapComponentsFactory_NilWorkingDir(t *testing.T) { bcf, err := bootstrap.NewBootstrapComponentsFactory(args) require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrInvalidWorkingDir, err) + require.Equal(t, errorsMx.ErrInvalidWorkingDir, err) } func TestBootstrapComponentsFactory_CreateShouldWork(t *testing.T) { @@ -96,7 +96,7 @@ func TestBootstrapComponentsFactory_CreateBootstrapDataProviderCreationFail(t *t bc, err := bcf.Create() require.Nil(t, bc) - require.True(t, errors.Is(err, errorsErd.ErrNewBootstrapDataProvider)) + require.True(t, errors.Is(err, errorsMx.ErrNewBootstrapDataProvider)) } func TestBootstrapComponentsFactory_CreateEpochStartBootstrapCreationFail(t *testing.T) { @@ -112,5 +112,5 @@ func TestBootstrapComponentsFactory_CreateEpochStartBootstrapCreationFail(t *tes bc, err := bcf.Create() require.Nil(t, bc) - require.True(t, errors.Is(err, errorsErd.ErrNewEpochStartBootstrap)) + require.True(t, errors.Is(err, errorsMx.ErrNewEpochStartBootstrap)) } diff --git a/factory/core/coreComponentsHandler_test.go b/factory/core/coreComponentsHandler_test.go index daffc8d6e24..346add45ada 100644 --- a/factory/core/coreComponentsHandler_test.go +++ b/factory/core/coreComponentsHandler_test.go @@ -5,7 +5,7 @@ import ( "time" "github.com/multiversx/mx-chain-go/config" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" coreComp "github.com/multiversx/mx-chain-go/factory/core" "github.com/multiversx/mx-chain-go/testscommon" @@ -20,7 +20,7 @@ func TestManagedCoreComponents(t *testing.T) { t.Parallel() managedCoreComponents, err := coreComp.NewManagedCoreComponents(nil) - require.Equal(t, errErd.ErrNilCoreComponentsFactory, err) + require.Equal(t, errorsMx.ErrNilCoreComponentsFactory, err) require.Nil(t, managedCoreComponents) }) t.Run("invalid args should error", func(t *testing.T) { @@ -45,7 +45,6 @@ func TestManagedCoreComponents(t *testing.T) { coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) managedCoreComponents, err := coreComp.NewManagedCoreComponents(coreComponentsFactory) require.NoError(t, err) - require.Equal(t, errErd.ErrNilCoreComponents, managedCoreComponents.CheckSubcomponents()) require.Nil(t, managedCoreComponents.Hasher()) require.Nil(t, managedCoreComponents.InternalMarshalizer()) require.Nil(t, managedCoreComponents.VmMarshalizer()) @@ -83,7 +82,6 @@ func TestManagedCoreComponents(t *testing.T) { err = managedCoreComponents.Create() require.NoError(t, err) - require.Nil(t, managedCoreComponents.CheckSubcomponents()) require.NotNil(t, managedCoreComponents.Hasher()) require.NotNil(t, managedCoreComponents.InternalMarshalizer()) require.NotNil(t, managedCoreComponents.VmMarshalizer()) @@ -130,16 +128,28 @@ func TestManagedCoreComponents(t *testing.T) { }) } +func TestManagedCoreComponents_CheckSubcomponents(t *testing.T) { + t.Parallel() + + coreArgs := componentsMock.GetCoreArgs() + coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) + managedCoreComponents, err := coreComp.NewManagedCoreComponents(coreComponentsFactory) + require.NoError(t, err) + require.Equal(t, errorsMx.ErrNilCoreComponents, managedCoreComponents.CheckSubcomponents()) + + err = managedCoreComponents.Create() + require.NoError(t, err) + require.Nil(t, managedCoreComponents.CheckSubcomponents()) +} + func TestManagedCoreComponents_IsInterfaceNil(t *testing.T) { t.Parallel() - managedCoreComponents, err := coreComp.NewManagedCoreComponents(nil) - require.Equal(t, errErd.ErrNilCoreComponentsFactory, err) + managedCoreComponents, _ := coreComp.NewManagedCoreComponents(nil) require.True(t, managedCoreComponents.IsInterfaceNil()) coreArgs := componentsMock.GetCoreArgs() coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) - managedCoreComponents, err = coreComp.NewManagedCoreComponents(coreComponentsFactory) - require.NoError(t, err) + managedCoreComponents, _ = coreComp.NewManagedCoreComponents(coreComponentsFactory) require.False(t, managedCoreComponents.IsInterfaceNil()) } diff --git a/factory/core/coreComponents_test.go b/factory/core/coreComponents_test.go index 0c1b42f26f4..090776b3b93 100644 --- a/factory/core/coreComponents_test.go +++ b/factory/core/coreComponents_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" - errorsErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" coreComp "github.com/multiversx/mx-chain-go/factory/core" "github.com/multiversx/mx-chain-go/state" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" @@ -35,7 +35,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoHasherConfigShouldErr(t *te cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrHasherCreation)) + require.True(t, errors.Is(err, errorsMx.ErrHasherCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsInvalidHasherConfigShouldErr(t *testing.T) { @@ -55,7 +55,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidHasherConfigShouldErr( cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrHasherCreation)) + require.True(t, errors.Is(err, errorsMx.ErrHasherCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsNoInternalMarshallerConfigShouldErr(t *testing.T) { @@ -71,7 +71,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoInternalMarshallerConfigSho cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrMarshalizerCreation)) + require.True(t, errors.Is(err, errorsMx.ErrMarshalizerCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsInvalidInternalMarshallerConfigShouldErr(t *testing.T) { @@ -91,7 +91,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidInternalMarshallerConf cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrMarshalizerCreation)) + require.True(t, errors.Is(err, errorsMx.ErrMarshalizerCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsNoVmMarshallerConfigShouldErr(t *testing.T) { @@ -111,7 +111,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoVmMarshallerConfigShouldErr cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrMarshalizerCreation)) + require.True(t, errors.Is(err, errorsMx.ErrMarshalizerCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsInvalidVmMarshallerConfigShouldErr(t *testing.T) { @@ -134,7 +134,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidVmMarshallerConfigShou cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrMarshalizerCreation)) + require.True(t, errors.Is(err, errorsMx.ErrMarshalizerCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsNoTxSignMarshallerConfigShouldErr(t *testing.T) { @@ -157,7 +157,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsNoTxSignMarshallerConfigShoul cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrMarshalizerCreation)) + require.True(t, errors.Is(err, errorsMx.ErrMarshalizerCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignMarshallerConfigShouldErr(t *testing.T) { @@ -183,7 +183,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignMarshallerConfig cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrMarshalizerCreation)) + require.True(t, errors.Is(err, errorsMx.ErrMarshalizerCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignHasherConfigShouldErr(t *testing.T) { @@ -197,7 +197,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidTxSignHasherConfigShou cc, err := ccf.Create() require.Nil(t, cc) - require.True(t, errors.Is(err, errorsErd.ErrHasherCreation)) + require.True(t, errors.Is(err, errorsMx.ErrHasherCreation)) } func TestCoreComponentsFactory_CreateCoreComponentsInvalidValPubKeyConverterShouldErr(t *testing.T) { diff --git a/factory/crypto/cryptoComponents.go b/factory/crypto/cryptoComponents.go index 4caeaee15ee..b73349565e7 100644 --- a/factory/crypto/cryptoComponents.go +++ b/factory/crypto/cryptoComponents.go @@ -69,7 +69,6 @@ type cryptoParams struct { privateKey crypto.PrivateKey publicKeyString string publicKeyBytes []byte - privateKeyBytes []byte } // p2pCryptoParams holds the p2p public/private key data @@ -271,11 +270,6 @@ func (ccf *cryptoComponentsFactory) readCryptoParams(keygen crypto.KeyGenerator) return nil, err } - cp.privateKeyBytes, err = cp.privateKey.ToByteArray() - if err != nil { - return nil, err - } - cp.publicKey = cp.privateKey.GeneratePublic() if len(readPk) > 0 { cp.publicKeyBytes, err = cp.publicKey.ToByteArray() @@ -307,11 +301,6 @@ func (ccf *cryptoComponentsFactory) generateCryptoParams(keygen crypto.KeyGenera cp.privateKey, cp.publicKey = keygen.GeneratePair() var err error - cp.privateKeyBytes, err = cp.privateKey.ToByteArray() - if err != nil { - return nil, err - } - cp.publicKeyBytes, err = cp.publicKey.ToByteArray() if err != nil { return nil, err diff --git a/factory/crypto/cryptoComponentsHandler.go b/factory/crypto/cryptoComponentsHandler.go index 78ccc8f2587..1a2b2e7d820 100644 --- a/factory/crypto/cryptoComponentsHandler.go +++ b/factory/crypto/cryptoComponentsHandler.go @@ -194,18 +194,6 @@ func (mcc *managedCryptoComponents) PublicKeyBytes() []byte { return mcc.cryptoParams.publicKeyBytes } -// PrivateKeyBytes returns the configured validator private key bytes -func (mcc *managedCryptoComponents) PrivateKeyBytes() []byte { - mcc.mutCryptoComponents.RLock() - defer mcc.mutCryptoComponents.RUnlock() - - if mcc.cryptoComponents == nil { - return nil - } - - return mcc.cryptoParams.privateKeyBytes -} - // TxSingleSigner returns the transaction signer func (mcc *managedCryptoComponents) TxSingleSigner() crypto.SingleSigner { mcc.mutCryptoComponents.RLock() diff --git a/factory/crypto/cryptoComponentsHandler_test.go b/factory/crypto/cryptoComponentsHandler_test.go index 201f7c2ba69..c917e944692 100644 --- a/factory/crypto/cryptoComponentsHandler_test.go +++ b/factory/crypto/cryptoComponentsHandler_test.go @@ -4,7 +4,7 @@ import ( "strings" "testing" - erdErrors "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" cryptoComp "github.com/multiversx/mx-chain-go/factory/crypto" "github.com/multiversx/mx-chain-go/integrationTests/mock" @@ -19,7 +19,7 @@ func TestManagedCryptoComponents(t *testing.T) { t.Parallel() managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(nil) - require.Equal(t, erdErrors.ErrNilCryptoComponentsFactory, err) + require.Equal(t, errorsMx.ErrNilCryptoComponentsFactory, err) require.Nil(t, managedCryptoComponents) }) t.Run("invalid args should error", func(t *testing.T) { @@ -45,7 +45,7 @@ func TestManagedCryptoComponents(t *testing.T) { managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) require.NoError(t, err) err = managedCryptoComponents.Create() - require.True(t, strings.Contains(err.Error(), erdErrors.ErrPublicKeyMismatch.Error())) + require.True(t, strings.Contains(err.Error(), errorsMx.ErrPublicKeyMismatch.Error())) }) t.Run("should work with activateBLSPubKeyMessageVerification", func(t *testing.T) { t.Parallel() @@ -67,7 +67,6 @@ func TestManagedCryptoComponents(t *testing.T) { cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) require.NoError(t, err) - require.Equal(t, erdErrors.ErrNilCryptoComponents, managedCryptoComponents.CheckSubcomponents()) require.Nil(t, managedCryptoComponents.TxSingleSigner()) require.Nil(t, managedCryptoComponents.BlockSigner()) require.Nil(t, managedCryptoComponents.MultiSignerContainer()) @@ -81,17 +80,15 @@ func TestManagedCryptoComponents(t *testing.T) { require.Empty(t, managedCryptoComponents.PublicKeyString()) require.Nil(t, managedCryptoComponents.PublicKeyBytes()) require.Nil(t, managedCryptoComponents.P2pPrivateKey()) - require.Nil(t, managedCryptoComponents.PrivateKeyBytes()) require.Nil(t, managedCryptoComponents.P2pSingleSigner()) require.Nil(t, managedCryptoComponents.PeerSignatureHandler()) require.Nil(t, managedCryptoComponents.P2pKeyGen()) multiSigner, errGet := managedCryptoComponents.GetMultiSigner(0) require.Nil(t, multiSigner) - require.Equal(t, erdErrors.ErrNilCryptoComponentsHolder, errGet) + require.Equal(t, errorsMx.ErrNilCryptoComponentsHolder, errGet) err = managedCryptoComponents.Create() require.NoError(t, err) - require.Nil(t, managedCryptoComponents.CheckSubcomponents()) require.NotNil(t, managedCryptoComponents.TxSingleSigner()) require.NotNil(t, managedCryptoComponents.BlockSigner()) require.NotNil(t, managedCryptoComponents.MultiSignerContainer()) @@ -107,9 +104,6 @@ func TestManagedCryptoComponents(t *testing.T) { require.NotNil(t, managedCryptoComponents.P2pPublicKey()) require.NotEmpty(t, managedCryptoComponents.PublicKeyString()) require.NotNil(t, managedCryptoComponents.PublicKeyBytes()) - require.NotNil(t, managedCryptoComponents.PrivateKeyBytes()) - require.Equal(t, erdErrors.ErrNilMultiSignerContainer, managedCryptoComponents.SetMultiSignerContainer(nil)) - require.Nil(t, managedCryptoComponents.SetMultiSignerContainer(&mock.CryptoComponentsStub{})) require.NotNil(t, managedCryptoComponents.P2pSingleSigner()) require.NotNil(t, managedCryptoComponents.PeerSignatureHandler()) require.NotNil(t, managedCryptoComponents.P2pKeyGen()) @@ -124,6 +118,34 @@ func TestManagedCryptoComponents(t *testing.T) { }) } +func TestNewManagedCryptoComponents_CheckSubcomponents(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetCryptoArgs(coreComponents) + cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) + managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) + require.NoError(t, err) + require.Equal(t, errorsMx.ErrNilCryptoComponents, managedCryptoComponents.CheckSubcomponents()) + + err = managedCryptoComponents.Create() + require.NoError(t, err) + require.Nil(t, managedCryptoComponents.CheckSubcomponents()) +} + +func TestNewManagedCryptoComponents_SetMultiSignerContainer(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetCryptoArgs(coreComponents) + cryptoComponentsFactory, _ := cryptoComp.NewCryptoComponentsFactory(args) + managedCryptoComponents, _ := cryptoComp.NewManagedCryptoComponents(cryptoComponentsFactory) + _ = managedCryptoComponents.Create() + + require.Equal(t, errorsMx.ErrNilMultiSignerContainer, managedCryptoComponents.SetMultiSignerContainer(nil)) + require.Nil(t, managedCryptoComponents.SetMultiSignerContainer(&mock.CryptoComponentsStub{})) +} + func TestManagedCryptoComponents_Clone(t *testing.T) { t.Parallel() @@ -150,7 +172,7 @@ func TestNewManagedCryptoComponents_IsInterfaceNil(t *testing.T) { t.Parallel() managedCryptoComponents, err := cryptoComp.NewManagedCryptoComponents(nil) - require.Equal(t, erdErrors.ErrNilCryptoComponentsFactory, err) + require.Equal(t, errorsMx.ErrNilCryptoComponentsFactory, err) require.True(t, managedCryptoComponents.IsInterfaceNil()) coreComponents := componentsMock.GetCoreComponents() diff --git a/factory/data/dataComponentsHandler_test.go b/factory/data/dataComponentsHandler_test.go index 00af88f3e60..7c1e2fef913 100644 --- a/factory/data/dataComponentsHandler_test.go +++ b/factory/data/dataComponentsHandler_test.go @@ -4,7 +4,7 @@ import ( "testing" "github.com/multiversx/mx-chain-go/config" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" dataComp "github.com/multiversx/mx-chain-go/factory/data" "github.com/multiversx/mx-chain-go/factory/mock" @@ -20,7 +20,7 @@ func TestNewManagedDataComponents(t *testing.T) { t.Parallel() managedDataComponents, err := dataComp.NewManagedDataComponents(nil) - require.Equal(t, errErd.ErrNilDataComponentsFactory, err) + require.Equal(t, errorsMx.ErrNilDataComponentsFactory, err) require.Nil(t, managedDataComponents) }) t.Run("should work", func(t *testing.T) { @@ -62,7 +62,6 @@ func TestManagedDataComponents_Create(t *testing.T) { dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) managedDataComponents, err := dataComp.NewManagedDataComponents(dataComponentsFactory) require.NoError(t, err) - require.Equal(t, errErd.ErrNilDataComponents, managedDataComponents.CheckSubcomponents()) require.Nil(t, managedDataComponents.Blockchain()) require.Nil(t, managedDataComponents.StorageService()) require.Nil(t, managedDataComponents.Datapool()) @@ -74,15 +73,42 @@ func TestManagedDataComponents_Create(t *testing.T) { require.NotNil(t, managedDataComponents.StorageService()) require.NotNil(t, managedDataComponents.Datapool()) require.NotNil(t, managedDataComponents.MiniBlocksProvider()) - require.Nil(t, managedDataComponents.CheckSubcomponents()) - - require.Equal(t, errErd.ErrNilBlockChainHandler, managedDataComponents.SetBlockchain(nil)) - require.Nil(t, managedDataComponents.SetBlockchain(&testscommon.ChainHandlerMock{})) require.Equal(t, factory.DataComponentsName, managedDataComponents.String()) }) } +func TestManagedDataComponents_CheckSubcomponents(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) + managedDataComponents, err := dataComp.NewManagedDataComponents(dataComponentsFactory) + require.NoError(t, err) + require.Equal(t, errorsMx.ErrNilDataComponents, managedDataComponents.CheckSubcomponents()) + + err = managedDataComponents.Create() + require.NoError(t, err) + require.Nil(t, managedDataComponents.CheckSubcomponents()) +} + +func TestManagedDataComponents_SetBlockchain(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) + dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) + managedDataComponents, _ := dataComp.NewManagedDataComponents(dataComponentsFactory) + + _ = managedDataComponents.Create() + + require.Equal(t, errorsMx.ErrNilBlockChainHandler, managedDataComponents.SetBlockchain(nil)) + require.Nil(t, managedDataComponents.SetBlockchain(&testscommon.ChainHandlerMock{})) +} + func TestManagedDataComponents_Close(t *testing.T) { t.Parallel() @@ -125,15 +151,13 @@ func TestManagedDataComponents_Clone(t *testing.T) { func TestManagedDataComponents_IsInterfaceNil(t *testing.T) { t.Parallel() - managedDataComponents, err := dataComp.NewManagedDataComponents(nil) - require.Equal(t, errErd.ErrNilDataComponentsFactory, err) + managedDataComponents, _ := dataComp.NewManagedDataComponents(nil) require.True(t, managedDataComponents.IsInterfaceNil()) coreComponents := componentsMock.GetCoreComponents() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) dataComponentsFactory, _ := dataComp.NewDataComponentsFactory(args) - managedDataComponents, err = dataComp.NewManagedDataComponents(dataComponentsFactory) - require.NoError(t, err) + managedDataComponents, _ = dataComp.NewManagedDataComponents(dataComponentsFactory) require.False(t, managedDataComponents.IsInterfaceNil()) } diff --git a/factory/data/dataComponents_test.go b/factory/data/dataComponents_test.go index 197c9277614..71f9635b353 100644 --- a/factory/data/dataComponents_test.go +++ b/factory/data/dataComponents_test.go @@ -6,7 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/config" - erdErrors "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" dataComp "github.com/multiversx/mx-chain-go/factory/data" "github.com/multiversx/mx-chain-go/factory/mock" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" @@ -27,7 +27,7 @@ func TestNewDataComponentsFactory(t *testing.T) { dcf, err := dataComp.NewDataComponentsFactory(args) require.Nil(t, dcf) - require.Equal(t, erdErrors.ErrNilShardCoordinator, err) + require.Equal(t, errorsMx.ErrNilShardCoordinator, err) }) t.Run("nil core components should error", func(t *testing.T) { t.Parallel() @@ -38,7 +38,7 @@ func TestNewDataComponentsFactory(t *testing.T) { dcf, err := dataComp.NewDataComponentsFactory(args) require.Nil(t, dcf) - require.Equal(t, erdErrors.ErrNilCoreComponents, err) + require.Equal(t, errorsMx.ErrNilCoreComponents, err) }) t.Run("nil epoch start notifier should error", func(t *testing.T) { t.Parallel() @@ -50,7 +50,7 @@ func TestNewDataComponentsFactory(t *testing.T) { dcf, err := dataComp.NewDataComponentsFactory(args) require.Nil(t, dcf) - require.Equal(t, erdErrors.ErrNilEpochStartNotifier, err) + require.Equal(t, errorsMx.ErrNilEpochStartNotifier, err) }) t.Run("nil status core components should error", func(t *testing.T) { t.Parallel() @@ -62,7 +62,7 @@ func TestNewDataComponentsFactory(t *testing.T) { dcf, err := dataComp.NewDataComponentsFactory(args) require.Nil(t, dcf) - require.Equal(t, erdErrors.ErrNilStatusCoreComponents, err) + require.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) }) t.Run("should work", func(t *testing.T) { t.Parallel() @@ -126,7 +126,7 @@ func TestDataComponentsFactory_Create(t *testing.T) { require.NoError(t, err) dc, err := dcf.Create() - require.Equal(t, erdErrors.ErrBlockchainCreation, err) + require.Equal(t, errorsMx.ErrBlockchainCreation, err) require.Nil(t, dc) }) t.Run("NewStorageServiceFactory returns error", func(t *testing.T) { @@ -176,7 +176,7 @@ func TestDataComponentsFactory_Create(t *testing.T) { require.NoError(t, err) dc, err := dcf.Create() - require.Equal(t, erdErrors.ErrDataStoreCreation, err) + require.Equal(t, errorsMx.ErrDataStoreCreation, err) require.Nil(t, dc) }) t.Run("NewDataPoolFromConfig fails should error", func(t *testing.T) { @@ -190,7 +190,7 @@ func TestDataComponentsFactory_Create(t *testing.T) { require.NoError(t, err) dc, err := dcf.Create() - require.True(t, errors.Is(err, erdErrors.ErrDataPoolCreation)) + require.True(t, errors.Is(err, errorsMx.ErrDataPoolCreation)) require.Nil(t, dc) }) t.Run("should work for shard", func(t *testing.T) { diff --git a/factory/interface.go b/factory/interface.go index fe6ea4144e9..c0813129333 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -165,7 +165,6 @@ type CryptoParamsHolder interface { PrivateKey() crypto.PrivateKey PublicKeyString() string PublicKeyBytes() []byte - PrivateKeyBytes() []byte } // CryptoComponentsHolder holds the crypto components diff --git a/factory/mock/cryptoComponentsMock.go b/factory/mock/cryptoComponentsMock.go index 6249992e711..141c3ee96fd 100644 --- a/factory/mock/cryptoComponentsMock.go +++ b/factory/mock/cryptoComponentsMock.go @@ -17,7 +17,6 @@ type CryptoComponentsMock struct { P2pPrivKey crypto.PrivateKey P2pSig crypto.SingleSigner PubKeyString string - PrivKeyBytes []byte PubKeyBytes []byte BlockSig crypto.SingleSigner TxSig crypto.SingleSigner @@ -65,11 +64,6 @@ func (ccm *CryptoComponentsMock) PublicKeyBytes() []byte { return ccm.PubKeyBytes } -// PrivateKeyBytes - -func (ccm *CryptoComponentsMock) PrivateKeyBytes() []byte { - return ccm.PrivKeyBytes -} - // BlockSigner - func (ccm *CryptoComponentsMock) BlockSigner() crypto.SingleSigner { return ccm.BlockSig @@ -143,7 +137,6 @@ func (ccm *CryptoComponentsMock) Clone() interface{} { PubKey: ccm.PubKey, PrivKey: ccm.PrivKey, PubKeyString: ccm.PubKeyString, - PrivKeyBytes: ccm.PrivKeyBytes, PubKeyBytes: ccm.PubKeyBytes, BlockSig: ccm.BlockSig, TxSig: ccm.TxSig, diff --git a/integrationTests/mock/cryptoComponentsStub.go b/integrationTests/mock/cryptoComponentsStub.go index fd87b0f3cce..15de5f84c3b 100644 --- a/integrationTests/mock/cryptoComponentsStub.go +++ b/integrationTests/mock/cryptoComponentsStub.go @@ -17,7 +17,6 @@ type CryptoComponentsStub struct { P2pPrivKey crypto.PrivateKey P2pSig crypto.SingleSigner PubKeyString string - PrivKeyBytes []byte PubKeyBytes []byte BlockSig crypto.SingleSigner TxSig crypto.SingleSigner @@ -75,11 +74,6 @@ func (ccs *CryptoComponentsStub) PublicKeyBytes() []byte { return ccs.PubKeyBytes } -// PrivateKeyBytes - -func (ccs *CryptoComponentsStub) PrivateKeyBytes() []byte { - return ccs.PrivKeyBytes -} - // BlockSigner - func (ccs *CryptoComponentsStub) BlockSigner() crypto.SingleSigner { return ccs.BlockSig @@ -160,7 +154,6 @@ func (ccs *CryptoComponentsStub) Clone() interface{} { PrivKey: ccs.PrivKey, P2pPrivKey: ccs.P2pPrivKey, PubKeyString: ccs.PubKeyString, - PrivKeyBytes: ccs.PrivKeyBytes, PubKeyBytes: ccs.PubKeyBytes, BlockSig: ccs.BlockSig, TxSig: ccs.TxSig, diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 995d1659d8a..978eb7e80ea 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -3059,7 +3059,6 @@ func GetDefaultCryptoComponents() *mock.CryptoComponentsStub { PubKey: &mock.PublicKeyMock{}, PrivKey: &mock.PrivateKeyMock{}, PubKeyString: "pubKey", - PrivKeyBytes: []byte("privKey"), PubKeyBytes: []byte("pubKey"), BlockSig: &mock.SignerMock{}, TxSig: &mock.SignerMock{}, diff --git a/node/mock/factory/cryptoComponentsStub.go b/node/mock/factory/cryptoComponentsStub.go index 1b569859f68..dd6fb2cde53 100644 --- a/node/mock/factory/cryptoComponentsStub.go +++ b/node/mock/factory/cryptoComponentsStub.go @@ -17,7 +17,6 @@ type CryptoComponentsMock struct { P2pPrivKey crypto.PrivateKey P2pSig crypto.SingleSigner PubKeyString string - PrivKeyBytes []byte PubKeyBytes []byte BlockSig crypto.SingleSigner TxSig crypto.SingleSigner @@ -80,11 +79,6 @@ func (ccm *CryptoComponentsMock) PublicKeyBytes() []byte { return ccm.PubKeyBytes } -// PrivateKeyBytes - -func (ccm *CryptoComponentsMock) PrivateKeyBytes() []byte { - return ccm.PrivKeyBytes -} - // BlockSigner - func (ccm *CryptoComponentsMock) BlockSigner() crypto.SingleSigner { return ccm.BlockSig @@ -160,7 +154,6 @@ func (ccm *CryptoComponentsMock) Clone() interface{} { PrivKey: ccm.PrivKey, P2pPrivKey: ccm.P2pPrivKey, PubKeyString: ccm.PubKeyString, - PrivKeyBytes: ccm.PrivKeyBytes, PubKeyBytes: ccm.PubKeyBytes, BlockSig: ccm.BlockSig, TxSig: ccm.TxSig, diff --git a/node/nodeTesting_test.go b/node/nodeTesting_test.go index 83b2f2a058b..119d76b1808 100644 --- a/node/nodeTesting_test.go +++ b/node/nodeTesting_test.go @@ -394,7 +394,6 @@ func getDefaultCryptoComponents() *factoryMock.CryptoComponentsMock { PrivKey: &mock.PrivateKeyStub{}, P2pPrivKey: &mock.PrivateKeyStub{}, PubKeyString: "pubKey", - PrivKeyBytes: []byte("privKey"), PubKeyBytes: []byte("pubKey"), BlockSig: &mock.SingleSignerMock{}, TxSig: &mock.SingleSignerMock{}, diff --git a/testscommon/components/default.go b/testscommon/components/default.go index 9a302c0a7eb..7aee0b54a4a 100644 --- a/testscommon/components/default.go +++ b/testscommon/components/default.go @@ -59,7 +59,6 @@ func GetDefaultCryptoComponents() *mock.CryptoComponentsMock { P2pPrivKey: mock.NewP2pPrivateKeyMock(), P2pSig: &mock.SinglesignMock{}, PubKeyString: "pubKey", - PrivKeyBytes: []byte("privKey"), PubKeyBytes: []byte("pubKey"), BlockSig: &mock.SinglesignMock{}, TxSig: &mock.SinglesignMock{}, From 80a83b13b884e562b1cd2e04af855807a07ecfa6 Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 4 Apr 2023 11:50:04 +0300 Subject: [PATCH 242/335] update vm common --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 83f13c6fa13..1fa151ed223 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.39 + github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404084419-9b08f24b8274 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 diff --git a/go.sum b/go.sum index 4917eb14bb5..efbacafa11a 100644 --- a/go.sum +++ b/go.sum @@ -630,8 +630,9 @@ github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2 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.39-0.20230322094554-e7451f25d7bf/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-common-go v1.3.39 h1:6yC/vqwA5o8POeHTmFnbeH2b0wT17izA5PeSulNIZY8= github.com/multiversx/mx-chain-vm-common-go v1.3.39/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404084419-9b08f24b8274 h1:scWE/I6PVSfVzNyE3cv8S/q+uzNHZBAEO2vmKHtKE1k= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404084419-9b08f24b8274/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc h1:Sk83Pf8lL3RtHpfOisJlvG8uk0LBytScQI1+TthBxEI= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc/go.mod h1:44jBXUBfoBJ7W5gLoLJrOB14pt5TUUJBh6jDc7BaC68= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de h1:wlpWxxf/qJHkLakKQvgebCbOWDm1s0mlYts3X3iLXsg= From 2fecb7f805cf64edb1dae6fb36eec253d8cbfcff Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 4 Apr 2023 12:42:28 +0300 Subject: [PATCH 243/335] change vm common and semi integration test --- go.mod | 2 +- go.sum | 4 +-- .../vm/txsFee/guardAccount_test.go | 34 +++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1fa151ed223..d559ac7aa12 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404084419-9b08f24b8274 + github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404093245-8fdb3a8c4054 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 diff --git a/go.sum b/go.sum index efbacafa11a..44fb0623c76 100644 --- a/go.sum +++ b/go.sum @@ -631,8 +631,8 @@ github.com/multiversx/mx-chain-storage-go v1.0.7 h1:UqLo/OLTD3IHiE/TB/SEdNRV1GG2 github.com/multiversx/mx-chain-storage-go v1.0.7/go.mod h1:gtKoV32Cg2Uy8deHzF8Ud0qAl0zv92FvWgPSYIP0Zmg= github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-common-go v1.3.39/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404084419-9b08f24b8274 h1:scWE/I6PVSfVzNyE3cv8S/q+uzNHZBAEO2vmKHtKE1k= -github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404084419-9b08f24b8274/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404093245-8fdb3a8c4054 h1:ZRyiUdOJvsIcfPg8O0B2lfVbqJSRGxVxoj+nSOILEcU= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404093245-8fdb3a8c4054/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc h1:Sk83Pf8lL3RtHpfOisJlvG8uk0LBytScQI1+TthBxEI= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc/go.mod h1:44jBXUBfoBJ7W5gLoLJrOB14pt5TUUJBh6jDc7BaC68= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de h1:wlpWxxf/qJHkLakKQvgebCbOWDm1s0mlYts3X3iLXsg= diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index eae375cf11d..171c6814fa0 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -14,6 +14,7 @@ import ( "sync" "testing" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/guardians" "github.com/multiversx/mx-chain-core-go/data/smartContractResult" @@ -383,6 +384,17 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { } testGuardianStatus(t, testContext, alice, expectedStatus) + allLogs := testContext.TxsLogsProcessor.GetAllCurrentLogs() + require.NotNil(t, allLogs) + + event := allLogs[0].LogHandler.GetLogEvents()[0] + require.Equal(t, &transaction.Event{ + Address: alice, + Identifier: []byte(core.BuiltInFunctionSetGuardian), + Topics: [][]byte{bob, uuid}, + }, event) + testContext.TxsLogsProcessor.Clean() + // can not activate guardian now returnCode, err = guardAccount(testContext, alice) require.Equal(t, process.ErrFailedTransaction, err) @@ -402,6 +414,18 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { } testGuardianStatus(t, testContext, alice, expectedStatus) + allLogs = testContext.TxsLogsProcessor.GetAllCurrentLogs() + require.NotNil(t, allLogs) + + 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"), + }, event) + testContext.TxsLogsProcessor.Clean() + // can activate guardian now returnCode, err = guardAccount(testContext, alice) require.Nil(t, err) @@ -417,6 +441,16 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { pending: nil, } testGuardianStatus(t, testContext, alice, expectedStatus) + + allLogs = testContext.TxsLogsProcessor.GetAllCurrentLogs() + require.NotNil(t, allLogs) + + event = allLogs[0].LogHandler.GetLogEvents()[0] + require.Equal(t, &transaction.Event{ + Address: alice, + Identifier: []byte(core.BuiltInFunctionGuardAccount), + }, event) + testContext.TxsLogsProcessor.Clean() } func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { From 85dc0615b3e3964bd966ea336a9aa780756a99c6 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 4 Apr 2023 13:29:16 +0300 Subject: [PATCH 244/335] added back TestManagedCoreComponents_Close as per review --- factory/core/coreComponentsHandler_test.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/factory/core/coreComponentsHandler_test.go b/factory/core/coreComponentsHandler_test.go index 346add45ada..8d345b2516a 100644 --- a/factory/core/coreComponentsHandler_test.go +++ b/factory/core/coreComponentsHandler_test.go @@ -120,11 +120,6 @@ func TestManagedCoreComponents(t *testing.T) { require.Nil(t, managedCoreComponents.SetInternalMarshalizer(&testscommon.MarshalizerStub{})) require.Equal(t, factory.CoreComponentsName, managedCoreComponents.String()) - - err = managedCoreComponents.Close() - require.NoError(t, err) - err = managedCoreComponents.Create() - require.NoError(t, err) }) } @@ -141,6 +136,18 @@ func TestManagedCoreComponents_CheckSubcomponents(t *testing.T) { require.NoError(t, err) require.Nil(t, managedCoreComponents.CheckSubcomponents()) } +func TestManagedCoreComponents_Close(t *testing.T) { + t.Parallel() + + coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(componentsMock.GetCoreArgs()) + managedCoreComponents, _ := coreComp.NewManagedCoreComponents(coreComponentsFactory) + err := managedCoreComponents.Close() + require.NoError(t, err) + err = managedCoreComponents.Create() + require.NoError(t, err) + err = managedCoreComponents.Close() + require.NoError(t, err) +} func TestManagedCoreComponents_IsInterfaceNil(t *testing.T) { t.Parallel() From 5a43d23dcbaf2ba51f075260b408fbfb981ce00e Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 4 Apr 2023 14:13:19 +0300 Subject: [PATCH 245/335] improved coverage on factory/heartbeat + factory/network --- factory/constants.go | 2 - factory/heartbeat/heartbeatV2Components.go | 20 +- .../heartbeat/heartbeatV2ComponentsHandler.go | 4 + .../heartbeatV2ComponentsHandler_test.go | 94 ++++- .../heartbeat/heartbeatV2Components_test.go | 361 +++++++++++++++++- .../network/networkComponentsHandler_test.go | 110 ++++-- factory/network/networkComponents_test.go | 168 +++++--- .../mock/processComponentsStub.go | 4 + 8 files changed, 650 insertions(+), 113 deletions(-) diff --git a/factory/constants.go b/factory/constants.go index 58a37c56d00..5b2eb2a16f6 100644 --- a/factory/constants.go +++ b/factory/constants.go @@ -13,8 +13,6 @@ const ( CryptoComponentsName = "managedCryptoComponents" // DataComponentsName is the data components identifier DataComponentsName = "managedDataComponents" - // HeartbeatComponentsName is the heartbeat components identifier - HeartbeatComponentsName = "managedHeartbeatComponents" // HeartbeatV2ComponentsName is the heartbeat V2 components identifier HeartbeatV2ComponentsName = "managedHeartbeatV2Components" // NetworkComponentsName is the network components identifier diff --git a/factory/heartbeat/heartbeatV2Components.go b/factory/heartbeat/heartbeatV2Components.go index 2be327361a6..163c459aa95 100644 --- a/factory/heartbeat/heartbeatV2Components.go +++ b/factory/heartbeat/heartbeatV2Components.go @@ -90,25 +90,27 @@ func checkHeartbeatV2FactoryArgs(args ArgHeartbeatV2ComponentsFactory) error { if check.IfNil(args.DataComponents) { return errors.ErrNilDataComponentsHolder } + if check.IfNil(args.DataComponents.Datapool()) { + return errors.ErrNilDataPoolsHolder + } if check.IfNil(args.NetworkComponents) { return errors.ErrNilNetworkComponentsHolder } + if check.IfNil(args.NetworkComponents.NetworkMessenger()) { + return errors.ErrNilMessenger + } if check.IfNil(args.CryptoComponents) { return errors.ErrNilCryptoComponentsHolder } if check.IfNil(args.ProcessComponents) { return errors.ErrNilProcessComponentsHolder } + if check.IfNil(args.ProcessComponents.EpochStartTrigger()) { + return errors.ErrNilEpochStartTrigger + } if check.IfNil(args.StatusCoreComponents) { return errors.ErrNilStatusCoreComponents } - if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { - return errors.ErrNilAppStatusHandler - } - hardforkTrigger := args.ProcessComponents.HardforkTrigger() - if check.IfNil(hardforkTrigger) { - return errors.ErrNilHardforkTrigger - } return nil } @@ -231,7 +233,7 @@ func (hcf *heartbeatV2ComponentsFactory) Create() (*heartbeatV2Components, error HeartbeatMonitor: heartbeatsMonitor, HeartbeatSenderInfoProvider: heartbeatV2Sender, AppStatusHandler: hcf.statusCoreComponents.AppStatusHandler(), - TimeBetweenConnectionsMetricsUpdate: time.Second * time.Duration(hcf.config.HeartbeatV2.TimeBetweenConnectionsMetricsUpdateInSec), + TimeBetweenConnectionsMetricsUpdate: time.Second * time.Duration(cfg.TimeBetweenConnectionsMetricsUpdateInSec), } statusHandler, err := status.NewMetricsUpdater(argsMetricsUpdater) if err != nil { @@ -239,7 +241,7 @@ func (hcf *heartbeatV2ComponentsFactory) Create() (*heartbeatV2Components, error } argsDirectConnectionProcessor := processor.ArgsDirectConnectionProcessor{ - TimeToReadDirectConnections: time.Second * time.Duration(hcf.config.HeartbeatV2.TimeToReadDirectConnectionsInSec), + TimeToReadDirectConnections: time.Second * time.Duration(cfg.TimeToReadDirectConnectionsInSec), Messenger: hcf.networkComponents.NetworkMessenger(), PeerShardMapper: hcf.processComponents.PeerShardMapper(), ShardCoordinator: hcf.processComponents.ShardCoordinator(), diff --git a/factory/heartbeat/heartbeatV2ComponentsHandler.go b/factory/heartbeat/heartbeatV2ComponentsHandler.go index 0fa1deeee20..6ff35e7047d 100644 --- a/factory/heartbeat/heartbeatV2ComponentsHandler.go +++ b/factory/heartbeat/heartbeatV2ComponentsHandler.go @@ -65,6 +65,10 @@ func (mhc *managedHeartbeatV2Components) Monitor() factory.HeartbeatV2Monitor { mhc.mutHeartbeatV2Components.Lock() defer mhc.mutHeartbeatV2Components.Unlock() + if mhc.heartbeatV2Components == nil { + return nil + } + return mhc.monitor } diff --git a/factory/heartbeat/heartbeatV2ComponentsHandler_test.go b/factory/heartbeat/heartbeatV2ComponentsHandler_test.go index 5826af05a00..91da128be40 100644 --- a/factory/heartbeat/heartbeatV2ComponentsHandler_test.go +++ b/factory/heartbeat/heartbeatV2ComponentsHandler_test.go @@ -3,13 +3,13 @@ package heartbeat_test import ( "testing" - "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" heartbeatComp "github.com/multiversx/mx-chain-go/factory/heartbeat" "github.com/stretchr/testify/assert" ) -func TestManagedHeartbeatV2Components(t *testing.T) { +func TestNewManagedHeartbeatV2Components(t *testing.T) { t.Parallel() defer func() { @@ -20,23 +20,89 @@ func TestManagedHeartbeatV2Components(t *testing.T) { }() mhc, err := heartbeatComp.NewManagedHeartbeatV2Components(nil) - assert.True(t, check.IfNil(mhc)) - assert.Equal(t, errors.ErrNilHeartbeatV2ComponentsFactory, err) + assert.Nil(t, mhc) + assert.Equal(t, errorsMx.ErrNilHeartbeatV2ComponentsFactory, err) args := createMockHeartbeatV2ComponentsFactoryArgs() hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) mhc, err = heartbeatComp.NewManagedHeartbeatV2Components(hcf) - assert.False(t, check.IfNil(mhc)) - assert.Nil(t, err) + assert.NotNil(t, mhc) + assert.NoError(t, err) +} + +func TestManagedHeartbeatV2Components_Create(t *testing.T) { + t.Parallel() + + t.Run("invalid config should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Config.HeartbeatV2.PeerAuthenticationTimeBetweenSendsInSec = 0 // Create will fail + hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + mhc, _ := heartbeatComp.NewManagedHeartbeatV2Components(hcf) + assert.NotNil(t, mhc) + err := mhc.Create() + assert.Error(t, err) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + mhc, _ := heartbeatComp.NewManagedHeartbeatV2Components(hcf) + assert.NotNil(t, mhc) + assert.Nil(t, mhc.Monitor()) + + err := mhc.Create() + assert.NoError(t, err) + assert.NotNil(t, mhc.Monitor()) - err = mhc.Create() - assert.Nil(t, err) + assert.Equal(t, factory.HeartbeatV2ComponentsName, mhc.String()) - err = mhc.CheckSubcomponents() - assert.Nil(t, err) + assert.NoError(t, mhc.Close()) + }) +} - assert.Equal(t, "managedHeartbeatV2Components", mhc.String()) +func TestManagedHeartbeatV2Components_CheckSubcomponents(t *testing.T) { + t.Parallel() - err = mhc.Close() - assert.Nil(t, err) + args := createMockHeartbeatV2ComponentsFactoryArgs() + hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + mhc, _ := heartbeatComp.NewManagedHeartbeatV2Components(hcf) + assert.NotNil(t, mhc) + assert.Equal(t, errorsMx.ErrNilHeartbeatV2Components, mhc.CheckSubcomponents()) + + err := mhc.Create() + assert.NoError(t, err) + assert.Nil(t, mhc.CheckSubcomponents()) + + assert.NoError(t, mhc.Close()) +} + +func TestManagedHeartbeatV2Components_Close(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + mhc, _ := heartbeatComp.NewManagedHeartbeatV2Components(hcf) + assert.NotNil(t, mhc) + assert.NoError(t, mhc.Close()) + + err := mhc.Create() + assert.NoError(t, err) + assert.NoError(t, mhc.Close()) +} + +func TestManagedHeartbeatV2Components_IsInterfaceNil(t *testing.T) { + t.Parallel() + + mhc, _ := heartbeatComp.NewManagedHeartbeatV2Components(nil) + assert.NotNil(t, mhc) + assert.True(t, mhc.IsInterfaceNil()) + + args := createMockHeartbeatV2ComponentsFactoryArgs() + hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + mhc, _ = heartbeatComp.NewManagedHeartbeatV2Components(hcf) + assert.NotNil(t, mhc) + assert.False(t, mhc.IsInterfaceNil()) } diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index 3a69e2268bd..b655d926a56 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -4,13 +4,17 @@ import ( "errors" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" bootstrapComp "github.com/multiversx/mx-chain-go/factory/bootstrap" heartbeatComp "github.com/multiversx/mx-chain-go/factory/heartbeat" "github.com/multiversx/mx-chain-go/factory/mock" + testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" + "github.com/multiversx/mx-chain-go/p2p" + "github.com/multiversx/mx-chain-go/sharding" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" "github.com/stretchr/testify/assert" ) @@ -79,21 +83,344 @@ func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2Co } } -func Test_heartbeatV2Components_Create(t *testing.T) { +func TestNewHeartbeatV2ComponentsFactory(t *testing.T) { t.Parallel() + t.Run("should work", func(t *testing.T) { + t.Parallel() + + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(createMockHeartbeatV2ComponentsFactoryArgs()) + assert.NotNil(t, hcf) + assert.NoError(t, err) + }) + t.Run("nil BootstrapComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.BootstrapComponents = nil + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilBootstrapComponentsHolder, err) + }) + t.Run("nil CoreComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.CoreComponents = nil + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilCoreComponentsHolder, err) + }) + t.Run("nil DataComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.DataComponents = nil + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilDataComponentsHolder, err) + }) + t.Run("nil DataPool should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.DataComponents = &testsMocks.DataComponentsStub{ + DataPool: nil, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilDataPoolsHolder, err) + }) + t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.NetworkComponents = nil + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilNetworkComponentsHolder, err) + }) + t.Run("nil NetworkMessenger should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.NetworkComponents = &testsMocks.NetworkComponentsStub{ + Messenger: nil, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilMessenger, err) + }) + t.Run("nil CryptoComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.CryptoComponents = nil + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilCryptoComponentsHolder, err) + }) + t.Run("nil ProcessComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.ProcessComponents = nil + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilProcessComponentsHolder, err) + }) + t.Run("nil EpochStartTrigger should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + EpochTrigger: nil, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilEpochStartTrigger, err) + }) + t.Run("nil StatusCoreComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.StatusCoreComponents = nil + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) + }) + t.Run("nil EpochStartTrigger should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + EpochTrigger: nil, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.Nil(t, hcf) + assert.Equal(t, errorsMx.ErrNilEpochStartTrigger, err) + }) +} + +func TestHeartbeatV2Components_Create(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + t.Run("messenger does not have PeerAuthenticationTopic and fails to create it", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.NetworkComponents = &testsMocks.NetworkComponentsStub{ + Messenger: &p2pmocks.MessengerStub{ + HasTopicCalled: func(name string) bool { + if name == common.PeerAuthenticationTopic { + return false + } + assert.Fail(t, "should not have been called") + return true + }, + CreateTopicCalled: func(name string, createChannelForTopic bool) error { + if name == common.PeerAuthenticationTopic { + return expectedErr + } + assert.Fail(t, "should not have been called") + return nil + }, + }, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Equal(t, expectedErr, err) + }) + t.Run("messenger does not have HeartbeatV2Topic and fails to create it", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.NetworkComponents = &testsMocks.NetworkComponentsStub{ + Messenger: &p2pmocks.MessengerStub{ + HasTopicCalled: func(name string) bool { + if name == common.HeartbeatV2Topic { + return false + } + return true + }, + CreateTopicCalled: func(name string, createChannelForTopic bool) error { + if name == common.HeartbeatV2Topic { + return expectedErr + } + assert.Fail(t, "should not have been called") + return nil + }, + }, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Equal(t, expectedErr, err) + }) t.Run("invalid config should error", func(t *testing.T) { t.Parallel() args := createMockHeartbeatV2ComponentsFactoryArgs() args.Config.HeartbeatV2.HeartbeatExpiryTimespanInSec = args.Config.HeartbeatV2.PeerAuthenticationTimeBetweenSendsInSec hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) - assert.False(t, check.IfNil(hcf)) - assert.Nil(t, err) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.True(t, errors.Is(err, errorsMx.ErrInvalidHeartbeatV2Config)) + }) + t.Run("NewPeerTypeProvider fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + processComp := args.ProcessComponents + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + NodesCoord: nil, + EpochTrigger: processComp.EpochStartTrigger(), + EpochNotifier: processComp.EpochStartNotifier(), + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Error(t, err) + }) + t.Run("NewSender fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Config.HeartbeatV2.PeerAuthenticationTimeBetweenSendsInSec = 0 + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Error(t, err) + }) + t.Run("NewPeerAuthenticationRequestsProcessor fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Config.HeartbeatV2.DelayBetweenRequestsInSec = 0 + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Error(t, err) + }) + t.Run("NewPeerShardSender fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Config.HeartbeatV2.PeerShardTimeBetweenSendsInSec = 0 + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Error(t, err) + }) + t.Run("NewHeartbeatV2Monitor fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Config.HeartbeatV2.MaxDurationPeerUnresponsiveInSec = 0 + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) hc, err := hcf.Create() assert.Nil(t, hc) - assert.True(t, errors.Is(err, errErd.ErrInvalidHeartbeatV2Config)) + assert.Error(t, err) + }) + t.Run("NewMetricsUpdater fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Config.HeartbeatV2.TimeBetweenConnectionsMetricsUpdateInSec = 0 + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Error(t, err) + }) + t.Run("NewDirectConnectionProcessor fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Config.HeartbeatV2.TimeToReadDirectConnectionsInSec = 0 + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Error(t, err) + }) + t.Run("NewCrossShardPeerTopicNotifier fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + processComp := args.ProcessComponents + cnt := 0 + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + NodesCoord: processComp.NodesCoordinator(), + EpochTrigger: processComp.EpochStartTrigger(), + EpochNotifier: processComp.EpochStartNotifier(), + NodeRedundancyHandlerInternal: processComp.NodeRedundancyHandler(), + HardforkTriggerField: processComp.HardforkTrigger(), + PeerMapper: processComp.PeerShardMapper(), + ShardCoordinatorCalled: func() sharding.Coordinator { + cnt++ + if cnt > 3 { + return nil + } + return processComp.ShardCoordinator() + }, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Error(t, err) + }) + t.Run("AddPeerTopicNotifier fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.NetworkComponents = &testsMocks.NetworkComponentsStub{ + Messenger: &p2pmocks.MessengerStub{ + AddPeerTopicNotifierCalled: func(notifier p2p.PeerTopicNotifier) error { + return expectedErr + }, + }, + } + hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.NotNil(t, hcf) + assert.NoError(t, err) + + hc, err := hcf.Create() + assert.Nil(t, hc) + assert.Equal(t, expectedErr, err) }) t.Run("should work", func(t *testing.T) { t.Parallel() @@ -106,15 +433,27 @@ func Test_heartbeatV2Components_Create(t *testing.T) { }() args := createMockHeartbeatV2ComponentsFactoryArgs() + args.Prefs.Preferences.FullArchive = true // coverage only hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) - assert.False(t, check.IfNil(hcf)) - assert.Nil(t, err) + assert.NotNil(t, hcf) + assert.NoError(t, err) hc, err := hcf.Create() assert.NotNil(t, hc) - assert.Nil(t, err) + assert.NoError(t, err) - err = hc.Close() - assert.Nil(t, err) + assert.NoError(t, hc.Close()) }) } + +func TestHeartbeatV2ComponentsFactory_IsInterfaceNil(t *testing.T) { + t.Parallel() + + args := createMockHeartbeatV2ComponentsFactoryArgs() + args.CoreComponents = nil + hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) + assert.True(t, hcf.IsInterfaceNil()) + + hcf, _ = heartbeatComp.NewHeartbeatV2ComponentsFactory(createMockHeartbeatV2ComponentsFactoryArgs()) + assert.False(t, hcf.IsInterfaceNil()) +} diff --git a/factory/network/networkComponentsHandler_test.go b/factory/network/networkComponentsHandler_test.go index 03da0ee915a..51bfe86372c 100644 --- a/factory/network/networkComponentsHandler_test.go +++ b/factory/network/networkComponentsHandler_test.go @@ -3,51 +3,78 @@ package network_test import ( "testing" - "github.com/multiversx/mx-chain-core-go/core/check" + errorsMx "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" networkComp "github.com/multiversx/mx-chain-go/factory/network" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" ) -// ------------ Test ManagedNetworkComponents -------------------- -func TestManagedNetworkComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestNewManagedNetworkComponents(t *testing.T) { t.Parallel() - networkArgs := componentsMock.GetNetworkFactoryArgs() - networkArgs.P2pConfig.Node.Port = "invalid" - networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) - managedNetworkComponents, err := networkComp.NewManagedNetworkComponents(networkComponentsFactory) - require.NoError(t, err) - err = managedNetworkComponents.Create() - require.Error(t, err) - require.Nil(t, managedNetworkComponents.NetworkMessenger()) + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() + + managedNetworkComponents, err := networkComp.NewManagedNetworkComponents(nil) + require.Equal(t, errorsMx.ErrNilNetworkComponentsFactory, err) + require.Nil(t, managedNetworkComponents) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(componentsMock.GetNetworkFactoryArgs()) + managedNetworkComponents, err := networkComp.NewManagedNetworkComponents(networkComponentsFactory) + require.NoError(t, err) + require.NotNil(t, managedNetworkComponents) + }) } -func TestManagedNetworkComponents_CreateShouldWork(t *testing.T) { +func TestManagedNetworkComponents_Create(t *testing.T) { t.Parallel() - networkArgs := componentsMock.GetNetworkFactoryArgs() - networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) - managedNetworkComponents, err := networkComp.NewManagedNetworkComponents(networkComponentsFactory) - require.NoError(t, err) - require.False(t, check.IfNil(managedNetworkComponents)) - require.Nil(t, managedNetworkComponents.NetworkMessenger()) - require.Nil(t, managedNetworkComponents.InputAntiFloodHandler()) - require.Nil(t, managedNetworkComponents.OutputAntiFloodHandler()) - require.Nil(t, managedNetworkComponents.PeerBlackListHandler()) - require.Nil(t, managedNetworkComponents.PubKeyCacher()) - require.Nil(t, managedNetworkComponents.PreferredPeersHolderHandler()) - require.Nil(t, managedNetworkComponents.PeerHonestyHandler()) + t.Run("invalid config should error", func(t *testing.T) { + t.Parallel() - err = managedNetworkComponents.Create() - require.NoError(t, err) - require.NotNil(t, managedNetworkComponents.NetworkMessenger()) - require.NotNil(t, managedNetworkComponents.InputAntiFloodHandler()) - require.NotNil(t, managedNetworkComponents.OutputAntiFloodHandler()) - require.NotNil(t, managedNetworkComponents.PeerBlackListHandler()) - require.NotNil(t, managedNetworkComponents.PubKeyCacher()) - require.NotNil(t, managedNetworkComponents.PreferredPeersHolderHandler()) - require.NotNil(t, managedNetworkComponents.PeerHonestyHandler()) + networkArgs := componentsMock.GetNetworkFactoryArgs() + networkArgs.P2pConfig.Node.Port = "invalid" + networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) + managedNetworkComponents, err := networkComp.NewManagedNetworkComponents(networkComponentsFactory) + require.NoError(t, err) + err = managedNetworkComponents.Create() + require.Error(t, err) + require.Nil(t, managedNetworkComponents.NetworkMessenger()) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + networkArgs := componentsMock.GetNetworkFactoryArgs() + networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) + managedNetworkComponents, err := networkComp.NewManagedNetworkComponents(networkComponentsFactory) + require.NoError(t, err) + require.NotNil(t, managedNetworkComponents) + require.Nil(t, managedNetworkComponents.NetworkMessenger()) + require.Nil(t, managedNetworkComponents.InputAntiFloodHandler()) + require.Nil(t, managedNetworkComponents.OutputAntiFloodHandler()) + require.Nil(t, managedNetworkComponents.PeerBlackListHandler()) + require.Nil(t, managedNetworkComponents.PubKeyCacher()) + require.Nil(t, managedNetworkComponents.PreferredPeersHolderHandler()) + require.Nil(t, managedNetworkComponents.PeerHonestyHandler()) + require.Nil(t, managedNetworkComponents.PeersRatingHandler()) + + err = managedNetworkComponents.Create() + require.NoError(t, err) + require.NotNil(t, managedNetworkComponents.NetworkMessenger()) + require.NotNil(t, managedNetworkComponents.InputAntiFloodHandler()) + require.NotNil(t, managedNetworkComponents.OutputAntiFloodHandler()) + require.NotNil(t, managedNetworkComponents.PeerBlackListHandler()) + require.NotNil(t, managedNetworkComponents.PubKeyCacher()) + require.NotNil(t, managedNetworkComponents.PreferredPeersHolderHandler()) + require.NotNil(t, managedNetworkComponents.PeerHonestyHandler()) + require.NotNil(t, managedNetworkComponents.PeersRatingHandler()) + + require.Equal(t, factory.NetworkComponentsName, managedNetworkComponents.String()) + }) } func TestManagedNetworkComponents_CheckSubcomponents(t *testing.T) { @@ -74,10 +101,25 @@ func TestManagedNetworkComponents_Close(t *testing.T) { networkArgs := componentsMock.GetNetworkFactoryArgs() networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) managedNetworkComponents, _ := networkComp.NewManagedNetworkComponents(networkComponentsFactory) - err := managedNetworkComponents.Create() + err := managedNetworkComponents.Close() + require.NoError(t, err) + + err = managedNetworkComponents.Create() require.NoError(t, err) err = managedNetworkComponents.Close() require.NoError(t, err) require.Nil(t, managedNetworkComponents.NetworkMessenger()) } + +func TestManagedNetworkComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedNetworkComponents, _ := networkComp.NewManagedNetworkComponents(nil) + require.True(t, managedNetworkComponents.IsInterfaceNil()) + + networkArgs := componentsMock.GetNetworkFactoryArgs() + networkComponentsFactory, _ := networkComp.NewNetworkComponentsFactory(networkArgs) + managedNetworkComponents, _ = networkComp.NewManagedNetworkComponents(networkComponentsFactory) + require.False(t, managedNetworkComponents.IsInterfaceNil()) +} diff --git a/factory/network/networkComponents_test.go b/factory/network/networkComponents_test.go index 0fdd190aa72..1fe95107b6f 100644 --- a/factory/network/networkComponents_test.go +++ b/factory/network/networkComponents_test.go @@ -4,72 +4,154 @@ import ( "errors" "testing" - "github.com/multiversx/mx-chain-go/config" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" networkComp "github.com/multiversx/mx-chain-go/factory/network" "github.com/multiversx/mx-chain-go/p2p" - p2pConfig "github.com/multiversx/mx-chain-go/p2p/config" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" ) -func TestNewNetworkComponentsFactory_NilStatusHandlerShouldErr(t *testing.T) { +func TestNewNetworkComponentsFactory(t *testing.T) { t.Parallel() - args := componentsMock.GetNetworkFactoryArgs() - args.StatusHandler = nil - ncf, err := networkComp.NewNetworkComponentsFactory(args) - require.Nil(t, ncf) - require.Equal(t, errErd.ErrNilStatusHandler, err) + t.Run("nil StatusHandler should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + args.StatusHandler = nil + ncf, err := networkComp.NewNetworkComponentsFactory(args) + require.Nil(t, ncf) + require.Equal(t, errorsMx.ErrNilStatusHandler, err) + }) + t.Run("nil Marshalizer should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + args.Marshalizer = nil + ncf, err := networkComp.NewNetworkComponentsFactory(args) + require.Nil(t, ncf) + require.True(t, errors.Is(err, errorsMx.ErrNilMarshalizer)) + }) + t.Run("nil Syncer should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + args.Syncer = nil + ncf, err := networkComp.NewNetworkComponentsFactory(args) + require.Nil(t, ncf) + require.Equal(t, errorsMx.ErrNilSyncTimer, err) + }) + t.Run("nil CryptoComponents should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + args.CryptoComponents = nil + ncf, err := networkComp.NewNetworkComponentsFactory(args) + require.Nil(t, ncf) + require.Equal(t, errorsMx.ErrNilCryptoComponentsHolder, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + ncf, err := networkComp.NewNetworkComponentsFactory(args) + require.NoError(t, err) + require.NotNil(t, ncf) + }) } -func TestNewNetworkComponentsFactory_NilMarshalizerShouldErr(t *testing.T) { +func TestNetworkComponentsFactory_Create(t *testing.T) { t.Parallel() - args := componentsMock.GetNetworkFactoryArgs() - args.Marshalizer = nil - ncf, err := networkComp.NewNetworkComponentsFactory(args) - require.Nil(t, ncf) - require.True(t, errors.Is(err, errErd.ErrNilMarshalizer)) -} + t.Run("NewPeersHolder fails should error", func(t *testing.T) { + t.Parallel() -func TestNewNetworkComponentsFactory_OkValsShouldWork(t *testing.T) { - t.Parallel() + args := componentsMock.GetNetworkFactoryArgs() + args.PreferredPeersSlices = []string{"invalid peer"} - args := componentsMock.GetNetworkFactoryArgs() - ncf, err := networkComp.NewNetworkComponentsFactory(args) - require.NoError(t, err) - require.NotNil(t, ncf) -} + ncf, _ := networkComp.NewNetworkComponentsFactory(args) -func TestNetworkComponentsFactory_CreateShouldErrDueToBadConfig(t *testing.T) { - t.Parallel() + nc, err := ncf.Create() + require.Error(t, err) + require.Nil(t, nc) + }) + t.Run("first NewLRUCache fails should error", func(t *testing.T) { + t.Parallel() - args := componentsMock.GetNetworkFactoryArgs() - args.MainConfig = config.Config{} - args.P2pConfig = p2pConfig.P2PConfig{} + args := componentsMock.GetNetworkFactoryArgs() + args.MainConfig.PeersRatingConfig.BadRatedCacheCapacity = 0 - ncf, _ := networkComp.NewNetworkComponentsFactory(args) + ncf, _ := networkComp.NewNetworkComponentsFactory(args) - nc, err := ncf.Create() - require.Error(t, err) - require.Nil(t, nc) -} + nc, err := ncf.Create() + require.Error(t, err) + require.Nil(t, nc) + }) + t.Run("second NewLRUCache fails should error", func(t *testing.T) { + t.Parallel() -func TestNetworkComponentsFactory_CreateShouldWork(t *testing.T) { - t.Parallel() + args := componentsMock.GetNetworkFactoryArgs() + args.MainConfig.PeersRatingConfig.TopRatedCacheCapacity = 0 - args := componentsMock.GetNetworkFactoryArgs() - ncf, _ := networkComp.NewNetworkComponentsFactory(args) - ncf.SetListenAddress(p2p.ListenLocalhostAddrWithIp4AndTcp) + ncf, _ := networkComp.NewNetworkComponentsFactory(args) - nc, err := ncf.Create() - require.NoError(t, err) - require.NotNil(t, nc) + nc, err := ncf.Create() + require.Error(t, err) + require.Nil(t, nc) + }) + t.Run("NewP2PAntiFloodComponents fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + args.MainConfig.Antiflood.Enabled = true + args.MainConfig.Antiflood.SlowReacting.BlackList.NumFloodingRounds = 0 // NewP2PAntiFloodComponents fails + + ncf, _ := networkComp.NewNetworkComponentsFactory(args) + + nc, err := ncf.Create() + require.Error(t, err) + require.Nil(t, nc) + }) + t.Run("NewAntifloodDebugger fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + args.MainConfig.Antiflood.Enabled = true + args.MainConfig.Debug.Antiflood.CacheSize = 0 // NewAntifloodDebugger fails + + ncf, _ := networkComp.NewNetworkComponentsFactory(args) + + nc, err := ncf.Create() + require.Error(t, err) + require.Nil(t, nc) + }) + t.Run("createPeerHonestyHandler fails should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + args.MainConfig.PeerHonesty.Type = "invalid" // createPeerHonestyHandler fails + + ncf, _ := networkComp.NewNetworkComponentsFactory(args) + + nc, err := ncf.Create() + require.Error(t, err) + require.Nil(t, nc) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetNetworkFactoryArgs() + ncf, _ := networkComp.NewNetworkComponentsFactory(args) + ncf.SetListenAddress(p2p.ListenLocalhostAddrWithIp4AndTcp) + + nc, err := ncf.Create() + require.NoError(t, err) + require.NotNil(t, nc) + require.NoError(t, nc.Close()) + }) } -// ------------ Test NetworkComponents -------------------- -func TestNetworkComponents_CloseShouldWork(t *testing.T) { +func TestNetworkComponents_Close(t *testing.T) { t.Parallel() args := componentsMock.GetNetworkFactoryArgs() diff --git a/integrationTests/mock/processComponentsStub.go b/integrationTests/mock/processComponentsStub.go index 02712358812..709cd6e2b50 100644 --- a/integrationTests/mock/processComponentsStub.go +++ b/integrationTests/mock/processComponentsStub.go @@ -18,6 +18,7 @@ import ( type ProcessComponentsStub struct { NodesCoord nodesCoordinator.NodesCoordinator ShardCoord sharding.Coordinator + ShardCoordinatorCalled func() sharding.Coordinator IntContainer process.InterceptorsContainer ResFinder dataRetriever.ResolversFinder RoundHandlerField consensus.RoundHandler @@ -77,6 +78,9 @@ func (pcs *ProcessComponentsStub) NodesCoordinator() nodesCoordinator.NodesCoord // ShardCoordinator - func (pcs *ProcessComponentsStub) ShardCoordinator() sharding.Coordinator { + if pcs.ShardCoordinatorCalled != nil { + return pcs.ShardCoordinatorCalled() + } return pcs.ShardCoord } From 4fb6588e1fba03394a94f03c7074d1479a36f5d4 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 4 Apr 2023 14:22:19 +0300 Subject: [PATCH 246/335] fix lint --- factory/heartbeat/heartbeatV2Components_test.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index b655d926a56..d20b481853d 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -243,10 +243,7 @@ func TestHeartbeatV2Components_Create(t *testing.T) { args.NetworkComponents = &testsMocks.NetworkComponentsStub{ Messenger: &p2pmocks.MessengerStub{ HasTopicCalled: func(name string) bool { - if name == common.HeartbeatV2Topic { - return false - } - return true + return name != common.HeartbeatV2Topic }, CreateTopicCalled: func(name string, createChannelForTopic bool) error { if name == common.HeartbeatV2Topic { From b7000baf30ce93b99dbb4c9594050cff76993f85 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 4 Apr 2023 14:36:10 +0300 Subject: [PATCH 247/335] fix IsInterfaceNil test --- factory/heartbeat/heartbeatV2ComponentsHandler_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/factory/heartbeat/heartbeatV2ComponentsHandler_test.go b/factory/heartbeat/heartbeatV2ComponentsHandler_test.go index 91da128be40..d3653ef37e1 100644 --- a/factory/heartbeat/heartbeatV2ComponentsHandler_test.go +++ b/factory/heartbeat/heartbeatV2ComponentsHandler_test.go @@ -97,12 +97,10 @@ func TestManagedHeartbeatV2Components_IsInterfaceNil(t *testing.T) { t.Parallel() mhc, _ := heartbeatComp.NewManagedHeartbeatV2Components(nil) - assert.NotNil(t, mhc) assert.True(t, mhc.IsInterfaceNil()) args := createMockHeartbeatV2ComponentsFactoryArgs() hcf, _ := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) mhc, _ = heartbeatComp.NewManagedHeartbeatV2Components(hcf) - assert.NotNil(t, mhc) assert.False(t, mhc.IsInterfaceNil()) } From 11b21354ab654eedfadc028613e0a50f267dbbd2 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 4 Apr 2023 16:01:18 +0300 Subject: [PATCH 248/335] tests on factory/state --- factory/api/apiResolverFactory_test.go | 2 +- .../heartbeat/heartbeatV2Components_test.go | 6 +- .../processComponentsHandler_test.go | 2 +- factory/state/stateComponents.go | 24 +-- factory/state/stateComponentsHandler_test.go | 132 +++++++++---- factory/state/stateComponents_test.go | 180 +++++++++++++----- factory/status/statusComponents_test.go | 2 +- .../consensusComponents_test.go | 2 +- .../heartbeatComponents_test.go | 2 +- .../processComponents_test.go | 2 +- .../stateComponents/stateComponents_test.go | 2 +- .../statusComponents/statusComponents_test.go | 2 +- node/nodeRunner.go | 3 - testscommon/components/components.go | 25 ++- 14 files changed, 246 insertions(+), 140 deletions(-) diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index b4113165776..370deda9a6b 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -65,7 +65,7 @@ func createMockArgs(t *testing.T) *api.ApiResolverArgs { cryptoComponents := componentsMock.GetCryptoComponents(coreComponents) networkComponents := componentsMock.GetNetworkComponents(cryptoComponents) dataComponents := componentsMock.GetDataComponents(coreComponents, shardCoordinator) - stateComponents := componentsMock.GetStateComponents(coreComponents, shardCoordinator) + stateComponents := componentsMock.GetStateComponents(coreComponents) processComponents := componentsMock.GetProcessComponents(shardCoordinator, coreComponents, networkComponents, dataComponents, cryptoComponents, stateComponents) argsB := componentsMock.GetBootStrapFactoryArgs() diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index d20b481853d..8a38827ba5a 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -32,7 +32,7 @@ func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2Co cryptoC := componentsMock.GetCryptoComponents(coreC) networkC := componentsMock.GetNetworkComponents(cryptoC) dataC := componentsMock.GetDataComponents(coreC, shardCoordinator) - stateC := componentsMock.GetStateComponents(coreC, shardCoordinator) + stateC := componentsMock.GetStateComponents(coreC) processC := componentsMock.GetProcessComponents(shardCoordinator, coreC, networkC, dataC, cryptoC, stateC) return heartbeatComp.ArgHeartbeatV2ComponentsFactory{ Config: config.Config{ @@ -292,6 +292,7 @@ func TestHeartbeatV2Components_Create(t *testing.T) { hc, err := hcf.Create() assert.Nil(t, hc) assert.Error(t, err) + assert.NoError(t, hc.Close()) }) t.Run("NewSender fails should error", func(t *testing.T) { t.Parallel() @@ -399,6 +400,7 @@ func TestHeartbeatV2Components_Create(t *testing.T) { hc, err := hcf.Create() assert.Nil(t, hc) assert.Error(t, err) + assert.NoError(t, hc.Close()) }) t.Run("AddPeerTopicNotifier fails should error", func(t *testing.T) { t.Parallel() @@ -418,6 +420,7 @@ func TestHeartbeatV2Components_Create(t *testing.T) { hc, err := hcf.Create() assert.Nil(t, hc) assert.Equal(t, expectedErr, err) + assert.NoError(t, hc.Close()) }) t.Run("should work", func(t *testing.T) { t.Parallel() @@ -438,7 +441,6 @@ func TestHeartbeatV2Components_Create(t *testing.T) { hc, err := hcf.Create() assert.NotNil(t, hc) assert.NoError(t, err) - assert.NoError(t, hc.Close()) }) } diff --git a/factory/processing/processComponentsHandler_test.go b/factory/processing/processComponentsHandler_test.go index b8c00301261..502640de4dc 100644 --- a/factory/processing/processComponentsHandler_test.go +++ b/factory/processing/processComponentsHandler_test.go @@ -46,7 +46,7 @@ func TestManagedProcessComponents_CreateShouldWork(t *testing.T) { dataComponents := componentsMock.GetDataComponents(coreComponents, shardCoordinator) cryptoComponents := componentsMock.GetCryptoComponents(coreComponents) networkComponents := componentsMock.GetNetworkComponents(cryptoComponents) - stateComponents := componentsMock.GetStateComponents(coreComponents, shardCoordinator) + stateComponents := componentsMock.GetStateComponents(coreComponents) processArgs := componentsMock.GetProcessArgs( shardCoordinator, coreComponents, diff --git a/factory/state/stateComponents.go b/factory/state/stateComponents.go index 98afa8a2d38..a1fccddfd68 100644 --- a/factory/state/stateComponents.go +++ b/factory/state/stateComponents.go @@ -10,7 +10,6 @@ import ( "github.com/multiversx/mx-chain-go/dataRetriever" "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" - "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/state" factoryState "github.com/multiversx/mx-chain-go/state/factory" "github.com/multiversx/mx-chain-go/state/storagePruningManager" @@ -23,7 +22,6 @@ import ( // StateComponentsFactoryArgs holds the arguments needed for creating a state components factory type StateComponentsFactoryArgs struct { Config config.Config - ShardCoordinator sharding.Coordinator Core factory.CoreComponentsHolder StatusCore factory.StatusCoreComponentsHolder StorageService dataRetriever.StorageService @@ -34,7 +32,6 @@ type StateComponentsFactoryArgs struct { type stateComponentsFactory struct { config config.Config - shardCoordinator sharding.Coordinator core factory.CoreComponentsHolder statusCore factory.StatusCoreComponentsHolder storageService dataRetriever.StorageService @@ -55,37 +52,18 @@ type stateComponents struct { // NewStateComponentsFactory will return a new instance of stateComponentsFactory func NewStateComponentsFactory(args StateComponentsFactoryArgs) (*stateComponentsFactory, error) { - if args.Core == nil { + if check.IfNil(args.Core) { return nil, errors.ErrNilCoreComponents } - if check.IfNil(args.Core.Hasher()) { - return nil, errors.ErrNilHasher - } - if check.IfNil(args.Core.InternalMarshalizer()) { - return nil, errors.ErrNilMarshalizer - } - if check.IfNil(args.Core.PathHandler()) { - return nil, errors.ErrNilPathHandler - } - if check.IfNil(args.ShardCoordinator) { - return nil, errors.ErrNilShardCoordinator - } if check.IfNil(args.StorageService) { return nil, errors.ErrNilStorageService } - if check.IfNil(args.ChainHandler) { - return nil, errors.ErrNilBlockChainHandler - } if check.IfNil(args.StatusCore) { return nil, errors.ErrNilStatusCoreComponents } - if check.IfNil(args.StatusCore.AppStatusHandler()) { - return nil, errors.ErrNilAppStatusHandler - } return &stateComponentsFactory{ config: args.Config, - shardCoordinator: args.ShardCoordinator, core: args.Core, statusCore: args.StatusCore, storageService: args.StorageService, diff --git a/factory/state/stateComponentsHandler_test.go b/factory/state/stateComponentsHandler_test.go index 91932d43391..dd429650df1 100644 --- a/factory/state/stateComponentsHandler_test.go +++ b/factory/state/stateComponentsHandler_test.go @@ -4,7 +4,8 @@ import ( "testing" "github.com/multiversx/mx-chain-go/common" - "github.com/multiversx/mx-chain-go/factory/mock" + errorsMx "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" stateComp "github.com/multiversx/mx-chain-go/factory/state" "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" @@ -12,57 +13,86 @@ import ( "github.com/stretchr/testify/require" ) -// ------------ Test ManagedStateComponents -------------------- -func TestManagedStateComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestNewManagedStateComponents(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) - stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) - managedStateComponents, err := stateComp.NewManagedStateComponents(stateComponentsFactory) - require.NoError(t, err) - _ = args.Core.SetInternalMarshalizer(nil) - err = managedStateComponents.Create() - require.Error(t, err) - require.Nil(t, managedStateComponents.AccountsAdapter()) + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() + + managedStateComponents, err := stateComp.NewManagedStateComponents(nil) + require.Equal(t, errorsMx.ErrNilStateComponentsFactory, err) + require.Nil(t, managedStateComponents) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) + managedStateComponents, err := stateComp.NewManagedStateComponents(stateComponentsFactory) + require.NoError(t, err) + require.NotNil(t, managedStateComponents) + }) } -func TestManagedStateComponents_CreateShouldWork(t *testing.T) { +func TestManagedStateComponents_Create(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) - stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) - managedStateComponents, err := stateComp.NewManagedStateComponents(stateComponentsFactory) - require.NoError(t, err) - require.Nil(t, managedStateComponents.AccountsAdapter()) - require.Nil(t, managedStateComponents.PeerAccounts()) - require.Nil(t, managedStateComponents.TriesContainer()) - require.Nil(t, managedStateComponents.TrieStorageManagers()) - - err = managedStateComponents.Create() - require.NoError(t, err) - require.NotNil(t, managedStateComponents.AccountsAdapter()) - require.NotNil(t, managedStateComponents.PeerAccounts()) - require.NotNil(t, managedStateComponents.TriesContainer()) - require.NotNil(t, managedStateComponents.TrieStorageManagers()) + t.Run("invalid config should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) + managedStateComponents, err := stateComp.NewManagedStateComponents(stateComponentsFactory) + require.NoError(t, err) + _ = args.Core.SetInternalMarshalizer(nil) + err = managedStateComponents.Create() + require.Error(t, err) + require.Nil(t, managedStateComponents.AccountsAdapter()) + require.NoError(t, managedStateComponents.Close()) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) + managedStateComponents, err := stateComp.NewManagedStateComponents(stateComponentsFactory) + require.NoError(t, err) + require.Nil(t, managedStateComponents.AccountsAdapter()) + require.Nil(t, managedStateComponents.PeerAccounts()) + require.Nil(t, managedStateComponents.TriesContainer()) + require.Nil(t, managedStateComponents.TrieStorageManagers()) + require.Nil(t, managedStateComponents.AccountsAdapterAPI()) + require.Nil(t, managedStateComponents.AccountsRepository()) + + err = managedStateComponents.Create() + require.NoError(t, err) + require.NotNil(t, managedStateComponents.AccountsAdapter()) + require.NotNil(t, managedStateComponents.PeerAccounts()) + require.NotNil(t, managedStateComponents.TriesContainer()) + require.NotNil(t, managedStateComponents.TrieStorageManagers()) + require.NotNil(t, managedStateComponents.AccountsAdapterAPI()) + require.NotNil(t, managedStateComponents.AccountsRepository()) + + require.Equal(t, factory.StateComponentsName, managedStateComponents.String()) + require.NoError(t, managedStateComponents.Close()) + }) } func TestManagedStateComponents_Close(t *testing.T) { t.Parallel() coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) + args := componentsMock.GetStateFactoryArgs(coreComponents) stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) managedStateComponents, _ := stateComp.NewManagedStateComponents(stateComponentsFactory) + require.NoError(t, managedStateComponents.Close()) err := managedStateComponents.Create() require.NoError(t, err) - err = managedStateComponents.Close() - require.NoError(t, err) + require.NoError(t, managedStateComponents.Close()) require.Nil(t, managedStateComponents.AccountsAdapter()) } @@ -70,23 +100,26 @@ func TestManagedStateComponents_CheckSubcomponents(t *testing.T) { t.Parallel() coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) + args := componentsMock.GetStateFactoryArgs(coreComponents) stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) managedStateComponents, _ := stateComp.NewManagedStateComponents(stateComponentsFactory) - err := managedStateComponents.Create() + err := managedStateComponents.CheckSubcomponents() + require.Equal(t, errorsMx.ErrNilStateComponents, err) + + err = managedStateComponents.Create() require.NoError(t, err) err = managedStateComponents.CheckSubcomponents() require.NoError(t, err) + + require.NoError(t, managedStateComponents.Close()) } func TestManagedStateComponents_Setters(t *testing.T) { t.Parallel() coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) + args := componentsMock.GetStateFactoryArgs(coreComponents) stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) managedStateComponents, _ := stateComp.NewManagedStateComponents(stateComponentsFactory) err := managedStateComponents.Create() @@ -95,12 +128,31 @@ func TestManagedStateComponents_Setters(t *testing.T) { triesContainer := &trieMock.TriesHolderStub{} triesStorageManagers := map[string]common.StorageManager{"a": &testscommon.StorageManagerStub{}} + err = managedStateComponents.SetTriesContainer(nil) + require.Equal(t, errorsMx.ErrNilTriesContainer, err) err = managedStateComponents.SetTriesContainer(triesContainer) require.NoError(t, err) + err = managedStateComponents.SetTriesStorageManagers(nil) + require.Equal(t, errorsMx.ErrNilTriesStorageManagers, err) err = managedStateComponents.SetTriesStorageManagers(triesStorageManagers) require.NoError(t, err) require.Equal(t, triesContainer, managedStateComponents.TriesContainer()) require.Equal(t, triesStorageManagers, managedStateComponents.TrieStorageManagers()) + + require.NoError(t, managedStateComponents.Close()) +} + +func TestManagedStateComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedStateComponents, _ := stateComp.NewManagedStateComponents(nil) + require.True(t, managedStateComponents.IsInterfaceNil()) + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + stateComponentsFactory, _ := stateComp.NewStateComponentsFactory(args) + managedStateComponents, _ = stateComp.NewManagedStateComponents(stateComponentsFactory) + require.False(t, managedStateComponents.IsInterfaceNil()) } diff --git a/factory/state/stateComponents_test.go b/factory/state/stateComponents_test.go index 3dc6ef7aee1..a474d5b7f9a 100644 --- a/factory/state/stateComponents_test.go +++ b/factory/state/stateComponents_test.go @@ -3,76 +3,154 @@ package state_test import ( "testing" + "github.com/multiversx/mx-chain-core-go/hashing" + "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/errors" - "github.com/multiversx/mx-chain-go/factory/mock" stateComp "github.com/multiversx/mx-chain-go/factory/state" + "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/stretchr/testify/require" ) -func TestNewStateComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { +func TestNewStateComponentsFactory(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) - args.ShardCoordinator = nil - - scf, err := stateComp.NewStateComponentsFactory(args) - require.Nil(t, scf) - require.Equal(t, errors.ErrNilShardCoordinator, err) -} - -func TestNewStateComponentsFactory_NilCoreComponents(t *testing.T) { - t.Parallel() - - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) - args.Core = nil - - scf, err := stateComp.NewStateComponentsFactory(args) - require.Nil(t, scf) - require.Equal(t, errors.ErrNilCoreComponents, err) + t.Run("nil Core should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + args.Core = nil + + scf, err := stateComp.NewStateComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errors.ErrNilCoreComponents, err) + }) + t.Run("nil StatusCore should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + args.StatusCore = nil + + scf, err := stateComp.NewStateComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errors.ErrNilStatusCoreComponents, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + + scf, err := stateComp.NewStateComponentsFactory(args) + require.NoError(t, err) + require.NotNil(t, scf) + }) } -func TestNewStateComponentsFactory_ShouldWork(t *testing.T) { +func TestStateComponentsFactory_Create(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) - - scf, err := stateComp.NewStateComponentsFactory(args) - require.NoError(t, err) - require.NotNil(t, scf) + t.Run("CreateTriesComponentsForShardId fails should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + coreCompStub := factory.NewCoreComponentsHolderStubFromRealComponent(args.Core) + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + return nil + } + args.Core = coreCompStub + scf, _ := stateComp.NewStateComponentsFactory(args) + + sc, err := scf.Create() + require.Error(t, err) + require.Nil(t, sc) + }) + t.Run("NewMemoryEvictionWaitingList fails should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + args.Config.EvictionWaitingList.RootHashesSize = 0 + scf, _ := stateComp.NewStateComponentsFactory(args) + + sc, err := scf.Create() + require.Error(t, err) + require.Nil(t, sc) + }) + t.Run("NewAccountsDB fails should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + + coreCompStub := factory.NewCoreComponentsHolderStubFromRealComponent(args.Core) + cnt := 0 + coreCompStub.HasherCalled = func() hashing.Hasher { + cnt++ + if cnt > 1 { + return nil + } + return &testscommon.HasherStub{} + } + args.Core = coreCompStub + scf, _ := stateComp.NewStateComponentsFactory(args) + + sc, err := scf.Create() + require.Error(t, err) + require.Nil(t, sc) + require.NoError(t, sc.Close()) + }) + t.Run("CreateAccountsAdapterAPIOnFinal fails should error", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + + coreCompStub := factory.NewCoreComponentsHolderStubFromRealComponent(args.Core) + cnt := 0 + coreCompStub.HasherCalled = func() hashing.Hasher { + cnt++ + if cnt > 2 { + return nil + } + return &testscommon.HasherStub{} + } + args.Core = coreCompStub + scf, _ := stateComp.NewStateComponentsFactory(args) + + sc, err := scf.Create() + require.Error(t, err) + require.Nil(t, sc) + require.NoError(t, sc.Close()) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + coreComponents := componentsMock.GetCoreComponents() + args := componentsMock.GetStateFactoryArgs(coreComponents) + scf, _ := stateComp.NewStateComponentsFactory(args) + + sc, err := scf.Create() + require.NoError(t, err) + require.NotNil(t, sc) + require.NoError(t, sc.Close()) + }) } -func TestStateComponentsFactory_CreateShouldWork(t *testing.T) { +func TestStateComponents_Close(t *testing.T) { t.Parallel() coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) - + args := componentsMock.GetStateFactoryArgs(coreComponents) scf, _ := stateComp.NewStateComponentsFactory(args) - res, err := scf.Create() + sc, err := scf.Create() require.NoError(t, err) - require.NotNil(t, res) -} - -// ------------ Test StateComponents -------------------- -func TestStateComponents_CloseShouldWork(t *testing.T) { - t.Parallel() + require.NotNil(t, sc) - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetStateFactoryArgs(coreComponents, shardCoordinator) - scf, _ := stateComp.NewStateComponentsFactory(args) - - sc, _ := scf.Create() - - err := sc.Close() - require.NoError(t, err) + require.NoError(t, sc.Close()) } diff --git a/factory/status/statusComponents_test.go b/factory/status/statusComponents_test.go index 3a52d8bf06e..865628054b2 100644 --- a/factory/status/statusComponents_test.go +++ b/factory/status/statusComponents_test.go @@ -85,7 +85,7 @@ func TestNewStatusComponents_InvalidRoundDurationShouldErr(t *testing.T) { require.Nil(t, err) networkComponents := componentsMock.GetNetworkComponents(componentsMock.GetCryptoComponents(coreComponents)) dataComponents := componentsMock.GetDataComponents(coreComponents, shardCoordinator) - stateComponents := componentsMock.GetStateComponents(coreComponents, shardCoordinator) + stateComponents := componentsMock.GetStateComponents(coreComponents) statusArgs := statusComp.StatusComponentsFactoryArgs{ Config: testscommon.GetGeneralConfig(), diff --git a/integrationTests/factory/consensusComponents/consensusComponents_test.go b/integrationTests/factory/consensusComponents/consensusComponents_test.go index 1f8404f7e5c..d3f99512d5e 100644 --- a/integrationTests/factory/consensusComponents/consensusComponents_test.go +++ b/integrationTests/factory/consensusComponents/consensusComponents_test.go @@ -43,7 +43,7 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) diff --git a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go index bcae8ad1344..4f08b5553f1 100644 --- a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go +++ b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go @@ -43,7 +43,7 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) diff --git a/integrationTests/factory/processComponents/processComponents_test.go b/integrationTests/factory/processComponents/processComponents_test.go index 0a2802df441..773ad0e267c 100644 --- a/integrationTests/factory/processComponents/processComponents_test.go +++ b/integrationTests/factory/processComponents/processComponents_test.go @@ -44,7 +44,7 @@ func TestProcessComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) diff --git a/integrationTests/factory/stateComponents/stateComponents_test.go b/integrationTests/factory/stateComponents/stateComponents_test.go index afc6c5b1983..c7a25a6e63d 100644 --- a/integrationTests/factory/stateComponents/stateComponents_test.go +++ b/integrationTests/factory/stateComponents/stateComponents_test.go @@ -40,7 +40,7 @@ func TestStateComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) require.NotNil(t, managedStateComponents) diff --git a/integrationTests/factory/statusComponents/statusComponents_test.go b/integrationTests/factory/statusComponents/statusComponents_test.go index 3d642cfd5cd..45788768fe6 100644 --- a/integrationTests/factory/statusComponents/statusComponents_test.go +++ b/integrationTests/factory/statusComponents/statusComponents_test.go @@ -44,7 +44,7 @@ func TestStatusComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) managedDataComponents, err := nr.CreateManagedDataComponents(managedStatusCoreComponents, managedCoreComponents, managedBootstrapComponents) require.Nil(t, err) - managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents) + managedStateComponents, err := nr.CreateManagedStateComponents(managedCoreComponents, managedDataComponents, managedStatusCoreComponents) require.Nil(t, err) nodesShufflerOut, err := bootstrapComp.CreateNodesShuffleOut(managedCoreComponents.GenesisNodesSetup(), configs.GeneralConfig.EpochStartConfig, managedCoreComponents.ChanStopNodeProcess()) require.Nil(t, err) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 6ddda9d18f8..bff3ae3c12f 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -327,7 +327,6 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( log.Debug("creating state components") managedStateComponents, err := nr.CreateManagedStateComponents( managedCoreComponents, - managedBootstrapComponents, managedDataComponents, managedStatusCoreComponents, ) @@ -1295,13 +1294,11 @@ func (nr *nodeRunner) CreateManagedDataComponents( // CreateManagedStateComponents is the managed state components factory func (nr *nodeRunner) CreateManagedStateComponents( coreComponents mainFactory.CoreComponentsHolder, - bootstrapComponents mainFactory.BootstrapComponentsHolder, dataComponents mainFactory.DataComponentsHandler, statusCoreComponents mainFactory.StatusCoreComponentsHolder, ) (mainFactory.StateComponentsHandler, error) { stateArgs := stateComp.StateComponentsFactoryArgs{ Config: *nr.configs.GeneralConfig, - ShardCoordinator: bootstrapComponents.ShardCoordinator(), Core: coreComponents, StatusCore: statusCoreComponents, StorageService: dataComponents.StorageService(), diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 7f38e669f7b..784767a1b75 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -134,7 +134,7 @@ func GetConsensusArgs(shardCoordinator sharding.Coordinator) consensusComp.Conse coreComponents := GetCoreComponents() cryptoComponents := GetCryptoComponents(coreComponents) networkComponents := GetNetworkComponents(cryptoComponents) - stateComponents := GetStateComponents(coreComponents, shardCoordinator) + stateComponents := GetStateComponents(coreComponents) dataComponents := GetDataComponents(coreComponents, shardCoordinator) processComponents := GetProcessComponents( shardCoordinator, @@ -331,7 +331,7 @@ func getNewTrieStorageManagerArgs() trie.NewTrieStorageManagerArgs { } // GetStateFactoryArgs - -func GetStateFactoryArgs(coreComponents factory.CoreComponentsHolder, shardCoordinator sharding.Coordinator) stateComp.StateComponentsFactoryArgs { +func GetStateFactoryArgs(coreComponents factory.CoreComponentsHolder) stateComp.StateComponentsFactoryArgs { tsm, _ := trie.NewTrieStorageManager(getNewTrieStorageManagerArgs()) storageManagerUser, _ := trie.NewTrieStorageManagerWithoutPruning(tsm) tsm, _ = trie.NewTrieStorageManager(getNewTrieStorageManagerArgs()) @@ -348,13 +348,12 @@ func GetStateFactoryArgs(coreComponents factory.CoreComponentsHolder, shardCoord triesHolder.Put([]byte(trieFactory.PeerAccountTrie), triePeers) stateComponentsFactoryArgs := stateComp.StateComponentsFactoryArgs{ - Config: GetGeneralConfig(), - ShardCoordinator: shardCoordinator, - Core: coreComponents, - StatusCore: GetStatusCoreComponents(), - StorageService: disabled.NewChainStorer(), - ProcessingMode: common.Normal, - ChainHandler: &testscommon.ChainHandlerStub{}, + Config: GetGeneralConfig(), + Core: coreComponents, + StatusCore: GetStatusCoreComponents(), + StorageService: disabled.NewChainStorer(), + ProcessingMode: common.Normal, + ChainHandler: &testscommon.ChainHandlerStub{}, } return stateComponentsFactoryArgs @@ -366,7 +365,7 @@ func GetProcessComponentsFactoryArgs(shardCoordinator sharding.Coordinator) proc cryptoComponents := GetCryptoComponents(coreComponents) networkComponents := GetNetworkComponents(cryptoComponents) dataComponents := GetDataComponents(coreComponents, shardCoordinator) - stateComponents := GetStateComponents(coreComponents, shardCoordinator) + stateComponents := GetStateComponents(coreComponents) processArgs := GetProcessArgs( shardCoordinator, coreComponents, @@ -625,7 +624,7 @@ func GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator shardin cryptoComponents := GetCryptoComponents(coreComponents) networkComponents := GetNetworkComponents(cryptoComponents) dataComponents := GetDataComponents(coreComponents, shardCoordinator) - stateComponents := GetStateComponents(coreComponents, shardCoordinator) + stateComponents := GetStateComponents(coreComponents) processComponents := GetProcessComponents( shardCoordinator, coreComponents, @@ -703,8 +702,8 @@ func GetCryptoComponents(coreComponents factory.CoreComponentsHolder) factory.Cr } // GetStateComponents - -func GetStateComponents(coreComponents factory.CoreComponentsHolder, shardCoordinator sharding.Coordinator) factory.StateComponentsHolder { - stateArgs := GetStateFactoryArgs(coreComponents, shardCoordinator) +func GetStateComponents(coreComponents factory.CoreComponentsHolder) factory.StateComponentsHolder { + stateArgs := GetStateFactoryArgs(coreComponents) stateComponentsFactory, err := stateComp.NewStateComponentsFactory(stateArgs) if err != nil { log.Error("getStateComponents NewStateComponentsFactory", "error", err.Error()) From e61fb7b1180f6a895113c70faaacc8a9a3f470a7 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 4 Apr 2023 16:31:28 +0300 Subject: [PATCH 249/335] fixed tests --- factory/heartbeat/heartbeatV2Components_test.go | 3 --- factory/state/stateComponents_test.go | 2 -- 2 files changed, 5 deletions(-) diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index 8a38827ba5a..0193efdfbdf 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -292,7 +292,6 @@ func TestHeartbeatV2Components_Create(t *testing.T) { hc, err := hcf.Create() assert.Nil(t, hc) assert.Error(t, err) - assert.NoError(t, hc.Close()) }) t.Run("NewSender fails should error", func(t *testing.T) { t.Parallel() @@ -400,7 +399,6 @@ func TestHeartbeatV2Components_Create(t *testing.T) { hc, err := hcf.Create() assert.Nil(t, hc) assert.Error(t, err) - assert.NoError(t, hc.Close()) }) t.Run("AddPeerTopicNotifier fails should error", func(t *testing.T) { t.Parallel() @@ -420,7 +418,6 @@ func TestHeartbeatV2Components_Create(t *testing.T) { hc, err := hcf.Create() assert.Nil(t, hc) assert.Equal(t, expectedErr, err) - assert.NoError(t, hc.Close()) }) t.Run("should work", func(t *testing.T) { t.Parallel() diff --git a/factory/state/stateComponents_test.go b/factory/state/stateComponents_test.go index a474d5b7f9a..177407226d8 100644 --- a/factory/state/stateComponents_test.go +++ b/factory/state/stateComponents_test.go @@ -102,7 +102,6 @@ func TestStateComponentsFactory_Create(t *testing.T) { sc, err := scf.Create() require.Error(t, err) require.Nil(t, sc) - require.NoError(t, sc.Close()) }) t.Run("CreateAccountsAdapterAPIOnFinal fails should error", func(t *testing.T) { t.Parallel() @@ -125,7 +124,6 @@ func TestStateComponentsFactory_Create(t *testing.T) { sc, err := scf.Create() require.Error(t, err) require.Nil(t, sc) - require.NoError(t, sc.Close()) }) t.Run("should work", func(t *testing.T) { t.Parallel() From b65196b6ccea94ce146e5176648b414c52c57501 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 4 Apr 2023 17:38:37 +0300 Subject: [PATCH 250/335] remove extra flag for guard account feature activation --- cmd/node/config/enableEpochs.toml | 3 +- common/enablers/enableEpochsHandler.go | 1 - common/enablers/epochFlags.go | 5 -- common/interface.go | 1 - config/epochConfig.go | 1 - config/tomlConfig_test.go | 6 +-- genesis/process/shardGenesisBlockCreator.go | 2 +- go.mod | 2 +- go.sum | 3 +- .../vm/txsFee/guardAccount_test.go | 53 +++++++++---------- sharding/mock/enableEpochsHandlerMock.go | 5 -- testscommon/enableEpochsHandlerStub.go | 9 ---- 12 files changed, 34 insertions(+), 57 deletions(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 3c77d79c386..db8388d8ff8 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -248,8 +248,7 @@ { EnableEpoch = 1, Type = "KOSK"} ] - # GuardAccountFeatureEnableEpoch represents the epoch when the guard account feature is enabled in the protocol - GuardAccountFeatureEnableEpoch = 2 + # SetGuardianEnableEpoch represents the epoch when the guard account feature is enabled in the protocol SetGuardianEnableEpoch = 2 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index eaeeaccbc2d..a40d3868936 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -118,7 +118,6 @@ func (handler *enableEpochsHandler) EpochConfirmed(epoch uint32, _ uint64) { handler.setFlagValue(epoch >= handler.enableEpochsConfig.MaxBlockchainHookCountersEnableEpoch, handler.maxBlockchainHookCountersFlag, "maxBlockchainHookCountersFlag") handler.setFlagValue(epoch >= handler.enableEpochsConfig.WipeSingleNFTLiquidityDecreaseEnableEpoch, handler.wipeSingleNFTLiquidityDecreaseFlag, "wipeSingleNFTLiquidityDecreaseFlag") handler.setFlagValue(epoch >= handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch, handler.alwaysSaveTokenMetaDataFlag, "alwaysSaveTokenMetaDataFlag") - handler.setFlagValue(epoch >= handler.enableEpochsConfig.GuardAccountFeatureEnableEpoch, handler.guardAccountFlag, "guardAccountFeatureFlag") handler.setFlagValue(epoch >= handler.enableEpochsConfig.SetGuardianEnableEpoch, handler.setGuardianFlag, "setGuardianFlag") } diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index 76e807911d5..f187c6f4d4d 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -664,11 +664,6 @@ func (holder *epochFlagsHolder) IsAlwaysSaveTokenMetaDataEnabled() bool { return holder.alwaysSaveTokenMetaDataFlag.IsSet() } -// IsGuardAccountEnabled returns true if GuardAccountFlag is enabled -func (holder *epochFlagsHolder) IsGuardAccountEnabled() bool { - return holder.guardAccountFlag.IsSet() -} - // IsSetGuardianEnabled returns true if setGuardianFlag is enabled func (holder *epochFlagsHolder) IsSetGuardianEnabled() bool { return holder.setGuardianFlag.IsSet() diff --git a/common/interface.go b/common/interface.go index 5eebe61154e..a75eddd4db2 100644 --- a/common/interface.go +++ b/common/interface.go @@ -335,7 +335,6 @@ type EnableEpochsHandler interface { IsMaxBlockchainHookCountersFlagEnabled() bool IsWipeSingleNFTLiquidityDecreaseEnabled() bool IsAlwaysSaveTokenMetaDataEnabled() bool - IsGuardAccountEnabled() bool IsSetGuardianEnabled() bool IsInterfaceNil() bool diff --git a/config/epochConfig.go b/config/epochConfig.go index 4a65e09a438..5450d5ad72d 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -94,7 +94,6 @@ type EnableEpochs struct { WipeSingleNFTLiquidityDecreaseEnableEpoch uint32 AlwaysSaveTokenMetaDataEnableEpoch uint32 BLSMultiSignerEnableEpoch []MultiSignerConfig - GuardAccountFeatureEnableEpoch uint32 SetGuardianEnableEpoch uint32 } diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 45c5f96c359..b66d2c49156 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -689,8 +689,8 @@ func TestEnableEpochConfig(t *testing.T) { # RuntimeMemStoreLimitEnableEpoch represents the epoch when the condition for Runtime MemStore is enabled RuntimeMemStoreLimitEnableEpoch = 63 - # GuardAccountFeatureEnableEpoch represents the epoch when guard account feature is enabled - GuardAccountFeatureEnableEpoch = 10 + # SetGuardianEnableEpoch represents the epoch when guard account feature is enabled + SetGuardianEnableEpoch = 10 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ @@ -787,7 +787,7 @@ func TestEnableEpochConfig(t *testing.T) { AlwaysSaveTokenMetaDataEnableEpoch: 61, RuntimeCodeSizeFixEnableEpoch: 62, RuntimeMemStoreLimitEnableEpoch: 63, - GuardAccountFeatureEnableEpoch: 10, + SetGuardianEnableEpoch: 10, BLSMultiSignerEnableEpoch: []MultiSignerConfig{ { EnableEpoch: 0, diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index efc95ba649d..2b8ebef8410 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -140,7 +140,7 @@ func createGenesisConfig() config.EnableEpochs { DoNotReturnOldBlockInBlockchainHookEnableEpoch: unreachableEpoch, MaxBlockchainHookCountersEnableEpoch: unreachableEpoch, BLSMultiSignerEnableEpoch: blsMultiSignerEnableEpoch, - GuardAccountFeatureEnableEpoch: unreachableEpoch, + SetGuardianEnableEpoch: unreachableEpoch, } } diff --git a/go.mod b/go.mod index d3a7a67d4e6..acdab7691cd 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf + github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404142831-b94681cbed9b github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 diff --git a/go.sum b/go.sum index 38126ef35be..340098bc8fa 100644 --- a/go.sum +++ b/go.sum @@ -630,8 +630,9 @@ github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2 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.34/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf h1:1mCRjtB2W8q3VPPwhlL7OZOyTzkpJa8/xmpPIA7JCyQ= github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404142831-b94681cbed9b h1:KLkEv90o3RasYOqQamEH/BMMBmIm7jmWUVX0rac2IXI= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404142831-b94681cbed9b/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc h1:Sk83Pf8lL3RtHpfOisJlvG8uk0LBytScQI1+TthBxEI= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc/go.mod h1:44jBXUBfoBJ7W5gLoLJrOB14pt5TUUJBh6jDc7BaC68= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de h1:wlpWxxf/qJHkLakKQvgebCbOWDm1s0mlYts3X3iLXsg= diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index eae375cf11d..1960690bc38 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -97,7 +97,6 @@ func prepareTestContextForGuardedAccounts(tb testing.TB) *vm.VMTestContext { WaitingListFixEnableEpoch: unreachableEpoch, SetSenderInEeiOutputTransferEnableEpoch: unreachableEpoch, RefactorPeersMiniBlocksEnableEpoch: unreachableEpoch, - GuardAccountFeatureEnableEpoch: 0, }, testscommon.NewMultiShardsCoordinatorMock(2), db, @@ -526,23 +525,23 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { } // Scenario 1 description: -// 1. create & mint 4 addresses: alice, bob, charlie and david -// 2. alice sets bob as guardian (test if pending) -// 3. alice can not set bob as guardian again (test if pending & same activation epoch) -// 3.1 alice can not set bob as guardian again even if one epoch past -// 4. alice activates the guardian (test if active) -// 5. alice sets charlie as pending guardian (test if pending & different activation epoch) -// 5.1. alice wants to set david as pending guardian (transaction is not executable, will not be included in a miniblock) -// 6. alice sets charlie as guardian immediately through a cosigned transaction (test active & pending guardians) -// 7. alice immediately sets bob as guardian through a cosigned transaction (test active & pending guardians) -// 8. alice adds charlie as a pending guardian (test if pending & different activation epoch) +// 1. create & mint 4 addresses: alice, bob, charlie and david +// 2. alice sets bob as guardian (test if pending) +// 3. alice can not set bob as guardian again (test if pending & same activation epoch) +// 3.1 alice can not set bob as guardian again even if one epoch past +// 4. alice activates the guardian (test if active) +// 5. alice sets charlie as pending guardian (test if pending & different activation epoch) +// 5.1. alice wants to set david as pending guardian (transaction is not executable, will not be included in a miniblock) +// 6. alice sets charlie as guardian immediately through a cosigned transaction (test active & pending guardians) +// 7. alice immediately sets bob as guardian through a cosigned transaction (test active & pending guardians) +// 8. alice adds charlie as a pending guardian (test if pending & different activation epoch) // wait until charlie becomes active, no more pending guardians -// 9. alice adds bob as a pending guardian and calls set charlie immediately cosigned and should remove the pending guardian -// 10. alice un-guards the account immediately by using a cosigned transaction -// 11. alice guards the account immediately by calling the GuardAccount function -// 13. alice sends a guarded transaction, while account is guarded -> should work -// 14. alice un-guards the accounts immediately using a cosigned transaction and then sends a guarded transaction -> should error -// 14.1 alice sends unguarded transaction -> should work +// 9. alice adds bob as a pending guardian and calls set charlie immediately cosigned and should remove the pending guardian +// 10. alice un-guards the account immediately by using a cosigned transaction +// 11. alice guards the account immediately by calling the GuardAccount function +// 13. alice sends a guarded transaction, while account is guarded -> should work +// 14. alice un-guards the accounts immediately using a cosigned transaction and then sends a guarded transaction -> should error +// 14.1 alice sends unguarded transaction -> should work func TestGuardAccount_Scenario1(t *testing.T) { testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() @@ -820,11 +819,11 @@ func TestGuardAccount_Scenario1(t *testing.T) { require.Nil(t, err) } -// 1. create & mint 4 addresses: alice, bob, charlie and david -// 2. alice sets bob as guardian and the account becomes guarded -// 3. test that charlie can send a relayed transaction v1 on the behalf of alice to david -// 3.1 cosigned transaction should work -// 3.2 single signed transaction should not work +// 1. create & mint 4 addresses: alice, bob, charlie and david +// 2. alice sets bob as guardian and the account becomes guarded +// 3. test that charlie can send a relayed transaction v1 on the behalf of alice to david +// 3.1 cosigned transaction should work +// 3.2 single signed transaction should not work func TestGuardAccounts_RelayedTransactionV1(t *testing.T) { testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() @@ -940,11 +939,11 @@ func TestGuardAccounts_RelayedTransactionV1(t *testing.T) { assert.Equal(t, davidCurrentBalance, getBalance(testContext, david)) } -// 1. create & mint 4 addresses: alice, bob, charlie and david -// 2. alice sets bob as guardian and the account becomes guarded -// 3. test that charlie can not send a relayed transaction v2 on the behalf of alice to david -// 3.1 cosigned transaction should not work -// 3.2 single signed transaction should not work +// 1. create & mint 4 addresses: alice, bob, charlie and david +// 2. alice sets bob as guardian and the account becomes guarded +// 3. test that charlie can not send a relayed transaction v2 on the behalf of alice to david +// 3.1 cosigned transaction should not work +// 3.2 single signed transaction should not work func TestGuardAccounts_RelayedTransactionV2(t *testing.T) { testContext := prepareTestContextForGuardedAccounts(t) defer testContext.Close() diff --git a/sharding/mock/enableEpochsHandlerMock.go b/sharding/mock/enableEpochsHandlerMock.go index 80c80a0e99d..969caeed41b 100644 --- a/sharding/mock/enableEpochsHandlerMock.go +++ b/sharding/mock/enableEpochsHandlerMock.go @@ -566,11 +566,6 @@ func (mock *EnableEpochsHandlerMock) IsAlwaysSaveTokenMetaDataEnabled() bool { return false } -// IsGuardAccountEnabled returns false -func (mock *EnableEpochsHandlerMock) IsGuardAccountEnabled() bool { - return false -} - // IsSetGuardianEnabled returns false func (mock *EnableEpochsHandlerMock) IsSetGuardianEnabled() bool { return false diff --git a/testscommon/enableEpochsHandlerStub.go b/testscommon/enableEpochsHandlerStub.go index e19a9aec9b1..83854c49ae7 100644 --- a/testscommon/enableEpochsHandlerStub.go +++ b/testscommon/enableEpochsHandlerStub.go @@ -117,7 +117,6 @@ type EnableEpochsHandlerStub struct { IsMaxBlockchainHookCountersFlagEnabledField bool IsWipeSingleNFTLiquidityDecreaseEnabledField bool IsAlwaysSaveTokenMetaDataEnabledField bool - IsGuardAccountEnabledField bool IsSetGuardianEnabledField bool } @@ -1016,14 +1015,6 @@ func (stub *EnableEpochsHandlerStub) IsAlwaysSaveTokenMetaDataEnabled() bool { return stub.IsAlwaysSaveTokenMetaDataEnabledField } -// IsGuardAccountEnabled - -func (stub *EnableEpochsHandlerStub) IsGuardAccountEnabled() bool { - stub.RLock() - defer stub.RUnlock() - - return stub.IsGuardAccountEnabledField -} - // IsSetGuardianEnabled - func (stub *EnableEpochsHandlerStub) IsSetGuardianEnabled() bool { stub.RLock() From 005e2d4bdc452accb6c64cbab6cd6d0ea322b8e1 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 4 Apr 2023 17:43:33 +0300 Subject: [PATCH 251/335] fix activation epoch in test --- config/tomlConfig_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index b66d2c49156..b1a59838919 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -690,7 +690,7 @@ func TestEnableEpochConfig(t *testing.T) { RuntimeMemStoreLimitEnableEpoch = 63 # SetGuardianEnableEpoch represents the epoch when guard account feature is enabled - SetGuardianEnableEpoch = 10 + SetGuardianEnableEpoch = 64 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ @@ -787,7 +787,7 @@ func TestEnableEpochConfig(t *testing.T) { AlwaysSaveTokenMetaDataEnableEpoch: 61, RuntimeCodeSizeFixEnableEpoch: 62, RuntimeMemStoreLimitEnableEpoch: 63, - SetGuardianEnableEpoch: 10, + SetGuardianEnableEpoch: 64, BLSMultiSignerEnableEpoch: []MultiSignerConfig{ { EnableEpoch: 0, From 275e1931beb96ebc21cab8fba096c7f9da67f197 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 4 Apr 2023 19:20:05 +0300 Subject: [PATCH 252/335] fix flag in unit test --- integrationTests/vm/wasm/wasmvm/deployment/deploy_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/wasm/wasmvm/deployment/deploy_test.go b/integrationTests/vm/wasm/wasmvm/deployment/deploy_test.go index 1c10054dc05..135ee310df4 100644 --- a/integrationTests/vm/wasm/wasmvm/deployment/deploy_test.go +++ b/integrationTests/vm/wasm/wasmvm/deployment/deploy_test.go @@ -30,8 +30,8 @@ func TestScDeployShouldManageCorrectlyTheCodeMetadata(t *testing.T) { senderAddressBytes, senderBalance, config.EnableEpochs{ - IsPayableBySCEnableEpoch: 1, - GuardAccountFeatureEnableEpoch: 1, + IsPayableBySCEnableEpoch: 1, + SetGuardianEnableEpoch: 1, }, ) require.Nil(t, err) From a78e87f9c0c1f984199a21c4fea5ecf3aa0153ef Mon Sep 17 00:00:00 2001 From: Iuga Mihai Date: Tue, 4 Apr 2023 19:58:49 +0300 Subject: [PATCH 253/335] proper release indexer --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d559ac7aa12..ea91368ab9b 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,7 @@ require ( github.com/mitchellh/mapstructure v1.5.0 github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98 github.com/multiversx/mx-chain-crypto-go v1.2.6 - github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403125654-57b739a6710c + github.com/multiversx/mx-chain-es-indexer-go v1.3.15 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 diff --git a/go.sum b/go.sum index 44fb0623c76..982f18a859c 100644 --- a/go.sum +++ b/go.sum @@ -621,8 +621,8 @@ github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98 h1: github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98/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.3.15-0.20230403125654-57b739a6710c h1:weP4YVnMKNIUqMdFsxVp/J9BTZD2RuUsF+oUToeF+ro= -github.com/multiversx/mx-chain-es-indexer-go v1.3.15-0.20230403125654-57b739a6710c/go.mod h1:7npwCXMXDjNRllUzLbXaR8CoBC8H+8c0J9wGQL2raKk= +github.com/multiversx/mx-chain-es-indexer-go v1.3.15 h1:ws4P1A/QFY/CdPj3i8JHPrC/oG7NVOvt8UESIu14zPo= +github.com/multiversx/mx-chain-es-indexer-go v1.3.15/go.mod h1:7npwCXMXDjNRllUzLbXaR8CoBC8H+8c0J9wGQL2raKk= 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.14 h1:ndrOESrdNyb0AFIqYAZ1yBYJF7cK1skgePO/zTbe/BU= From 646c798d96183757759b3d54f0bcaf965fca5d81 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 4 Apr 2023 20:34:56 +0300 Subject: [PATCH 254/335] reference latest vm-common changes --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ea91368ab9b..d39555bf089 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,7 @@ require ( github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404093245-8fdb3a8c4054 + github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41 github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 diff --git a/go.sum b/go.sum index 982f18a859c..b1491b48d1e 100644 --- a/go.sum +++ b/go.sum @@ -631,8 +631,8 @@ github.com/multiversx/mx-chain-storage-go v1.0.7 h1:UqLo/OLTD3IHiE/TB/SEdNRV1GG2 github.com/multiversx/mx-chain-storage-go v1.0.7/go.mod h1:gtKoV32Cg2Uy8deHzF8Ud0qAl0zv92FvWgPSYIP0Zmg= github.com/multiversx/mx-chain-vm-common-go v1.3.39-0.20230322094554-e7451f25d7bf/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-common-go v1.3.39/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404093245-8fdb3a8c4054 h1:ZRyiUdOJvsIcfPg8O0B2lfVbqJSRGxVxoj+nSOILEcU= -github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404093245-8fdb3a8c4054/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41 h1:vpw68qZXg9ZVVwC7AATAInSdunOrSKtgNlDR3db+NTY= +github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc h1:Sk83Pf8lL3RtHpfOisJlvG8uk0LBytScQI1+TthBxEI= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc/go.mod h1:44jBXUBfoBJ7W5gLoLJrOB14pt5TUUJBh6jDc7BaC68= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de h1:wlpWxxf/qJHkLakKQvgebCbOWDm1s0mlYts3X3iLXsg= From 2597d02e4f36c45bd2de849b498e6b63f67e41fa Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Tue, 4 Apr 2023 20:52:02 +0300 Subject: [PATCH 255/335] latest wasm-vms --- go.mod | 6 +++--- go.sum | 13 ++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index d39555bf089..f05b625040f 100644 --- a/go.mod +++ b/go.mod @@ -20,9 +20,9 @@ require ( github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230404174945-c7fcc419ff82 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230404174736-1533907f5328 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230404174519-cd50467dc671 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 b1491b48d1e..11074a2cfd4 100644 --- a/go.sum +++ b/go.sum @@ -629,16 +629,15 @@ github.com/multiversx/mx-chain-p2p-go v1.0.14 h1:ndrOESrdNyb0AFIqYAZ1yBYJF7cK1sk github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2cGV/vPHsnqqbvTA2AN0= 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.39-0.20230322094554-e7451f25d7bf/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-common-go v1.3.39/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41 h1:vpw68qZXg9ZVVwC7AATAInSdunOrSKtgNlDR3db+NTY= github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc h1:Sk83Pf8lL3RtHpfOisJlvG8uk0LBytScQI1+TthBxEI= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230322095501-5445e4dfdccc/go.mod h1:44jBXUBfoBJ7W5gLoLJrOB14pt5TUUJBh6jDc7BaC68= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de h1:wlpWxxf/qJHkLakKQvgebCbOWDm1s0mlYts3X3iLXsg= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230322095729-c2dfc69795de/go.mod h1:/PSbbb+0/HeUlbrsLO1Af9rmPWu5w491vGH/2dnmtrE= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329 h1:oo4JFogoglCcRHVU9mM7IRq85Cbz7UDpn7G6+1qGBmQ= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230322095947-ed8a65a7a329/go.mod h1:uiinjaJAKIGOA4CaZupv9z6OWwNOJRwyuMUdE9imawQ= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230404174945-c7fcc419ff82 h1:bsAKsdPKBvGrBrqCv2OtIwizpyM62I6pBvYVqbvkT1s= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230404174945-c7fcc419ff82/go.mod h1:1DmyIn697SKi8LbQCCE62hAwFQFOZy17/Dh5zblzrCA= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230404174736-1533907f5328 h1:QaHbQ4l3gv6WNiNx5fMWWzNMsHsqB0baWr+OlJIa20A= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230404174736-1533907f5328/go.mod h1:fIfw/FDsb98LNEZosn/JcbxhWz+55eMl9a2Lo4rh+SI= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230404174519-cd50467dc671 h1:fublrrUpWM7En0e+8+xK9GN7GA5fGolTRsDRN57EJTU= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230404174519-cd50467dc671/go.mod h1:yeUcRL63CQsgaYvmllZTlbjy5mJTZpLi6jRcFK9hGXc= 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 53c85ca48d2ee77270198b82d007f94902d18779 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 5 Apr 2023 09:19:06 +0300 Subject: [PATCH 256/335] add status metrics for set guardian enable epoch --- common/constants.go | 6 +++--- node/metrics/metrics.go | 1 + statusHandler/statusMetricsProvider.go | 1 + statusHandler/statusMetricsProvider_test.go | 2 ++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/common/constants.go b/common/constants.go index 1b194e0aeb7..106bac1d626 100644 --- a/common/constants.go +++ b/common/constants.go @@ -301,7 +301,7 @@ const MetricRedundancyIsMainActive = "erd_redundancy_is_main_active" // MetricValueNA represents the value to be used when a metric is not available/applicable const MetricValueNA = "N/A" -//MetricProcessedProposedBlock is the metric that specify the percent of the block subround used for header and body +// MetricProcessedProposedBlock is the metric that specify the percent of the block subround used for header and body // processing (0 meaning that the block was processed in no-time and 100 meaning that the block processing used all the // subround spare duration) const MetricProcessedProposedBlock = "erd_consensus_processed_proposed_block" @@ -601,8 +601,8 @@ const ( // MetricRatingsPeerHonestyUnitValue represents the peer honesty unit value MetricRatingsPeerHonestyUnitValue = "erd_ratings_peerhonesty_unit_value" - // MetricGuardAccountFeatureEnableEpoch represents the epoch when the guard account feature is enabled - MetricGuardAccountFeatureEnableEpoch = "erd_guard_account_feature_enable_epoch" + // MetricSetGuardianEnableEpoch represents the epoch when the guardian feature is enabled + MetricSetGuardianEnableEpoch = "erd_set_guardian_feature_enable_epoch" ) const ( diff --git a/node/metrics/metrics.go b/node/metrics/metrics.go index df9ea699f06..d584be00004 100644 --- a/node/metrics/metrics.go +++ b/node/metrics/metrics.go @@ -128,6 +128,7 @@ func InitConfigMetrics( appStatusHandler.SetUInt64Value(common.MetricBuiltInFunctionOnMetaEnableEpoch, uint64(enableEpochs.BuiltInFunctionOnMetaEnableEpoch)) appStatusHandler.SetStringValue(common.MetricTotalSupply, economicsConfig.GlobalSettings.GenesisTotalSupply) appStatusHandler.SetUInt64Value(common.MetricWaitingListFixEnableEpoch, uint64(enableEpochs.WaitingListFixEnableEpoch)) + appStatusHandler.SetUInt64Value(common.MetricSetGuardianEnableEpoch, uint64(enableEpochs.SetGuardianEnableEpoch)) for i, nodesChangeConfig := range enableEpochs.MaxNodesChangeEnableEpoch { epochEnable := fmt.Sprintf("%s%d%s", common.MetricMaxNodesChangeEnableEpoch, i, common.EpochEnableSuffix) diff --git a/statusHandler/statusMetricsProvider.go b/statusHandler/statusMetricsProvider.go index 673ead277ac..a6ce71a75e9 100644 --- a/statusHandler/statusMetricsProvider.go +++ b/statusHandler/statusMetricsProvider.go @@ -296,6 +296,7 @@ func (sm *statusMetrics) EnableEpochsMetrics() (map[string]interface{}, error) { enableEpochsMetrics[common.MetricIncrementSCRNonceInMultiTransferEnableEpoch] = sm.uint64Metrics[common.MetricIncrementSCRNonceInMultiTransferEnableEpoch] enableEpochsMetrics[common.MetricBalanceWaitingListsEnableEpoch] = sm.uint64Metrics[common.MetricBalanceWaitingListsEnableEpoch] enableEpochsMetrics[common.MetricWaitingListFixEnableEpoch] = sm.uint64Metrics[common.MetricWaitingListFixEnableEpoch] + enableEpochsMetrics[common.MetricSetGuardianEnableEpoch] = sm.uint64Metrics[common.MetricSetGuardianEnableEpoch] numNodesChangeConfig := sm.uint64Metrics[common.MetricMaxNodesChangeEnableEpoch+"_count"] diff --git a/statusHandler/statusMetricsProvider_test.go b/statusHandler/statusMetricsProvider_test.go index e59d8db970f..cd399259e08 100644 --- a/statusHandler/statusMetricsProvider_test.go +++ b/statusHandler/statusMetricsProvider_test.go @@ -316,6 +316,7 @@ func TestStatusMetrics_EnableEpochMetrics(t *testing.T) { sm.SetUInt64Value(common.MetricIncrementSCRNonceInMultiTransferEnableEpoch, 3) sm.SetUInt64Value(common.MetricBalanceWaitingListsEnableEpoch, 4) sm.SetUInt64Value(common.MetricWaitingListFixEnableEpoch, 1) + sm.SetUInt64Value(common.MetricSetGuardianEnableEpoch, 3) maxNodesChangeConfig := []map[string]uint64{ { @@ -365,6 +366,7 @@ func TestStatusMetrics_EnableEpochMetrics(t *testing.T) { common.MetricIncrementSCRNonceInMultiTransferEnableEpoch: uint64(3), common.MetricBalanceWaitingListsEnableEpoch: uint64(4), common.MetricWaitingListFixEnableEpoch: uint64(1), + common.MetricSetGuardianEnableEpoch: uint64(3), common.MetricMaxNodesChangeEnableEpoch: []map[string]interface{}{ { From 4cee0b8e2be66162f77f6d16f8538ee6e058df9f Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 5 Apr 2023 09:21:43 +0300 Subject: [PATCH 257/335] fix test --- node/metrics/metrics_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/node/metrics/metrics_test.go b/node/metrics/metrics_test.go index 7e2e3d324d8..381a16100d6 100644 --- a/node/metrics/metrics_test.go +++ b/node/metrics/metrics_test.go @@ -137,6 +137,7 @@ func TestInitConfigMetrics(t *testing.T) { ESDTTransferRoleEnableEpoch: 33, BuiltInFunctionOnMetaEnableEpoch: 34, WaitingListFixEnableEpoch: 35, + SetGuardianEnableEpoch: 36, MaxNodesChangeEnableEpoch: []config.MaxNodesChangeConfig{ { EpochEnable: 0, @@ -190,6 +191,7 @@ func TestInitConfigMetrics(t *testing.T) { "erd_max_nodes_change_enable_epoch0_epoch_enable": uint32(0), "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), } economicsConfig := config.EconomicsConfig{ From 35b67495451b9232dc147138654b37d0fb9a7bf1 Mon Sep 17 00:00:00 2001 From: jules01 Date: Wed, 5 Apr 2023 12:04:53 +0300 Subject: [PATCH 258/335] - proper releases --- go.mod | 12 ++++++------ go.sum | 26 ++++++++++++-------------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index f05b625040f..a7ed6fa8f33 100644 --- a/go.mod +++ b/go.mod @@ -13,16 +13,16 @@ 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.1.37-0.20230403132126-aa1ed8d32e98 + github.com/multiversx/mx-chain-core-go v1.1.37 github.com/multiversx/mx-chain-crypto-go v1.2.6 - github.com/multiversx/mx-chain-es-indexer-go v1.3.15 + github.com/multiversx/mx-chain-es-indexer-go v1.3.16 github.com/multiversx/mx-chain-logger-go v1.0.11 github.com/multiversx/mx-chain-p2p-go v1.0.14 github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230404174945-c7fcc419ff82 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230404174736-1533907f5328 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230404174519-cd50467dc671 + github.com/multiversx/mx-chain-vm-common-go v1.3.40 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79 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 11074a2cfd4..31b65f32707 100644 --- a/go.sum +++ b/go.sum @@ -616,28 +616,26 @@ 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.1.36/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98 h1:+V7ce6GpFS0heu2pDukhh/ETMCGSx7dJUlNMWyIGgh4= -github.com/multiversx/mx-chain-core-go v1.1.37-0.20230403132126-aa1ed8d32e98/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= +github.com/multiversx/mx-chain-core-go v1.1.37 h1:2EYoUWjr+8zUYEt3TBMnQ+0UUZwDb71HA+KBwqDUpVQ= +github.com/multiversx/mx-chain-core-go v1.1.37/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.3.15 h1:ws4P1A/QFY/CdPj3i8JHPrC/oG7NVOvt8UESIu14zPo= -github.com/multiversx/mx-chain-es-indexer-go v1.3.15/go.mod h1:7npwCXMXDjNRllUzLbXaR8CoBC8H+8c0J9wGQL2raKk= +github.com/multiversx/mx-chain-es-indexer-go v1.3.16 h1:WeE4gP+dbQRaW4NrC1NSW6ldTfbQaqrP4qtFnh61Asg= +github.com/multiversx/mx-chain-es-indexer-go v1.3.16/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.14 h1:ndrOESrdNyb0AFIqYAZ1yBYJF7cK1skgePO/zTbe/BU= github.com/multiversx/mx-chain-p2p-go v1.0.14/go.mod h1:64lqBWpQa/sDwdmzzHb2waT2cGV/vPHsnqqbvTA2AN0= 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.39/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41 h1:vpw68qZXg9ZVVwC7AATAInSdunOrSKtgNlDR3db+NTY= -github.com/multiversx/mx-chain-vm-common-go v1.3.40-0.20230404173025-6e638df77e41/go.mod h1:+zuF/XIXiwGuLJAdK9t23w79GH9d8Q+lF2xdbnLtAng= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230404174945-c7fcc419ff82 h1:bsAKsdPKBvGrBrqCv2OtIwizpyM62I6pBvYVqbvkT1s= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52-0.20230404174945-c7fcc419ff82/go.mod h1:1DmyIn697SKi8LbQCCE62hAwFQFOZy17/Dh5zblzrCA= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230404174736-1533907f5328 h1:QaHbQ4l3gv6WNiNx5fMWWzNMsHsqB0baWr+OlJIa20A= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53-0.20230404174736-1533907f5328/go.mod h1:fIfw/FDsb98LNEZosn/JcbxhWz+55eMl9a2Lo4rh+SI= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230404174519-cd50467dc671 h1:fublrrUpWM7En0e+8+xK9GN7GA5fGolTRsDRN57EJTU= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79-0.20230404174519-cd50467dc671/go.mod h1:yeUcRL63CQsgaYvmllZTlbjy5mJTZpLi6jRcFK9hGXc= +github.com/multiversx/mx-chain-vm-common-go v1.3.40 h1:oGUIW0EoCWHHh8bAxGKbaQN7kUO0fMzuezbYMJfpsu8= +github.com/multiversx/mx-chain-vm-common-go v1.3.40/go.mod h1:r+aILrY07ue89PH+D+B+Pp0viO1U3kN98t1pXneSgkE= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52 h1:y+xhrc6PI8qD85SP4WA2hEElhyKkemSymq07xBye9pM= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52/go.mod h1:QX55n5InsyvHBSPN4/Dbkqqxv4dclS/RiROycMNS72I= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53 h1:DXt1eSBmHb0tXHesj0pHk0h/koDz+3NH//JHl2GXFzo= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53/go.mod h1:MAhYoxqqRj0z5k7Cewq7yeV9b7jQKykzRj/0nxCsJU0= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79 h1:kNu8NDAtgTK3SBGV/lYnadCXj6ujemWa23XLnpZe+YA= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79/go.mod h1:BjeRM95qx2TrAxUEEFopZ44rvADq/olS/Ofqys2XgTM= 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 b1d3b3a8f1a27c5039fd3fa6819e964cfa90bfe8 Mon Sep 17 00:00:00 2001 From: AdoAdoAdo Date: Wed, 5 Apr 2023 17:09:16 +0300 Subject: [PATCH 259/335] add extra fields on prepare transaction --- node/external/transactionAPI/unmarshaller.go | 25 ++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/node/external/transactionAPI/unmarshaller.go b/node/external/transactionAPI/unmarshaller.go index b2f9e753a38..097e39ae17e 100644 --- a/node/external/transactionAPI/unmarshaller.go +++ b/node/external/transactionAPI/unmarshaller.go @@ -102,7 +102,7 @@ func (tu *txUnmarshaller) unmarshalTransaction(txBytes []byte, txType transactio } func (tu *txUnmarshaller) prepareNormalTx(tx *transaction.Transaction) (*transaction.ApiTransactionResult, error) { - return &transaction.ApiTransactionResult{ + apiTx := &transaction.ApiTransactionResult{ Tx: tx, Type: string(transaction.TxTypeNormal), Nonce: tx.Nonce, @@ -118,11 +118,18 @@ func (tu *txUnmarshaller) prepareNormalTx(tx *transaction.Transaction) (*transac Options: tx.Options, Version: tx.Version, ChainID: string(tx.ChainID), - }, nil + } + + if len(tx.GuardianAddr) > 0 { + apiTx.GuardianAddr = tu.addressPubKeyConverter.Encode(tx.GuardianAddr) + apiTx.GuardianSignature = hex.EncodeToString(tx.GuardianSignature) + } + + return apiTx, nil } func (tu *txUnmarshaller) prepareInvalidTx(tx *transaction.Transaction) (*transaction.ApiTransactionResult, error) { - return &transaction.ApiTransactionResult{ + apiTx := &transaction.ApiTransactionResult{ Tx: tx, Type: string(transaction.TxTypeInvalid), Nonce: tx.Nonce, @@ -135,7 +142,17 @@ func (tu *txUnmarshaller) prepareInvalidTx(tx *transaction.Transaction) (*transa GasLimit: tx.GasLimit, Data: tx.Data, Signature: hex.EncodeToString(tx.Signature), - }, nil + Options: tx.Options, + Version: tx.Version, + ChainID: string(tx.ChainID), + } + + if len(tx.GuardianAddr) > 0 { + apiTx.GuardianAddr = tu.addressPubKeyConverter.Encode(tx.GuardianAddr) + apiTx.GuardianSignature = hex.EncodeToString(tx.GuardianSignature) + } + + return apiTx, nil } func (tu *txUnmarshaller) prepareRewardTx(tx *rewardTxData.RewardTx) (*transaction.ApiTransactionResult, error) { From 79fa1fda65debd85ed4e15fdc7ebd2ed61052e9c Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 6 Apr 2023 12:44:18 +0300 Subject: [PATCH 260/335] use stubs only for factory/heartbeat tests --- .../heartbeat/heartbeatV2Components_test.go | 148 +++++++++++------- integrationTests/mock/peerShardMapperStub.go | 8 + 2 files changed, 101 insertions(+), 55 deletions(-) diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index 0193efdfbdf..97c26f1b7ea 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -4,82 +4,120 @@ import ( "errors" "testing" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" errorsMx "github.com/multiversx/mx-chain-go/errors" - bootstrapComp "github.com/multiversx/mx-chain-go/factory/bootstrap" heartbeatComp "github.com/multiversx/mx-chain-go/factory/heartbeat" "github.com/multiversx/mx-chain-go/factory/mock" testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" "github.com/multiversx/mx-chain-go/p2p" "github.com/multiversx/mx-chain-go/sharding" + "github.com/multiversx/mx-chain-go/storage" + "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/bootstrapMocks" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" + "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/factory" + "github.com/multiversx/mx-chain-go/testscommon/mainFactoryMocks" "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" + "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" + "github.com/multiversx/mx-chain-go/testscommon/statusHandler" "github.com/stretchr/testify/assert" ) func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2ComponentsFactory { - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - bootStrapArgs := componentsMock.GetBootStrapFactoryArgs() - bootstrapComponentsFactory, _ := bootstrapComp.NewBootstrapComponentsFactory(bootStrapArgs) - bootstrapC, _ := bootstrapComp.NewTestManagedBootstrapComponents(bootstrapComponentsFactory) - _ = bootstrapC.Create() - - _ = bootstrapC.SetShardCoordinator(shardCoordinator) - - statusCoreC := componentsMock.GetStatusCoreComponents() - coreC := componentsMock.GetCoreComponents() - cryptoC := componentsMock.GetCryptoComponents(coreC) - networkC := componentsMock.GetNetworkComponents(cryptoC) - dataC := componentsMock.GetDataComponents(coreC, shardCoordinator) - stateC := componentsMock.GetStateComponents(coreC) - processC := componentsMock.GetProcessComponents(shardCoordinator, coreC, networkC, dataC, cryptoC, stateC) return heartbeatComp.ArgHeartbeatV2ComponentsFactory{ - Config: config.Config{ - HeartbeatV2: config.HeartbeatV2Config{ - PeerAuthenticationTimeBetweenSendsInSec: 1, - PeerAuthenticationTimeBetweenSendsWhenErrorInSec: 1, - PeerAuthenticationThresholdBetweenSends: 0.1, - HeartbeatTimeBetweenSendsInSec: 1, - HeartbeatTimeBetweenSendsDuringBootstrapInSec: 1, - HeartbeatTimeBetweenSendsWhenErrorInSec: 1, - HeartbeatThresholdBetweenSends: 0.1, - HeartbeatExpiryTimespanInSec: 30, - MinPeersThreshold: 0.8, - DelayBetweenRequestsInSec: 10, - MaxTimeoutInSec: 60, - PeerShardTimeBetweenSendsInSec: 5, - PeerShardThresholdBetweenSends: 0.1, - MaxMissingKeysInRequest: 100, - MaxDurationPeerUnresponsiveInSec: 10, - HideInactiveValidatorIntervalInSec: 60, - HardforkTimeBetweenSendsInSec: 5, - TimeBetweenConnectionsMetricsUpdateInSec: 10, - TimeToReadDirectConnectionsInSec: 15, - HeartbeatPool: config.CacheConfig{ - Type: "LRU", - Capacity: 1000, - Shards: 1, - }, - }, - Hardfork: config.HardforkConfig{ - PublicKeyToListenFrom: componentsMock.DummyPk, - }, - }, + Config: createMockConfig(), Prefs: config.Preferences{ Preferences: config.PreferencesConfig{ NodeDisplayName: "node", Identity: "identity", }, }, - AppVersion: "test", - BootstrapComponents: bootstrapC, - CoreComponents: coreC, - DataComponents: dataC, - NetworkComponents: networkC, - CryptoComponents: cryptoC, - ProcessComponents: processC, - StatusCoreComponents: statusCoreC, + AppVersion: "test", + BootstrapComponents: &mainFactoryMocks.BootstrapComponentsStub{ + ShCoordinator: &testscommon.ShardsCoordinatorMock{}, + BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, + }, + CoreComponents: &factory.CoreComponentsHolderStub{ + InternalMarshalizerCalled: func() marshal.Marshalizer { + return &testscommon.MarshalizerStub{} + }, + HardforkTriggerPubKeyCalled: func() []byte { + return []byte("hardfork pub key") + }, + ValidatorPubKeyConverterCalled: func() core.PubkeyConverter { + return &mock.PubkeyConverterStub{} + }, + }, + DataComponents: &testsMocks.DataComponentsStub{ + DataPool: &dataRetriever.PoolsHolderStub{ + PeerAuthenticationsCalled: func() storage.Cacher { + return &testscommon.CacherStub{} + }, + HeartbeatsCalled: func() storage.Cacher { + return &testscommon.CacherStub{} + }, + }, + BlockChain: &testscommon.ChainHandlerStub{}, + }, + NetworkComponents: &testsMocks.NetworkComponentsStub{ + Messenger: &p2pmocks.MessengerStub{}, + }, + CryptoComponents: &testsMocks.CryptoComponentsStub{ + PrivKey: &cryptoMocks.PrivateKeyStub{}, + PeerSignHandler: &testsMocks.PeerSignatureHandler{}, + }, + ProcessComponents: &testsMocks.ProcessComponentsStub{ + EpochTrigger: &testsMocks.EpochStartTriggerStub{}, + EpochNotifier: &testsMocks.EpochStartNotifierStub{}, + NodesCoord: &shardingMocks.NodesCoordinatorStub{}, + NodeRedundancyHandlerInternal: &testsMocks.RedundancyHandlerStub{}, + HardforkTriggerField: &testscommon.HardforkTriggerStub{}, + ReqHandler: &testscommon.RequestHandlerStub{}, + PeerMapper: &testsMocks.PeerShardMapperStub{}, + ShardCoord: &testscommon.ShardsCoordinatorMock{}, + }, + StatusCoreComponents: &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, + }, + } +} + +func createMockConfig() config.Config { + return config.Config{ + HeartbeatV2: config.HeartbeatV2Config{ + PeerAuthenticationTimeBetweenSendsInSec: 1, + PeerAuthenticationTimeBetweenSendsWhenErrorInSec: 1, + PeerAuthenticationThresholdBetweenSends: 0.1, + HeartbeatTimeBetweenSendsInSec: 1, + HeartbeatTimeBetweenSendsDuringBootstrapInSec: 1, + HeartbeatTimeBetweenSendsWhenErrorInSec: 1, + HeartbeatThresholdBetweenSends: 0.1, + HeartbeatExpiryTimespanInSec: 30, + MinPeersThreshold: 0.8, + DelayBetweenRequestsInSec: 10, + MaxTimeoutInSec: 60, + PeerShardTimeBetweenSendsInSec: 5, + PeerShardThresholdBetweenSends: 0.1, + MaxMissingKeysInRequest: 100, + MaxDurationPeerUnresponsiveInSec: 10, + HideInactiveValidatorIntervalInSec: 60, + HardforkTimeBetweenSendsInSec: 5, + TimeBetweenConnectionsMetricsUpdateInSec: 10, + TimeToReadDirectConnectionsInSec: 15, + HeartbeatPool: config.CacheConfig{ + Type: "LRU", + Capacity: 1000, + Shards: 1, + }, + }, + Hardfork: config.HardforkConfig{ + PublicKeyToListenFrom: componentsMock.DummyPk, + }, } } diff --git a/integrationTests/mock/peerShardMapperStub.go b/integrationTests/mock/peerShardMapperStub.go index 8e2bc50dbfc..b32a1045c7b 100644 --- a/integrationTests/mock/peerShardMapperStub.go +++ b/integrationTests/mock/peerShardMapperStub.go @@ -8,6 +8,14 @@ type PeerShardMapperStub struct { UpdatePeerIDPublicKeyPairCalled func(pid core.PeerID, pk []byte) PutPeerIdShardIdCalled func(pid core.PeerID, shardID uint32) PutPeerIdSubTypeCalled func(pid core.PeerID, peerSubType core.P2PPeerSubType) + UpdatePeerIDInfoCalled func(pid core.PeerID, pk []byte, shardID uint32) +} + +// UpdatePeerIDInfo - +func (psms *PeerShardMapperStub) UpdatePeerIDInfo(pid core.PeerID, pk []byte, shardID uint32) { + if psms.UpdatePeerIDInfoCalled != nil { + psms.UpdatePeerIDInfoCalled(pid, pk, shardID) + } } // UpdatePeerIDPublicKeyPair - From 5803baf3dc6aafcb223f5185ee45d744d3c1e0d6 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 6 Apr 2023 12:54:25 +0300 Subject: [PATCH 261/335] fix after merge --- storage/factory/openStorage_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/storage/factory/openStorage_test.go b/storage/factory/openStorage_test.go index c83de89936f..69a81bc1f67 100644 --- a/storage/factory/openStorage_test.go +++ b/storage/factory/openStorage_test.go @@ -234,6 +234,6 @@ func TestOldDataCleanerProvider_IsInterfaceNil(t *testing.T) { var osu *openStorageUnits require.True(t, osu.IsInterfaceNil()) - osu = NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) + osu, _ = NewStorageUnitOpenHandler(createMockArgsOpenStorageUnits()) require.False(t, osu.IsInterfaceNil()) } From 2e1456a02acc1645e66d96e2723117f8db180ff0 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 6 Apr 2023 13:03:39 +0300 Subject: [PATCH 262/335] more fixes after merge --- factory/bootstrap/bootstrapComponents.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/factory/bootstrap/bootstrapComponents.go b/factory/bootstrap/bootstrapComponents.go index 9ad5fc0bc46..9f580416853 100644 --- a/factory/bootstrap/bootstrapComponents.go +++ b/factory/bootstrap/bootstrapComponents.go @@ -162,12 +162,15 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) { return nil, err } - unitOpener := createUnitOpener( + unitOpener, err := createUnitOpener( bootstrapDataProvider, latestStorageDataProvider, storage.DefaultEpochString, storage.DefaultShardString, ) + if err != nil { + return nil, err + } dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory() @@ -334,7 +337,7 @@ func createUnitOpener( latestDataFromStorageProvider storage.LatestStorageDataProviderHandler, defaultEpochString string, defaultShardString string, -) storage.UnitOpenerHandler { +) (storage.UnitOpenerHandler, error) { argsStorageUnitOpener := storageFactory.ArgsNewOpenStorageUnits{ BootstrapDataProvider: bootstrapDataProvider, LatestStorageDataProvider: latestDataFromStorageProvider, From 2b733bac0d8458a5503c6833adb88bcfb50f4083 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Thu, 6 Apr 2023 14:56:01 +0300 Subject: [PATCH 263/335] wrap invalid guardian signature error --- process/transaction/interceptedTransaction.go | 7 ++++++- process/transaction/interceptedTransaction_test.go | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index 05bfbb4cf47..9f9a292e281 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -397,7 +397,12 @@ func (inTx *InterceptedTransaction) VerifyGuardianSig(tx *transaction.Transactio return err } - return inTx.singleSigner.Verify(guardianPubKey, txMessageForSigVerification, tx.GuardianSignature) + errVerifySig := inTx.singleSigner.Verify(guardianPubKey, txMessageForSigVerification, tx.GuardianSignature) + if errVerifySig != nil { + return fmt.Errorf("%w when checking the guardian's signature", errVerifySig) + } + + return nil } func verifyConsistencyForNotGuardedTx(tx *transaction.Transaction) error { diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index 7ba2750ddf2..881771a1c67 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -1812,7 +1812,8 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { require.Nil(t, err) err = inTx.VerifyGuardianSig(&tx) - require.Equal(t, errSignerMockVerifySigFails, err) + require.ErrorIs(t, err, errSignerMockVerifySigFails) + require.Contains(t, err.Error(), "guardian's signature") }) t.Run("normal TX with not empty guardian address", func(t *testing.T) { tx := tx @@ -1848,7 +1849,8 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { require.Nil(t, err) err = inTx.VerifyGuardianSig(&tx) - require.Equal(t, errSignerMockVerifySigFails, err) + require.ErrorIs(t, err, errSignerMockVerifySigFails) + require.Contains(t, err.Error(), "guardian's signature") }) t.Run("correct guardian sig", func(t *testing.T) { tx := tx From 04c7ce2642c027070aa4807a39d9614c56c4dd86 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 6 Apr 2023 16:03:33 +0300 Subject: [PATCH 264/335] added unittests on factory/status, factory/statusCore --- .../factory/softwareVersionFactory.go | 4 +- errors/errors.go | 3 + factory/interface.go | 2 +- factory/status/export_test.go | 28 ++ factory/status/statusComponents.go | 17 +- factory/status/statusComponentsHandler.go | 8 +- .../status/statusComponentsHandler_test.go | 292 ++++++++++++++--- factory/status/statusComponents_test.go | 309 ++++++++++++------ factory/statusCore/statusCoreComponents.go | 15 +- .../statusCore/statusCoreComponentsHandler.go | 2 +- .../statusCoreComponentsHandler_test.go | 109 ++++-- .../statusCore/statusCoreComponents_test.go | 125 +++---- .../consensusComponents_test.go | 4 +- .../heartbeatComponents_test.go | 4 +- .../processComponents_test.go | 4 +- .../statusComponents/statusComponents_test.go | 4 +- node/nodeRunner.go | 9 +- testscommon/components/components.go | 8 +- testscommon/generalConfig.go | 1 + testscommon/networkStatisticsProviderStub.go | 117 +++++++ 20 files changed, 794 insertions(+), 271 deletions(-) create mode 100644 factory/status/export_test.go create mode 100644 testscommon/networkStatisticsProviderStub.go diff --git a/common/statistics/softwareVersion/factory/softwareVersionFactory.go b/common/statistics/softwareVersion/factory/softwareVersionFactory.go index df30e135bb8..8713db01dc9 100644 --- a/common/statistics/softwareVersion/factory/softwareVersionFactory.go +++ b/common/statistics/softwareVersion/factory/softwareVersionFactory.go @@ -32,7 +32,5 @@ func NewSoftwareVersionFactory( // Create returns a software version checker object func (svf *softwareVersionFactory) Create() (*softwareVersion.SoftwareVersionChecker, error) { stableTagProvider := softwareVersion.NewStableTagProvider(svf.config.StableTagLocation) - softwareVersionChecker, err := softwareVersion.NewSoftwareVersionChecker(svf.statusHandler, stableTagProvider, svf.config.PollingIntervalInMinutes) - - return softwareVersionChecker, err + return softwareVersion.NewSoftwareVersionChecker(svf.statusHandler, stableTagProvider, svf.config.PollingIntervalInMinutes) } diff --git a/errors/errors.go b/errors/errors.go index b9b526eb95b..80f2ee02914 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -116,6 +116,9 @@ var ErrNilStateComponentsFactory = errors.New("nil state components factory") // ErrNilStatusComponentsFactory signals that the provided status components factory is nil var ErrNilStatusComponentsFactory = errors.New("nil status components factory") +// ErrNilStatusCoreComponentsFactory signals that an operation has been attempted with nil status core components factory +var ErrNilStatusCoreComponentsFactory = errors.New("nil status core components factory provided") + // ErrNilBootstrapParamsHandler signals that the provided bootstrap parameters handler is nil var ErrNilBootstrapParamsHandler = errors.New("nil bootstrap parameters handler") diff --git a/factory/interface.go b/factory/interface.go index 306fb1b50f3..3f6f1fbb9de 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -334,7 +334,7 @@ type StatusComponentsHandler interface { ComponentHandler StatusComponentsHolder // SetForkDetector should be set before starting Polling for updates - SetForkDetector(forkDetector process.ForkDetector) + SetForkDetector(forkDetector process.ForkDetector) error StartPolling() error } diff --git a/factory/status/export_test.go b/factory/status/export_test.go new file mode 100644 index 00000000000..09f8e9c76bf --- /dev/null +++ b/factory/status/export_test.go @@ -0,0 +1,28 @@ +package status + +import ( + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-go/epochStart" + "github.com/multiversx/mx-chain-go/p2p" +) + +// EpochStartEventHandler - +func (pc *statusComponents) EpochStartEventHandler() epochStart.ActionHandler { + return pc.epochStartEventHandler() +} + +// ComputeNumConnectedPeers - +func ComputeNumConnectedPeers( + appStatusHandler core.AppStatusHandler, + netMessenger p2p.Messenger, +) { + computeNumConnectedPeers(appStatusHandler, netMessenger) +} + +// ComputeConnectedPeers - +func ComputeConnectedPeers( + appStatusHandler core.AppStatusHandler, + netMessenger p2p.Messenger, +) { + computeConnectedPeers(appStatusHandler, netMessenger) +} diff --git a/factory/status/statusComponents.go b/factory/status/statusComponents.go index ed66739b3c7..c2898767ef3 100644 --- a/factory/status/statusComponents.go +++ b/factory/status/statusComponents.go @@ -2,7 +2,6 @@ package status import ( "context" - "fmt" "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" @@ -45,7 +44,6 @@ type StatusComponentsFactoryArgs struct { EpochStartNotifier factory.EpochStartNotifier CoreComponents factory.CoreComponentsHolder StatusCoreComponents factory.StatusCoreComponentsHolder - DataComponents factory.DataComponentsHolder NetworkComponents factory.NetworkComponentsHolder StateComponents factory.StateComponentsHolder IsInImportMode bool @@ -61,7 +59,6 @@ type statusComponentsFactory struct { forkDetector process.ForkDetector coreComponents factory.CoreComponentsHolder statusCoreComponents factory.StatusCoreComponentsHolder - dataComponents factory.DataComponentsHolder networkComponents factory.NetworkComponentsHolder stateComponents factory.StateComponentsHolder isInImportMode bool @@ -74,18 +71,12 @@ func NewStatusComponentsFactory(args StatusComponentsFactoryArgs) (*statusCompon if check.IfNil(args.CoreComponents) { return nil, errors.ErrNilCoreComponentsHolder } - if check.IfNil(args.DataComponents) { - return nil, errors.ErrNilDataComponentsHolder + if check.IfNil(args.CoreComponents.GenesisNodesSetup()) { + return nil, errors.ErrNilGenesisNodesSetupHandler } if check.IfNil(args.NetworkComponents) { return nil, errors.ErrNilNetworkComponentsHolder } - if check.IfNil(args.CoreComponents.AddressPubKeyConverter()) { - return nil, fmt.Errorf("%w for address", errors.ErrNilPubKeyConverter) - } - if check.IfNil(args.CoreComponents.ValidatorPubKeyConverter()) { - return nil, fmt.Errorf("%w for validator", errors.ErrNilPubKeyConverter) - } if check.IfNil(args.ShardCoordinator) { return nil, errors.ErrNilShardCoordinator } @@ -98,9 +89,6 @@ func NewStatusComponentsFactory(args StatusComponentsFactoryArgs) (*statusCompon if check.IfNil(args.StatusCoreComponents) { return nil, errors.ErrNilStatusCoreComponents } - if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { - return nil, errors.ErrNilAppStatusHandler - } return &statusComponentsFactory{ config: args.Config, @@ -111,7 +99,6 @@ func NewStatusComponentsFactory(args StatusComponentsFactoryArgs) (*statusCompon epochStartNotifier: args.EpochStartNotifier, coreComponents: args.CoreComponents, statusCoreComponents: args.StatusCoreComponents, - dataComponents: args.DataComponents, networkComponents: args.NetworkComponents, stateComponents: args.StateComponents, isInImportMode: args.IsInImportMode, diff --git a/factory/status/statusComponentsHandler.go b/factory/status/statusComponentsHandler.go index 1eeb6c2754c..71f69b2a325 100644 --- a/factory/status/statusComponentsHandler.go +++ b/factory/status/statusComponentsHandler.go @@ -107,10 +107,16 @@ func (msc *managedStatusComponents) CheckSubcomponents() error { } // SetForkDetector sets the fork detector -func (msc *managedStatusComponents) SetForkDetector(forkDetector process.ForkDetector) { +func (msc *managedStatusComponents) SetForkDetector(forkDetector process.ForkDetector) error { + if check.IfNil(forkDetector) { + return errors.ErrNilForkDetector + } + msc.mutStatusComponents.Lock() msc.statusComponentsFactory.forkDetector = forkDetector msc.mutStatusComponents.Unlock() + + return nil } // StartPolling starts polling for the updated status diff --git a/factory/status/statusComponentsHandler_test.go b/factory/status/statusComponentsHandler_test.go index f021cbb4284..f84cc07ce20 100644 --- a/factory/status/statusComponentsHandler_test.go +++ b/factory/status/statusComponentsHandler_test.go @@ -3,59 +3,90 @@ package status_test import ( "testing" + "github.com/multiversx/mx-chain-go/common" + errorsMx "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/factory/mock" statusComp "github.com/multiversx/mx-chain-go/factory/status" - componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" - "github.com/multiversx/mx-chain-go/testscommon/factory" + "github.com/multiversx/mx-chain-go/p2p" + factoryMocks "github.com/multiversx/mx-chain-go/testscommon/factory" + "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" "github.com/stretchr/testify/require" ) -// ------------ Test ManagedStatusComponents -------------------- -func TestManagedStatusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestNewManagedStatusComponents(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - statusCoreComponents := &factory.StatusCoreComponentsStub{ - AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, - } - statusArgs.StatusCoreComponents = statusCoreComponents + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() - statusComponentsFactory, _ := statusComp.NewStatusComponentsFactory(statusArgs) - managedStatusComponents, err := statusComp.NewManagedStatusComponents(statusComponentsFactory) - require.NoError(t, err) + managedStatusComponents, err := statusComp.NewManagedStatusComponents(nil) + require.Equal(t, errorsMx.ErrNilStatusComponentsFactory, err) + require.Nil(t, managedStatusComponents) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - statusCoreComponents.AppStatusHandlerField = nil - err = managedStatusComponents.Create() - require.Error(t, err) + scf, err := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + require.Nil(t, err) + managedStatusComponents, err := statusComp.NewManagedStatusComponents(scf) + require.Nil(t, err) + require.NotNil(t, managedStatusComponents) + }) } -func TestManagedStatusComponents_CreateShouldWork(t *testing.T) { +func TestManagedStatusComponents_Create(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - statusComponentsFactory, _ := statusComp.NewStatusComponentsFactory(statusArgs) - managedStatusComponents, err := statusComp.NewManagedStatusComponents(statusComponentsFactory) - require.NoError(t, err) - require.Nil(t, managedStatusComponents.OutportHandler()) - require.Nil(t, managedStatusComponents.SoftwareVersionChecker()) + t.Run("invalid params should error", func(t *testing.T) { + t.Parallel() - err = managedStatusComponents.Create() - require.NoError(t, err) - require.NotNil(t, managedStatusComponents.OutportHandler()) - require.NotNil(t, managedStatusComponents.SoftwareVersionChecker()) + args := createMockStatusComponentsFactoryArgs() + args.StatusCoreComponents = &factoryMocks.StatusCoreComponentsStub{ + AppStatusHandlerField: nil, + } + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, err) + managedStatusComponents, err := statusComp.NewManagedStatusComponents(scf) + require.Nil(t, err) + require.NotNil(t, managedStatusComponents) + + err = managedStatusComponents.Create() + require.Error(t, err) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + scf, err := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + require.Nil(t, err) + managedStatusComponents, err := statusComp.NewManagedStatusComponents(scf) + require.Nil(t, err) + require.NotNil(t, managedStatusComponents) + require.Nil(t, managedStatusComponents.OutportHandler()) + require.Nil(t, managedStatusComponents.SoftwareVersionChecker()) + + err = managedStatusComponents.Create() + require.NoError(t, err) + require.NotNil(t, managedStatusComponents.OutportHandler()) + require.NotNil(t, managedStatusComponents.SoftwareVersionChecker()) + + require.Equal(t, factory.StatusComponentsName, managedStatusComponents.String()) + }) } func TestManagedStatusComponents_Close(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - statusComponentsFactory, _ := statusComp.NewStatusComponentsFactory(statusArgs) - managedStatusComponents, _ := statusComp.NewManagedStatusComponents(statusComponentsFactory) - err := managedStatusComponents.Create() + scf, _ := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + managedStatusComponents, _ := statusComp.NewManagedStatusComponents(scf) + err := managedStatusComponents.Close() + require.NoError(t, err) + + err = managedStatusComponents.Create() + require.NoError(t, err) + + err = managedStatusComponents.StartPolling() // coverage require.NoError(t, err) err = managedStatusComponents.Close() @@ -65,13 +96,198 @@ func TestManagedStatusComponents_Close(t *testing.T) { func TestManagedStatusComponents_CheckSubcomponents(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - statusComponentsFactory, _ := statusComp.NewStatusComponentsFactory(statusArgs) - managedStatusComponents, _ := statusComp.NewManagedStatusComponents(statusComponentsFactory) - err := managedStatusComponents.Create() + scf, _ := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + managedStatusComponents, _ := statusComp.NewManagedStatusComponents(scf) + + err := managedStatusComponents.CheckSubcomponents() + require.Equal(t, errorsMx.ErrNilStatusComponents, err) + + err = managedStatusComponents.Create() require.NoError(t, err) err = managedStatusComponents.CheckSubcomponents() require.NoError(t, err) } + +func TestManagedStatusComponents_SetForkDetector(t *testing.T) { + t.Parallel() + + scf, _ := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + managedStatusComponents, _ := statusComp.NewManagedStatusComponents(scf) + err := managedStatusComponents.Create() + require.NoError(t, err) + + err = managedStatusComponents.SetForkDetector(nil) + require.Equal(t, errorsMx.ErrNilForkDetector, err) + err = managedStatusComponents.SetForkDetector(&mock.ForkDetectorMock{}) + require.NoError(t, err) +} + +func TestManagedStatusComponents_StartPolling(t *testing.T) { + t.Parallel() + + t.Run("NewAppStatusPolling fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockStatusComponentsFactoryArgs() + args.Config.GeneralSettings.StatusPollingIntervalSec = 0 + scf, _ := statusComp.NewStatusComponentsFactory(args) + managedStatusComponents, _ := statusComp.NewManagedStatusComponents(scf) + err := managedStatusComponents.Create() + require.NoError(t, err) + + err = managedStatusComponents.StartPolling() + require.Equal(t, errorsMx.ErrStatusPollingInit, err) + }) + t.Run("RegisterPollingFunc fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockStatusComponentsFactoryArgs() + args.Config.GeneralSettings.StatusPollingIntervalSec = 0 + scf, _ := statusComp.NewStatusComponentsFactory(args) + managedStatusComponents, _ := statusComp.NewManagedStatusComponents(scf) + err := managedStatusComponents.Create() + require.NoError(t, err) + + err = managedStatusComponents.StartPolling() + require.Equal(t, errorsMx.ErrStatusPollingInit, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + scf, _ := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + managedStatusComponents, _ := statusComp.NewManagedStatusComponents(scf) + err := managedStatusComponents.Create() + require.NoError(t, err) + + err = managedStatusComponents.StartPolling() + require.NoError(t, err) + }) +} + +func TestComputeNumConnectedPeers(t *testing.T) { + t.Parallel() + + netMes := &p2pmocks.MessengerStub{ + ConnectedAddressesCalled: func() []string { + return []string{"addr1", "addr2", "addr3"} + }, + } + appStatusHandler := &statusHandler.AppStatusHandlerStub{ + SetUInt64ValueHandler: func(key string, value uint64) { + require.Equal(t, common.MetricNumConnectedPeers, key) + require.Equal(t, uint64(3), value) + }, + } + + statusComp.ComputeNumConnectedPeers(appStatusHandler, netMes) +} + +func TestComputeConnectedPeers(t *testing.T) { + t.Parallel() + + netMes := &p2pmocks.MessengerStub{ + GetConnectedPeersInfoCalled: func() *p2p.ConnectedPeersInfo { + return &p2p.ConnectedPeersInfo{ + SelfShardID: 0, + UnknownPeers: []string{"unknown"}, + Seeders: []string{"seeder"}, + IntraShardValidators: map[uint32][]string{ + 0: {"intra-v-0"}, + 1: {"intra-v-1"}, + }, + IntraShardObservers: map[uint32][]string{ + 0: {"intra-o-0"}, + 1: {"intra-o-1"}, + }, + CrossShardValidators: map[uint32][]string{ + 0: {"cross-v-0"}, + 1: {"cross-v-1"}, + }, + CrossShardObservers: map[uint32][]string{ + 0: {"cross-o-0"}, + 1: {"cross-o-1"}, + }, + FullHistoryObservers: map[uint32][]string{ + 0: {"fh-0"}, + 1: {"fh-1"}, + }, + NumValidatorsOnShard: map[uint32]int{ + 0: 1, + 1: 1, + }, + NumObserversOnShard: map[uint32]int{ + 0: 1, + 1: 1, + }, + NumPreferredPeersOnShard: map[uint32]int{ + 0: 0, + 1: 0, + }, + NumIntraShardValidators: 2, + NumIntraShardObservers: 2, + NumCrossShardValidators: 2, + NumCrossShardObservers: 2, + NumFullHistoryObservers: 2, + } + }, + AddressesCalled: func() []string { + return []string{"intra-v-0", "intra-v-1", "intra-o-0", "intra-o-1", "cross-v-0", "cross-v-1"} + }, + } + expectedPeerClassification := "intraVal:2,crossVal:2,intraObs:2,crossObs:2,fullObs:2,unknown:1," + cnt := 0 + appStatusHandler := &statusHandler.AppStatusHandlerStub{ + SetStringValueHandler: func(key string, value string) { + cnt++ + switch cnt { + case 1: + require.Equal(t, common.MetricNumConnectedPeersClassification, key) + require.Equal(t, expectedPeerClassification, value) + case 2: + require.Equal(t, common.MetricP2PNumConnectedPeersClassification, key) + require.Equal(t, expectedPeerClassification, value) + case 3: + require.Equal(t, common.MetricP2PUnknownPeers, key) + require.Equal(t, "unknown", value) + case 4: + require.Equal(t, common.MetricP2PIntraShardValidators, key) + require.Equal(t, "intra-v-0,intra-v-1", value) + case 5: + require.Equal(t, common.MetricP2PIntraShardObservers, key) + require.Equal(t, "intra-o-0,intra-o-1", value) + case 6: + require.Equal(t, common.MetricP2PCrossShardValidators, key) + require.Equal(t, "cross-v-0,cross-v-1", value) + case 7: + require.Equal(t, common.MetricP2PCrossShardObservers, key) + require.Equal(t, "cross-o-0,cross-o-1", value) + case 8: + require.Equal(t, common.MetricP2PFullHistoryObservers, key) + require.Equal(t, "fh-0,fh-1", value) + case 9: + require.Equal(t, common.MetricP2PPeerInfo, key) + require.Equal(t, "intra-v-0,intra-v-1,intra-o-0,intra-o-1,cross-v-0,cross-v-1", value) + default: + require.Fail(t, "should not have been called") + } + }, + SetUInt64ValueHandler: func(key string, value uint64) { + require.Equal(t, common.MetricNumConnectedPeers, key) + require.Equal(t, 3, key) + }, + } + + statusComp.ComputeConnectedPeers(appStatusHandler, netMes) +} + +func TestManagedStatusComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedStatusComponents, _ := statusComp.NewManagedStatusComponents(nil) + require.True(t, managedStatusComponents.IsInterfaceNil()) + + scf, _ := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + managedStatusComponents, _ = statusComp.NewManagedStatusComponents(scf) + require.False(t, managedStatusComponents.IsInterfaceNil()) +} diff --git a/factory/status/statusComponents_test.go b/factory/status/statusComponents_test.go index 3a52d8bf06e..5240fc11ba7 100644 --- a/factory/status/statusComponents_test.go +++ b/factory/status/statusComponents_test.go @@ -1,145 +1,254 @@ package status_test import ( + "errors" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" + "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/config" - "github.com/multiversx/mx-chain-go/errors" - coreComp "github.com/multiversx/mx-chain-go/factory/core" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory/mock" statusComp "github.com/multiversx/mx-chain-go/factory/status" + testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" + "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" - "github.com/stretchr/testify/assert" + "github.com/multiversx/mx-chain-go/testscommon/statusHandler" "github.com/stretchr/testify/require" ) -func TestNewStatusComponentsFactory_NilCoreComponentsShouldErr(t *testing.T) { - t.Parallel() - - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - args.CoreComponents = nil - scf, err := statusComp.NewStatusComponentsFactory(args) - assert.True(t, check.IfNil(scf)) - assert.Equal(t, errors.ErrNilCoreComponentsHolder, err) +func createMockStatusComponentsFactoryArgs() statusComp.StatusComponentsFactoryArgs { + return statusComp.StatusComponentsFactoryArgs{ + Config: testscommon.GetGeneralConfig(), + ExternalConfig: config.ExternalConfig{ + ElasticSearchConnector: config.ElasticSearchConfig{ + Enabled: false, + URL: "url", + Username: "user", + Password: "pass", + EnabledIndexes: []string{"transactions", "blocks"}, + }, + WebSocketConnector: config.WebSocketDriverConfig{ + MarshallerType: "json", + }, + }, + EconomicsConfig: config.EconomicsConfig{}, + ShardCoordinator: &testscommon.ShardsCoordinatorMock{}, + NodesCoordinator: &shardingMocks.NodesCoordinatorMock{}, + EpochStartNotifier: &mock.EpochStartNotifierStub{}, + CoreComponents: &mock.CoreComponentsMock{ + NodesConfig: &testscommon.NodesSetupStub{ + GetRoundDurationCalled: func() uint64 { + return 1000 + }, + }, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + }, + StatusCoreComponents: &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, + NetworkStatisticsField: &testscommon.NetworkStatisticsProviderStub{}, + }, + NetworkComponents: &testsMocks.NetworkComponentsStub{}, + StateComponents: &mock.StateComponentsHolderStub{}, + IsInImportMode: false, + } } -func TestNewStatusComponentsFactory_NilNodesCoordinatorShouldErr(t *testing.T) { +func TestNewStatusComponentsFactory(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - args.NodesCoordinator = nil - scf, err := statusComp.NewStatusComponentsFactory(args) - assert.True(t, check.IfNil(scf)) - assert.Equal(t, errors.ErrNilNodesCoordinator, err) -} + t.Run("nil CoreComponents should error", func(t *testing.T) { + t.Parallel() -func TestNewStatusComponentsFactory_NilEpochStartNotifierShouldErr(t *testing.T) { - t.Parallel() + args := createMockStatusComponentsFactoryArgs() + args.CoreComponents = nil + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errorsMx.ErrNilCoreComponentsHolder, err) + }) + t.Run("CoreComponents with nil GenesisNodesSetup should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - args.EpochStartNotifier = nil - scf, err := statusComp.NewStatusComponentsFactory(args) - assert.True(t, check.IfNil(scf)) - assert.Equal(t, errors.ErrNilEpochStartNotifier, err) -} + args := createMockStatusComponentsFactoryArgs() + args.CoreComponents = &mock.CoreComponentsMock{ + NodesConfig: nil, + } + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errorsMx.ErrNilGenesisNodesSetupHandler, err) + }) + t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Parallel() -func TestNewStatusComponentsFactory_NilNetworkComponentsShouldErr(t *testing.T) { - t.Parallel() + args := createMockStatusComponentsFactoryArgs() + args.NetworkComponents = nil + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errorsMx.ErrNilNetworkComponentsHolder, err) + }) + t.Run("nil ShardCoordinator should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - args.NetworkComponents = nil - scf, err := statusComp.NewStatusComponentsFactory(args) - assert.True(t, check.IfNil(scf)) - assert.Equal(t, errors.ErrNilNetworkComponentsHolder, err) -} + args := createMockStatusComponentsFactoryArgs() + args.ShardCoordinator = nil + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errorsMx.ErrNilShardCoordinator, err) + }) + t.Run("nil NodesCoordinator should error", func(t *testing.T) { + t.Parallel() -func TestNewStatusComponentsFactory_NilShardCoordinatorShouldErr(t *testing.T) { - t.Parallel() + args := createMockStatusComponentsFactoryArgs() + args.NodesCoordinator = nil + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errorsMx.ErrNilNodesCoordinator, err) + }) + t.Run("nil EpochStartNotifier should error", func(t *testing.T) { + t.Parallel() + + args := createMockStatusComponentsFactoryArgs() + args.EpochStartNotifier = nil + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errorsMx.ErrNilEpochStartNotifier, err) + }) + t.Run("nil StatusCoreComponents should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - args.ShardCoordinator = nil - scf, err := statusComp.NewStatusComponentsFactory(args) - assert.True(t, check.IfNil(scf)) - assert.Equal(t, errors.ErrNilShardCoordinator, err) + args := createMockStatusComponentsFactoryArgs() + args.StatusCoreComponents = nil + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, scf) + require.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + scf, err := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + require.NotNil(t, scf) + require.NoError(t, err) + }) } -func TestNewStatusComponents_InvalidRoundDurationShouldErr(t *testing.T) { +func TestStatusComponentsFactory_Create(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - coreArgs := componentsMock.GetCoreArgs() - coreArgs.NodesFilename = "../mock/testdata/nodesSetupMockInvalidRound.json" - coreComponentsFactory, _ := coreComp.NewCoreComponentsFactory(coreArgs) - coreComponents, err := coreComp.NewManagedCoreComponents(coreComponentsFactory) - require.Nil(t, err) - require.NotNil(t, coreComponents) - err = coreComponents.Create() - require.Nil(t, err) - networkComponents := componentsMock.GetNetworkComponents(componentsMock.GetCryptoComponents(coreComponents)) - dataComponents := componentsMock.GetDataComponents(coreComponents, shardCoordinator) - stateComponents := componentsMock.GetStateComponents(coreComponents, shardCoordinator) - - statusArgs := statusComp.StatusComponentsFactoryArgs{ - Config: testscommon.GetGeneralConfig(), - ExternalConfig: config.ExternalConfig{}, - ShardCoordinator: shardCoordinator, - NodesCoordinator: &shardingMocks.NodesCoordinatorMock{}, - EpochStartNotifier: &mock.EpochStartNotifierStub{}, - CoreComponents: coreComponents, - DataComponents: dataComponents, - NetworkComponents: networkComponents, - StateComponents: stateComponents, - IsInImportMode: false, - EconomicsConfig: config.EconomicsConfig{}, - StatusCoreComponents: componentsMock.GetStatusCoreComponents(), - } - scf, err := statusComp.NewStatusComponentsFactory(statusArgs) - assert.Nil(t, err) - assert.NotNil(t, scf) + t.Run("NewSoftwareVersionFactory fails should return error", func(t *testing.T) { + t.Parallel() + + args := createMockStatusComponentsFactoryArgs() + args.StatusCoreComponents = &factory.StatusCoreComponentsStub{ + AppStatusHandlerField: nil, // make NewSoftwareVersionFactory fail + } + scf, _ := statusComp.NewStatusComponentsFactory(args) + require.NotNil(t, scf) - statusComponents, err := scf.Create() - assert.Nil(t, statusComponents) - assert.Equal(t, errors.ErrInvalidRoundDuration, err) + sc, err := scf.Create() + require.Error(t, err) + require.Nil(t, sc) + }) + t.Run("softwareVersionCheckerFactory.Create fails should return error", func(t *testing.T) { + t.Parallel() + + args := createMockStatusComponentsFactoryArgs() + args.Config.SoftwareVersionConfig.PollingIntervalInMinutes = 0 + scf, _ := statusComp.NewStatusComponentsFactory(args) + require.NotNil(t, scf) + + sc, err := scf.Create() + require.Error(t, err) + require.Nil(t, sc) + }) + t.Run("invalid round duration should error", func(t *testing.T) { + t.Parallel() + + args := createMockStatusComponentsFactoryArgs() + args.CoreComponents = &mock.CoreComponentsMock{ + NodesConfig: &testscommon.NodesSetupStub{ + GetRoundDurationCalled: func() uint64 { + return 0 + }, + }, + } + scf, _ := statusComp.NewStatusComponentsFactory(args) + require.NotNil(t, scf) + + sc, err := scf.Create() + require.Equal(t, errorsMx.ErrInvalidRoundDuration, err) + require.Nil(t, sc) + }) + t.Run("makeWebSocketDriverArgs fails due to invalid marshaller type should error", func(t *testing.T) { + t.Parallel() + + args := createMockStatusComponentsFactoryArgs() + args.ExternalConfig.WebSocketConnector.Enabled = true + args.ExternalConfig.WebSocketConnector.MarshallerType = "invalid type" + scf, _ := statusComp.NewStatusComponentsFactory(args) + require.NotNil(t, scf) + + sc, err := scf.Create() + require.Error(t, err) + require.Nil(t, sc) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + shardCoordinator.SelfIDCalled = func() uint32 { + return core.MetachainShardId // coverage + } + args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) + args.ExternalConfig.WebSocketConnector.Enabled = true // coverage + scf, err := statusComp.NewStatusComponentsFactory(args) + require.Nil(t, err) + + sc, err := scf.Create() + require.NoError(t, err) + require.NotNil(t, sc) + + require.NoError(t, sc.Close()) + }) } -func TestNewStatusComponentsFactory_ShouldWork(t *testing.T) { +func TestStatusComponentsFactory_epochStartEventHandler(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - scf, err := statusComp.NewStatusComponentsFactory(args) - require.NoError(t, err) - require.False(t, check.IfNil(scf)) + args := createMockStatusComponentsFactoryArgs() + args.NodesCoordinator = &shardingMocks.NodesCoordinatorStub{ + GetAllEligibleValidatorsPublicKeysCalled: func(epoch uint32) (map[uint32][][]byte, error) { + return make(map[uint32][][]byte), errors.New("fail for coverage") + }, + } + scf, _ := statusComp.NewStatusComponentsFactory(args) + require.NotNil(t, scf) + + sc, _ := scf.Create() + require.NotNil(t, sc) + + handler := sc.EpochStartEventHandler() + require.NotNil(t, handler) + handler.EpochStartAction(&testscommon.HeaderHandlerStub{}) } -func TestStatusComponentsFactory_Create(t *testing.T) { +func TestStatusComponentsFactory_IsInterfaceNil(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - scf, err := statusComp.NewStatusComponentsFactory(args) - require.Nil(t, err) + args := createMockStatusComponentsFactoryArgs() + args.CoreComponents = nil + scf, _ := statusComp.NewStatusComponentsFactory(args) + require.True(t, scf.IsInterfaceNil()) - res, err := scf.Create() - require.NoError(t, err) - require.NotNil(t, res) + scf, _ = statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) + require.False(t, scf.IsInterfaceNil()) } -// ------------ Test StatusComponents -------------------- -func TestStatusComponents_CloseShouldWork(t *testing.T) { +func TestStatusComponents_Close(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - statusArgs, _ := componentsMock.GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator) - scf, _ := statusComp.NewStatusComponentsFactory(statusArgs) + scf, _ := statusComp.NewStatusComponentsFactory(createMockStatusComponentsFactoryArgs()) cc, err := scf.Create() require.Nil(t, err) diff --git a/factory/statusCore/statusCoreComponents.go b/factory/statusCore/statusCoreComponents.go index 600ea96ea7e..f256f051611 100644 --- a/factory/statusCore/statusCoreComponents.go +++ b/factory/statusCore/statusCoreComponents.go @@ -6,7 +6,7 @@ import ( "github.com/multiversx/mx-chain-go/common/statistics" "github.com/multiversx/mx-chain-go/common/statistics/machine" "github.com/multiversx/mx-chain-go/config" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/node/external" "github.com/multiversx/mx-chain-go/node/metrics" @@ -67,19 +67,10 @@ func NewStatusCoreComponentsFactory(args StatusCoreComponentsFactoryArgs) (*stat func checkArgs(args StatusCoreComponentsFactoryArgs) error { if check.IfNil(args.CoreComp) { - return errErd.ErrNilCoreComponents + return errorsMx.ErrNilCoreComponents } if check.IfNil(args.CoreComp.EconomicsData()) { - return errErd.ErrNilEconomicsData - } - if check.IfNil(args.CoreComp.GenesisNodesSetup()) { - return errErd.ErrNilGenesisNodesSetupHandler - } - if check.IfNil(args.CoreComp.InternalMarshalizer()) { - return errErd.ErrNilMarshalizer - } - if check.IfNil(args.CoreComp.Uint64ByteSliceConverter()) { - return errErd.ErrNilUint64ByteSliceConverter + return errorsMx.ErrNilEconomicsData } return nil diff --git a/factory/statusCore/statusCoreComponentsHandler.go b/factory/statusCore/statusCoreComponentsHandler.go index 72bae620e49..89d6f6ad063 100644 --- a/factory/statusCore/statusCoreComponentsHandler.go +++ b/factory/statusCore/statusCoreComponentsHandler.go @@ -25,7 +25,7 @@ type managedStatusCoreComponents struct { // NewManagedStatusCoreComponents creates a new status core components handler implementation func NewManagedStatusCoreComponents(sccf *statusCoreComponentsFactory) (*managedStatusCoreComponents, error) { if sccf == nil { - return nil, errors.ErrNilCoreComponentsFactory + return nil, errors.ErrNilStatusCoreComponentsFactory } mcc := &managedStatusCoreComponents{ diff --git a/factory/statusCore/statusCoreComponentsHandler_test.go b/factory/statusCore/statusCoreComponentsHandler_test.go index ea12dbcb993..83a6e94ec5d 100644 --- a/factory/statusCore/statusCoreComponentsHandler_test.go +++ b/factory/statusCore/statusCoreComponentsHandler_test.go @@ -3,47 +3,100 @@ package statusCore_test import ( "testing" + errorsMx "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/factory/statusCore" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" ) -func TestManagedStatusCoreComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestNewManagedStatusCoreComponents(t *testing.T) { t.Parallel() - args := componentsMock.GetStatusCoreArgs(componentsMock.GetDefaultCoreComponents()) - args.Config.ResourceStats.RefreshIntervalInSec = 0 + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() - statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) - require.NoError(t, err) - managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) - require.NoError(t, err) + managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(nil) + require.Equal(t, errorsMx.ErrNilStatusCoreComponentsFactory, err) + require.Nil(t, managedStatusCoreComponents) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - err = managedStatusCoreComponents.Create() - require.Error(t, err) - require.Nil(t, managedStatusCoreComponents.ResourceMonitor()) + args := componentsMock.GetStatusCoreArgs(componentsMock.GetDefaultCoreComponents()) + statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + require.NoError(t, err) + managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) + require.NoError(t, err) + require.NotNil(t, managedStatusCoreComponents) + }) } -func TestManagedStatusCoreComponents_CreateShouldWork(t *testing.T) { +func TestManagedStatusCoreComponents_Create(t *testing.T) { + t.Parallel() + + t.Run("invalid params should error", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetStatusCoreArgs(componentsMock.GetDefaultCoreComponents()) + args.Config.ResourceStats.RefreshIntervalInSec = 0 + + statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + require.NoError(t, err) + managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) + require.NoError(t, err) + + err = managedStatusCoreComponents.Create() + require.Error(t, err) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) + require.NoError(t, err) + managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) + require.NoError(t, err) + + require.Nil(t, managedStatusCoreComponents.ResourceMonitor()) + require.Nil(t, managedStatusCoreComponents.NetworkStatistics()) + require.Nil(t, managedStatusCoreComponents.TrieSyncStatistics()) + require.Nil(t, managedStatusCoreComponents.AppStatusHandler()) + require.Nil(t, managedStatusCoreComponents.StatusMetrics()) + require.Nil(t, managedStatusCoreComponents.PersistentStatusHandler()) + + err = managedStatusCoreComponents.Create() + require.NoError(t, err) + + require.NotNil(t, managedStatusCoreComponents.ResourceMonitor()) + require.NotNil(t, managedStatusCoreComponents.NetworkStatistics()) + require.NotNil(t, managedStatusCoreComponents.TrieSyncStatistics()) + require.NotNil(t, managedStatusCoreComponents.AppStatusHandler()) + require.NotNil(t, managedStatusCoreComponents.StatusMetrics()) + require.NotNil(t, managedStatusCoreComponents.PersistentStatusHandler()) + + require.Equal(t, factory.StatusCoreComponentsName, managedStatusCoreComponents.String()) + }) +} + +func TestManagedStatusCoreComponents_CheckSubcomponents(t *testing.T) { t.Parallel() args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) - statusCoreComponentsFactory, err := statusCore.NewStatusCoreComponentsFactory(args) - require.NoError(t, err) - managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) - require.NoError(t, err) + statusCoreComponentsFactory, _ := statusCore.NewStatusCoreComponentsFactory(args) + managedStatusCoreComponents, _ := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) - require.Nil(t, managedStatusCoreComponents.ResourceMonitor()) - require.Nil(t, managedStatusCoreComponents.NetworkStatistics()) + err := managedStatusCoreComponents.CheckSubcomponents() + require.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) err = managedStatusCoreComponents.Create() require.NoError(t, err) - require.NotNil(t, managedStatusCoreComponents.ResourceMonitor()) - require.NotNil(t, managedStatusCoreComponents.NetworkStatistics()) + err = managedStatusCoreComponents.CheckSubcomponents() + require.NoError(t, err) } -func TestManagedCoreComponents_Close(t *testing.T) { +func TestManagedStatusCoreComponents_Close(t *testing.T) { t.Parallel() args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) @@ -52,10 +105,24 @@ func TestManagedCoreComponents_Close(t *testing.T) { managedStatusCoreComponents, err := statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) require.NoError(t, err) + err = managedStatusCoreComponents.Close() + require.NoError(t, err) + err = managedStatusCoreComponents.Create() require.NoError(t, err) err = managedStatusCoreComponents.Close() require.NoError(t, err) - require.Nil(t, managedStatusCoreComponents.ResourceMonitor()) +} + +func TestManagedStatusCoreComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedStatusCoreComponents, _ := statusCore.NewManagedStatusCoreComponents(nil) + require.True(t, managedStatusCoreComponents.IsInterfaceNil()) + + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + statusCoreComponentsFactory, _ := statusCore.NewStatusCoreComponentsFactory(args) + managedStatusCoreComponents, _ = statusCore.NewManagedStatusCoreComponents(statusCoreComponentsFactory) + require.False(t, managedStatusCoreComponents.IsInterfaceNil()) } diff --git a/factory/statusCore/statusCoreComponents_test.go b/factory/statusCore/statusCoreComponents_test.go index f54706fe8f0..bd85752faeb 100644 --- a/factory/statusCore/statusCoreComponents_test.go +++ b/factory/statusCore/statusCoreComponents_test.go @@ -4,14 +4,17 @@ import ( "errors" "testing" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common/statistics" "github.com/multiversx/mx-chain-go/config" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory/statusCore" "github.com/multiversx/mx-chain-go/integrationTests/mock" - "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/process" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" + "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -24,7 +27,7 @@ func TestNewStatusCoreComponentsFactory(t *testing.T) { args := componentsMock.GetStatusCoreArgs(nil) sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - assert.Equal(t, errErd.ErrNilCoreComponents, err) + assert.Equal(t, errorsMx.ErrNilCoreComponents, err) require.Nil(t, sccf) }) t.Run("nil economics data should error", func(t *testing.T) { @@ -36,88 +39,86 @@ func TestNewStatusCoreComponentsFactory(t *testing.T) { args := componentsMock.GetStatusCoreArgs(coreComp) sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - assert.Equal(t, errErd.ErrNilEconomicsData, err) + assert.Equal(t, errorsMx.ErrNilEconomicsData, err) require.Nil(t, sccf) }) - t.Run("nil genesis node setup should error", func(t *testing.T) { + t.Run("should work", func(t *testing.T) { t.Parallel() - coreComp := &mock.CoreComponentsStub{ - EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, - GenesisNodesSetupField: nil, - } - - args := componentsMock.GetStatusCoreArgs(coreComp) + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - assert.Equal(t, errErd.ErrNilGenesisNodesSetupHandler, err) - require.Nil(t, sccf) + assert.Nil(t, err) + require.NotNil(t, sccf) }) - t.Run("nil marshaller should error", func(t *testing.T) { +} + +func TestStatusCoreComponentsFactory_Create(t *testing.T) { + t.Parallel() + + t.Run("NewResourceMonitor fails should error", func(t *testing.T) { t.Parallel() - coreComp := &mock.CoreComponentsStub{ - EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, - GenesisNodesSetupField: &testscommon.NodesSetupStub{}, - InternalMarshalizerField: nil, + args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + args.Config = config.Config{ + ResourceStats: config.ResourceStatsConfig{ + RefreshIntervalInSec: 0, + }, } - - args := componentsMock.GetStatusCoreArgs(coreComp) sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - assert.Equal(t, errErd.ErrNilMarshalizer, err) - require.Nil(t, sccf) + require.Nil(t, err) + + cc, err := sccf.Create() + require.Nil(t, cc) + require.True(t, errors.Is(err, statistics.ErrInvalidRefreshIntervalValue)) }) - t.Run("nil slice converter should error", func(t *testing.T) { + t.Run("NewPersistentStatusHandler fails should error", func(t *testing.T) { t.Parallel() - coreComp := &mock.CoreComponentsStub{ - EconomicsDataField: &economicsmocks.EconomicsHandlerStub{}, - GenesisNodesSetupField: &testscommon.NodesSetupStub{}, - InternalMarshalizerField: &testscommon.MarshalizerStub{}, - Uint64ByteSliceConverterField: nil, + coreCompStub := factory.NewCoreComponentsHolderStubFromRealComponent(componentsMock.GetCoreComponents()) + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + return nil } + args := componentsMock.GetStatusCoreArgs(coreCompStub) + sccf, err := statusCore.NewStatusCoreComponentsFactory(args) + require.Nil(t, err) - args := componentsMock.GetStatusCoreArgs(coreComp) + cc, err := sccf.Create() + require.Error(t, err) + require.Nil(t, cc) + }) + t.Run("SetStatusHandler fails should error", func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + coreCompStub := factory.NewCoreComponentsHolderStubFromRealComponent(componentsMock.GetCoreComponents()) + coreCompStub.EconomicsDataCalled = func() process.EconomicsDataHandler { + return &economicsmocks.EconomicsHandlerStub{ + SetStatusHandlerCalled: func(statusHandler core.AppStatusHandler) error { + return expectedErr + }, + } + } + args := componentsMock.GetStatusCoreArgs(coreCompStub) sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - assert.Equal(t, errErd.ErrNilUint64ByteSliceConverter, err) - require.Nil(t, sccf) + require.Nil(t, err) + + cc, err := sccf.Create() + require.Equal(t, expectedErr, err) + require.Nil(t, cc) }) t.Run("should work", func(t *testing.T) { t.Parallel() args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) + args.Config.ResourceStats.Enabled = true // coverage sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - assert.Nil(t, err) - require.NotNil(t, sccf) - }) -} - -func TestStatusCoreComponentsFactory_InvalidValueShouldErr(t *testing.T) { - t.Parallel() - - args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) - args.Config = config.Config{ - ResourceStats: config.ResourceStatsConfig{ - RefreshIntervalInSec: 0, - }, - } - sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - require.Nil(t, err) + require.Nil(t, err) - cc, err := sccf.Create() - require.Nil(t, cc) - require.True(t, errors.Is(err, statistics.ErrInvalidRefreshIntervalValue)) -} - -func TestStatusCoreComponentsFactory_CreateStatusCoreComponentsShouldWork(t *testing.T) { - t.Parallel() - - args := componentsMock.GetStatusCoreArgs(componentsMock.GetCoreComponents()) - sccf, err := statusCore.NewStatusCoreComponentsFactory(args) - require.Nil(t, err) - - cc, err := sccf.Create() - require.NoError(t, err) - require.NotNil(t, cc) + cc, err := sccf.Create() + require.NoError(t, err) + require.NotNil(t, cc) + require.NoError(t, cc.Close()) + }) } // ------------ Test CoreComponents -------------------- diff --git a/integrationTests/factory/consensusComponents/consensusComponents_test.go b/integrationTests/factory/consensusComponents/consensusComponents_test.go index 1f8404f7e5c..00979d76a20 100644 --- a/integrationTests/factory/consensusComponents/consensusComponents_test.go +++ b/integrationTests/factory/consensusComponents/consensusComponents_test.go @@ -74,7 +74,6 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { managedCoreComponents, managedNetworkComponents, managedBootstrapComponents, - managedDataComponents, managedStateComponents, nodesCoordinator, false, @@ -105,7 +104,8 @@ func TestConsensusComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) time.Sleep(2 * time.Second) - managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + err = managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + require.Nil(t, err) err = managedStatusComponents.StartPolling() require.Nil(t, err) diff --git a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go index bcae8ad1344..18f73fb6efd 100644 --- a/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go +++ b/integrationTests/factory/heartbeatComponents/heartbeatComponents_test.go @@ -74,7 +74,6 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { managedCoreComponents, managedNetworkComponents, managedBootstrapComponents, - managedDataComponents, managedStateComponents, nodesCoordinator, false, @@ -105,7 +104,8 @@ func TestHeartbeatComponents_Close_ShouldWork(t *testing.T) { require.Nil(t, err) time.Sleep(2 * time.Second) - managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + err = managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + require.Nil(t, err) err = managedStatusComponents.StartPolling() require.Nil(t, err) diff --git a/integrationTests/factory/processComponents/processComponents_test.go b/integrationTests/factory/processComponents/processComponents_test.go index 0a2802df441..254100c219c 100644 --- a/integrationTests/factory/processComponents/processComponents_test.go +++ b/integrationTests/factory/processComponents/processComponents_test.go @@ -75,7 +75,6 @@ func TestProcessComponents_Close_ShouldWork(t *testing.T) { managedCoreComponents, managedNetworkComponents, managedBootstrapComponents, - managedDataComponents, managedStateComponents, nodesCoordinator, false, @@ -106,7 +105,8 @@ func TestProcessComponents_Close_ShouldWork(t *testing.T) { time.Sleep(2 * time.Second) - managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + err = managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + require.Nil(t, err) err = managedStatusComponents.StartPolling() require.Nil(t, err) diff --git a/integrationTests/factory/statusComponents/statusComponents_test.go b/integrationTests/factory/statusComponents/statusComponents_test.go index 3d642cfd5cd..3f61a7a650b 100644 --- a/integrationTests/factory/statusComponents/statusComponents_test.go +++ b/integrationTests/factory/statusComponents/statusComponents_test.go @@ -75,7 +75,6 @@ func TestStatusComponents_Create_Close_ShouldWork(t *testing.T) { managedCoreComponents, managedNetworkComponents, managedBootstrapComponents, - managedDataComponents, managedStateComponents, nodesCoordinator, false, @@ -106,7 +105,8 @@ func TestStatusComponents_Create_Close_ShouldWork(t *testing.T) { require.Nil(t, err) time.Sleep(2 * time.Second) - managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + err = managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + require.Nil(t, err) err = managedStatusComponents.StartPolling() require.Nil(t, err) diff --git a/node/nodeRunner.go b/node/nodeRunner.go index 35e77abedad..dcd7e3429a1 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -389,7 +389,6 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( managedCoreComponents, managedNetworkComponents, managedBootstrapComponents, - managedDataComponents, managedStateComponents, nodesCoordinatorInstance, configs.ImportDbConfig.IsImportDBMode, @@ -444,7 +443,11 @@ func (nr *nodeRunner) executeOneComponentCreationCycle( return true, fmt.Errorf("%w when adding nodeShufflerOut in hardForkTrigger", err) } - managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + err = managedStatusComponents.SetForkDetector(managedProcessComponents.ForkDetector()) + if err != nil { + return true, err + } + err = managedStatusComponents.StartPolling() if err != nil { return true, err @@ -1036,7 +1039,6 @@ func (nr *nodeRunner) CreateManagedStatusComponents( managedCoreComponents mainFactory.CoreComponentsHolder, managedNetworkComponents mainFactory.NetworkComponentsHolder, managedBootstrapComponents mainFactory.BootstrapComponentsHolder, - managedDataComponents mainFactory.DataComponentsHolder, managedStateComponents mainFactory.StateComponentsHolder, nodesCoordinator nodesCoordinator.NodesCoordinator, isInImportMode bool, @@ -1049,7 +1051,6 @@ func (nr *nodeRunner) CreateManagedStatusComponents( NodesCoordinator: nodesCoordinator, EpochStartNotifier: managedCoreComponents.EpochStartNotifierWithConfirm(), CoreComponents: managedCoreComponents, - DataComponents: managedDataComponents, NetworkComponents: managedNetworkComponents, StateComponents: managedStateComponents, IsInImportMode: isInImportMode, diff --git a/testscommon/components/components.go b/testscommon/components/components.go index 7f38e669f7b..65b1893f3df 100644 --- a/testscommon/components/components.go +++ b/testscommon/components/components.go @@ -147,7 +147,6 @@ func GetConsensusArgs(shardCoordinator sharding.Coordinator) consensusComp.Conse statusComponents := GetStatusComponents( coreComponents, networkComponents, - dataComponents, stateComponents, shardCoordinator, processComponents.NodesCoordinator(), @@ -433,7 +432,6 @@ func GetProcessArgs( statusComponents := GetStatusComponents( coreComponents, networkComponents, - dataComponents, stateComponents, shardCoordinator, nc, @@ -574,7 +572,6 @@ func GetProcessArgs( func GetStatusComponents( coreComponents factory.CoreComponentsHolder, networkComponents factory.NetworkComponentsHolder, - dataComponents factory.DataComponentsHolder, stateComponents factory.StateComponentsHolder, shardCoordinator sharding.Coordinator, nodesCoordinator nodesCoordinator.NodesCoordinator, @@ -598,7 +595,6 @@ func GetStatusComponents( NodesCoordinator: nodesCoordinator, EpochStartNotifier: coreComponents.EpochStartNotifierWithConfirm(), CoreComponents: coreComponents, - DataComponents: dataComponents, NetworkComponents: networkComponents, StateComponents: stateComponents, IsInImportMode: false, @@ -649,13 +645,15 @@ func GetStatusComponentsFactoryArgsAndProcessComponents(shardCoordinator shardin Password: elasticPassword, EnabledIndexes: []string{"transactions", "blocks"}, }, + WebSocketConnector: config.WebSocketDriverConfig{ + MarshallerType: "json", + }, }, EconomicsConfig: config.EconomicsConfig{}, ShardCoordinator: mock.NewMultiShardsCoordinatorMock(2), NodesCoordinator: &shardingMocks.NodesCoordinatorMock{}, EpochStartNotifier: &mock.EpochStartNotifierStub{}, CoreComponents: coreComponents, - DataComponents: dataComponents, NetworkComponents: networkComponents, StateComponents: stateComponents, StatusCoreComponents: statusCoreComponents, diff --git a/testscommon/generalConfig.go b/testscommon/generalConfig.go index a32ebe2c8a7..dc4f445d1b9 100644 --- a/testscommon/generalConfig.go +++ b/testscommon/generalConfig.go @@ -55,6 +55,7 @@ func GetGeneralConfig() config.Config { MaxConsecutiveRoundsOfRatingDecrease: 2000, SyncProcessTimeInMillis: 6000, SetGuardianEpochsDelay: 20, + StatusPollingIntervalSec: 10, }, EpochStartConfig: config.EpochStartConfig{ MinRoundsBetweenEpochs: 5, diff --git a/testscommon/networkStatisticsProviderStub.go b/testscommon/networkStatisticsProviderStub.go new file mode 100644 index 00000000000..a8d4de1b7d8 --- /dev/null +++ b/testscommon/networkStatisticsProviderStub.go @@ -0,0 +1,117 @@ +package testscommon + +// NetworkStatisticsProviderStub - +type NetworkStatisticsProviderStub struct { + BpsSentCalled func() uint64 + BpsRecvCalled func() uint64 + BpsSentPeakCalled func() uint64 + BpsRecvPeakCalled func() uint64 + PercentSentCalled func() uint64 + PercentRecvCalled func() uint64 + TotalBytesSentInCurrentEpochCalled func() uint64 + TotalBytesReceivedInCurrentEpochCalled func() uint64 + TotalSentInCurrentEpochCalled func() string + TotalReceivedInCurrentEpochCalled func() string + EpochConfirmedCalled func(epoch uint32, timestamp uint64) + CloseCalled func() error +} + +// BpsSent - +func (stub *NetworkStatisticsProviderStub) BpsSent() uint64 { + if stub.BpsSentCalled != nil { + return stub.BpsSentCalled() + } + return 0 +} + +// BpsRecv - +func (stub *NetworkStatisticsProviderStub) BpsRecv() uint64 { + if stub.BpsRecvCalled != nil { + return stub.BpsRecvCalled() + } + return 0 +} + +// BpsSentPeak - +func (stub *NetworkStatisticsProviderStub) BpsSentPeak() uint64 { + if stub.BpsSentPeakCalled != nil { + return stub.BpsSentPeakCalled() + } + return 0 +} + +// BpsRecvPeak - +func (stub *NetworkStatisticsProviderStub) BpsRecvPeak() uint64 { + if stub.BpsRecvPeakCalled != nil { + return stub.BpsRecvPeakCalled() + } + return 0 +} + +// PercentSent - +func (stub *NetworkStatisticsProviderStub) PercentSent() uint64 { + if stub.PercentSentCalled != nil { + return stub.PercentSentCalled() + } + return 0 +} + +// PercentRecv - +func (stub *NetworkStatisticsProviderStub) PercentRecv() uint64 { + if stub.PercentRecvCalled != nil { + return stub.PercentRecvCalled() + } + return 0 +} + +// TotalBytesSentInCurrentEpoch - +func (stub *NetworkStatisticsProviderStub) TotalBytesSentInCurrentEpoch() uint64 { + if stub.TotalBytesSentInCurrentEpochCalled != nil { + return stub.TotalBytesSentInCurrentEpochCalled() + } + return 0 +} + +// TotalBytesReceivedInCurrentEpoch - +func (stub *NetworkStatisticsProviderStub) TotalBytesReceivedInCurrentEpoch() uint64 { + if stub.TotalBytesReceivedInCurrentEpochCalled != nil { + return stub.TotalBytesReceivedInCurrentEpochCalled() + } + return 0 +} + +// TotalSentInCurrentEpoch - +func (stub *NetworkStatisticsProviderStub) TotalSentInCurrentEpoch() string { + if stub.TotalSentInCurrentEpochCalled != nil { + return stub.TotalSentInCurrentEpochCalled() + } + return "" +} + +// TotalReceivedInCurrentEpoch - +func (stub *NetworkStatisticsProviderStub) TotalReceivedInCurrentEpoch() string { + if stub.TotalReceivedInCurrentEpochCalled != nil { + return stub.TotalReceivedInCurrentEpochCalled() + } + return "" +} + +// EpochConfirmed - +func (stub *NetworkStatisticsProviderStub) EpochConfirmed(epoch uint32, timestamp uint64) { + if stub.EpochConfirmedCalled != nil { + stub.EpochConfirmedCalled(epoch, timestamp) + } +} + +// Close - +func (stub *NetworkStatisticsProviderStub) Close() error { + if stub.CloseCalled != nil { + return stub.CloseCalled() + } + return nil +} + +// IsInterfaceNil - +func (stub *NetworkStatisticsProviderStub) IsInterfaceNil() bool { + return stub == nil +} From a8062ee21b3e173ca9f562ae23977228ee80112b Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Thu, 6 Apr 2023 16:27:30 +0300 Subject: [PATCH 265/335] wrap relayed invalid sigs as well --- process/transaction/interceptedTransaction.go | 4 ++-- process/transaction/interceptedTransaction_test.go | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index 9f9a292e281..adfa3340d5c 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -225,7 +225,7 @@ func (inTx *InterceptedTransaction) verifyIfRelayedTxV2(tx *transaction.Transact err = inTx.verifySig(userTx) if err != nil { - return err + return fmt.Errorf("%w while checking inner transaction's signature", err) } err = inTx.VerifyGuardianSig(userTx) @@ -275,7 +275,7 @@ func (inTx *InterceptedTransaction) verifyIfRelayedTx(tx *transaction.Transactio err = inTx.verifySig(userTx) if err != nil { - return err + return fmt.Errorf("%w while checking inner transaction's signature", err) } err = inTx.VerifyGuardianSig(userTx) diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index 881771a1c67..c5a61d5963d 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -1408,7 +1408,8 @@ func TestInterceptedTransaction_CheckValidityOfRelayedTx(t *testing.T) { tx.Data = []byte(core.RelayedTransaction + "@" + hex.EncodeToString(userTxData)) txi, _ = createInterceptedTxFromPlainTxWithArgParser(tx) err = txi.CheckValidity() - assert.Equal(t, errSignerMockVerifySigFails, err) + assert.ErrorIs(t, err, errSignerMockVerifySigFails) + assert.Contains(t, err.Error(), "inner transaction's signature") userTx.Signature = sigOk userTx.SndAddr = []byte("otherAddress") @@ -1477,7 +1478,8 @@ func TestInterceptedTransaction_CheckValidityOfRelayedTxV2(t *testing.T) { tx.Data = []byte(core.RelayedTransactionV2 + "@" + hex.EncodeToString(userTx.RcvAddr) + "@" + hex.EncodeToString(big.NewInt(0).SetUint64(userTx.Nonce).Bytes()) + "@" + hex.EncodeToString(userTx.Data) + "@" + hex.EncodeToString(userTx.Signature)) txi, _ = createInterceptedTxFromPlainTxWithArgParser(tx) err = txi.CheckValidity() - assert.Equal(t, errSignerMockVerifySigFails, err) + assert.ErrorIs(t, err, errSignerMockVerifySigFails) + assert.Contains(t, err.Error(), "inner transaction's signature") userTx.Signature = sigOk userTx.SndAddr = []byte("otherAddress") From 36f029dece1fe5ab8dfa117d7323672a69306036 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Thu, 6 Apr 2023 16:53:27 +0300 Subject: [PATCH 266/335] further refactoring --- process/transaction/interceptedTransaction.go | 12 ++++++------ process/transaction/interceptedTransaction_test.go | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/process/transaction/interceptedTransaction.go b/process/transaction/interceptedTransaction.go index adfa3340d5c..0aedf837d09 100644 --- a/process/transaction/interceptedTransaction.go +++ b/process/transaction/interceptedTransaction.go @@ -225,12 +225,12 @@ func (inTx *InterceptedTransaction) verifyIfRelayedTxV2(tx *transaction.Transact err = inTx.verifySig(userTx) if err != nil { - return fmt.Errorf("%w while checking inner transaction's signature", err) + return fmt.Errorf("inner transaction: %w", err) } err = inTx.VerifyGuardianSig(userTx) if err != nil { - return err + return fmt.Errorf("inner transaction: %w", err) } funcName, _, err = inTx.argsParser.ParseCallData(string(userTx.Data)) @@ -261,7 +261,7 @@ func (inTx *InterceptedTransaction) verifyIfRelayedTx(tx *transaction.Transactio userTx, err := createTx(inTx.signMarshalizer, userTxArgs[0]) if err != nil { - return err + return fmt.Errorf("inner transaction: %w", err) } if !bytes.Equal(userTx.SndAddr, tx.RcvAddr) { @@ -270,17 +270,17 @@ func (inTx *InterceptedTransaction) verifyIfRelayedTx(tx *transaction.Transactio err = inTx.integrity(userTx) if err != nil { - return err + return fmt.Errorf("inner transaction: %w", err) } err = inTx.verifySig(userTx) if err != nil { - return fmt.Errorf("%w while checking inner transaction's signature", err) + return fmt.Errorf("inner transaction: %w", err) } err = inTx.VerifyGuardianSig(userTx) if err != nil { - return err + return fmt.Errorf("inner transaction: %w", err) } if len(userTx.Data) == 0 { diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index c5a61d5963d..ffc3627ba0c 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -1394,7 +1394,7 @@ func TestInterceptedTransaction_CheckValidityOfRelayedTx(t *testing.T) { tx.Data = []byte(core.RelayedTransaction + "@" + hex.EncodeToString(userTxData)) txi, _ = createInterceptedTxFromPlainTxWithArgParser(tx) err = txi.CheckValidity() - assert.Equal(t, process.ErrNilValue, err) + assert.ErrorIs(t, err, data.ErrNilValue) userTx.Value = big.NewInt(0) userTxData, _ = marshalizer.Marshal(userTx) @@ -1409,7 +1409,7 @@ func TestInterceptedTransaction_CheckValidityOfRelayedTx(t *testing.T) { txi, _ = createInterceptedTxFromPlainTxWithArgParser(tx) err = txi.CheckValidity() assert.ErrorIs(t, err, errSignerMockVerifySigFails) - assert.Contains(t, err.Error(), "inner transaction's signature") + assert.Contains(t, err.Error(), "inner transaction") userTx.Signature = sigOk userTx.SndAddr = []byte("otherAddress") @@ -1479,7 +1479,7 @@ func TestInterceptedTransaction_CheckValidityOfRelayedTxV2(t *testing.T) { txi, _ = createInterceptedTxFromPlainTxWithArgParser(tx) err = txi.CheckValidity() assert.ErrorIs(t, err, errSignerMockVerifySigFails) - assert.Contains(t, err.Error(), "inner transaction's signature") + assert.Contains(t, err.Error(), "inner transaction") userTx.Signature = sigOk userTx.SndAddr = []byte("otherAddress") From 9280537f73587b8a3b0916e6f647fc612154cfb1 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 10 Apr 2023 13:53:33 +0300 Subject: [PATCH 267/335] added unittests on factory/consensus --- factory/consensus/consensusComponents.go | 122 +- .../consensusComponentsHandler_test.go | 138 +- factory/consensus/consensusComponents_test.go | 1146 +++++++++++++---- factory/mock/forkDetectorMock.go | 42 +- integrationTests/mock/cryptoComponentsStub.go | 4 + integrationTests/mock/headersCacherStub.go | 34 +- .../mock/networkComponentsMock.go | 4 + integrationTests/mock/peerShardMapperStub.go | 8 + .../mock/processComponentsStub.go | 12 + integrationTests/mock/statusComponentsStub.go | 2 - integrationTests/testProcessorNode.go | 1 - .../factory/statusCoreComponentsStub.go | 4 + .../shardingMocks/nodesCoordinatorStub.go | 8 +- 13 files changed, 1133 insertions(+), 392 deletions(-) diff --git a/factory/consensus/consensusComponents.go b/factory/consensus/consensusComponents.go index ff49af71cbf..3f48af3e216 100644 --- a/factory/consensus/consensusComponents.go +++ b/factory/consensus/consensusComponents.go @@ -76,32 +76,9 @@ type consensusComponents struct { // NewConsensusComponentsFactory creates an instance of consensusComponentsFactory func NewConsensusComponentsFactory(args ConsensusComponentsFactoryArgs) (*consensusComponentsFactory, error) { - if check.IfNil(args.CoreComponents) { - return nil, errors.ErrNilCoreComponentsHolder - } - if check.IfNil(args.DataComponents) { - return nil, errors.ErrNilDataComponentsHolder - } - if check.IfNil(args.CryptoComponents) { - return nil, errors.ErrNilCryptoComponentsHolder - } - if check.IfNil(args.NetworkComponents) { - return nil, errors.ErrNilNetworkComponentsHolder - } - if check.IfNil(args.ProcessComponents) { - return nil, errors.ErrNilProcessComponentsHolder - } - if check.IfNil(args.StateComponents) { - return nil, errors.ErrNilStateComponentsHolder - } - if check.IfNil(args.StatusComponents) { - return nil, errors.ErrNilStatusComponentsHolder - } - if check.IfNil(args.ScheduledProcessor) { - return nil, errors.ErrNilScheduledProcessor - } - if check.IfNil(args.StatusCoreComponents) { - return nil, errors.ErrNilStatusCoreComponents + err := checkArgs(args) + if err != nil { + return nil, err } return &consensusComponentsFactory{ @@ -125,10 +102,6 @@ func NewConsensusComponentsFactory(args ConsensusComponentsFactoryArgs) (*consen func (ccf *consensusComponentsFactory) Create() (*consensusComponents, error) { var err error - err = ccf.checkArgs() - if err != nil { - return nil, err - } cc := &consensusComponents{} consensusGroupSize, err := getConsensusGroupSize(ccf.coreComponents.GenesisNodesSetup(), ccf.processComponents.ShardCoordinator()) @@ -343,12 +316,7 @@ func (ccf *consensusComponentsFactory) createChronology() (consensus.ChronologyH Watchdog: wd, AppStatusHandler: ccf.statusCoreComponents.AppStatusHandler(), } - chronologyHandler, err := chronology.NewChronology(chronologyArg) - if err != nil { - return nil, err - } - - return chronologyHandler, nil + return chronology.NewChronology(chronologyArg) } func (ccf *consensusComponentsFactory) getEpoch() uint32 { @@ -489,12 +457,7 @@ func (ccf *consensusComponentsFactory) createShardBootstrapper() (process.Bootst ArgBaseBootstrapper: argsBaseBootstrapper, } - bootstrap, err := sync.NewShardBootstrap(argsShardBootstrapper) - if err != nil { - return nil, err - } - - return bootstrap, nil + return sync.NewShardBootstrap(argsShardBootstrapper) } func (ccf *consensusComponentsFactory) createArgsBaseAccountsSyncer(trieStorageManager common.StorageManager) syncer.ArgsNewBaseAccountsSyncer { @@ -626,12 +589,7 @@ func (ccf *consensusComponentsFactory) createMetaChainBootstrapper() (process.Bo ValidatorStatisticsDBSyncer: validatorAccountsDBSyncer, } - bootstrap, err := sync.NewMetaBootstrap(argsMetaBootstrapper) - if err != nil { - return nil, err - } - - return bootstrap, nil + return sync.NewMetaBootstrap(argsMetaBootstrapper) } func (ccf *consensusComponentsFactory) createConsensusTopic(cc *consensusComponents) error { @@ -684,33 +642,63 @@ func (ccf *consensusComponentsFactory) addCloserInstances(closers ...update.Clos return nil } -func (ccf *consensusComponentsFactory) checkArgs() error { - blockchain := ccf.dataComponents.Blockchain() - if check.IfNil(blockchain) { - return errors.ErrNilBlockChainHandler +func checkArgs(args ConsensusComponentsFactoryArgs) error { + if check.IfNil(args.CoreComponents) { + return errors.ErrNilCoreComponentsHolder } - marshalizer := ccf.coreComponents.InternalMarshalizer() - if check.IfNil(marshalizer) { - return errors.ErrNilMarshalizer + if check.IfNil(args.CoreComponents.GenesisNodesSetup()) { + return errors.ErrNilGenesisNodesSetupHandler + } + if check.IfNil(args.DataComponents) { + return errors.ErrNilDataComponentsHolder } - dataPool := ccf.dataComponents.Datapool() - if check.IfNil(dataPool) { + if check.IfNil(args.DataComponents.Datapool()) { return errors.ErrNilDataPoolsHolder } - shardCoordinator := ccf.processComponents.ShardCoordinator() - if check.IfNil(shardCoordinator) { - return errors.ErrNilShardCoordinator + if check.IfNil(args.DataComponents.Blockchain()) { + return errors.ErrNilBlockChainHandler + } + if check.IfNil(args.CryptoComponents) { + return errors.ErrNilCryptoComponentsHolder + } + if check.IfNil(args.CryptoComponents.PublicKey()) { + return errors.ErrNilPublicKey + } + if check.IfNil(args.CryptoComponents.PrivateKey()) { + return errors.ErrNilPrivateKey } - netMessenger := ccf.networkComponents.NetworkMessenger() - if check.IfNil(netMessenger) { + if check.IfNil(args.NetworkComponents) { + return errors.ErrNilNetworkComponentsHolder + } + if check.IfNil(args.NetworkComponents.NetworkMessenger()) { return errors.ErrNilMessenger } - hardforkTrigger := ccf.processComponents.HardforkTrigger() - if check.IfNil(hardforkTrigger) { - return errors.ErrNilHardforkTrigger + if check.IfNil(args.ProcessComponents) { + return errors.ErrNilProcessComponentsHolder + } + if check.IfNil(args.ProcessComponents.NodesCoordinator()) { + return errors.ErrNilNodesCoordinator + } + if check.IfNil(args.ProcessComponents.ShardCoordinator()) { + return errors.ErrNilShardCoordinator + } + if check.IfNil(args.ProcessComponents.RoundHandler()) { + return errors.ErrNilRoundHandler } - if check.IfNil(ccf.statusCoreComponents.AppStatusHandler()) { - return errors.ErrNilAppStatusHandler + if check.IfNil(args.StateComponents) { + return errors.ErrNilStateComponentsHolder + } + if check.IfNil(args.StatusComponents) { + return errors.ErrNilStatusComponentsHolder + } + if check.IfNil(args.StatusComponents.OutportHandler()) { + return errors.ErrNilOutportHandler + } + if check.IfNil(args.ScheduledProcessor) { + return errors.ErrNilScheduledProcessor + } + if check.IfNil(args.StatusCoreComponents) { + return errors.ErrNilStatusCoreComponents } return nil diff --git a/factory/consensus/consensusComponentsHandler_test.go b/factory/consensus/consensusComponentsHandler_test.go index 87d28ce6960..e95af0cdefd 100644 --- a/factory/consensus/consensusComponentsHandler_test.go +++ b/factory/consensus/consensusComponentsHandler_test.go @@ -3,67 +3,133 @@ package consensus_test import ( "testing" + errErd "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" consensusComp "github.com/multiversx/mx-chain-go/factory/consensus" - "github.com/multiversx/mx-chain-go/factory/mock" + "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" - "github.com/multiversx/mx-chain-go/testscommon/factory" - "github.com/multiversx/mx-chain-go/testscommon/statusHandler" + factoryMocks "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/stretchr/testify/require" ) -// ------------ Test ManagedConsensusComponentsFactory -------------------- -func TestManagedConsensusComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestNewManagedConsensusComponents(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - statusCoreComponents := &factory.StatusCoreComponentsStub{ - AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, - } - args.StatusCoreComponents = statusCoreComponents - consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(args) - managedConsensusComponents, err := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) - require.NoError(t, err) + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() - statusCoreComponents.AppStatusHandlerField = nil - err = managedConsensusComponents.Create() - require.Error(t, err) - require.NotNil(t, managedConsensusComponents.CheckSubcomponents()) + managedConsensusComponents, err := consensusComp.NewManagedConsensusComponents(nil) + require.Equal(t, errErd.ErrNilConsensusComponentsFactory, err) + require.Nil(t, managedConsensusComponents) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(createMockConsensusComponentsFactoryArgs()) + managedConsensusComponents, err := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + require.NoError(t, err) + require.NotNil(t, managedConsensusComponents) + }) } -func TestManagedConsensusComponents_CreateShouldWork(t *testing.T) { +func TestManagedConsensusComponents_Create(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) + t.Run("invalid params should error", func(t *testing.T) { + t.Parallel() - consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(args) - managedConsensusComponents, err := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + args := createMockConsensusComponentsFactoryArgs() + statusCoreCompStub, ok := args.StatusCoreComponents.(*factoryMocks.StatusCoreComponentsStub) + require.True(t, ok) + statusCoreCompStub.AppStatusHandlerField = nil + consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(args) + managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + require.NotNil(t, managedConsensusComponents) - require.NoError(t, err) - require.Nil(t, managedConsensusComponents.BroadcastMessenger()) - require.Nil(t, managedConsensusComponents.Chronology()) - require.Nil(t, managedConsensusComponents.ConsensusWorker()) - require.Error(t, managedConsensusComponents.CheckSubcomponents()) + err := managedConsensusComponents.Create() + require.Error(t, err) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + shardCoordinator := testscommon.NewMultiShardsCoordinatorMock(2) + args := componentsMock.GetConsensusArgs(shardCoordinator) + consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(args) + managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + require.NotNil(t, managedConsensusComponents) + + require.Nil(t, managedConsensusComponents.BroadcastMessenger()) + require.Nil(t, managedConsensusComponents.Chronology()) + require.Nil(t, managedConsensusComponents.ConsensusWorker()) + require.Nil(t, managedConsensusComponents.Bootstrapper()) + + err := managedConsensusComponents.Create() + require.NoError(t, err) + require.NotNil(t, managedConsensusComponents.BroadcastMessenger()) + require.NotNil(t, managedConsensusComponents.Chronology()) + require.NotNil(t, managedConsensusComponents.ConsensusWorker()) + require.NotNil(t, managedConsensusComponents.Bootstrapper()) + + require.Equal(t, factory.ConsensusComponentsName, managedConsensusComponents.String()) + }) +} + +func TestManagedConsensusComponents_ConsensusGroupSize(t *testing.T) { + t.Parallel() + + consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(createMockConsensusComponentsFactoryArgs()) + managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + require.NotNil(t, managedConsensusComponents) + + size, err := managedConsensusComponents.ConsensusGroupSize() + require.Equal(t, errErd.ErrNilConsensusComponentsHolder, err) + require.Zero(t, size) err = managedConsensusComponents.Create() require.NoError(t, err) - require.NotNil(t, managedConsensusComponents.BroadcastMessenger()) - require.NotNil(t, managedConsensusComponents.Chronology()) - require.NotNil(t, managedConsensusComponents.ConsensusWorker()) - require.NoError(t, managedConsensusComponents.CheckSubcomponents()) + size, err = managedConsensusComponents.ConsensusGroupSize() + require.NoError(t, err) + require.Equal(t, 2, size) } -func TestManagedConsensusComponents_Close(t *testing.T) { +func TestManagedConsensusComponents_CheckSubcomponents(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - consensusArgs := componentsMock.GetConsensusArgs(shardCoordinator) - consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(consensusArgs) + consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(createMockConsensusComponentsFactoryArgs()) managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + require.NotNil(t, managedConsensusComponents) + + require.Equal(t, errErd.ErrNilConsensusComponentsHolder, managedConsensusComponents.CheckSubcomponents()) + err := managedConsensusComponents.Create() require.NoError(t, err) + require.Nil(t, managedConsensusComponents.CheckSubcomponents()) +} + +func TestManagedConsensusComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(nil) + require.True(t, managedConsensusComponents.IsInterfaceNil()) + + consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(createMockConsensusComponentsFactoryArgs()) + managedConsensusComponents, _ = consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + require.False(t, managedConsensusComponents.IsInterfaceNil()) +} + +func TestManagedConsensusComponents_Close(t *testing.T) { + t.Parallel() + + consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(createMockConsensusComponentsFactoryArgs()) + managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + + err := managedConsensusComponents.Close() + require.NoError(t, err) + + err = managedConsensusComponents.Create() + require.NoError(t, err) + err = managedConsensusComponents.Close() require.NoError(t, err) require.Nil(t, managedConsensusComponents.BroadcastMessenger()) diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index 1fb5291510e..a3107f49960 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -4,358 +4,970 @@ import ( "errors" "strings" "testing" + "time" "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-go/consensus/chronology" - "github.com/multiversx/mx-chain-go/consensus/spos/sposFactory" - errorsErd "github.com/multiversx/mx-chain-go/errors" - "github.com/multiversx/mx-chain-go/factory" + "github.com/multiversx/mx-chain-crypto-go" + "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/consensus" + retriever "github.com/multiversx/mx-chain-go/dataRetriever" + errorsMx "github.com/multiversx/mx-chain-go/errors" consensusComp "github.com/multiversx/mx-chain-go/factory/consensus" "github.com/multiversx/mx-chain-go/factory/mock" - "github.com/multiversx/mx-chain-go/process" + testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" + "github.com/multiversx/mx-chain-go/p2p" "github.com/multiversx/mx-chain-go/sharding" + "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" + "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" - componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + consensusMocks "github.com/multiversx/mx-chain-go/testscommon/consensus" + "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" + "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + "github.com/multiversx/mx-chain-go/testscommon/dblookupext" + "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" + factoryMocks "github.com/multiversx/mx-chain-go/testscommon/factory" + "github.com/multiversx/mx-chain-go/testscommon/genericMocks" + outportMocks "github.com/multiversx/mx-chain-go/testscommon/outport" "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" + "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" + stateMocks "github.com/multiversx/mx-chain-go/testscommon/state" + "github.com/multiversx/mx-chain-go/testscommon/statusHandler" + trieFactory "github.com/multiversx/mx-chain-go/trie/factory" + "github.com/multiversx/mx-chain-go/update" "github.com/stretchr/testify/require" ) -// ------------ Test ConsensusComponentsFactory -------------------- -func TestNewConsensusComponentsFactory_OkValuesShouldWork(t *testing.T) { +func createMockConsensusComponentsFactoryArgs() consensusComp.ConsensusComponentsFactoryArgs { + return consensusComp.ConsensusComponentsFactoryArgs{ + Config: testscommon.GetGeneralConfig(), + BootstrapRoundIndex: 0, + CoreComponents: &mock.CoreComponentsMock{ + IntMarsh: &testscommon.MarshalizerStub{}, + Hash: &testscommon.HasherStub{ + SizeCalled: func() int { + return 1 + }, + }, + TxSignHasherField: nil, + UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, + AddrPubKeyConv: &mock.PubkeyConverterStub{}, + ValPubKeyConv: nil, + PathHdl: nil, + WatchdogTimer: &testscommon.WatchdogMock{}, + AlarmSch: &testscommon.AlarmSchedulerStub{}, + NtpSyncTimer: &testscommon.SyncTimerStub{}, + GenesisBlockTime: time.Time{}, + ChainIdCalled: nil, + MinTransactionVersionCalled: nil, + RoundHandlerField: nil, + EconomicsHandler: nil, + APIEconomicsHandler: nil, + RatingsConfig: nil, + RatingHandler: nil, + NodesConfig: &testscommon.NodesSetupStub{ + GetShardConsensusGroupSizeCalled: func() uint32 { + return 2 + }, + GetMetaConsensusGroupSizeCalled: func() uint32 { + return 2 + }, + }, + Shuffler: nil, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + EnableRoundsHandlerField: nil, + EpochNotifierWithConfirm: nil, + TxVersionCheckHandler: nil, + ChanStopProcess: nil, + StartTime: time.Time{}, + NodeTypeProviderField: nil, + WasmVMChangeLockerInternal: nil, + ProcessStatusHandlerInternal: nil, + HardforkTriggerPubKeyField: nil, + EnableEpochsHandlerField: nil, + }, + NetworkComponents: &testsMocks.NetworkComponentsStub{ + Messenger: &p2pmocks.MessengerStub{}, + InputAntiFlood: &testsMocks.P2PAntifloodHandlerStub{}, + PeerHonesty: &testscommon.PeerHonestyHandlerStub{}, + }, + CryptoComponents: &testsMocks.CryptoComponentsStub{ + PrivKey: &cryptoMocks.PrivateKeyStub{}, + PubKey: &cryptoMocks.PublicKeyStub{}, + PubKeyString: "pub key string", + PeerSignHandler: &testsMocks.PeerSignatureHandler{}, + MultiSigContainer: &cryptoMocks.MultiSignerContainerMock{ + MultiSigner: &cryptoMocks.MultisignerMock{}, + }, + BlKeyGen: &cryptoMocks.KeyGenStub{}, + BlockSig: &cryptoMocks.SingleSignerStub{}, + }, + DataComponents: &testsMocks.DataComponentsStub{ + DataPool: &dataRetriever.PoolsHolderStub{ + MiniBlocksCalled: func() storage.Cacher { + return &testscommon.CacherStub{} + }, + TrieNodesCalled: func() storage.Cacher { + return &testscommon.CacherStub{} + }, + HeadersCalled: func() retriever.HeadersPool { + return &testsMocks.HeadersCacherStub{} + }, + }, + BlockChain: &testscommon.ChainHandlerStub{ + GetGenesisHeaderHashCalled: func() []byte { + return []byte("genesis hash") + }, + GetGenesisHeaderCalled: func() data.HeaderHandler { + return &testscommon.HeaderHandlerStub{} + }, + }, + MbProvider: &testsMocks.MiniBlocksProviderStub{}, + Store: &genericMocks.ChainStorerMock{}, + }, + ProcessComponents: &testsMocks.ProcessComponentsStub{ + EpochTrigger: &testsMocks.EpochStartTriggerStub{}, + EpochNotifier: &testsMocks.EpochStartNotifierStub{}, + NodesCoord: &shardingMocks.NodesCoordinatorStub{}, + NodeRedundancyHandlerInternal: &testsMocks.RedundancyHandlerStub{}, + HardforkTriggerField: &testscommon.HardforkTriggerStub{}, + ReqHandler: &testscommon.RequestHandlerStub{}, + PeerMapper: &testsMocks.PeerShardMapperStub{}, + ShardCoord: testscommon.NewMultiShardsCoordinatorMock(2), + RoundHandlerField: &testscommon.RoundHandlerMock{ + TimeDurationCalled: func() time.Duration { + return time.Second + }, + }, + BootSore: &mock.BootstrapStorerMock{}, + ForkDetect: &mock.ForkDetectorMock{}, + BlockProcess: &testscommon.BlockProcessorStub{}, + BlockTrack: &mock.BlockTrackerStub{}, + ScheduledTxsExecutionHandlerInternal: &testscommon.ScheduledTxsExecutionStub{}, + ProcessedMiniBlocksTrackerInternal: &testscommon.ProcessedMiniBlocksTrackerStub{}, + PendingMiniBlocksHdl: &mock.PendingMiniBlocksHandlerStub{}, + BlackListHdl: &testscommon.TimeCacheStub{}, + CurrentEpochProviderInternal: &testsMocks.CurrentNetworkEpochProviderStub{}, + HistoryRepositoryInternal: &dblookupext.HistoryRepositoryStub{}, + IntContainer: &testscommon.InterceptorsContainerStub{}, + HeaderSigVerif: &testsMocks.HeaderSigVerifierStub{}, + HeaderIntegrVerif: &mock.HeaderIntegrityVerifierStub{}, + FallbackHdrValidator: &testscommon.FallBackHeaderValidatorStub{}, + }, + StateComponents: &testscommon.StateComponentsMock{ + StorageManagers: map[string]common.StorageManager{ + trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, + trieFactory.PeerAccountTrie: &testscommon.StorageManagerStub{}, + }, + Accounts: &stateMocks.AccountsStub{}, + PeersAcc: &stateMocks.AccountsStub{}, + }, + StatusComponents: &testsMocks.StatusComponentsStub{ + Outport: &outportMocks.OutportStub{}, + }, + StatusCoreComponents: &factoryMocks.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, + }, + ScheduledProcessor: &consensusMocks.ScheduledProcessorStub{}, + IsInImportMode: false, + ShouldDisableWatchdog: false, + } +} + +func TestNewConsensusComponentsFactory(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) + t.Run("should work", func(t *testing.T) { + t.Parallel() - bcf, err := consensusComp.NewConsensusComponentsFactory(args) + ccf, err := consensusComp.NewConsensusComponentsFactory(createMockConsensusComponentsFactoryArgs()) - require.NotNil(t, bcf) - require.Nil(t, err) -} + require.NotNil(t, ccf) + require.Nil(t, err) + }) + t.Run("nil CoreComponents should error", func(t *testing.T) { + t.Parallel() -func TestNewConsensusComponentsFactory_NilCoreComponents(t *testing.T) { - t.Parallel() + args := createMockConsensusComponentsFactoryArgs() + args.CoreComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - args.CoreComponents = nil + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilCoreComponentsHolder, err) + }) + t.Run("nil GenesisNodesSetup should error", func(t *testing.T) { + t.Parallel() - bcf, err := consensusComp.NewConsensusComponentsFactory(args) + args := createMockConsensusComponentsFactoryArgs() + args.CoreComponents = &mock.CoreComponentsMock{ + NodesConfig: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilCoreComponentsHolder, err) -} + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilGenesisNodesSetupHandler, err) + }) + t.Run("nil DataComponents should error", func(t *testing.T) { + t.Parallel() -func TestNewConsensusComponentsFactory_NilDataComponents(t *testing.T) { - t.Parallel() + args := createMockConsensusComponentsFactoryArgs() + args.DataComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - args.DataComponents = nil + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilDataComponentsHolder, err) + }) + t.Run("nil Datapool should error", func(t *testing.T) { + t.Parallel() - bcf, err := consensusComp.NewConsensusComponentsFactory(args) + args := createMockConsensusComponentsFactoryArgs() + args.DataComponents = &testsMocks.DataComponentsStub{ + DataPool: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilDataComponentsHolder, err) -} + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilDataPoolsHolder, err) + }) + t.Run("nil BlockChain should error", func(t *testing.T) { + t.Parallel() -func TestNewConsensusComponentsFactory_NilCryptoComponents(t *testing.T) { - t.Parallel() + args := createMockConsensusComponentsFactoryArgs() + args.DataComponents = &testsMocks.DataComponentsStub{ + DataPool: &dataRetriever.PoolsHolderStub{}, + BlockChain: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - args.CryptoComponents = nil + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilBlockChainHandler, err) + }) + t.Run("nil CryptoComponents should error", func(t *testing.T) { + t.Parallel() - bcf, err := consensusComp.NewConsensusComponentsFactory(args) + args := createMockConsensusComponentsFactoryArgs() + args.CryptoComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilCryptoComponentsHolder, err) -} + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilCryptoComponentsHolder, err) + }) + t.Run("nil PublicKey should error", func(t *testing.T) { + t.Parallel() -func TestNewConsensusComponentsFactory_NilNetworkComponents(t *testing.T) { - t.Parallel() + args := createMockConsensusComponentsFactoryArgs() + args.CryptoComponents = &testsMocks.CryptoComponentsStub{ + PubKey: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - args.NetworkComponents = nil + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilPublicKey, err) + }) + t.Run("nil PrivateKey should error", func(t *testing.T) { + t.Parallel() - bcf, err := consensusComp.NewConsensusComponentsFactory(args) + args := createMockConsensusComponentsFactoryArgs() + args.CryptoComponents = &testsMocks.CryptoComponentsStub{ + PubKey: &cryptoMocks.PublicKeyStub{}, + PrivKey: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilNetworkComponentsHolder, err) -} + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilPrivateKey, err) + }) + t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Parallel() -func TestNewConsensusComponentsFactory_NilProcessComponents(t *testing.T) { - t.Parallel() + args := createMockConsensusComponentsFactoryArgs() + args.NetworkComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) + + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilNetworkComponentsHolder, err) + }) + t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - args.ProcessComponents = nil + args := createMockConsensusComponentsFactoryArgs() + args.NetworkComponents = &testsMocks.NetworkComponentsStub{ + Messenger: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - bcf, err := consensusComp.NewConsensusComponentsFactory(args) + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilMessenger, err) + }) + t.Run("nil ProcessComponents should error", func(t *testing.T) { + t.Parallel() - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilProcessComponentsHolder, err) -} + args := createMockConsensusComponentsFactoryArgs() + args.ProcessComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) -func TestNewConsensusComponentsFactory_NilStateComponents(t *testing.T) { - t.Parallel() + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilProcessComponentsHolder, err) + }) + t.Run("nil NodesCoordinator should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - args.StateComponents = nil + args := createMockConsensusComponentsFactoryArgs() + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + NodesCoord: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - bcf, err := consensusComp.NewConsensusComponentsFactory(args) + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilNodesCoordinator, err) + }) + t.Run("nil ShardCoordinator should error", func(t *testing.T) { + t.Parallel() - require.Nil(t, bcf) - require.Equal(t, errorsErd.ErrNilStateComponentsHolder, err) -} + args := createMockConsensusComponentsFactoryArgs() + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + NodesCoord: &shardingMocks.NodesCoordinatorStub{}, + ShardCoord: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) -// ------------ Test Old Use Cases -------------------- -func TestConsensusComponentsFactory_CreateGenesisBlockNotInitializedShouldErr(t *testing.T) { - t.Parallel() + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilShardCoordinator, err) + }) + t.Run("nil ShardCoordinator should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + NodesCoord: &shardingMocks.NodesCoordinatorStub{}, + ShardCoord: &testscommon.ShardsCoordinatorMock{}, + RoundHandlerField: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - consensusArgs := componentsMock.GetConsensusArgs(shardCoordinator) - consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(consensusArgs) - managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilRoundHandler, err) + }) + t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Parallel() - dataComponents := consensusArgs.DataComponents + args := createMockConsensusComponentsFactoryArgs() + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + NodesCoord: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - dataComponents.SetBlockchain(&testscommon.ChainHandlerStub{ - GetGenesisHeaderHashCalled: func() []byte { - return nil - }, - GetGenesisHeaderCalled: func() data.HeaderHandler { - return nil - }, + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilNodesCoordinator, err) }) + t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Parallel() - err := managedConsensusComponents.Create() - require.True(t, errors.Is(err, errorsErd.ErrConsensusComponentsFactoryCreate)) - require.True(t, strings.Contains(err.Error(), errorsErd.ErrGenesisBlockNotInitialized.Error())) -} + args := createMockConsensusComponentsFactoryArgs() + args.ProcessComponents = &testsMocks.ProcessComponentsStub{ + NodesCoord: &shardingMocks.NodesCoordinatorStub{}, + ShardCoord: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) -func TestConsensusComponentsFactory_CreateForShard(t *testing.T) { - t.Parallel() + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilShardCoordinator, err) + }) + t.Run("nil StateComponents should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - ccf, _ := consensusComp.NewConsensusComponentsFactory(args) - require.NotNil(t, ccf) + args := createMockConsensusComponentsFactoryArgs() + args.StateComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - cc, err := ccf.Create() - require.NoError(t, err) - require.NotNil(t, cc) -} + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilStateComponentsHolder, err) + }) + t.Run("nil StatusComponents should error", func(t *testing.T) { + t.Parallel() -type wrappedProcessComponents struct { - factory.ProcessComponentsHolder -} + args := createMockConsensusComponentsFactoryArgs() + args.StatusComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) -func (wp *wrappedProcessComponents) ShardCoordinator() sharding.Coordinator { - shC := mock.NewMultiShardsCoordinatorMock(2) - shC.SelfIDCalled = func() uint32 { - return core.MetachainShardId - } + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilStatusComponentsHolder, err) + }) + t.Run("nil OutportHandler should error", func(t *testing.T) { + t.Parallel() - return shC -} + args := createMockConsensusComponentsFactoryArgs() + args.StatusComponents = &testsMocks.StatusComponentsStub{ + Outport: nil, + } + ccf, err := consensusComp.NewConsensusComponentsFactory(args) -func TestConsensusComponentsFactory_CreateForMeta(t *testing.T) { - t.Parallel() + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilOutportHandler, err) + }) + t.Run("nil ScheduledProcessor should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) + args := createMockConsensusComponentsFactoryArgs() + args.ScheduledProcessor = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) - args.ProcessComponents = &wrappedProcessComponents{ - ProcessComponentsHolder: args.ProcessComponents, - } - ccf, _ := consensusComp.NewConsensusComponentsFactory(args) - require.NotNil(t, ccf) + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilScheduledProcessor, err) + }) + t.Run("nil StatusCoreComponents should error", func(t *testing.T) { + t.Parallel() - cc, err := ccf.Create() - require.NoError(t, err) - require.NotNil(t, cc) + args := createMockConsensusComponentsFactoryArgs() + args.StatusCoreComponents = nil + ccf, err := consensusComp.NewConsensusComponentsFactory(args) + + require.Nil(t, ccf) + require.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) + }) } -func TestConsensusComponentsFactory_CreateNilShardCoordinator(t *testing.T) { +func TestConsensusComponentsFactory_Create(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - consensusArgs := componentsMock.GetConsensusArgs(shardCoordinator) - processComponents := &mock.ProcessComponentsMock{} - consensusArgs.ProcessComponents = processComponents - consensusComponentsFactory, _ := consensusComp.NewConsensusComponentsFactory(consensusArgs) + expectedErr := errors.New("expected error") + t.Run("invalid shard id should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.ShardCoord = &testscommon.ShardsCoordinatorMock{ + SelfIDCalled: func() uint32 { + return 5 + }, + NoShards: 2, + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - cc, err := consensusComponentsFactory.Create() + cc, err := ccf.Create() + require.Equal(t, sharding.ErrShardIdOutOfRange, err) + require.Nil(t, cc) + }) + t.Run("genesis block not initialized should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.ShardCoord = &testscommon.ShardsCoordinatorMock{ + SelfIDCalled: func() uint32 { + return core.MetachainShardId // coverage + }, + NoShards: 2, + } - require.Nil(t, cc) - require.Equal(t, errorsErd.ErrNilShardCoordinator, err) -} + dataCompStub, ok := args.DataComponents.(*testsMocks.DataComponentsStub) + require.True(t, ok) + dataCompStub.BlockChain = &testscommon.ChainHandlerStub{ + GetGenesisHeaderHashCalled: func() []byte { + return []byte("") + }, + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestConsensusComponentsFactory_CreateConsensusTopicCreateTopicError(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrGenesisBlockNotInitialized, err) + require.Nil(t, cc) + }) + t.Run("createChronology fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + processCompStub.RoundHandlerCalled = func() consensus.RoundHandler { + cnt++ + if cnt > 1 { + return nil + } + return &testscommon.RoundHandlerMock{} + } - localError := errors.New("error") - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - networkComponents := componentsMock.GetDefaultNetworkComponents() - networkComponents.Messenger = &p2pmocks.MessengerStub{ - HasTopicValidatorCalled: func(name string) bool { - return false - }, - HasTopicCalled: func(name string) bool { - return false - }, - CreateTopicCalled: func(name string, createChannelForTopic bool) error { - return localError - }, - } - args.NetworkComponents = networkComponents + args.IsInImportMode = true // coverage + args.ShouldDisableWatchdog = true // coverage + statusCompStub, ok := args.StatusComponents.(*testsMocks.StatusComponentsStub) + require.True(t, ok) + statusCompStub.Outport = &outportMocks.OutportStub{ + HasDriversCalled: func() bool { + return true // coverage + }, + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - bcf, _ := consensusComp.NewConsensusComponentsFactory(args) - cc, err := bcf.Create() + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "roundHandler")) + require.Nil(t, cc) + }) + t.Run("createBootstrapper fails due to nil shard coordinator should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 2 { + return nil // createBootstrapper fails + } + return testscommon.NewMultiShardsCoordinatorMock(2) + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - require.Nil(t, cc) - require.Equal(t, localError, err) -} + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilShardCoordinator, err) + require.Nil(t, cc) + }) + t.Run("createBootstrapper fails due to invalid shard coordinator should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + shardC := testscommon.NewMultiShardsCoordinatorMock(2) + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 2 { + shardC.SelfIDCalled = func() uint32 { + return shardC.NoShards + 1 // createBootstrapper returns ErrShardIdOutOfRange + } + return shardC + } + return shardC + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestConsensusComponentsFactory_CreateConsensusTopicNilMessageProcessor(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Equal(t, sharding.ErrShardIdOutOfRange, err) + require.Nil(t, cc) + }) + t.Run("createShardBootstrapper fails due to NewShardStorageBootstrapper failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 3 { + return nil // NewShardStorageBootstrapper fails + } + return testscommon.NewMultiShardsCoordinatorMock(2) + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - networkComponents := componentsMock.GetDefaultNetworkComponents() - networkComponents.Messenger = nil - args.NetworkComponents = networkComponents + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "shard coordinator")) + require.Nil(t, cc) + }) + t.Run("createUserAccountsSyncer fails due to missing UserAccountTrie should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + stateCompStub, ok := args.StateComponents.(*testscommon.StateComponentsMock) + require.True(t, ok) + stateCompStub.StorageManagers = make(map[string]common.StorageManager) // missing UserAccountTrie + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) + + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilTrieStorageManager, err) + require.Nil(t, cc) + }) + t.Run("createUserAccountsSyncer fails due to invalid NumConcurrentTrieSyncers should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + args.Config.TrieSync.NumConcurrentTrieSyncers = 0 + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) + + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "value is not positive")) + require.Nil(t, cc) + }) + t.Run("createMetaChainBootstrapper fails due to NewMetaStorageBootstrapper failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 3 { + return nil // NewShardStorageBootstrapper fails + } + shardC := testscommon.NewMultiShardsCoordinatorMock(2) + shardC.CurrentShard = core.MetachainShardId + return shardC + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - bcf, _ := consensusComp.NewConsensusComponentsFactory(args) - cc, err := bcf.Create() + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "shard coordinator")) + require.Nil(t, cc) + }) + t.Run("createUserAccountsSyncer fails due to missing UserAccountTrie should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + stateCompStub, ok := args.StateComponents.(*testscommon.StateComponentsMock) + require.True(t, ok) + stateCompStub.StorageManagers = make(map[string]common.StorageManager) // missing UserAccountTrie + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + shardC := testscommon.NewMultiShardsCoordinatorMock(2) + shardC.CurrentShard = core.MetachainShardId + return shardC + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - require.Nil(t, cc) - require.Equal(t, errorsErd.ErrNilMessenger, err) -} + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilTrieStorageManager, err) + require.Nil(t, cc) + }) + t.Run("createValidatorAccountsSyncer fails due to missing PeerAccountTrie should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + stateCompStub, ok := args.StateComponents.(*testscommon.StateComponentsMock) + require.True(t, ok) + stateCompStub.StorageManagers = map[string]common.StorageManager{ + trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, + } // missing PeerAccountTrie + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + shardC := testscommon.NewMultiShardsCoordinatorMock(2) + shardC.CurrentShard = core.MetachainShardId + return shardC + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestConsensusComponentsFactory_CreateNilSyncTimer(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilTrieStorageManager, err) + require.Nil(t, cc) + }) + t.Run("createConsensusState fails due to nil public key should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + cryptoCompStub, ok := args.CryptoComponents.(*testsMocks.CryptoComponentsStub) + require.True(t, ok) + cnt := 0 + cryptoCompStub.PublicKeyCalled = func() crypto.PublicKey { + cnt++ + if cnt > 1 { + return nil + } + return &cryptoMocks.PublicKeyStub{} + } + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + shardC := testscommon.NewMultiShardsCoordinatorMock(2) + shardC.CurrentShard = core.MetachainShardId // coverage + return shardC + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - coreComponents := componentsMock.GetDefaultCoreComponents() - coreComponents.NtpSyncTimer = nil - args.CoreComponents = coreComponents - bcf, _ := consensusComp.NewConsensusComponentsFactory(args) - cc, err := bcf.Create() + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilPublicKey, err) + require.Nil(t, cc) + }) + t.Run("createConsensusState fails due to ToByteArray failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + cryptoCompStub, ok := args.CryptoComponents.(*testsMocks.CryptoComponentsStub) + require.True(t, ok) + cryptoCompStub.PubKey = &cryptoMocks.PublicKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return nil, expectedErr + }, + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - require.Nil(t, cc) - require.Equal(t, chronology.ErrNilSyncTimer, err) -} + cc, err := ccf.Create() + require.Equal(t, expectedErr, err) + require.Nil(t, cc) + }) + t.Run("createConsensusState fails due to nil nodes coordinator should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + processCompStub.NodesCoordinatorCalled = func() nodesCoordinator.NodesCoordinator { + cnt++ + if cnt > 2 { + return nil + } + return &shardingMocks.NodesCoordinatorStub{} + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestStartConsensus_ShardBootstrapperNilAccounts(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilNodesCoordinator, err) + require.Nil(t, cc) + }) + t.Run("createConsensusState fails due to GetConsensusWhitelistedNodes failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.NodesCoordinatorCalled = func() nodesCoordinator.NodesCoordinator { + return &shardingMocks.NodesCoordinatorStub{ + GetConsensusWhitelistedNodesCalled: func(epoch uint32) (map[string]struct{}, error) { + return nil, expectedErr + }, + } + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - stateComponents := componentsMock.GetDefaultStateComponents() - stateComponents.Accounts = nil - args.StateComponents = stateComponents - bcf, _ := consensusComp.NewConsensusComponentsFactory(args) - cc, err := bcf.Create() + cc, err := ccf.Create() + require.Equal(t, expectedErr, err) + require.Nil(t, cc) + }) + t.Run("GetConsensusCoreFactory failure should error", func(t *testing.T) { + t.Parallel() - require.Nil(t, cc) - require.Equal(t, process.ErrNilAccountsAdapter, err) -} + args := createMockConsensusComponentsFactoryArgs() + args.Config.Consensus.Type = "invalid" // GetConsensusCoreFactory fails + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestStartConsensus_ShardBootstrapperNilPoolHolder(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Error(t, err) + require.Nil(t, cc) + }) + t.Run("GetBroadcastMessenger failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 6 { + return nil // GetBroadcastMessenger fails + } + return testscommon.NewMultiShardsCoordinatorMock(2) + } + dataCompStub, ok := args.DataComponents.(*testsMocks.DataComponentsStub) + require.True(t, ok) + dataCompStub.BlockChain = &testscommon.ChainHandlerStub{ + GetGenesisHeaderHashCalled: func() []byte { + return []byte("genesis hash") + }, + GetGenesisHeaderCalled: func() data.HeaderHandler { + return &testscommon.HeaderHandlerStub{} + }, + GetCurrentBlockHeaderCalled: func() data.HeaderHandler { + return &testscommon.HeaderHandlerStub{} // coverage + }, + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) - shardCoordinator.CurrentShard = 0 - args := componentsMock.GetConsensusArgs(shardCoordinator) - dataComponents := componentsMock.GetDefaultDataComponents() - dataComponents.DataPool = nil - args.DataComponents = dataComponents - processComponents := componentsMock.GetDefaultProcessComponents(shardCoordinator) - args.ProcessComponents = processComponents - bcf, _ := consensusComp.NewConsensusComponentsFactory(args) - cc, err := bcf.Create() - - require.Nil(t, cc) - require.Equal(t, errorsErd.ErrNilDataPoolsHolder, err) -} + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "shard coordinator")) + require.Nil(t, cc) + }) + t.Run("NewWorker failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + args.Config.Marshalizer.SizeCheckDelta = 1 // coverage + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.HeaderIntegrVerif = nil + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) + + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "header integrity verifier")) + require.Nil(t, cc) + }) + t.Run("createConsensusTopic fails due nil shard coordinator should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + cnt := 0 + processCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 9 { + return nil // createConsensusTopic fails + } + return testscommon.NewMultiShardsCoordinatorMock(2) + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestStartConsensus_MetaBootstrapperNilPoolHolder(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilShardCoordinator, err) + require.Nil(t, cc) + }) + t.Run("createConsensusTopic fails due nil messenger should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + netwCompStub, ok := args.NetworkComponents.(*testsMocks.NetworkComponentsStub) + require.True(t, ok) + cnt := 0 + netwCompStub.MessengerCalled = func() p2p.Messenger { + cnt++ + if cnt > 3 { + return nil + } + return &p2pmocks.MessengerStub{} + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) - shardCoordinator.CurrentShard = core.MetachainShardId - shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { - if core.IsSmartContractOnMetachain(address[len(address)-1:], address) { - return core.MetachainShardId + cc, err := ccf.Create() + require.Equal(t, errorsMx.ErrNilMessenger, err) + require.Nil(t, cc) + }) + t.Run("createConsensusTopic fails due CreateTopic failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + netwCompStub, ok := args.NetworkComponents.(*testsMocks.NetworkComponentsStub) + require.True(t, ok) + netwCompStub.Messenger = &p2pmocks.MessengerStub{ + HasTopicCalled: func(name string) bool { + return false + }, + CreateTopicCalled: func(name string, createChannelForTopic bool) error { + return expectedErr + }, } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - return 0 - } - args := componentsMock.GetConsensusArgs(shardCoordinator) - dataComponents := componentsMock.GetDefaultDataComponents() - dataComponents.DataPool = nil - args.DataComponents = dataComponents - args.ProcessComponents = componentsMock.GetDefaultProcessComponents(shardCoordinator) - bcf, err := consensusComp.NewConsensusComponentsFactory(args) - require.Nil(t, err) - require.NotNil(t, bcf) - cc, err := bcf.Create() - - require.Nil(t, cc) - require.Equal(t, errorsErd.ErrNilDataPoolsHolder, err) -} + cc, err := ccf.Create() + require.Equal(t, expectedErr, err) + require.Nil(t, cc) + }) + t.Run("createBlsSignatureHandler fails due ToByteArray failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + cryptoCompStub, ok := args.CryptoComponents.(*testsMocks.CryptoComponentsStub) + require.True(t, ok) + cryptoCompStub.PrivKey = &cryptoMocks.PrivateKeyStub{ + ToByteArrayStub: func() ([]byte, error) { + return nil, expectedErr + }, + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestStartConsensus_MetaBootstrapperWrongNumberShards(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Equal(t, expectedErr, err) + require.Nil(t, cc) + }) + t.Run("NewConsensusCore failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + cryptoCompStub, ok := args.CryptoComponents.(*testsMocks.CryptoComponentsStub) + require.True(t, ok) + cryptoCompStub.BlockSig = nil + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) + + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "single signer")) + require.Nil(t, cc) + }) + t.Run("GetSubroundsFactory failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + statusCoreCompStub, ok := args.StatusCoreComponents.(*factoryMocks.StatusCoreComponentsStub) + require.True(t, ok) + cnt := 0 + statusCoreCompStub.AppStatusHandlerCalled = func() core.AppStatusHandler { + cnt++ + if cnt > 4 { + return nil + } + return &statusHandler.AppStatusHandlerStub{} + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) - args := componentsMock.GetConsensusArgs(shardCoordinator) - processComponents := componentsMock.GetDefaultProcessComponents(shardCoordinator) - args.ProcessComponents = processComponents - bcf, err := consensusComp.NewConsensusComponentsFactory(args) - require.Nil(t, err) - shardCoordinator.CurrentShard = 2 - cc, err := bcf.Create() - - require.Nil(t, cc) - require.Equal(t, sharding.ErrShardIdOutOfRange, err) -} + cc, err := ccf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), "AppStatusHandler")) + require.Nil(t, cc) + }) + t.Run("addCloserInstances failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockConsensusComponentsFactoryArgs() + processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) + require.True(t, ok) + processCompStub.HardforkTriggerField = &testscommon.HardforkTriggerStub{ + AddCloserCalled: func(closer update.Closer) error { + return expectedErr + }, + } + ccf, _ := consensusComp.NewConsensusComponentsFactory(args) + require.NotNil(t, ccf) -func TestStartConsensus_ShardBootstrapperPubKeyToByteArrayError(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.Equal(t, expectedErr, err) + require.Nil(t, cc) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - localErr := errors.New("err") - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - cryptoParams := componentsMock.GetDefaultCryptoComponents() - cryptoParams.PubKey = &mock.PublicKeyMock{ - ToByteArrayHandler: func() (i []byte, err error) { - return []byte("nil"), localErr - }, - } - args.CryptoComponents = cryptoParams - bcf, _ := consensusComp.NewConsensusComponentsFactory(args) - cc, err := bcf.Create() - require.Nil(t, cc) - require.Equal(t, localErr, err) -} + ccf, _ := consensusComp.NewConsensusComponentsFactory(createMockConsensusComponentsFactoryArgs()) + require.NotNil(t, ccf) -func TestStartConsensus_ShardBootstrapperInvalidConsensusType(t *testing.T) { - t.Parallel() + cc, err := ccf.Create() + require.NoError(t, err) + require.NotNil(t, cc) - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - args := componentsMock.GetConsensusArgs(shardCoordinator) - args.Config.Consensus.Type = "invalid" - bcf, err := consensusComp.NewConsensusComponentsFactory(args) - require.Nil(t, err) - cc, err := bcf.Create() - require.Nil(t, cc) - require.Equal(t, sposFactory.ErrInvalidConsensusType, err) + require.Nil(t, cc.Close()) + }) } diff --git a/factory/mock/forkDetectorMock.go b/factory/mock/forkDetectorMock.go index d681b976d7d..4a041bc814a 100644 --- a/factory/mock/forkDetectorMock.go +++ b/factory/mock/forkDetectorMock.go @@ -23,37 +23,56 @@ type ForkDetectorMock struct { // RestoreToGenesis - func (fdm *ForkDetectorMock) RestoreToGenesis() { - fdm.RestoreToGenesisCalled() + if fdm.RestoreToGenesisCalled != nil { + fdm.RestoreToGenesisCalled() + } } // AddHeader is a mock implementation for AddHeader func (fdm *ForkDetectorMock) AddHeader(header data.HeaderHandler, hash []byte, state process.BlockHeaderState, selfNotarizedHeaders []data.HeaderHandler, selfNotarizedHeadersHashes [][]byte) error { - return fdm.AddHeaderCalled(header, hash, state, selfNotarizedHeaders, selfNotarizedHeadersHashes) + if fdm.AddHeaderCalled != nil { + return fdm.AddHeaderCalled(header, hash, state, selfNotarizedHeaders, selfNotarizedHeadersHashes) + } + return nil } // RemoveHeader is a mock implementation for RemoveHeader func (fdm *ForkDetectorMock) RemoveHeader(nonce uint64, hash []byte) { - fdm.RemoveHeaderCalled(nonce, hash) + if fdm.RemoveHeaderCalled != nil { + fdm.RemoveHeaderCalled(nonce, hash) + } } // CheckFork is a mock implementation for CheckFork func (fdm *ForkDetectorMock) CheckFork() *process.ForkInfo { - return fdm.CheckForkCalled() + if fdm.CheckForkCalled != nil { + return fdm.CheckForkCalled() + } + return &process.ForkInfo{} } // GetHighestFinalBlockNonce is a mock implementation for GetHighestFinalBlockNonce func (fdm *ForkDetectorMock) GetHighestFinalBlockNonce() uint64 { - return fdm.GetHighestFinalBlockNonceCalled() + if fdm.GetHighestFinalBlockNonceCalled != nil { + return fdm.GetHighestFinalBlockNonceCalled() + } + return 0 } // GetHighestFinalBlockHash - func (fdm *ForkDetectorMock) GetHighestFinalBlockHash() []byte { - return fdm.GetHighestFinalBlockHashCalled() + if fdm.GetHighestFinalBlockHashCalled != nil { + return fdm.GetHighestFinalBlockHashCalled() + } + return nil } // ProbableHighestNonce is a mock implementation for GetProbableHighestNonce func (fdm *ForkDetectorMock) ProbableHighestNonce() uint64 { - return fdm.ProbableHighestNonceCalled() + if fdm.ProbableHighestNonceCalled != nil { + return fdm.ProbableHighestNonceCalled() + } + return 0 } // SetRollBackNonce - @@ -65,12 +84,17 @@ func (fdm *ForkDetectorMock) SetRollBackNonce(nonce uint64) { // ResetFork - func (fdm *ForkDetectorMock) ResetFork() { - fdm.ResetForkCalled() + if fdm.ResetForkCalled != nil { + fdm.ResetForkCalled() + } } // GetNotarizedHeaderHash - func (fdm *ForkDetectorMock) GetNotarizedHeaderHash(nonce uint64) []byte { - return fdm.GetNotarizedHeaderHashCalled(nonce) + if fdm.GetNotarizedHeaderHashCalled != nil { + return fdm.GetNotarizedHeaderHashCalled(nonce) + } + return nil } // ResetProbableHighestNonce - diff --git a/integrationTests/mock/cryptoComponentsStub.go b/integrationTests/mock/cryptoComponentsStub.go index fd87b0f3cce..10c5db9aaac 100644 --- a/integrationTests/mock/cryptoComponentsStub.go +++ b/integrationTests/mock/cryptoComponentsStub.go @@ -12,6 +12,7 @@ import ( // CryptoComponentsStub - type CryptoComponentsStub struct { PubKey crypto.PublicKey + PublicKeyCalled func() crypto.PublicKey PrivKey crypto.PrivateKey P2pPubKey crypto.PublicKey P2pPrivKey crypto.PrivateKey @@ -47,6 +48,9 @@ func (ccs *CryptoComponentsStub) CheckSubcomponents() error { // PublicKey - func (ccs *CryptoComponentsStub) PublicKey() crypto.PublicKey { + if ccs.PublicKeyCalled != nil { + return ccs.PublicKeyCalled() + } return ccs.PubKey } diff --git a/integrationTests/mock/headersCacherStub.go b/integrationTests/mock/headersCacherStub.go index 391db3c1c1f..153988a6b13 100644 --- a/integrationTests/mock/headersCacherStub.go +++ b/integrationTests/mock/headersCacherStub.go @@ -14,10 +14,35 @@ type HeadersCacherStub struct { GetHeaderByNonceAndShardIdCalled func(hdrNonce uint64, shardId uint32) ([]data.HeaderHandler, [][]byte, error) GetHeaderByHashCalled func(hash []byte) (data.HeaderHandler, error) ClearCalled func() - RegisterHandlerCalled func(handler func(key []byte, value interface{})) KeysCalled func(shardId uint32) []uint64 LenCalled func() int MaxSizeCalled func() int + RegisterHandlerCalled func(handler func(headerHandler data.HeaderHandler, headerHash []byte)) + GetNumHeadersCalled func(shardId uint32) int + NoncesCalled func(shardId uint32) []uint64 +} + +// RegisterHandler - +func (hcs *HeadersCacherStub) RegisterHandler(handler func(headerHandler data.HeaderHandler, headerHash []byte)) { + if hcs.RegisterHandlerCalled != nil { + hcs.RegisterHandlerCalled(handler) + } +} + +// Nonces - +func (hcs *HeadersCacherStub) Nonces(shardId uint32) []uint64 { + if hcs.NoncesCalled != nil { + return hcs.NoncesCalled(shardId) + } + return nil +} + +// GetNumHeaders - +func (hcs *HeadersCacherStub) GetNumHeaders(shardId uint32) int { + if hcs.GetNumHeadersCalled != nil { + return hcs.GetNumHeadersCalled(shardId) + } + return 0 } // AddHeader - @@ -64,13 +89,6 @@ func (hcs *HeadersCacherStub) Clear() { } } -// RegisterHandler - -func (hcs *HeadersCacherStub) RegisterHandler(handler func(key []byte, value interface{})) { - if hcs.RegisterHandlerCalled != nil { - hcs.RegisterHandlerCalled(handler) - } -} - // Keys - func (hcs *HeadersCacherStub) Keys(shardId uint32) []uint64 { if hcs.KeysCalled != nil { diff --git a/integrationTests/mock/networkComponentsMock.go b/integrationTests/mock/networkComponentsMock.go index d6f810325a6..2b672ae5de0 100644 --- a/integrationTests/mock/networkComponentsMock.go +++ b/integrationTests/mock/networkComponentsMock.go @@ -9,6 +9,7 @@ import ( // NetworkComponentsStub - type NetworkComponentsStub struct { Messenger p2p.Messenger + MessengerCalled func() p2p.Messenger InputAntiFlood factory.P2PAntifloodHandler OutputAntiFlood factory.P2PAntifloodHandler PeerBlackList process.PeerBlackListCacher @@ -44,6 +45,9 @@ func (ncs *NetworkComponentsStub) CheckSubcomponents() error { // NetworkMessenger - func (ncs *NetworkComponentsStub) NetworkMessenger() p2p.Messenger { + if ncs.MessengerCalled != nil { + return ncs.MessengerCalled() + } return ncs.Messenger } diff --git a/integrationTests/mock/peerShardMapperStub.go b/integrationTests/mock/peerShardMapperStub.go index 8e2bc50dbfc..b32a1045c7b 100644 --- a/integrationTests/mock/peerShardMapperStub.go +++ b/integrationTests/mock/peerShardMapperStub.go @@ -8,6 +8,14 @@ type PeerShardMapperStub struct { UpdatePeerIDPublicKeyPairCalled func(pid core.PeerID, pk []byte) PutPeerIdShardIdCalled func(pid core.PeerID, shardID uint32) PutPeerIdSubTypeCalled func(pid core.PeerID, peerSubType core.P2PPeerSubType) + UpdatePeerIDInfoCalled func(pid core.PeerID, pk []byte, shardID uint32) +} + +// UpdatePeerIDInfo - +func (psms *PeerShardMapperStub) UpdatePeerIDInfo(pid core.PeerID, pk []byte, shardID uint32) { + if psms.UpdatePeerIDInfoCalled != nil { + psms.UpdatePeerIDInfoCalled(pid, pk, shardID) + } } // UpdatePeerIDPublicKeyPair - diff --git a/integrationTests/mock/processComponentsStub.go b/integrationTests/mock/processComponentsStub.go index 02712358812..8bde831797d 100644 --- a/integrationTests/mock/processComponentsStub.go +++ b/integrationTests/mock/processComponentsStub.go @@ -17,10 +17,13 @@ import ( // ProcessComponentsStub - type ProcessComponentsStub struct { NodesCoord nodesCoordinator.NodesCoordinator + NodesCoordinatorCalled func() nodesCoordinator.NodesCoordinator ShardCoord sharding.Coordinator + ShardCoordinatorCalled func() sharding.Coordinator IntContainer process.InterceptorsContainer ResFinder dataRetriever.ResolversFinder RoundHandlerField consensus.RoundHandler + RoundHandlerCalled func() consensus.RoundHandler EpochTrigger epochStart.TriggerHandler EpochNotifier factory.EpochStartNotifier ForkDetect process.ForkDetector @@ -72,11 +75,17 @@ func (pcs *ProcessComponentsStub) CheckSubcomponents() error { // NodesCoordinator - func (pcs *ProcessComponentsStub) NodesCoordinator() nodesCoordinator.NodesCoordinator { + if pcs.NodesCoordinatorCalled != nil { + return pcs.NodesCoordinatorCalled() + } return pcs.NodesCoord } // ShardCoordinator - func (pcs *ProcessComponentsStub) ShardCoordinator() sharding.Coordinator { + if pcs.ShardCoordinatorCalled != nil { + return pcs.ShardCoordinatorCalled() + } return pcs.ShardCoord } @@ -92,6 +101,9 @@ func (pcs *ProcessComponentsStub) ResolversFinder() dataRetriever.ResolversFinde // RoundHandler - func (pcs *ProcessComponentsStub) RoundHandler() consensus.RoundHandler { + if pcs.RoundHandlerCalled != nil { + return pcs.RoundHandlerCalled() + } return pcs.RoundHandlerField } diff --git a/integrationTests/mock/statusComponentsStub.go b/integrationTests/mock/statusComponentsStub.go index 8d1fd5465c8..ec6e211286a 100644 --- a/integrationTests/mock/statusComponentsStub.go +++ b/integrationTests/mock/statusComponentsStub.go @@ -1,7 +1,6 @@ package mock import ( - "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-go/common/statistics" "github.com/multiversx/mx-chain-go/outport" ) @@ -10,7 +9,6 @@ import ( type StatusComponentsStub struct { Outport outport.OutportHandler SoftwareVersionCheck statistics.SoftwareVersionChecker - AppStatusHandler core.AppStatusHandler } // Create - diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 94d835f409e..76fcb28b54e 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -3118,7 +3118,6 @@ func GetDefaultStatusComponents() *mock.StatusComponentsStub { return &mock.StatusComponentsStub{ Outport: mock.NewNilOutport(), SoftwareVersionCheck: &mock.SoftwareVersionCheckerMock{}, - AppStatusHandler: &statusHandlerMock.AppStatusHandlerStub{}, } } diff --git a/testscommon/factory/statusCoreComponentsStub.go b/testscommon/factory/statusCoreComponentsStub.go index 8698a56a11b..a5371408f66 100644 --- a/testscommon/factory/statusCoreComponentsStub.go +++ b/testscommon/factory/statusCoreComponentsStub.go @@ -12,6 +12,7 @@ type StatusCoreComponentsStub struct { NetworkStatisticsField factory.NetworkStatisticsProvider TrieSyncStatisticsField factory.TrieSyncStatisticsProvider AppStatusHandlerField core.AppStatusHandler + AppStatusHandlerCalled func() core.AppStatusHandler StatusMetricsField external.StatusMetricsHandler PersistentStatusHandlerField factory.PersistentStatusHandler } @@ -53,6 +54,9 @@ func (stub *StatusCoreComponentsStub) TrieSyncStatistics() factory.TrieSyncStati // AppStatusHandler - func (stub *StatusCoreComponentsStub) AppStatusHandler() core.AppStatusHandler { + if stub.AppStatusHandlerCalled != nil { + return stub.AppStatusHandlerCalled() + } return stub.AppStatusHandlerField } diff --git a/testscommon/shardingMocks/nodesCoordinatorStub.go b/testscommon/shardingMocks/nodesCoordinatorStub.go index f4d8be2a53a..caf833b1a18 100644 --- a/testscommon/shardingMocks/nodesCoordinatorStub.go +++ b/testscommon/shardingMocks/nodesCoordinatorStub.go @@ -18,6 +18,7 @@ type NodesCoordinatorStub struct { ConsensusGroupSizeCalled func(shardID uint32) int ComputeConsensusGroupCalled func(randomness []byte, round uint64, shardId uint32, epoch uint32) (validatorsGroup []nodesCoordinator.Validator, err error) EpochStartPrepareCalled func(metaHdr data.HeaderHandler, body data.BodyHandler) + GetConsensusWhitelistedNodesCalled func(epoch uint32) (map[string]struct{}, error) } // NodesCoordinatorToRegistry - @@ -157,8 +158,11 @@ func (ncm *NodesCoordinatorStub) ShuffleOutForEpoch(_ uint32) { } // GetConsensusWhitelistedNodes return the whitelisted nodes allowed to send consensus messages, for each of the shards -func (ncm *NodesCoordinatorStub) GetConsensusWhitelistedNodes(_ uint32) (map[string]struct{}, error) { - panic("not implemented") +func (ncm *NodesCoordinatorStub) GetConsensusWhitelistedNodes(epoch uint32) (map[string]struct{}, error) { + if ncm.GetConsensusWhitelistedNodesCalled != nil { + return ncm.GetConsensusWhitelistedNodesCalled(epoch) + } + return nil, nil } // GetSelectedPublicKeys - From e31cdb5dc83dfba3434d30ed178360cfe6a487d6 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 10 Apr 2023 13:57:41 +0300 Subject: [PATCH 268/335] fix after review --- errors/errors.go | 4 ++-- factory/bootstrap/shardingFactory_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/errors/errors.go b/errors/errors.go index 2f19ffdfd42..f0591fd4a4b 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -545,5 +545,5 @@ var ErrNilGenesisNodesSetupHandler = errors.New("nil genesis nodes setup handler // ErrNilLogger signals that a nil logger instance has been provided var ErrNilLogger = errors.New("nil logger") -// ErrNilShuffleOutCloser signals that a nil shuffler out closer has been provided -var ErrNilShuffleOutCloser = errors.New("nil shuffler out closer") +// ErrNilShuffleOutCloser signals that a nil shuffle out closer has been provided +var ErrNilShuffleOutCloser = errors.New("nil shuffle out closer") diff --git a/factory/bootstrap/shardingFactory_test.go b/factory/bootstrap/shardingFactory_test.go index 36846a14bea..277589f2e7e 100644 --- a/factory/bootstrap/shardingFactory_test.go +++ b/factory/bootstrap/shardingFactory_test.go @@ -486,7 +486,7 @@ func TestCreateNodesCoordinator(t *testing.T) { require.NotNil(t, err) require.True(t, check.IfNil(nodesC)) }) - t.Run("NewIndexHashedNodesCoordinator fails should error", func(t *testing.T) { + t.Run("NewIndexHashedNodesCoordinatorWithRater fails should error", func(t *testing.T) { t.Parallel() nodesC, err := CreateNodesCoordinator( From d70197c50874a46911f3f5acacc069d53a0fd742 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 10 Apr 2023 13:58:55 +0300 Subject: [PATCH 269/335] more fixes after review --- factory/core/coreComponents_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factory/core/coreComponents_test.go b/factory/core/coreComponents_test.go index 090776b3b93..79aba4a2532 100644 --- a/factory/core/coreComponents_test.go +++ b/factory/core/coreComponents_test.go @@ -248,7 +248,7 @@ func TestCoreComponentsFactory_CreateCoreComponentsInvalidRoundConfigShouldErr(t require.NotNil(t, err) } -func TestCoreComponentsFactory_CreateCoreComponentsInvalidGasScheduleShouldErr(t *testing.T) { +func TestCoreComponentsFactory_CreateCoreComponentsInvalidEpochConfigShouldErr(t *testing.T) { t.Parallel() args := componentsMock.GetCoreArgs() From 8f0e3b84e39881cdaf141f440282332c70dfed76 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 10 Apr 2023 14:13:33 +0300 Subject: [PATCH 270/335] fix race in mock --- testscommon/rounderMock.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/testscommon/rounderMock.go b/testscommon/rounderMock.go index e9d2639eff3..976e8a55181 100644 --- a/testscommon/rounderMock.go +++ b/testscommon/rounderMock.go @@ -1,12 +1,14 @@ package testscommon import ( + "sync" "time" ) // RoundHandlerMock - type RoundHandlerMock struct { - index int64 + indexMut sync.RWMutex + index int64 IndexCalled func() int64 TimeDurationCalled func() time.Duration @@ -30,6 +32,9 @@ func (rndm *RoundHandlerMock) Index() int64 { return rndm.IndexCalled() } + rndm.indexMut.RLock() + defer rndm.indexMut.RUnlock() + return rndm.index } @@ -58,7 +63,9 @@ func (rndm *RoundHandlerMock) UpdateRound(genesisRoundTimeStamp time.Time, timeS return } + rndm.indexMut.Lock() rndm.index++ + rndm.indexMut.Unlock() } // RemainingTime - From f5a6d5f5f6cf508edd74d77e304b67f7fa5ee1f3 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 11 Apr 2023 13:42:29 +0300 Subject: [PATCH 271/335] fix after system tests --- vm/systemSmartContracts/governance.go | 35 +++------ vm/systemSmartContracts/governance_test.go | 84 ++++++++++++++++------ 2 files changed, 72 insertions(+), 47 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 41fe0bbf5fb..c185439b777 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -506,12 +506,8 @@ func (g *governanceContract) addUserVote( totalStake *big.Int, direct bool, ) error { - nonce, err := uint64FromBytes(nonceAsBytes) - if err != nil { - return err - } - - err = g.updateUserVoteList(address, nonce.Uint64(), direct) + nonce := big.NewInt(0).SetBytes(nonceAsBytes) + err := g.updateUserVoteList(address, nonce.Uint64(), direct) if err != nil { return err } @@ -597,6 +593,10 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc g.eei.AddReturnMessage("proposal is already closed, do nothing") return vmcommon.Ok } + if !bytes.Equal(generalProposal.IssuerAddress, args.CallerAddr) { + g.eei.AddReturnMessage("only the issuer can close the proposal") + return vmcommon.UserError + } currentEpoch := g.eei.BlockChainHook().CurrentEpoch() if uint64(currentEpoch) < generalProposal.EndVoteEpoch { @@ -1088,14 +1088,8 @@ func (g *governanceContract) proposalExists(reference []byte) bool { // startEndEpochFromArguments converts the nonce string arguments to uint64 func (g *governanceContract) startEndEpochFromArguments(argStart []byte, argEnd []byte) (uint64, uint64, error) { - startVoteEpoch, err := uint64FromBytes(argStart) - if err != nil { - return 0, 0, err - } - endVoteEpoch, err := uint64FromBytes(argEnd) - if err != nil { - return 0, 0, err - } + startVoteEpoch := big.NewInt(0).SetBytes(argStart) + endVoteEpoch := big.NewInt(0).SetBytes(argEnd) currentEpoch := uint64(g.eei.BlockChainHook().CurrentEpoch()) if currentEpoch > startVoteEpoch.Uint64() || startVoteEpoch.Uint64() > endVoteEpoch.Uint64() { @@ -1108,19 +1102,6 @@ func (g *governanceContract) startEndEpochFromArguments(argStart []byte, argEnd return startVoteEpoch.Uint64(), endVoteEpoch.Uint64(), nil } -// uint64FromBytes converts a byte array to a big.Int, returns error for invalid values -func uint64FromBytes(nonce []byte) (*big.Int, error) { - voteNonce, okConvert := big.NewInt(0).SetString(string(nonce), conversionBase) - if !okConvert { - return nil, vm.ErrInvalidStartEndVoteEpoch - } - if !voteNonce.IsUint64() { - return nil, vm.ErrInvalidStartEndVoteEpoch - } - - return voteNonce, nil -} - // convertV2Config converts the passed config file to the correct V2 typed GovernanceConfig func (g *governanceContract) convertV2Config(config config.GovernanceSystemSCConfig) (*GovernanceConfigV2, error) { if config.Active.MinQuorum <= 0.01 { diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 5c0a9497cd9..8841fb41211 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -610,7 +610,7 @@ func TestGovernanceContract_ProposalInvalidVoteNonce(t *testing.T) { gsc, _, eei := createGovernanceBlockChainHookStubContextHandler() callInputArgs := [][]byte{ proposalIdentifier, - []byte("arg2"), + []byte("5"), []byte("arg3"), } callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) @@ -628,8 +628,8 @@ func TestGovernanceContract_ProposalOK(t *testing.T) { callInputArgs := [][]byte{ proposalIdentifier, - []byte("5"), - []byte("10"), + []byte("50"), + []byte("55"), } callInput := createVMInput(big.NewInt(500), "proposal", vm.GovernanceSCAddress, []byte("addr1"), callInputArgs) retCode := gsc.Execute(callInput) @@ -697,8 +697,7 @@ func TestGovernanceContract_VoteInvalidProposal(t *testing.T) { return 16 } - nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) + gsc.eei.SetStorage(append([]byte(noncePrefix), voteArgs[0]...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -727,8 +726,7 @@ func TestGovernanceContract_VoteInvalidVote(t *testing.T) { return 14 } - nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) + gsc.eei.SetStorage(append([]byte(noncePrefix), voteArgs[0]...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -764,8 +762,7 @@ func TestGovernanceContract_VoteTwice(t *testing.T) { []byte("yes"), } - nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) + gsc.eei.SetStorage(append([]byte(noncePrefix), voteArgs[0]...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -802,8 +799,7 @@ func TestGovernanceContract_DelegateVoteUserErrors(t *testing.T) { []byte("1"), []byte("yes"), } - nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(nonce.Bytes(), proposalIdentifier) + gsc.eei.SetStorage(voteArgs[0], proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -853,8 +849,8 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { {1}, big.NewInt(10000).Bytes(), } - nonce, _ := uint64FromBytes(voteArgs[0]) - gsc.eei.SetStorage(append([]byte(noncePrefix), nonce.Bytes()...), proposalIdentifier) + + gsc.eei.SetStorage(append([]byte(noncePrefix), voteArgs[0]...), proposalIdentifier) _ = gsc.saveGeneralProposal(proposalIdentifier, generalProposal) callInput := createVMInput(big.NewInt(0), "delegateVote", callerAddress, vm.GovernanceSCAddress, voteArgs) @@ -915,10 +911,11 @@ func TestGovernanceContract_CloseProposal(t *testing.T) { } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Yes: big.NewInt(10), - No: big.NewInt(10), - Veto: big.NewInt(10), - Abstain: big.NewInt(10), + Yes: big.NewInt(10), + No: big.NewInt(10), + Veto: big.NewInt(10), + Abstain: big.NewInt(10), + IssuerAddress: callerAddress, }) return proposalBytes } @@ -1108,6 +1105,52 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { callerAddress := []byte("address") proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) args := createMockGovernanceArgs() + args.Eei = &mock.SystemEIStub{ + AddReturnMessageCalled: func(msg string) { + retMessage = msg + }, + GetStorageCalled: func(key []byte) []byte { + if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { + proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ + Yes: big.NewInt(10), + No: big.NewInt(10), + Veto: big.NewInt(10), + EndVoteEpoch: 10, + IssuerAddress: callerAddress, + }) + return proposalBytes + } + + return nil + }, + BlockChainHookCalled: func() vm.BlockchainHook { + return &mock.BlockChainHookStub{ + CurrentEpochCalled: func() uint32 { + return 1 + }, + } + }, + } + + gsc, _ := NewGovernanceContract(args) + callInputArgs := [][]byte{ + proposalIdentifier, + } + callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) + retCode := gsc.Execute(callInput) + + require.Equal(t, vmcommon.UserError, retCode) + require.Contains(t, retMessage, errSubstr) +} + +func TestGovernanceContract_CloseProposalCallerNotIssuer(t *testing.T) { + t.Parallel() + + retMessage := "" + errSubstr := "only the issuer can close the proposal" + callerAddress := []byte("address") + proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) + args := createMockGovernanceArgs() args.Eei = &mock.SystemEIStub{ AddReturnMessageCalled: func(msg string) { retMessage = msg @@ -1160,9 +1203,10 @@ func TestGovernanceContract_CloseProposalComputeResultsErr(t *testing.T) { GetStorageCalled: func(key []byte) []byte { if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ - Yes: big.NewInt(10), - No: big.NewInt(10), - Veto: big.NewInt(10), + Yes: big.NewInt(10), + No: big.NewInt(10), + Veto: big.NewInt(10), + IssuerAddress: callerAddress, }) return proposalBytes } From ad04f73f9b0d1010cb4815b5b3a50282affd1709 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Apr 2023 15:24:46 +0300 Subject: [PATCH 272/335] errErd -> errorsMx into consensusComponentsHandler_test --- factory/consensus/consensusComponentsHandler_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/factory/consensus/consensusComponentsHandler_test.go b/factory/consensus/consensusComponentsHandler_test.go index e95af0cdefd..c0a89f8a08e 100644 --- a/factory/consensus/consensusComponentsHandler_test.go +++ b/factory/consensus/consensusComponentsHandler_test.go @@ -3,7 +3,7 @@ package consensus_test import ( "testing" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" consensusComp "github.com/multiversx/mx-chain-go/factory/consensus" "github.com/multiversx/mx-chain-go/testscommon" @@ -19,7 +19,7 @@ func TestNewManagedConsensusComponents(t *testing.T) { t.Parallel() managedConsensusComponents, err := consensusComp.NewManagedConsensusComponents(nil) - require.Equal(t, errErd.ErrNilConsensusComponentsFactory, err) + require.Equal(t, errorsMx.ErrNilConsensusComponentsFactory, err) require.Nil(t, managedConsensusComponents) }) t.Run("should work", func(t *testing.T) { @@ -82,7 +82,7 @@ func TestManagedConsensusComponents_ConsensusGroupSize(t *testing.T) { require.NotNil(t, managedConsensusComponents) size, err := managedConsensusComponents.ConsensusGroupSize() - require.Equal(t, errErd.ErrNilConsensusComponentsHolder, err) + require.Equal(t, errorsMx.ErrNilConsensusComponentsHolder, err) require.Zero(t, size) err = managedConsensusComponents.Create() @@ -99,7 +99,7 @@ func TestManagedConsensusComponents_CheckSubcomponents(t *testing.T) { managedConsensusComponents, _ := consensusComp.NewManagedConsensusComponents(consensusComponentsFactory) require.NotNil(t, managedConsensusComponents) - require.Equal(t, errErd.ErrNilConsensusComponentsHolder, managedConsensusComponents.CheckSubcomponents()) + require.Equal(t, errorsMx.ErrNilConsensusComponentsHolder, managedConsensusComponents.CheckSubcomponents()) err := managedConsensusComponents.Create() require.NoError(t, err) From de696dce98a297eb72e0bbbf0c71ab0eb84070d5 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 11 Apr 2023 15:26:00 +0300 Subject: [PATCH 273/335] remove nil fields from createMockConsensusComponentsFactoryArgs --- factory/consensus/consensusComponents_test.go | 36 +++++-------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index a3107f49960..ec539503107 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -49,22 +49,12 @@ func createMockConsensusComponentsFactoryArgs() consensusComp.ConsensusComponent return 1 }, }, - TxSignHasherField: nil, - UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, - AddrPubKeyConv: &mock.PubkeyConverterStub{}, - ValPubKeyConv: nil, - PathHdl: nil, - WatchdogTimer: &testscommon.WatchdogMock{}, - AlarmSch: &testscommon.AlarmSchedulerStub{}, - NtpSyncTimer: &testscommon.SyncTimerStub{}, - GenesisBlockTime: time.Time{}, - ChainIdCalled: nil, - MinTransactionVersionCalled: nil, - RoundHandlerField: nil, - EconomicsHandler: nil, - APIEconomicsHandler: nil, - RatingsConfig: nil, - RatingHandler: nil, + UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, + AddrPubKeyConv: &mock.PubkeyConverterStub{}, + WatchdogTimer: &testscommon.WatchdogMock{}, + AlarmSch: &testscommon.AlarmSchedulerStub{}, + NtpSyncTimer: &testscommon.SyncTimerStub{}, + GenesisBlockTime: time.Time{}, NodesConfig: &testscommon.NodesSetupStub{ GetShardConsensusGroupSizeCalled: func() uint32 { return 2 @@ -73,18 +63,8 @@ func createMockConsensusComponentsFactoryArgs() consensusComp.ConsensusComponent return 2 }, }, - Shuffler: nil, - EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, - EnableRoundsHandlerField: nil, - EpochNotifierWithConfirm: nil, - TxVersionCheckHandler: nil, - ChanStopProcess: nil, - StartTime: time.Time{}, - NodeTypeProviderField: nil, - WasmVMChangeLockerInternal: nil, - ProcessStatusHandlerInternal: nil, - HardforkTriggerPubKeyField: nil, - EnableEpochsHandlerField: nil, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + StartTime: time.Time{}, }, NetworkComponents: &testsMocks.NetworkComponentsStub{ Messenger: &p2pmocks.MessengerStub{}, From 7dfb94c83fd69194f0b32703e0a7a534b4c701a8 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 11 Apr 2023 15:57:30 +0300 Subject: [PATCH 274/335] added transferValueOnly logs on executeOnDest and createNewDelegationSC when needed. --- .../vm/delegation/delegationScenarios_test.go | 15 +++++++++++++-- vm/systemSmartContracts/eei.go | 13 +++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/delegation/delegationScenarios_test.go b/integrationTests/vm/delegation/delegationScenarios_test.go index 3ea763e8e08..29109b1cddc 100644 --- a/integrationTests/vm/delegation/delegationScenarios_test.go +++ b/integrationTests/vm/delegation/delegationScenarios_test.go @@ -8,6 +8,7 @@ import ( "encoding/binary" "encoding/hex" "fmt" + "github.com/multiversx/mx-chain-go/config" "math/big" "strings" "testing" @@ -31,11 +32,12 @@ import ( "github.com/stretchr/testify/require" ) -func TestDelegationSystemNodesOperationsTest(t *testing.T) { +func TestDelegationSystemNodesOperationsTestBackwardComp(t *testing.T) { tpn := integrationTests.NewTestProcessorNode(integrationTests.ArgTestProcessorNode{ MaxShards: 1, NodeShardId: core.MetachainShardId, TxSignPrivKeyShardId: 0, + EpochsConfig: &config.EnableEpochs{MultiClaimOnDelegationEnableEpoch: 5}, }) tpn.InitDelegationManager() maxDelegationCap := big.NewInt(5000) @@ -45,7 +47,7 @@ func TestDelegationSystemNodesOperationsTest(t *testing.T) { tpn.BlockchainHook.SetCurrentHeader(&block.MetaBlock{Nonce: 1}) tpn.EpochNotifier.CheckEpoch(&testscommon.HeaderHandlerStub{ - EpochField: integrationTests.UnreachableEpoch + 1, + EpochField: 3, }) // create new delegation contract @@ -69,6 +71,15 @@ func TestDelegationSystemNodesOperationsTest(t *testing.T) { } assert.Equal(t, 2, numExpectedScrsFound) + + tpn.EpochNotifier.CheckEpoch(&testscommon.HeaderHandlerStub{ + EpochField: 6, + }) + scrsHandler.CreateBlockStarted() + // create new delegation contract + delegationScAddress = deployNewSc(t, tpn, maxDelegationCap, serviceFee, value, bytes.Repeat([]byte{1}, 32)) + assert.NotNil(t, delegationScAddress) + assert.Equal(t, 0, len(scrsHandler.GetAllCurrentFinishedTxs())) } func TestDelegationSystemNodesOperations(t *testing.T) { diff --git a/vm/systemSmartContracts/eei.go b/vm/systemSmartContracts/eei.go index 9caea39e71b..4ca1437764c 100644 --- a/vm/systemSmartContracts/eei.go +++ b/vm/systemSmartContracts/eei.go @@ -13,6 +13,8 @@ import ( vmcommon "github.com/multiversx/mx-chain-vm-common-go" ) +const transferValueOnly = "transferValueOnly" + type vmContext struct { blockChainHook vm.BlockchainHook cryptoHook vmcommon.CryptoHook @@ -426,6 +428,17 @@ func (host *vmContext) transferBeforeInternalExec(callInput *vmcommon.ContractCa 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.RecipientAddr, callInput.CallValue.Bytes()}, + Data: []byte{}, + } + host.AddLogEntry(logEntry) + } + return nil } From ba4bcb20f293a82c2de5d6eb870f58141e07c1b6 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Apr 2023 09:47:57 +0300 Subject: [PATCH 275/335] goimports --- integrationTests/vm/delegation/delegationScenarios_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrationTests/vm/delegation/delegationScenarios_test.go b/integrationTests/vm/delegation/delegationScenarios_test.go index 29109b1cddc..32d828b4516 100644 --- a/integrationTests/vm/delegation/delegationScenarios_test.go +++ b/integrationTests/vm/delegation/delegationScenarios_test.go @@ -8,7 +8,6 @@ import ( "encoding/binary" "encoding/hex" "fmt" - "github.com/multiversx/mx-chain-go/config" "math/big" "strings" "testing" @@ -21,6 +20,7 @@ import ( "github.com/multiversx/mx-chain-crypto-go/signing" "github.com/multiversx/mx-chain-crypto-go/signing/mcl" mclsig "github.com/multiversx/mx-chain-crypto-go/signing/mcl/singlesig" + "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/dataRetriever/dataPool" "github.com/multiversx/mx-chain-go/integrationTests" "github.com/multiversx/mx-chain-go/process" From 51088ba212005d69cf6bc6dc8914b45e782debc7 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Apr 2023 10:27:57 +0300 Subject: [PATCH 276/335] return error in case of errors. --- vm/systemSmartContracts/delegation.go | 3 +++ vm/systemSmartContracts/esdt.go | 3 +++ vm/systemSmartContracts/validator.go | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/vm/systemSmartContracts/delegation.go b/vm/systemSmartContracts/delegation.go index 75d5b6fbd27..9cf75a9b6fa 100644 --- a/vm/systemSmartContracts/delegation.go +++ b/vm/systemSmartContracts/delegation.go @@ -2088,6 +2088,9 @@ func (d *delegation) withdraw(args *vmcommon.ContractCallInput) vmcommon.ReturnC } if totalUnBondable.Cmp(zero) == 0 { d.eei.AddReturnMessage("nothing to unBond") + if d.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { + return vmcommon.UserError + } return vmcommon.Ok } diff --git a/vm/systemSmartContracts/esdt.go b/vm/systemSmartContracts/esdt.go index 7b48d2c6912..8800a286ebc 100644 --- a/vm/systemSmartContracts/esdt.go +++ b/vm/systemSmartContracts/esdt.go @@ -812,6 +812,9 @@ func (e *esdt) burn(args *vmcommon.ContractCallInput) vmcommon.ReturnCode { } e.eei.AddReturnMessage("token is not burnable") + if e.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { + return vmcommon.UserError + } return vmcommon.Ok } diff --git a/vm/systemSmartContracts/validator.go b/vm/systemSmartContracts/validator.go index 5f73941ae28..01c4ba5de86 100644 --- a/vm/systemSmartContracts/validator.go +++ b/vm/systemSmartContracts/validator.go @@ -1709,6 +1709,9 @@ func (v *validatorSC) unBondTokens(args *vmcommon.ContractCallInput) vmcommon.Re } if totalUnBond.Cmp(zero) == 0 { v.eei.AddReturnMessage("no tokens that can be unbond at this time") + if v.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { + return vmcommon.UserError + } return vmcommon.Ok } @@ -2134,6 +2137,9 @@ func (v *validatorSC) getBlsKeysStatus(args *vmcommon.ContractCallInput) vmcommo if len(registrationData.BlsPubKeys) == 0 { v.eei.AddReturnMessage("no bls keys") + if v.enableEpochsHandler.IsMultiClaimOnDelegationEnabled() { + return vmcommon.UserError + } return vmcommon.Ok } From c981c1b4f3bdc5976547b91986827991cf69505f Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Apr 2023 10:46:12 +0300 Subject: [PATCH 277/335] add unit tests --- vm/systemSmartContracts/delegation_test.go | 5 +++++ vm/systemSmartContracts/validator_test.go | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/vm/systemSmartContracts/delegation_test.go b/vm/systemSmartContracts/delegation_test.go index 5cb17b9bac8..ca88bae93e9 100644 --- a/vm/systemSmartContracts/delegation_test.go +++ b/vm/systemSmartContracts/delegation_test.go @@ -53,6 +53,7 @@ func createMockArgumentsForDelegation() ArgsNewDelegation { IsComputeRewardCheckpointFlagEnabledField: true, IsValidatorToDelegationFlagEnabledField: true, IsReDelegateBelowMinCheckFlagEnabledField: true, + IsMultiClaimOnDelegationEnabledField: true, }, } } @@ -2092,6 +2093,10 @@ func TestDelegationSystemSC_ExecuteWithdraw(t *testing.T) { output := d.Execute(vmInput) assert.Equal(t, vmcommon.Ok, output) + output = d.Execute(vmInput) + assert.Equal(t, vmcommon.UserError, output) + assert.Equal(t, eei.returnMessage, "nothing to unBond") + gFundData, _ := d.getGlobalFundData() assert.Equal(t, big.NewInt(80), gFundData.TotalUnStaked) diff --git a/vm/systemSmartContracts/validator_test.go b/vm/systemSmartContracts/validator_test.go index 328414510c6..4f4d9efcae8 100644 --- a/vm/systemSmartContracts/validator_test.go +++ b/vm/systemSmartContracts/validator_test.go @@ -63,6 +63,7 @@ func createMockArgumentsForValidatorSCWithSystemScAddresses( IsUnBondTokensV2FlagEnabledField: true, IsValidatorToDelegationFlagEnabledField: true, IsDoubleKeyProtectionFlagEnabledField: true, + IsMultiClaimOnDelegationEnabledField: true, }, } @@ -3028,7 +3029,7 @@ func TestValidatorStakingSC_getBlsStatusNoBlsKeys(t *testing.T) { arguments.Arguments = append(arguments.Arguments, []byte("erd key")) returnCode := sc.Execute(arguments) - assert.Equal(t, vmcommon.Ok, returnCode) + assert.Equal(t, vmcommon.UserError, returnCode) assert.True(t, strings.Contains(eei.returnMessage, "no bls keys")) } From 736f30702c9560a45f4a6bd033ae93b01debd76e Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Apr 2023 12:03:19 +0300 Subject: [PATCH 278/335] return user error when needed --- vm/systemSmartContracts/governance.go | 2 +- vm/systemSmartContracts/governance_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index c185439b777..0e2f25c3cd8 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -591,7 +591,7 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc } if generalProposal.Closed { g.eei.AddReturnMessage("proposal is already closed, do nothing") - return vmcommon.Ok + return vmcommon.UserError } if !bytes.Equal(generalProposal.IssuerAddress, args.CallerAddr) { g.eei.AddReturnMessage("only the issuer can close the proposal") diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 8841fb41211..afb475990e0 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -1093,7 +1093,7 @@ func TestGovernanceContract_CloseProposalAlreadyClosed(t *testing.T) { callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) - require.Equal(t, vmcommon.Ok, retCode) + require.Equal(t, vmcommon.UserError, retCode) require.Contains(t, retMessage, errSubstr) } From c2d776eaae4ae179fdb84fb45529cdad7d76ec43 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Apr 2023 19:42:53 +0300 Subject: [PATCH 279/335] added flag and fixed order of adding scrs to miniblocks --- cmd/node/config/enableEpochs.toml | 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 | 4 + factory/processing/blockProcessorCreator.go | 84 +-- genesis/process/metaGenesisBlockCreator.go | 20 +- genesis/process/shardGenesisBlockCreator.go | 20 +- integrationTests/testProcessorNode.go | 84 +-- integrationTests/vm/testInitializer.go | 20 +- process/block/postprocess/basePostProcess.go | 6 +- .../block/postprocess/intermediateResults.go | 80 ++- .../postprocess/intermediateResults_test.go | 541 ++++++------------ .../postprocess/testIntermediateResult.go | 18 +- process/coordinator/process_test.go | 60 +- .../intermediateProcessorsContainerFactory.go | 91 +-- ...rmediateProcessorsContainerFactory_test.go | 131 ++--- .../intermediateProcessorsContainerFactory.go | 90 +-- ...rmediateProcessorsContainerFactory_test.go | 140 ++--- sharding/mock/enableEpochsHandlerMock.go | 5 + testscommon/enableEpochsHandlerStub.go | 9 + 23 files changed, 631 insertions(+), 789 deletions(-) diff --git a/cmd/node/config/enableEpochs.toml b/cmd/node/config/enableEpochs.toml index 7bd4ffbcd41..ac16930c9a0 100644 --- a/cmd/node/config/enableEpochs.toml +++ b/cmd/node/config/enableEpochs.toml @@ -242,6 +242,9 @@ # RuntimeCodeSizeFixEnableEpoch represents the epoch when the code size fix in the VM is enabled RuntimeCodeSizeFixEnableEpoch = 2 + # KeepExecOrderOnCreatedSCRsEnableEpoch represents the epoch when the execution order of created SCRs is ensured + KeepExecOrderOnCreatedSCRsEnableEpoch = 2 + # BLSMultiSignerEnableEpoch represents the activation epoch for different types of BLS multi-signers BLSMultiSignerEnableEpoch = [ { EnableEpoch = 0, Type = "no-KOSK"}, diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index f24b8fdf952..a170318df99 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -118,6 +118,7 @@ func (handler *enableEpochsHandler) EpochConfirmed(epoch uint32, _ uint64) { handler.setFlagValue(epoch >= handler.enableEpochsConfig.MaxBlockchainHookCountersEnableEpoch, handler.maxBlockchainHookCountersFlag, "maxBlockchainHookCountersFlag", epoch, handler.enableEpochsConfig.MaxBlockchainHookCountersEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.WipeSingleNFTLiquidityDecreaseEnableEpoch, handler.wipeSingleNFTLiquidityDecreaseFlag, "wipeSingleNFTLiquidityDecreaseFlag", epoch, handler.enableEpochsConfig.WipeSingleNFTLiquidityDecreaseEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch, handler.alwaysSaveTokenMetaDataFlag, "alwaysSaveTokenMetaDataFlag", epoch, handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch) + handler.setFlagValue(epoch >= handler.enableEpochsConfig.KeepExecOrderOnCreatedSCRsEnableEpoch, handler.keepExecOrderOnCreatedSCRsFlag, "keepExecOrderOnCreatedSCRsFlag", epoch, handler.enableEpochsConfig.KeepExecOrderOnCreatedSCRsEnableEpoch) } func (handler *enableEpochsHandler) setFlagValue(value bool, flag *atomic.Flag, flagName string, epoch uint32, flagEpoch uint32) { diff --git a/common/enablers/enableEpochsHandler_test.go b/common/enablers/enableEpochsHandler_test.go index 661d684f010..b920d06e519 100644 --- a/common/enablers/enableEpochsHandler_test.go +++ b/common/enablers/enableEpochsHandler_test.go @@ -91,6 +91,7 @@ func createEnableEpochsConfig() config.EnableEpochs { WipeSingleNFTLiquidityDecreaseEnableEpoch: 75, AlwaysSaveTokenMetaDataEnableEpoch: 76, RuntimeCodeSizeFixEnableEpoch: 77, + KeepExecOrderOnCreatedSCRsEnableEpoch: 78, } } @@ -213,6 +214,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.True(t, handler.IsMaxBlockchainHookCountersFlagEnabled()) assert.True(t, handler.IsAlwaysSaveTokenMetaDataEnabled()) assert.True(t, handler.IsRuntimeCodeSizeFixEnabled()) + assert.False(t, handler.IsKeepExecOrderOnCreatedSCRsEnabled()) }) t.Run("flags with == condition should be set, along with all >=", func(t *testing.T) { t.Parallel() @@ -313,6 +315,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.True(t, handler.IsWipeSingleNFTLiquidityDecreaseEnabled()) assert.True(t, handler.IsAlwaysSaveTokenMetaDataEnabled()) assert.True(t, handler.IsRuntimeCodeSizeFixEnabled()) + assert.True(t, handler.IsKeepExecOrderOnCreatedSCRsEnabled()) }) t.Run("flags with < should be set", func(t *testing.T) { t.Parallel() @@ -408,5 +411,6 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { assert.False(t, handler.IsWipeSingleNFTLiquidityDecreaseEnabled()) assert.False(t, handler.IsAlwaysSaveTokenMetaDataEnabled()) assert.False(t, handler.IsRuntimeCodeSizeFixEnabled()) + assert.False(t, handler.IsKeepExecOrderOnCreatedSCRsEnabled()) }) } diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index fe11469f4bb..e74ca765cc8 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -90,6 +90,7 @@ type epochFlagsHolder struct { maxBlockchainHookCountersFlag *atomic.Flag wipeSingleNFTLiquidityDecreaseFlag *atomic.Flag alwaysSaveTokenMetaDataFlag *atomic.Flag + keepExecOrderOnCreatedSCRsFlag *atomic.Flag } func newEpochFlagsHolder() *epochFlagsHolder { @@ -179,6 +180,7 @@ func newEpochFlagsHolder() *epochFlagsHolder { maxBlockchainHookCountersFlag: &atomic.Flag{}, wipeSingleNFTLiquidityDecreaseFlag: &atomic.Flag{}, alwaysSaveTokenMetaDataFlag: &atomic.Flag{}, + keepExecOrderOnCreatedSCRsFlag: &atomic.Flag{}, } } @@ -659,3 +661,8 @@ func (holder *epochFlagsHolder) IsWipeSingleNFTLiquidityDecreaseEnabled() bool { func (holder *epochFlagsHolder) IsAlwaysSaveTokenMetaDataEnabled() bool { return holder.alwaysSaveTokenMetaDataFlag.IsSet() } + +// IsKeepExecOrderOnCreatedSCRsEnabled returns true if keepExecOrderOnCreatedSCRsFlag is enabled +func (holder *epochFlagsHolder) IsKeepExecOrderOnCreatedSCRsEnabled() bool { + return holder.keepExecOrderOnCreatedSCRsFlag.IsSet() +} diff --git a/common/interface.go b/common/interface.go index 33137234db7..f1b5bec4c8c 100644 --- a/common/interface.go +++ b/common/interface.go @@ -328,6 +328,7 @@ type EnableEpochsHandler interface { IsMaxBlockchainHookCountersFlagEnabled() bool IsWipeSingleNFTLiquidityDecreaseEnabled() bool IsAlwaysSaveTokenMetaDataEnabled() bool + IsKeepExecOrderOnCreatedSCRsEnabled() bool IsInterfaceNil() bool } diff --git a/config/epochConfig.go b/config/epochConfig.go index e729f362d91..7efc1cd4659 100644 --- a/config/epochConfig.go +++ b/config/epochConfig.go @@ -93,6 +93,7 @@ type EnableEpochs struct { MaxBlockchainHookCountersEnableEpoch uint32 WipeSingleNFTLiquidityDecreaseEnableEpoch uint32 AlwaysSaveTokenMetaDataEnableEpoch uint32 + KeepExecOrderOnCreatedSCRsEnableEpoch uint32 BLSMultiSignerEnableEpoch []MultiSignerConfig } diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 2c2173c2ee1..004fe455e7e 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -684,6 +684,9 @@ func TestEnableEpochConfig(t *testing.T) { # RuntimeMemStoreLimitEnableEpoch represents the epoch when the condition for Runtime MemStore is enabled RuntimeMemStoreLimitEnableEpoch = 63 + # KeepExecOrderOnCreatedSCRsEnableEpoch represents the epoch when the execution order of created SCRs is ensured + KeepExecOrderOnCreatedSCRsEnableEpoch = 64 + # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ { EpochEnable = 44, MaxNumNodes = 2169, NodesToShufflePerShard = 80 }, @@ -779,6 +782,7 @@ func TestEnableEpochConfig(t *testing.T) { AlwaysSaveTokenMetaDataEnableEpoch: 61, RuntimeCodeSizeFixEnableEpoch: 62, RuntimeMemStoreLimitEnableEpoch: 63, + KeepExecOrderOnCreatedSCRsEnableEpoch: 64, BLSMultiSignerEnableEpoch: []MultiSignerConfig{ { EnableEpoch: 0, diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index 4f73a39db02..815e9f2470e 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -162,15 +162,18 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( return nil, err } - interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory( - pcf.bootstrapComponents.ShardCoordinator(), - pcf.coreData.InternalMarshalizer(), - pcf.coreData.Hasher(), - pcf.coreData.AddressPubKeyConverter(), - pcf.data.StorageService(), - pcf.data.Datapool(), - pcf.coreData.EconomicsData(), - ) + 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(), + } + + interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { return nil, err } @@ -480,15 +483,18 @@ func (pcf *processComponentsFactory) newMetaBlockProcessor( return nil, err } - interimProcFactory, err := metachain.NewIntermediateProcessorsContainerFactory( - pcf.bootstrapComponents.ShardCoordinator(), - pcf.coreData.InternalMarshalizer(), - pcf.coreData.Hasher(), - pcf.coreData.AddressPubKeyConverter(), - pcf.data.StorageService(), - pcf.data.Datapool(), - pcf.coreData.EconomicsData(), - ) + 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(), + } + + interimProcFactory, err := metachain.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { return nil, err } @@ -953,15 +959,18 @@ func (pcf *processComponentsFactory) createShardTxSimulatorProcessor( return nil, err } - interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory( - pcf.bootstrapComponents.ShardCoordinator(), - pcf.coreData.InternalMarshalizer(), - pcf.coreData.Hasher(), - pcf.coreData.AddressPubKeyConverter(), - disabled.NewChainStorer(), - pcf.data.Datapool(), - &processDisabled.FeeHandler{}, - ) + argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + Marshalizer: pcf.coreData.InternalMarshalizer(), + Hasher: pcf.coreData.Hasher(), + PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), + Store: disabled.NewChainStorer(), + PoolsHolder: pcf.data.Datapool(), + EconomicsFee: &processDisabled.FeeHandler{}, + EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + } + + interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { return nil, err } @@ -1045,15 +1054,18 @@ func (pcf *processComponentsFactory) createMetaTxSimulatorProcessor( scProcArgs smartContract.ArgsNewSmartContractProcessor, txTypeHandler process.TxTypeHandler, ) (process.VirtualMachinesContainerFactory, error) { - interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory( - pcf.bootstrapComponents.ShardCoordinator(), - pcf.coreData.InternalMarshalizer(), - pcf.coreData.Hasher(), - pcf.coreData.AddressPubKeyConverter(), - disabled.NewChainStorer(), - pcf.data.Datapool(), - &processDisabled.FeeHandler{}, - ) + argsFactory := metachain.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + Marshalizer: pcf.coreData.InternalMarshalizer(), + Hasher: pcf.coreData.Hasher(), + PubkeyConverter: pcf.coreData.AddressPubKeyConverter(), + Store: disabled.NewChainStorer(), + PoolsHolder: pcf.data.Datapool(), + EconomicsFee: &processDisabled.FeeHandler{}, + EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), + } + + interimProcFactory, err := metachain.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { return nil, err } diff --git a/genesis/process/metaGenesisBlockCreator.go b/genesis/process/metaGenesisBlockCreator.go index bfb4f26cb53..88b9649f3bc 100644 --- a/genesis/process/metaGenesisBlockCreator.go +++ b/genesis/process/metaGenesisBlockCreator.go @@ -357,15 +357,17 @@ func createProcessorsForMetaGenesisBlock(arg ArgsGenesisBlockCreator, enableEpoc } genesisFeeHandler := &disabled.FeeHandler{} - interimProcFactory, err := metachain.NewIntermediateProcessorsContainerFactory( - arg.ShardCoordinator, - arg.Core.InternalMarshalizer(), - arg.Core.Hasher(), - arg.Core.AddressPubKeyConverter(), - arg.Data.StorageService(), - arg.Data.Datapool(), - genesisFeeHandler, - ) + 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, + } + interimProcFactory, err := metachain.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { return nil, err } diff --git a/genesis/process/shardGenesisBlockCreator.go b/genesis/process/shardGenesisBlockCreator.go index aa140fe629a..f8b52d5a3ae 100644 --- a/genesis/process/shardGenesisBlockCreator.go +++ b/genesis/process/shardGenesisBlockCreator.go @@ -461,15 +461,17 @@ func createProcessorsForShardGenesisBlock(arg ArgsGenesisBlockCreator, enableEpo } genesisFeeHandler := &disabled.FeeHandler{} - interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory( - arg.ShardCoordinator, - arg.Core.InternalMarshalizer(), - arg.Core.Hasher(), - arg.Core.AddressPubKeyConverter(), - arg.Data.StorageService(), - arg.Data.Datapool(), - genesisFeeHandler, - ) + 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, + } + interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { return nil, err } diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 2bd652baf8c..795a0f8f144 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -1422,27 +1422,31 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u } } - interimProcFactory, _ := shard.NewIntermediateProcessorsContainerFactory( - tpn.ShardCoordinator, - TestMarshalizer, - TestHasher, - TestAddressPubkeyConverter, - tpn.Storage, - tpn.DataPool, - tpn.EconomicsData, - ) + argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: tpn.ShardCoordinator, + Marshalizer: TestMarshalizer, + Hasher: TestHasher, + PubkeyConverter: TestAddressPubkeyConverter, + Store: tpn.Storage, + PoolsHolder: tpn.DataPool, + EconomicsFee: tpn.EconomicsData, + EnableEpochsHandler: tpn.EnableEpochsHandler, + } + interimProcFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) tpn.InterimProcContainer, _ = interimProcFactory.Create() - tpn.ScrForwarder, _ = postprocess.NewTestIntermediateResultsProcessor( - TestHasher, - TestMarshalizer, - tpn.ShardCoordinator, - TestAddressPubkeyConverter, - tpn.Storage, - dataBlock.SmartContractResultBlock, - tpn.DataPool.CurrentBlockTxs(), - tpn.EconomicsData, - ) + 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, + } + tpn.ScrForwarder, _ = postprocess.NewTestIntermediateResultsProcessor(argsNewIntermediateResultsProc) tpn.InterimProcContainer.Remove(dataBlock.SmartContractResultBlock) _ = tpn.InterimProcContainer.Add(dataBlock.SmartContractResultBlock, tpn.ScrForwarder) @@ -1651,27 +1655,31 @@ func (tpn *TestProcessorNode) initInnerProcessors(gasMap map[string]map[string]u } func (tpn *TestProcessorNode) initMetaInnerProcessors(gasMap map[string]map[string]uint64) { - interimProcFactory, _ := metaProcess.NewIntermediateProcessorsContainerFactory( - tpn.ShardCoordinator, - TestMarshalizer, - TestHasher, - TestAddressPubkeyConverter, - tpn.Storage, - tpn.DataPool, - tpn.EconomicsData, - ) + argsFactory := metaProcess.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: tpn.ShardCoordinator, + Marshalizer: TestMarshalizer, + Hasher: TestHasher, + PubkeyConverter: TestAddressPubkeyConverter, + Store: tpn.Storage, + PoolsHolder: tpn.DataPool, + EconomicsFee: tpn.EconomicsData, + EnableEpochsHandler: tpn.EnableEpochsHandler, + } + interimProcFactory, _ := metaProcess.NewIntermediateProcessorsContainerFactory(argsFactory) tpn.InterimProcContainer, _ = interimProcFactory.Create() - tpn.ScrForwarder, _ = postprocess.NewTestIntermediateResultsProcessor( - TestHasher, - TestMarshalizer, - tpn.ShardCoordinator, - TestAddressPubkeyConverter, - tpn.Storage, - dataBlock.SmartContractResultBlock, - tpn.DataPool.CurrentBlockTxs(), - tpn.EconomicsData, - ) + 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, + } + tpn.ScrForwarder, _ = postprocess.NewTestIntermediateResultsProcessor(argsNewIntermediateResultsProc) tpn.InterimProcContainer.Remove(dataBlock.SmartContractResultBlock) _ = tpn.InterimProcContainer.Add(dataBlock.SmartContractResultBlock, tpn.ScrForwarder) diff --git a/integrationTests/vm/testInitializer.go b/integrationTests/vm/testInitializer.go index 1acb1994d02..30bc8a859fa 100644 --- a/integrationTests/vm/testInitializer.go +++ b/integrationTests/vm/testInitializer.go @@ -836,15 +836,17 @@ func CreateTxProcessorWithOneSCExecutorWithVMs( return nil, err } - interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory( - shardCoordinator, - integrationtests.TestMarshalizer, - integrationtests.TestHasher, - pubkeyConv, - disabled.NewChainStorer(), - poolsHolder, - &processDisabled.FeeHandler{}, - ) + argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: shardCoordinator, + Marshalizer: integrationtests.TestMarshalizer, + Hasher: integrationtests.TestHasher, + PubkeyConverter: pubkeyConv, + Store: disabled.NewChainStorer(), + PoolsHolder: poolsHolder, + EconomicsFee: &processDisabled.FeeHandler{}, + EnableEpochsHandler: enableEpochsHandler, + } + interimProcFactory, err := shard.NewIntermediateProcessorsContainerFactory(argsFactory) if err != nil { return nil, err } diff --git a/process/block/postprocess/basePostProcess.go b/process/block/postprocess/basePostProcess.go index 38048f2f7e7..a5fbfa807eb 100644 --- a/process/block/postprocess/basePostProcess.go +++ b/process/block/postprocess/basePostProcess.go @@ -20,6 +20,7 @@ var _ process.DataMarshalizer = (*basePostProcessor)(nil) type txShardInfo struct { senderShardID uint32 receiverShardID uint32 + index uint32 } type txInfo struct { @@ -41,6 +42,7 @@ type basePostProcessor struct { mapProcessedResult map[string][][]byte intraShardMiniBlock *block.MiniBlock economicsFee process.FeeHandler + index uint32 } // SaveCurrentIntermediateTxToStorage saves all current intermediate results to the provided storage unit @@ -77,6 +79,7 @@ func (bpp *basePostProcessor) CreateBlockStarted() { bpp.interResultsForBlock = make(map[string]*txInfo) bpp.intraShardMiniBlock = nil bpp.mapProcessedResult = make(map[string][][]byte) + bpp.index = 0 bpp.mutInterResultsForBlock.Unlock() } @@ -273,7 +276,8 @@ func (bpp *basePostProcessor) addIntermediateTxToResultsForBlock( sndShardID uint32, rcvShardID uint32, ) { - addScrShardInfo := &txShardInfo{receiverShardID: rcvShardID, senderShardID: sndShardID} + bpp.index++ + addScrShardInfo := &txShardInfo{receiverShardID: rcvShardID, senderShardID: sndShardID, index: bpp.index} scrInfo := &txInfo{tx: txHandler, txShardInfo: addScrShardInfo} bpp.interResultsForBlock[string(txHash)] = scrInfo diff --git a/process/block/postprocess/intermediateResults.go b/process/block/postprocess/intermediateResults.go index 2180bd034ce..d051fa41e65 100644 --- a/process/block/postprocess/intermediateResults.go +++ b/process/block/postprocess/intermediateResults.go @@ -12,6 +12,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/smartContractResult" "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" @@ -21,61 +22,72 @@ import ( var _ process.IntermediateTransactionHandler = (*intermediateResultsProcessor)(nil) type intermediateResultsProcessor struct { - pubkeyConv core.PubkeyConverter - blockType block.Type - currTxs dataRetriever.TransactionCacher + pubkeyConv core.PubkeyConverter + blockType block.Type + currTxs dataRetriever.TransactionCacher + enableEpochsHandler common.EnableEpochsHandler *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 +} + // NewIntermediateResultsProcessor creates a new intermediate results processor func NewIntermediateResultsProcessor( - hasher hashing.Hasher, - marshalizer marshal.Marshalizer, - coordinator sharding.Coordinator, - pubkeyConv core.PubkeyConverter, - store dataRetriever.StorageService, - blockType block.Type, - currTxs dataRetriever.TransactionCacher, - economicsFee process.FeeHandler, + args ArgsNewIntermediateResultsProcessor, ) (*intermediateResultsProcessor, error) { - if check.IfNil(hasher) { + if check.IfNil(args.Hasher) { return nil, process.ErrNilHasher } - if check.IfNil(marshalizer) { + if check.IfNil(args.Marshalizer) { return nil, process.ErrNilMarshalizer } - if check.IfNil(coordinator) { + if check.IfNil(args.Coordinator) { return nil, process.ErrNilShardCoordinator } - if check.IfNil(pubkeyConv) { + if check.IfNil(args.PubkeyConv) { return nil, process.ErrNilPubkeyConverter } - if check.IfNil(store) { + if check.IfNil(args.Store) { return nil, process.ErrNilStorage } - if check.IfNil(currTxs) { + if check.IfNil(args.CurrTxs) { return nil, process.ErrNilTxForCurrentBlockHandler } - if check.IfNil(economicsFee) { + if check.IfNil(args.EconomicsFee) { return nil, process.ErrNilEconomicsFeeHandler } + if check.IfNil(args.EnableEpochsHandler) { + return nil, process.ErrNilEnableEpochsHandler + } base := &basePostProcessor{ - hasher: hasher, - marshalizer: marshalizer, - shardCoordinator: coordinator, - store: store, + hasher: args.Hasher, + marshalizer: args.Marshalizer, + shardCoordinator: args.Coordinator, + store: args.Store, storageType: dataRetriever.UnsignedTransactionUnit, mapProcessedResult: make(map[string][][]byte), - economicsFee: economicsFee, + economicsFee: args.EconomicsFee, } irp := &intermediateResultsProcessor{ - basePostProcessor: base, - pubkeyConv: pubkeyConv, - blockType: blockType, - currTxs: currTxs, + basePostProcessor: base, + pubkeyConv: args.PubkeyConv, + blockType: args.BlockType, + currTxs: args.CurrTxs, + enableEpochsHandler: args.EnableEpochsHandler, } irp.interResultsForBlock = make(map[string]*txInfo) @@ -130,9 +142,17 @@ func (irp *intermediateResultsProcessor) CreateAllInterMiniBlocks() []*block.Min miniblock.ReceiverShardID = shId miniblock.Type = irp.blockType - sort.Slice(miniblock.TxHashes, func(a, b int) bool { - return bytes.Compare(miniblock.TxHashes[a], miniblock.TxHashes[b]) < 0 - }) + if irp.enableEpochsHandler.IsKeepExecOrderOnCreatedSCRsEnabled() { + sort.Slice(miniblock.TxHashes, func(a, b int) bool { + scrInfoA := irp.interResultsForBlock[string(miniblock.TxHashes[a])] + scrInfoB := irp.interResultsForBlock[string(miniblock.TxHashes[b])] + return scrInfoA.index < scrInfoB.index + }) + } else { + sort.Slice(miniblock.TxHashes, func(a, b int) bool { + return bytes.Compare(miniblock.TxHashes[a], miniblock.TxHashes[b]) < 0 + }) + } log.Debug("intermediateResultsProcessor.CreateAllInterMiniBlocks", "type", miniblock.Type, diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index 12773c61081..90658245a77 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -28,19 +28,27 @@ func createMockPubkeyConverter() *testscommon.PubkeyConverterMock { return testscommon.NewPubkeyConverterMock(32) } +func createMockArgsNewIntermediateResultsProcessor() ArgsNewIntermediateResultsProcessor { + args := ArgsNewIntermediateResultsProcessor{ + Hasher: &hashingMocks.HasherMock{}, + Marshalizer: &mock.MarshalizerMock{}, + Coordinator: mock.NewMultiShardsCoordinatorMock(5), + PubkeyConv: createMockPubkeyConverter(), + Store: &storage.ChainStorerStub{}, + BlockType: block.TxBlock, + CurrTxs: &mock.TxForCurrentBlockStub{}, + EconomicsFee: &mock.FeeHandlerStub{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + } + return args +} + func TestNewIntermediateResultsProcessor_NilHashes(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - nil, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(5), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Hasher = nil + irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) assert.Equal(t, process.ErrNilHasher, err) @@ -49,16 +57,9 @@ func TestNewIntermediateResultsProcessor_NilHashes(t *testing.T) { func TestNewIntermediateResultsProcessor_NilMarshalizer(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - nil, - mock.NewMultiShardsCoordinatorMock(5), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Marshalizer = nil + irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) assert.Equal(t, process.ErrNilMarshalizer, err) @@ -67,16 +68,9 @@ func TestNewIntermediateResultsProcessor_NilMarshalizer(t *testing.T) { func TestNewIntermediateResultsProcessor_NilShardCoordinator(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - nil, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = nil + irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) assert.Equal(t, process.ErrNilShardCoordinator, err) @@ -85,16 +79,9 @@ func TestNewIntermediateResultsProcessor_NilShardCoordinator(t *testing.T) { func TestNewIntermediateResultsProcessor_NilPubkeyConverter(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(5), - nil, - &storage.ChainStorerStub{}, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.PubkeyConv = nil + irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) assert.Equal(t, process.ErrNilPubkeyConverter, err) @@ -103,16 +90,9 @@ func TestNewIntermediateResultsProcessor_NilPubkeyConverter(t *testing.T) { func TestNewIntermediateResultsProcessor_NilStorer(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(5), - createMockPubkeyConverter(), - nil, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Store = nil + irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) assert.Equal(t, process.ErrNilStorage, err) @@ -121,16 +101,9 @@ func TestNewIntermediateResultsProcessor_NilStorer(t *testing.T) { func TestNewIntermediateResultsProcessor_NilTxForCurrentBlockHandler(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(5), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.TxBlock, - nil, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.CurrTxs = nil + irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) assert.Equal(t, process.ErrNilTxForCurrentBlockHandler, err) @@ -139,34 +112,29 @@ func TestNewIntermediateResultsProcessor_NilTxForCurrentBlockHandler(t *testing. func TestNewIntermediateResultsProcessor_NilEconomicsFeeHandler(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(5), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - nil, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.EconomicsFee = nil + irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) } +func TestNewIntermediateResultsProcessor_NilEpochHandler(t *testing.T) { + t.Parallel() + + args := createMockArgsNewIntermediateResultsProcessor() + args.EnableEpochsHandler = nil + irp, err := NewIntermediateResultsProcessor(args) + + assert.Nil(t, irp) + assert.Equal(t, process.ErrNilEpochHandler, err) +} + func TestNewIntermediateResultsProcessor_Good(t *testing.T) { t.Parallel() - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(5), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + irp, err := NewIntermediateResultsProcessor(createMockArgsNewIntermediateResultsProcessor()) assert.NotNil(t, irp) assert.Nil(t, err) @@ -176,16 +144,9 @@ func TestIntermediateResultsProcessor_getShardIdsFromAddressesGood(t *testing.T) t.Parallel() nrShards := 5 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(uint32(nrShards)), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -201,16 +162,9 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactions(t *testing.T) t.Parallel() nrShards := 5 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(uint32(nrShards)), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -223,16 +177,9 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsWrongType(t *te t.Parallel() nrShards := 5 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(uint32(nrShards)), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -248,16 +195,9 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsNilSender(t *te t.Parallel() shardC := mock.NewMultiShardsCoordinatorMock(2) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardC, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardC + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -281,16 +221,9 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsNilReceiver(t * t.Parallel() shardC := mock.NewMultiShardsCoordinatorMock(2) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardC, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardC + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -321,20 +254,14 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsShardIdMismatch return 1 }, } - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardC, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardC + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockCalled: func() uint64 { + return maxGasLimitPerBlock }, - ) + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -355,16 +282,9 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsNegativeValueIn t.Parallel() shardC := mock.NewMultiShardsCoordinatorMock(2) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardC, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardC + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -395,20 +315,14 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsAddrGood(t *tes t.Parallel() nrShards := 5 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(uint32(nrShards)), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockCalled: func() uint64 { + return maxGasLimitPerBlock }, - ) + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -429,16 +343,9 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsAddAndRevert(t t.Parallel() nrShards := 5 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(uint32(nrShards)), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -476,20 +383,14 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksNothingInCache(t * t.Parallel() nrShards := 5 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(uint32(nrShards)), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockCalled: func() uint64 { + return maxGasLimitPerBlock }, - ) + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -502,20 +403,14 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksNotCrossShard(t *t t.Parallel() nrShards := 5 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(uint32(nrShards)), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockCalled: func() uint64 { + return maxGasLimitPerBlock }, - ) + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -540,20 +435,14 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksCrossShard(t *test nrShards := 5 shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockCalled: func() uint64 { + return maxGasLimitPerBlock }, - ) + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -603,16 +492,9 @@ func TestIntermediateResultsProcessor_GetNumOfCrossInterMbsAndTxsShouldWork(t *t return uint32(shardID) } - irp, _ := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + irp, _ := NewIntermediateResultsProcessor(args) txs := make([]data.TransactionHandler, 0) txs = append(txs, &smartContractResult.SmartContractResult{Nonce: 0, SndAddr: snd, RcvAddr: []byte("0"), Value: big.NewInt(0), PrevTxHash: []byte("txHash")}) @@ -637,17 +519,9 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksNilBody(t *testing.T) t.Parallel() nrShards := 5 - shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -661,17 +535,9 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldpassAsNotCr t.Parallel() nrShards := 5 - shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -679,8 +545,8 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldpassAsNotCr body := &block.Body{} body.MiniBlocks = append(body.MiniBlocks, &block.MiniBlock{ Type: block.SmartContractResultBlock, - ReceiverShardID: shardCoordinator.SelfId(), - SenderShardID: shardCoordinator.SelfId() + 1}) + ReceiverShardID: args.Coordinator.SelfId(), + SenderShardID: args.Coordinator.SelfId() + 1}) err = irp.VerifyInterMiniBlocks(body) assert.Nil(t, err) @@ -690,23 +556,14 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyMissingMiniblock( t.Parallel() nrShards := 5 - shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) - + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) body := &block.Body{} - otherShard := shardCoordinator.SelfId() + 1 + otherShard := args.Coordinator.SelfId() + 1 body.MiniBlocks = append(body.MiniBlocks, &block.MiniBlock{Type: block.SmartContractResultBlock, ReceiverShardID: otherShard}) err = irp.VerifyInterMiniBlocks(body) @@ -718,20 +575,14 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyMiniBlockMissmatc nrShards := 5 shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockCalled: func() uint64 { + return maxGasLimitPerBlock }, - ) + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -768,23 +619,17 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldPass(t *tes nrShards := 5 shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, - MaxGasLimitPerBlockCalled: func() uint64 { - return maxGasLimitPerBlock - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockCalled: func() uint64 { + return maxGasLimitPerBlock + }, + MaxGasLimitPerBlockCalled: func() uint64 { + return maxGasLimitPerBlock }, - ) + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -835,24 +680,18 @@ func TestIntermediateResultsProcessor_SaveCurrentIntermediateTxToStorageShouldSa nrShards := 5 shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) putCounter := 0 - irp, err := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{ - PutCalled: func(unitType dataRetriever.UnitType, key []byte, value []byte) error { - if unitType == dataRetriever.UnsignedTransactionUnit { - putCounter++ - } - return nil - }, - }, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.Store = &storage.ChainStorerStub{ + PutCalled: func(unitType dataRetriever.UnitType, key []byte, value []byte) error { + if unitType == dataRetriever.UnsignedTransactionUnit { + putCounter++ + } + return nil + }, + } + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -884,18 +723,11 @@ func TestIntermediateResultsProcessor_CreateMarshalizedDataNothingToMarshal(t *t nrShards := 5 shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - hasher := &hashingMocks.HasherMock{} - marshalizer := &mock.MarshalizerMock{} - irp, err := NewIntermediateResultsProcessor( - hasher, - marshalizer, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.Hasher = &hashingMocks.HasherMock{} + args.Marshalizer = &mock.MarshalizerMock{} + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -918,16 +750,11 @@ func TestIntermediateResultsProcessor_CreateMarshalizedData(t *testing.T) { shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) hasher := &hashingMocks.HasherMock{} marshalizer := &mock.MarshalizerMock{} - irp, err := NewIntermediateResultsProcessor( - hasher, - marshalizer, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.Hasher = hasher + args.Marshalizer = marshalizer + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -986,16 +813,11 @@ func TestIntermediateResultsProcessor_GetAllCurrentUsedTxs(t *testing.T) { shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) hasher := &hashingMocks.HasherMock{} marshalizer := &mock.MarshalizerMock{} - irp, err := NewIntermediateResultsProcessor( - hasher, - marshalizer, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.Hasher = hasher + args.Marshalizer = marshalizer + irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) assert.Nil(t, err) @@ -1030,23 +852,19 @@ func TestIntermediateResultsProcessor_SplitMiniBlocksIfNeededShouldWork(t *testi shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) hasher := &hashingMocks.HasherMock{} marshalizer := &mock.MarshalizerMock{} - irp, _ := NewIntermediateResultsProcessor( - hasher, - marshalizer, - shardCoordinator, - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.SmartContractResultBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{ - MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { - return gasLimit - }, - MaxGasLimitPerTxCalled: func() uint64 { - return gasLimit - }, + args := createMockArgsNewIntermediateResultsProcessor() + args.Coordinator = shardCoordinator + args.Hasher = hasher + args.Marshalizer = marshalizer + args.EconomicsFee = &mock.FeeHandlerStub{ + MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { + return gasLimit + }, + MaxGasLimitPerTxCalled: func() uint64 { + return gasLimit }, - ) + } + irp, _ := NewIntermediateResultsProcessor(args) tx1 := transaction.Transaction{Nonce: 0, GasLimit: 100} tx2 := transaction.Transaction{Nonce: 1, GasLimit: 100} @@ -1085,16 +903,7 @@ func TestIntermediateResultsProcessor_SplitMiniBlocksIfNeededShouldWork(t *testi func TestIntermediateResultsProcessor_addIntermediateTxToResultsForBlock(t *testing.T) { t.Parallel() - irp, _ := NewIntermediateResultsProcessor( - &hashingMocks.HasherMock{}, - &mock.MarshalizerMock{}, - mock.NewMultiShardsCoordinatorMock(5), - createMockPubkeyConverter(), - &storage.ChainStorerStub{}, - block.TxBlock, - &mock.TxForCurrentBlockStub{}, - &mock.FeeHandlerStub{}, - ) + irp, _ := NewIntermediateResultsProcessor(createMockArgsNewIntermediateResultsProcessor()) key := []byte("key") irp.InitProcessedResults(key) diff --git a/process/block/postprocess/testIntermediateResult.go b/process/block/postprocess/testIntermediateResult.go index 92c0d893546..f6b8224d27c 100644 --- a/process/block/postprocess/testIntermediateResult.go +++ b/process/block/postprocess/testIntermediateResult.go @@ -1,14 +1,7 @@ package postprocess import ( - "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/hashing" - "github.com/multiversx/mx-chain-core-go/marshal" - "github.com/multiversx/mx-chain-go/dataRetriever" - "github.com/multiversx/mx-chain-go/process" - "github.com/multiversx/mx-chain-go/sharding" ) // TestIntermediateResProc extends intermediateResultsProcessor and is used in integration tests @@ -20,16 +13,9 @@ type TestIntermediateResProc struct { // NewTestIntermediateResultsProcessor creates a new instance of TestIntermediateResProc func NewTestIntermediateResultsProcessor( - hasher hashing.Hasher, - marshalizer marshal.Marshalizer, - coordinator sharding.Coordinator, - pubkeyConv core.PubkeyConverter, - store dataRetriever.StorageService, - blockType block.Type, - currTxs dataRetriever.TransactionCacher, - economicsFee process.FeeHandler, + args ArgsNewIntermediateResultsProcessor, ) (*TestIntermediateResProc, error) { - interimProc, err := NewIntermediateResultsProcessor(hasher, marshalizer, coordinator, pubkeyConv, store, blockType, currTxs, economicsFee) + interimProc, err := NewIntermediateResultsProcessor(args) return &TestIntermediateResProc{interimProc}, err } diff --git a/process/coordinator/process_test.go b/process/coordinator/process_test.go index 42ae2fc6374..fe9fef50e2b 100644 --- a/process/coordinator/process_test.go +++ b/process/coordinator/process_test.go @@ -547,15 +547,17 @@ func createPreProcessorContainer() process.PreProcessorsContainer { } func createInterimProcessorContainer() process.IntermediateProcessorContainer { - preFactory, _ := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - initStore(), - initDataPool([]byte("test_hash1")), - &mock.FeeHandlerStub{}, - ) + argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: mock.NewMultiShardsCoordinatorMock(5), + Marshalizer: &mock.MarshalizerMock{}, + Hasher: &hashingMocks.HasherMock{}, + PubkeyConverter: createMockPubkeyConverter(), + Store: initStore(), + PoolsHolder: initDataPool([]byte("test_hash1")), + EconomicsFee: &mock.FeeHandlerStub{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + } + preFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) container, _ := preFactory.Create() return container @@ -2180,15 +2182,17 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsNilOrMiss(t *testi tdp := initDataPool(txHash) shardCoordinator := mock.NewMultiShardsCoordinatorMock(5) - preFactory, _ := shard.NewIntermediateProcessorsContainerFactory( - shardCoordinator, - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - tdp, - &mock.FeeHandlerStub{}, - ) + argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: shardCoordinator, + Marshalizer: &mock.MarshalizerMock{}, + Hasher: &hashingMocks.HasherMock{}, + PubkeyConverter: createMockPubkeyConverter(), + Store: &storageStubs.ChainStorerStub{}, + PoolsHolder: tdp, + EconomicsFee: &mock.FeeHandlerStub{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + } + preFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) container, _ := preFactory.Create() argsTransactionCoordinator := createMockTransactionCoordinatorArguments() @@ -2234,19 +2238,21 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsOk(t *testing.T) { tdp := initDataPool(txHash) shardCoordinator := mock.NewMultiShardsCoordinatorMock(5) - interFactory, _ := shard.NewIntermediateProcessorsContainerFactory( - shardCoordinator, - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - tdp, - &mock.FeeHandlerStub{ + argsFactory := shard.ArgsNewIntermediateProcessorsContainerFactory{ + ShardCoordinator: shardCoordinator, + Marshalizer: &mock.MarshalizerMock{}, + Hasher: &hashingMocks.HasherMock{}, + PubkeyConverter: createMockPubkeyConverter(), + Store: &storageStubs.ChainStorerStub{}, + PoolsHolder: tdp, + EconomicsFee: &mock.FeeHandlerStub{ MaxGasLimitPerBlockCalled: func() uint64 { return MaxGasLimitPerBlock }, }, - ) + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + } + interFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) container, _ := interFactory.Create() argsTransactionCoordinator := createMockTransactionCoordinatorArguments() diff --git a/process/factory/metachain/intermediateProcessorsContainerFactory.go b/process/factory/metachain/intermediateProcessorsContainerFactory.go index d9a80abea50..1749d12a306 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "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/process/block/postprocess" @@ -14,56 +15,67 @@ 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 + shardCoordinator sharding.Coordinator + marshalizer marshal.Marshalizer + hasher hashing.Hasher + pubkeyConverter core.PubkeyConverter + store dataRetriever.StorageService + poolsHolder dataRetriever.PoolsHolder + economicsFee process.FeeHandler + enableEpochsHandler common.EnableEpochsHandler +} + +// 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 } // NewIntermediateProcessorsContainerFactory is responsible for creating a new intermediate processors factory object func NewIntermediateProcessorsContainerFactory( - shardCoordinator sharding.Coordinator, - marshalizer marshal.Marshalizer, - hasher hashing.Hasher, - pubkeyConverter core.PubkeyConverter, - store dataRetriever.StorageService, - poolsHolder dataRetriever.PoolsHolder, - economicsFee process.FeeHandler, + args ArgsNewIntermediateProcessorsContainerFactory, ) (*intermediateProcessorsContainerFactory, error) { - if check.IfNil(shardCoordinator) { + if check.IfNil(args.ShardCoordinator) { return nil, process.ErrNilShardCoordinator } - if check.IfNil(marshalizer) { + if check.IfNil(args.Marshalizer) { return nil, process.ErrNilMarshalizer } - if check.IfNil(hasher) { + if check.IfNil(args.Hasher) { return nil, process.ErrNilHasher } - if check.IfNil(pubkeyConverter) { + if check.IfNil(args.PubkeyConverter) { return nil, process.ErrNilPubkeyConverter } - if check.IfNil(store) { + if check.IfNil(args.Store) { return nil, process.ErrNilStorage } - if check.IfNil(poolsHolder) { + if check.IfNil(args.PoolsHolder) { return nil, process.ErrNilPoolsHolder } - if check.IfNil(economicsFee) { + if check.IfNil(args.EconomicsFee) { return nil, process.ErrNilEconomicsFeeHandler } + if check.IfNil(args.EnableEpochsHandler) { + return nil, process.ErrNilEpochHandler + } return &intermediateProcessorsContainerFactory{ - shardCoordinator: shardCoordinator, - marshalizer: marshalizer, - hasher: hasher, - pubkeyConverter: pubkeyConverter, - poolsHolder: poolsHolder, - store: store, - economicsFee: economicsFee, + shardCoordinator: args.ShardCoordinator, + marshalizer: args.Marshalizer, + hasher: args.Hasher, + pubkeyConverter: args.PubkeyConverter, + store: args.Store, + poolsHolder: args.PoolsHolder, + economicsFee: args.EconomicsFee, + enableEpochsHandler: args.EnableEpochsHandler, }, nil } @@ -95,17 +107,18 @@ func (ppcm *intermediateProcessorsContainerFactory) Create() (process.Intermedia } func (ppcm *intermediateProcessorsContainerFactory) createSmartContractResultsIntermediateProcessor() (process.IntermediateTransactionHandler, error) { - irp, err := postprocess.NewIntermediateResultsProcessor( - ppcm.hasher, - ppcm.marshalizer, - ppcm.shardCoordinator, - ppcm.pubkeyConverter, - ppcm.store, - block.SmartContractResultBlock, - ppcm.poolsHolder.CurrentBlockTxs(), - ppcm.economicsFee, - ) - + 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, + } + 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 03826424f18..d1120e99740 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go @@ -17,18 +17,26 @@ func createMockPubkeyConverter() *testscommon.PubkeyConverterMock { return testscommon.NewPubkeyConverterMock(32) } +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: &mock.FeeHandlerStub{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + } + return args +} + func TestNewIntermediateProcessorsContainerFactory_NilShardCoord(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - nil, - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.ShardCoordinator = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilShardCoordinator, err) @@ -37,15 +45,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilShardCoord(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilMarshalizer(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - nil, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.Marshalizer = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilMarshalizer, err) @@ -54,15 +56,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilMarshalizer(t *testing.T) func TestNewIntermediateProcessorsContainerFactory_NilHasher(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - nil, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.Hasher = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilHasher, err) @@ -71,15 +67,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilHasher(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilAdrConv(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - nil, - &storageStubs.ChainStorerStub{}, - dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.PubkeyConverter = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilPubkeyConverter, err) @@ -88,15 +78,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilAdrConv(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilStorer(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - nil, - dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.Store = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilStorage, err) @@ -105,15 +89,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilStorer(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilPoolsHolder(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - nil, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.PoolsHolder = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilPoolsHolder, err) @@ -122,32 +100,30 @@ func TestNewIntermediateProcessorsContainerFactory_NilPoolsHolder(t *testing.T) func TestNewIntermediateProcessorsContainerFactory_NilEconomicsFeeHandler(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dataRetrieverMock.NewPoolsHolderMock(), - nil, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.EconomicsFee = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) } +func TestNewIntermediateProcessorsContainerFactory_NilEnableEpochHandler(t *testing.T) { + t.Parallel() + + args := createMockArgsNewIntermediateProcessorsFactory() + args.EnableEpochsHandler = nil + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) + + assert.Nil(t, ipcf) + assert.Equal(t, process.ErrNilEnableEpochsHandler, err) +} + func TestNewIntermediateProcessorsContainerFactory(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, err) assert.NotNil(t, ipcf) @@ -157,15 +133,8 @@ func TestNewIntermediateProcessorsContainerFactory(t *testing.T) { func TestIntermediateProcessorsContainerFactory_Create(t *testing.T) { t.Parallel() - ipcf, err := metachain.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(5), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dataRetrieverMock.NewPoolsHolderMock(), - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + ipcf, err := metachain.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, err) assert.NotNil(t, ipcf) diff --git a/process/factory/shard/intermediateProcessorsContainerFactory.go b/process/factory/shard/intermediateProcessorsContainerFactory.go index d78eddbc061..de8ce346e2c 100644 --- a/process/factory/shard/intermediateProcessorsContainerFactory.go +++ b/process/factory/shard/intermediateProcessorsContainerFactory.go @@ -6,6 +6,7 @@ import ( "github.com/multiversx/mx-chain-core-go/data/block" "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/process/block/postprocess" @@ -14,56 +15,67 @@ 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 + shardCoordinator sharding.Coordinator + marshalizer marshal.Marshalizer + hasher hashing.Hasher + pubkeyConverter core.PubkeyConverter + store dataRetriever.StorageService + poolsHolder dataRetriever.PoolsHolder + economicsFee process.FeeHandler + enableEpochsHandler common.EnableEpochsHandler +} + +// 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 } // NewIntermediateProcessorsContainerFactory is responsible for creating a new intermediate processors factory object func NewIntermediateProcessorsContainerFactory( - shardCoordinator sharding.Coordinator, - marshalizer marshal.Marshalizer, - hasher hashing.Hasher, - pubkeyConverter core.PubkeyConverter, - store dataRetriever.StorageService, - poolsHolder dataRetriever.PoolsHolder, - economicsFee process.FeeHandler, + args ArgsNewIntermediateProcessorsContainerFactory, ) (*intermediateProcessorsContainerFactory, error) { - if check.IfNil(shardCoordinator) { + if check.IfNil(args.ShardCoordinator) { return nil, process.ErrNilShardCoordinator } - if check.IfNil(marshalizer) { + if check.IfNil(args.Marshalizer) { return nil, process.ErrNilMarshalizer } - if check.IfNil(hasher) { + if check.IfNil(args.Hasher) { return nil, process.ErrNilHasher } - if check.IfNil(pubkeyConverter) { + if check.IfNil(args.PubkeyConverter) { return nil, process.ErrNilPubkeyConverter } - if check.IfNil(store) { + if check.IfNil(args.Store) { return nil, process.ErrNilStorage } - if check.IfNil(poolsHolder) { + if check.IfNil(args.PoolsHolder) { return nil, process.ErrNilPoolsHolder } - if check.IfNil(economicsFee) { + if check.IfNil(args.EconomicsFee) { return nil, process.ErrNilEconomicsFeeHandler } + if check.IfNil(args.EnableEpochsHandler) { + return nil, process.ErrNilEpochHandler + } return &intermediateProcessorsContainerFactory{ - shardCoordinator: shardCoordinator, - marshalizer: marshalizer, - hasher: hasher, - pubkeyConverter: pubkeyConverter, - store: store, - poolsHolder: poolsHolder, - economicsFee: economicsFee, + shardCoordinator: args.ShardCoordinator, + marshalizer: args.Marshalizer, + hasher: args.Hasher, + pubkeyConverter: args.PubkeyConverter, + store: args.Store, + poolsHolder: args.PoolsHolder, + economicsFee: args.EconomicsFee, + enableEpochsHandler: args.EnableEpochsHandler, }, nil } @@ -105,16 +117,18 @@ func (ppcm *intermediateProcessorsContainerFactory) Create() (process.Intermedia } func (ppcm *intermediateProcessorsContainerFactory) createSmartContractResultsIntermediateProcessor() (process.IntermediateTransactionHandler, error) { - irp, err := postprocess.NewIntermediateResultsProcessor( - ppcm.hasher, - ppcm.marshalizer, - ppcm.shardCoordinator, - ppcm.pubkeyConverter, - ppcm.store, - block.SmartContractResultBlock, - ppcm.poolsHolder.CurrentBlockTxs(), - ppcm.economicsFee, - ) + 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, + } + irp, err := postprocess.NewIntermediateResultsProcessor(args) return irp, err } diff --git a/process/factory/shard/intermediateProcessorsContainerFactory_test.go b/process/factory/shard/intermediateProcessorsContainerFactory_test.go index bcec9873e60..08817109ffa 100644 --- a/process/factory/shard/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/shard/intermediateProcessorsContainerFactory_test.go @@ -51,19 +51,26 @@ func createMockPubkeyConverter() *testscommon.PubkeyConverterMock { return testscommon.NewPubkeyConverterMock(32) } +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: &mock.FeeHandlerStub{}, + EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, + } + return args +} + func TestNewIntermediateProcessorsContainerFactory_NilShardCoord(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - nil, - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dPool, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.ShardCoordinator = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilShardCoordinator, err) @@ -72,16 +79,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilShardCoord(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilMarshalizer(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - nil, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dPool, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.Marshalizer = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilMarshalizer, err) @@ -90,16 +90,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilMarshalizer(t *testing.T) func TestNewIntermediateProcessorsContainerFactory_NilHasher(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - &mock.MarshalizerMock{}, - nil, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dPool, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.Hasher = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilHasher, err) @@ -108,16 +101,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilHasher(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilAdrConv(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - nil, - &storageStubs.ChainStorerStub{}, - dPool, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.PubkeyConverter = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilPubkeyConverter, err) @@ -126,16 +112,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilAdrConv(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilStorer(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - nil, - dPool, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.Store = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilStorage, err) @@ -144,15 +123,9 @@ func TestNewIntermediateProcessorsContainerFactory_NilStorer(t *testing.T) { func TestNewIntermediateProcessorsContainerFactory_NilPoolsHolder(t *testing.T) { t.Parallel() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - nil, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.PoolsHolder = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilPoolsHolder, err) @@ -161,34 +134,30 @@ func TestNewIntermediateProcessorsContainerFactory_NilPoolsHolder(t *testing.T) func TestNewIntermediateProcessorsContainerFactory_NilEconomicsFeeHandler(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dPool, - nil, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + args.EconomicsFee = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, ipcf) assert.Equal(t, process.ErrNilEconomicsFeeHandler, err) } +func TestNewIntermediateProcessorsContainerFactory_NilEnableEpochsHandler(t *testing.T) { + t.Parallel() + + args := createMockArgsNewIntermediateProcessorsFactory() + args.EnableEpochsHandler = nil + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) + + assert.Nil(t, ipcf) + assert.Equal(t, process.ErrNilEnableEpochsHandler, err) +} + func TestNewIntermediateProcessorsContainerFactory(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dPool, - &mock.FeeHandlerStub{}, - ) + args := createMockArgsNewIntermediateProcessorsFactory() + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, err) assert.NotNil(t, ipcf) @@ -198,17 +167,8 @@ func TestNewIntermediateProcessorsContainerFactory(t *testing.T) { func TestIntermediateProcessorsContainerFactory_Create(t *testing.T) { t.Parallel() - dPool := createDataPools() - ipcf, err := shard.NewIntermediateProcessorsContainerFactory( - mock.NewMultiShardsCoordinatorMock(3), - &mock.MarshalizerMock{}, - &hashingMocks.HasherMock{}, - createMockPubkeyConverter(), - &storageStubs.ChainStorerStub{}, - dPool, - &mock.FeeHandlerStub{}, - ) - + args := createMockArgsNewIntermediateProcessorsFactory() + ipcf, err := shard.NewIntermediateProcessorsContainerFactory(args) assert.Nil(t, err) assert.NotNil(t, ipcf) diff --git a/sharding/mock/enableEpochsHandlerMock.go b/sharding/mock/enableEpochsHandlerMock.go index 6173c091e32..b84cccbd619 100644 --- a/sharding/mock/enableEpochsHandlerMock.go +++ b/sharding/mock/enableEpochsHandlerMock.go @@ -566,6 +566,11 @@ func (mock *EnableEpochsHandlerMock) IsAlwaysSaveTokenMetaDataEnabled() bool { return false } +// IsKeepExecOrderOnCreatedSCRsEnabled - +func (mock *EnableEpochsHandlerMock) IsKeepExecOrderOnCreatedSCRsEnabled() bool { + return false +} + // IsInterfaceNil returns true if there is no value under the interface func (mock *EnableEpochsHandlerMock) IsInterfaceNil() bool { return mock == nil diff --git a/testscommon/enableEpochsHandlerStub.go b/testscommon/enableEpochsHandlerStub.go index 092131f8ebc..0adb5542607 100644 --- a/testscommon/enableEpochsHandlerStub.go +++ b/testscommon/enableEpochsHandlerStub.go @@ -117,6 +117,7 @@ type EnableEpochsHandlerStub struct { IsMaxBlockchainHookCountersFlagEnabledField bool IsWipeSingleNFTLiquidityDecreaseEnabledField bool IsAlwaysSaveTokenMetaDataEnabledField bool + IsKeepExecOrderOnCreatedSCRsEnabledField bool } // ResetPenalizedTooMuchGasFlag - @@ -1014,6 +1015,14 @@ func (stub *EnableEpochsHandlerStub) IsAlwaysSaveTokenMetaDataEnabled() bool { return stub.IsAlwaysSaveTokenMetaDataEnabledField } +// IsKeepExecOrderOnCreatedSCRsEnabled - +func (stub *EnableEpochsHandlerStub) IsKeepExecOrderOnCreatedSCRsEnabled() bool { + stub.RLock() + defer stub.RUnlock() + + return stub.IsKeepExecOrderOnCreatedSCRsEnabledField +} + // IsInterfaceNil - func (stub *EnableEpochsHandlerStub) IsInterfaceNil() bool { return stub == nil From 6315e04ab22100f86f48411222d06501d18c5931 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Apr 2023 20:05:04 +0300 Subject: [PATCH 280/335] added more tests --- .../postprocess/intermediateResults_test.go | 20 +++++++++++++++++-- .../intermediateProcessorsContainerFactory.go | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index 90658245a77..bb5f8c5a063 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -35,11 +35,12 @@ func createMockArgsNewIntermediateResultsProcessor() ArgsNewIntermediateResultsP Coordinator: mock.NewMultiShardsCoordinatorMock(5), PubkeyConv: createMockPubkeyConverter(), Store: &storage.ChainStorerStub{}, - BlockType: block.TxBlock, + BlockType: block.SmartContractResultBlock, CurrTxs: &mock.TxForCurrentBlockStub{}, EconomicsFee: &mock.FeeHandlerStub{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, } + return args } @@ -128,7 +129,7 @@ func TestNewIntermediateResultsProcessor_NilEpochHandler(t *testing.T) { irp, err := NewIntermediateResultsProcessor(args) assert.Nil(t, irp) - assert.Equal(t, process.ErrNilEpochHandler, err) + assert.Equal(t, process.ErrNilEnableEpochsHandler, err) } func TestNewIntermediateResultsProcessor_Good(t *testing.T) { @@ -629,6 +630,8 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldPass(t *tes return maxGasLimitPerBlock }, } + enableEpochHandler := &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: false} + args.EnableEpochsHandler = enableEpochHandler irp, err := NewIntermediateResultsProcessor(args) assert.NotNil(t, irp) @@ -672,6 +675,19 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldPass(t *tes err = irp.VerifyInterMiniBlocks(body) assert.Nil(t, err) + + enableEpochHandler.IsKeepExecOrderOnCreatedSCRsEnabledField = true + err = irp.VerifyInterMiniBlocks(body) + assert.Equal(t, err, process.ErrMiniBlockHashMismatch) + + miniBlock.TxHashes = make([][]byte, 0) + for i := 0; i < len(txs); i++ { + txHash, _ := core.CalculateHash(&mock.MarshalizerMock{}, &hashingMocks.HasherMock{}, txs[i]) + miniBlock.TxHashes = append(miniBlock.TxHashes, txHash) + } + + err = irp.VerifyInterMiniBlocks(body) + assert.Nil(t, err) } func TestIntermediateResultsProcessor_SaveCurrentIntermediateTxToStorageShouldSave(t *testing.T) { diff --git a/process/factory/metachain/intermediateProcessorsContainerFactory.go b/process/factory/metachain/intermediateProcessorsContainerFactory.go index 1749d12a306..826e61231c7 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory.go @@ -64,7 +64,7 @@ func NewIntermediateProcessorsContainerFactory( return nil, process.ErrNilEconomicsFeeHandler } if check.IfNil(args.EnableEpochsHandler) { - return nil, process.ErrNilEpochHandler + return nil, process.ErrNilEnableEpochsHandler } return &intermediateProcessorsContainerFactory{ From 4014afde2cea946277ea0f1587fb100e04c5c30c Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 12 Apr 2023 20:37:21 +0300 Subject: [PATCH 281/335] fix test --- process/factory/shard/intermediateProcessorsContainerFactory.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/factory/shard/intermediateProcessorsContainerFactory.go b/process/factory/shard/intermediateProcessorsContainerFactory.go index de8ce346e2c..c19b971d3b3 100644 --- a/process/factory/shard/intermediateProcessorsContainerFactory.go +++ b/process/factory/shard/intermediateProcessorsContainerFactory.go @@ -64,7 +64,7 @@ func NewIntermediateProcessorsContainerFactory( return nil, process.ErrNilEconomicsFeeHandler } if check.IfNil(args.EnableEpochsHandler) { - return nil, process.ErrNilEpochHandler + return nil, process.ErrNilEnableEpochsHandler } return &intermediateProcessorsContainerFactory{ From 095e9fe2a8b309276ce04d6ece6c2a6cfb987e2e Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 13 Apr 2023 11:10:17 +0300 Subject: [PATCH 282/335] fix after review, removed duplicated test --- factory/heartbeat/heartbeatV2Components_test.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index 97c26f1b7ea..847255d379f 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -227,17 +227,6 @@ func TestNewHeartbeatV2ComponentsFactory(t *testing.T) { assert.Nil(t, hcf) assert.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) }) - t.Run("nil EpochStartTrigger should error", func(t *testing.T) { - t.Parallel() - - args := createMockHeartbeatV2ComponentsFactoryArgs() - args.ProcessComponents = &testsMocks.ProcessComponentsStub{ - EpochTrigger: nil, - } - hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) - assert.Nil(t, hcf) - assert.Equal(t, errorsMx.ErrNilEpochStartTrigger, err) - }) } func TestHeartbeatV2Components_Create(t *testing.T) { From e01235693872a1f2a9063d7b9c3360b8051134c7 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 13 Apr 2023 11:49:35 +0300 Subject: [PATCH 283/335] get proposal by nonce always --- vm/systemSmartContracts/governance.go | 24 +++++++-------- vm/systemSmartContracts/governance_test.go | 35 ++++++++++++---------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 0e2f25c3cd8..38646ff7a3d 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -583,8 +583,7 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.OutOfGas } - proposal := args.Arguments[0] - generalProposal, err := g.getGeneralProposal(proposal) + generalProposal, err := g.getProposalFromNonce(big.NewInt(0).SetBytes(args.Arguments[0])) if err != nil { g.eei.AddReturnMessage("getGeneralProposal error " + err.Error()) return vmcommon.UserError @@ -611,7 +610,7 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.UserError } - err = g.saveGeneralProposal(proposal, generalProposal) + err = g.saveGeneralProposal(generalProposal.CommitHash, generalProposal) if err != nil { g.eei.AddReturnMessage("saveGeneralProposal error " + err.Error()) return vmcommon.UserError @@ -626,7 +625,7 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc logEntry := &vmcommon.LogEntry{ Identifier: []byte(args.Function), Address: args.CallerAddr, - Topics: [][]byte{proposal, boolToSlice(generalProposal.Passed)}, + Topics: [][]byte{generalProposal.CommitHash, boolToSlice(generalProposal.Passed)}, } g.eei.AddLogEntry(logEntry) @@ -704,12 +703,7 @@ func (g *governanceContract) viewProposal(args *vmcommon.ContractCallInput) vmco return vmcommon.UserError } - reference := args.Arguments[0] - if len(reference) < commitHashLength { - reference = g.eei.GetStorage(append([]byte(noncePrefix), reference...)) - } - - proposal, err := g.getGeneralProposal(reference) + proposal, err := g.getProposalFromNonce(big.NewInt(0).SetBytes(args.Arguments[0])) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -1042,9 +1036,7 @@ func (g *governanceContract) saveGeneralProposal(reference []byte, generalPropos // getValidProposal returns a proposal from storage if it exists, or it is still valid/in-progress func (g *governanceContract) getValidProposal(nonce *big.Int) (*GeneralProposal, error) { - nonceKey := append([]byte(noncePrefix), nonce.Bytes()...) - commitHash := g.eei.GetStorage(nonceKey) - proposal, err := g.getGeneralProposal(commitHash) + proposal, err := g.getProposalFromNonce(nonce) if err != nil { return nil, err } @@ -1061,6 +1053,12 @@ func (g *governanceContract) getValidProposal(nonce *big.Int) (*GeneralProposal, return proposal, nil } +func (g *governanceContract) getProposalFromNonce(nonce *big.Int) (*GeneralProposal, error) { + nonceKey := append([]byte(noncePrefix), nonce.Bytes()...) + commitHash := g.eei.GetStorage(nonceKey) + return g.getGeneralProposal(commitHash) +} + // getGeneralProposal returns a proposal from storage func (g *governanceContract) getGeneralProposal(reference []byte) (*GeneralProposal, error) { key := append([]byte(proposalPrefix), reference...) diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index afb475990e0..83e1581f070 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -909,6 +909,9 @@ func TestGovernanceContract_CloseProposal(t *testing.T) { }) return configBytes } + if bytes.Equal(key, append([]byte(noncePrefix), byte(1))) { + return proposalIdentifier + } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), @@ -926,9 +929,7 @@ func TestGovernanceContract_CloseProposal(t *testing.T) { gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - proposalIdentifier, - } + callInputArgs := [][]byte{{1}} callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) @@ -1072,6 +1073,9 @@ func TestGovernanceContract_CloseProposalAlreadyClosed(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { + if bytes.Equal(key, append([]byte(noncePrefix), byte(1))) { + return proposalIdentifier + } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), @@ -1087,9 +1091,7 @@ func TestGovernanceContract_CloseProposalAlreadyClosed(t *testing.T) { } gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - proposalIdentifier, - } + callInputArgs := [][]byte{{1}} callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) @@ -1110,6 +1112,9 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { + if bytes.Equal(key, append([]byte(noncePrefix), byte(1))) { + return proposalIdentifier + } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), @@ -1133,9 +1138,7 @@ func TestGovernanceContract_CloseProposalVoteNotfinished(t *testing.T) { } gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - proposalIdentifier, - } + callInputArgs := [][]byte{{1}} callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) @@ -1156,6 +1159,9 @@ func TestGovernanceContract_CloseProposalCallerNotIssuer(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { + if bytes.Equal(key, append([]byte(noncePrefix), byte(1))) { + return proposalIdentifier + } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), @@ -1178,9 +1184,7 @@ func TestGovernanceContract_CloseProposalCallerNotIssuer(t *testing.T) { } gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - proposalIdentifier, - } + callInputArgs := [][]byte{{1}} callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) @@ -1201,6 +1205,9 @@ func TestGovernanceContract_CloseProposalComputeResultsErr(t *testing.T) { retMessage = msg }, GetStorageCalled: func(key []byte) []byte { + if bytes.Equal(key, append([]byte(noncePrefix), byte(1))) { + return proposalIdentifier + } if bytes.Equal(key, append([]byte(proposalPrefix), proposalIdentifier...)) { proposalBytes, _ := args.Marshalizer.Marshal(&GeneralProposal{ Yes: big.NewInt(10), @@ -1216,9 +1223,7 @@ func TestGovernanceContract_CloseProposalComputeResultsErr(t *testing.T) { } gsc, _ := NewGovernanceContract(args) - callInputArgs := [][]byte{ - proposalIdentifier, - } + callInputArgs := [][]byte{{1}} callInput := createVMInput(zero, "closeProposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) retCode := gsc.Execute(callInput) From 1c2b4e6f034f3f2b41a95ead6928ce41ab4fb29e Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 13 Apr 2023 12:51:25 +0300 Subject: [PATCH 284/335] fix the test --- integrationTests/vm/txsFee/validatorSC_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrationTests/vm/txsFee/validatorSC_test.go b/integrationTests/vm/txsFee/validatorSC_test.go index b9e9ffe9adf..374752adde1 100644 --- a/integrationTests/vm/txsFee/validatorSC_test.go +++ b/integrationTests/vm/txsFee/validatorSC_test.go @@ -171,9 +171,9 @@ func testValidatorsSCDoStakeWithTopUpValueTryToUnStakeTokensAndUnBondTokens(t *t testContextMeta.TxsLogsProcessor.Clean() tx = vm.CreateTransaction(0, big.NewInt(0), sndAddr, vmAddr.ValidatorSCAddress, gasPrice, gasLimit, []byte("unBondTokens@"+hex.EncodeToString(value200EGLD.Bytes()))) - executeTxAndCheckResults(t, testContextMeta, tx, vmcommon.Ok, nil) + executeTxAndCheckResults(t, testContextMeta, tx, vmcommon.UserError, nil) - checkReturnLog(t, testContextMeta, noTokensToUnBondMessage, false) + checkReturnLog(t, testContextMeta, noTokensToUnBondMessage, true) } func TestValidatorsSC_ToStakePutInQueueUnStakeAndUnBondShouldRefundUnBondTokens(t *testing.T) { From d8fdd91c953fdf61960b3b0a94c6d1f2eb598924 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 13 Apr 2023 13:09:18 +0300 Subject: [PATCH 285/335] fix after review --- process/block/postprocess/basePostProcess.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/process/block/postprocess/basePostProcess.go b/process/block/postprocess/basePostProcess.go index a5fbfa807eb..3f15929426b 100644 --- a/process/block/postprocess/basePostProcess.go +++ b/process/block/postprocess/basePostProcess.go @@ -276,8 +276,8 @@ func (bpp *basePostProcessor) addIntermediateTxToResultsForBlock( sndShardID uint32, rcvShardID uint32, ) { - bpp.index++ addScrShardInfo := &txShardInfo{receiverShardID: rcvShardID, senderShardID: sndShardID, index: bpp.index} + bpp.index++ scrInfo := &txInfo{tx: txHandler, txShardInfo: addScrShardInfo} bpp.interResultsForBlock[string(txHash)] = scrInfo From 72d66019620a3b7b82d77686f4e39737e1ca1098 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 13 Apr 2023 15:58:19 +0300 Subject: [PATCH 286/335] fix after review --- common/enablers/enableEpochsHandler_test.go | 4 ++-- config/tomlConfig_test.go | 4 ++-- process/block/postprocess/basePostProcess.go | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/common/enablers/enableEpochsHandler_test.go b/common/enablers/enableEpochsHandler_test.go index 833d56a9148..28e905aae64 100644 --- a/common/enablers/enableEpochsHandler_test.go +++ b/common/enablers/enableEpochsHandler_test.go @@ -92,7 +92,7 @@ func createEnableEpochsConfig() config.EnableEpochs { AlwaysSaveTokenMetaDataEnableEpoch: 76, RuntimeCodeSizeFixEnableEpoch: 77, MultiClaimOnDelegationEnableEpoch: 78, - KeepExecOrderOnCreatedSCRsEnableEpoch: 78, + KeepExecOrderOnCreatedSCRsEnableEpoch: 79, } } @@ -221,7 +221,7 @@ func TestNewEnableEpochsHandler_EpochConfirmed(t *testing.T) { t.Run("flags with == condition should be set, along with all >=", func(t *testing.T) { t.Parallel() - epoch := uint32(78) + epoch := uint32(79) cfg := createEnableEpochsConfig() cfg.StakingV2EnableEpoch = epoch cfg.ESDTEnableEpoch = epoch diff --git a/config/tomlConfig_test.go b/config/tomlConfig_test.go index 2cf232d5e95..914a028f411 100644 --- a/config/tomlConfig_test.go +++ b/config/tomlConfig_test.go @@ -688,7 +688,7 @@ func TestEnableEpochConfig(t *testing.T) { KeepExecOrderOnCreatedSCRsEnableEpoch = 64 # MultiClaimOnDelegationEnableEpoch represents the epoch when the multi claim on delegation function is enabled - MultiClaimOnDelegationEnableEpoch = 64 + MultiClaimOnDelegationEnableEpoch = 65 # MaxNodesChangeEnableEpoch holds configuration for changing the maximum number of nodes and the enabling epoch MaxNodesChangeEnableEpoch = [ @@ -786,7 +786,7 @@ func TestEnableEpochConfig(t *testing.T) { RuntimeCodeSizeFixEnableEpoch: 62, RuntimeMemStoreLimitEnableEpoch: 63, KeepExecOrderOnCreatedSCRsEnableEpoch: 64, - MultiClaimOnDelegationEnableEpoch: 64, + MultiClaimOnDelegationEnableEpoch: 65, BLSMultiSignerEnableEpoch: []MultiSignerConfig{ { EnableEpoch: 0, diff --git a/process/block/postprocess/basePostProcess.go b/process/block/postprocess/basePostProcess.go index 3f15929426b..058118dd88b 100644 --- a/process/block/postprocess/basePostProcess.go +++ b/process/block/postprocess/basePostProcess.go @@ -20,11 +20,11 @@ var _ process.DataMarshalizer = (*basePostProcessor)(nil) type txShardInfo struct { senderShardID uint32 receiverShardID uint32 - index uint32 } type txInfo struct { - tx data.TransactionHandler + tx data.TransactionHandler + index uint32 *txShardInfo } @@ -276,9 +276,9 @@ func (bpp *basePostProcessor) addIntermediateTxToResultsForBlock( sndShardID uint32, rcvShardID uint32, ) { - addScrShardInfo := &txShardInfo{receiverShardID: rcvShardID, senderShardID: sndShardID, index: bpp.index} + addScrShardInfo := &txShardInfo{receiverShardID: rcvShardID, senderShardID: sndShardID} + scrInfo := &txInfo{tx: txHandler, txShardInfo: addScrShardInfo, index: bpp.index} bpp.index++ - scrInfo := &txInfo{tx: txHandler, txShardInfo: addScrShardInfo} bpp.interResultsForBlock[string(txHash)] = scrInfo for key := range bpp.mapProcessedResult { From be9bf90f972302ec79500b2d913d304ce745f4ef Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 13 Apr 2023 15:59:33 +0300 Subject: [PATCH 287/335] tests for factory/processing --- errors/errors.go | 21 +- factory/processing/blockProcessorCreator.go | 5 +- factory/processing/export_test.go | 8 - factory/processing/processComponents.go | 203 ++- .../processComponentsHandler_test.go | 272 ++-- factory/processing/processComponents_test.go | 1282 ++++++++++++++++- genesis/errors.go | 6 +- genesis/process/genesisBlockCreator.go | 3 + .../mock/p2pAntifloodHandlerStub.go | 54 +- process/track/baseBlockTrack.go | 3 + process/track/baseBlockTrack_test.go | 18 + .../bootstrapComponentsStub.go | 4 + 12 files changed, 1531 insertions(+), 348 deletions(-) diff --git a/errors/errors.go b/errors/errors.go index b9b526eb95b..d30593eb8c0 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -296,15 +296,9 @@ var ErrNilP2pPublicKey = errors.New("nil p2p public key") // ErrNilRater signals that a nil rater was provided var ErrNilRater = errors.New("nil rater") -// ErrNilRatingData signals that nil rating data were provided -var ErrNilRatingData = errors.New("nil rating data") - // ErrNilRatingsInfoHandler signals that nil ratings data information was provided var ErrNilRatingsInfoHandler = errors.New("nil ratings info handler") -// ErrNilRequestedItemHandler signals that a nil requested items handler was provided -var ErrNilRequestedItemHandler = errors.New("nil requested item handler") - // ErrNilRequestHandler signals that a nil request handler was provided var ErrNilRequestHandler = errors.New("nil request handler") @@ -317,9 +311,6 @@ var ErrNilRoundHandler = errors.New("nil roundHandler") // ErrNilShardCoordinator signals that a nil shard coordinator was provided var ErrNilShardCoordinator = errors.New("nil shard coordinator provided") -// ErrNilSmartContractParser signals that a nil smart contract parser was provided -var ErrNilSmartContractParser = errors.New("nil smart contract parser") - // ErrNilSoftwareVersion signals that a nil software version was provided var ErrNilSoftwareVersion = errors.New("nil software version") @@ -395,12 +386,6 @@ var ErrNilVmMarshalizer = errors.New("nil vm marshalizer") // ErrNilWatchdog signals that a nil watchdog was provided var ErrNilWatchdog = errors.New("nil watchdog") -// ErrNilWhiteListHandler signals that a nil whitelist handler was provided -var ErrNilWhiteListHandler = errors.New("nil white list handler") - -// ErrNilWhiteListVerifiedTxs signals that a nil whitelist for verified transactions was prvovided -var ErrNilWhiteListVerifiedTxs = errors.New("nil white list verified txs") - // ErrPollingFunctionRegistration signals an error while registering the polling function registration var ErrPollingFunctionRegistration = errors.New("cannot register handler func for num of connected peers") @@ -479,9 +464,6 @@ var ErrNilProcessStatusHandler = errors.New("nil process status handler") // ErrNilESDTDataStorage signals that a nil esdt data storage has been provided var ErrNilESDTDataStorage = errors.New("nil esdt data storage") -// ErrDBIsClosed is raised when the DB is closed -var ErrDBIsClosed = errors.New("DB is closed") - // ErrNilEnableEpochsHandler signals that a nil enable epochs handler was provided var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler") @@ -541,3 +523,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") + +// ErrNilHistoryRepository signals that history processor is nil +var ErrNilHistoryRepository = errors.New("history repository is nil") diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index 9f8d8e8a892..72ebe28491e 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -65,7 +65,8 @@ func (pcf *processComponentsFactory) newBlockProcessor( processedMiniBlocksTracker process.ProcessedMiniBlocksTracker, receiptsRepository mainFactory.ReceiptsRepository, ) (*blockProcessorAndVmFactories, error) { - if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { + shardCoordinator := pcf.bootstrapComponents.ShardCoordinator() + if shardCoordinator.SelfId() < shardCoordinator.NumberOfShards() { return pcf.newShardBlockProcessor( requestHandler, forkDetector, @@ -81,7 +82,7 @@ func (pcf *processComponentsFactory) newBlockProcessor( receiptsRepository, ) } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { + if shardCoordinator.SelfId() == core.MetachainShardId { return pcf.newMetaBlockProcessor( requestHandler, forkDetector, diff --git a/factory/processing/export_test.go b/factory/processing/export_test.go index f9cae468a41..1a1c90a383f 100644 --- a/factory/processing/export_test.go +++ b/factory/processing/export_test.go @@ -1,12 +1,9 @@ package processing import ( - "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/outport" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/epochStart" "github.com/multiversx/mx-chain-go/factory" - "github.com/multiversx/mx-chain-go/genesis" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/txsimulator" ) @@ -48,8 +45,3 @@ func (pcf *processComponentsFactory) NewBlockProcessor( return blockProcessorComponents.blockProcessor, blockProcessorComponents.vmFactoryForTxSimulate, nil } - -// IndexGenesisBlocks - -func (pcf *processComponentsFactory) IndexGenesisBlocks(genesisBlocks map[uint32]data.HeaderHandler, indexingData map[uint32]*genesis.IndexingData) error { - return pcf.indexGenesisBlocks(genesisBlocks, indexingData, map[string]*outport.AlteredAccount{}) -} diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index f64de2f7447..e38962a64bc 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -30,7 +30,7 @@ import ( "github.com/multiversx/mx-chain-go/epochStart/metachain" "github.com/multiversx/mx-chain-go/epochStart/notifier" "github.com/multiversx/mx-chain-go/epochStart/shardchain" - errErd "github.com/multiversx/mx-chain-go/errors" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory" mainFactory "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/factory/disabled" @@ -717,6 +717,12 @@ func (pcf *processComponentsFactory) newValidatorStatisticsProcessor() (process. if hardforkConfig.AfterHardFork { ratingEnabledEpoch = hardforkConfig.StartEpoch + hardforkConfig.ValidatorGracePeriodInEpochs } + + genesisHeader := pcf.data.Blockchain().GetGenesisHeader() + if check.IfNil(genesisHeader) { + return nil, errorsMx.ErrGenesisBlockNotInitialized + } + arguments := peer.ArgValidatorStatisticsProcessor{ PeerAdapter: pcf.state.PeerAccounts(), PubkeyConv: pcf.coreData.ValidatorPubKeyConverter(), @@ -731,20 +737,16 @@ func (pcf *processComponentsFactory) newValidatorStatisticsProcessor() (process. RewardsHandler: pcf.coreData.EconomicsData(), NodesSetup: pcf.coreData.GenesisNodesSetup(), RatingEnableEpoch: ratingEnabledEpoch, - GenesisNonce: pcf.data.Blockchain().GetGenesisHeader().GetNonce(), + GenesisNonce: genesisHeader.GetNonce(), EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), } - validatorStatisticsProcessor, err := peer.NewValidatorStatisticsProcessor(arguments) - if err != nil { - return nil, err - } - - return validatorStatisticsProcessor, nil + return peer.NewValidatorStatisticsProcessor(arguments) } func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochStart.RequestHandler) (epochStart.TriggerHandler, error) { - if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { + shardCoordinator := pcf.bootstrapComponents.ShardCoordinator() + if shardCoordinator.SelfId() < shardCoordinator.NumberOfShards() { argsHeaderValidator := block.ArgsHeaderValidator{ Hasher: pcf.coreData.Hasher(), Marshalizer: pcf.coreData.InternalMarshalizer(), @@ -782,20 +784,20 @@ func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochSt AppStatusHandler: pcf.statusCoreComponents.AppStatusHandler(), EnableEpochsHandler: pcf.coreData.EnableEpochsHandler(), } - epochStartTrigger, err := shardchain.NewEpochStartTrigger(argEpochStart) - if err != nil { - return nil, errors.New("error creating new start of epoch trigger" + err.Error()) - } - - return epochStartTrigger, nil + return shardchain.NewEpochStartTrigger(argEpochStart) } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { + if shardCoordinator.SelfId() == core.MetachainShardId { + genesisHeader := pcf.data.Blockchain().GetGenesisHeader() + if check.IfNil(genesisHeader) { + return nil, errorsMx.ErrGenesisBlockNotInitialized + } + argEpochStart := &metachain.ArgsNewMetaEpochStartTrigger{ GenesisTime: time.Unix(pcf.coreData.GenesisNodesSetup().GetStartTime(), 0), Settings: &pcf.config.EpochStartConfig, Epoch: pcf.bootstrapComponents.EpochBootstrapParams().Epoch(), - EpochStartRound: pcf.data.Blockchain().GetGenesisHeader().GetRound(), + EpochStartRound: genesisHeader.GetRound(), EpochStartNotifier: pcf.coreData.EpochStartNotifierWithConfirm(), Storage: pcf.data.StorageService(), Marshalizer: pcf.coreData.InternalMarshalizer(), @@ -803,12 +805,7 @@ func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochSt AppStatusHandler: pcf.statusCoreComponents.AppStatusHandler(), DataPool: pcf.data.Datapool(), } - epochStartTrigger, err := metachain.NewEpochStartTrigger(argEpochStart) - if err != nil { - return nil, errors.New("error creating new start of epoch trigger" + err.Error()) - } - - return epochStartTrigger, nil + return metachain.NewEpochStartTrigger(argEpochStart) } return nil, errors.New("error creating new start of epoch trigger because of invalid shard id") @@ -870,7 +867,7 @@ func (pcf *processComponentsFactory) indexAndReturnGenesisAccounts() (map[string rootHash, err := pcf.state.AccountsAdapter().RootHash() if err != nil { - return nil, err + return map[string]*outport.AlteredAccount{}, err } leavesChannels := &common.TrieIteratorChannels{ @@ -879,7 +876,7 @@ func (pcf *processComponentsFactory) indexAndReturnGenesisAccounts() (map[string } err = pcf.state.AccountsAdapter().GetAllLeaves(leavesChannels, context.Background(), rootHash) if err != nil { - return nil, err + return map[string]*outport.AlteredAccount{}, err } genesisAccounts := make(map[string]*outport.AlteredAccount, 0) @@ -904,7 +901,7 @@ func (pcf *processComponentsFactory) indexAndReturnGenesisAccounts() (map[string err = leavesChannels.ErrChan.ReadFromChanNonBlocking() if err != nil { - return nil, err + return map[string]*outport.AlteredAccount{}, err } shardID := pcf.bootstrapComponents.ShardCoordinator().SelfId() @@ -931,12 +928,7 @@ func (pcf *processComponentsFactory) setGenesisHeader(genesisBlocks map[uint32]d return errors.New("genesis block does not exist") } - err := pcf.data.Blockchain().SetGenesisHeader(genesisBlock) - if err != nil { - return err - } - - return nil + return pcf.data.Blockchain().SetGenesisHeader(genesisBlock) } func (pcf *processComponentsFactory) prepareGenesisBlock( @@ -960,12 +952,7 @@ func (pcf *processComponentsFactory) prepareGenesisBlock( pcf.data.Blockchain().SetGenesisHeaderHash(genesisBlockHash) nonceToByteSlice := pcf.coreData.Uint64ByteSliceConverter().ToByteSlice(genesisBlock.GetNonce()) - err = pcf.saveGenesisHeaderToStorage(genesisBlock, genesisBlockHash, nonceToByteSlice) - if err != nil { - return err - } - - return nil + return pcf.saveGenesisHeaderToStorage(genesisBlock, genesisBlockHash, nonceToByteSlice) } func (pcf *processComponentsFactory) saveGenesisHeaderToStorage( @@ -1158,17 +1145,12 @@ func (pcf *processComponentsFactory) indexGenesisBlocks( return err } - err = pcf.saveAlteredGenesisHeaderToStorage( + return pcf.saveAlteredGenesisHeaderToStorage( genesisBlockHeader, genesisBlockHash, genesisBody, intraShardMiniBlocks, txsPoolPerShard) - if err != nil { - return err - } - - return nil } func (pcf *processComponentsFactory) saveAlteredGenesisHeaderToStorage( @@ -1257,13 +1239,14 @@ func (pcf *processComponentsFactory) newBlockTracker( requestHandler process.RequestHandler, genesisBlocks map[uint32]data.HeaderHandler, ) (process.BlockTracker, error) { + shardCoordinator := pcf.bootstrapComponents.ShardCoordinator() argBaseTracker := track.ArgBaseTracker{ Hasher: pcf.coreData.Hasher(), HeaderValidator: headerValidator, Marshalizer: pcf.coreData.InternalMarshalizer(), RequestHandler: requestHandler, RoundHandler: pcf.coreData.RoundHandler(), - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + ShardCoordinator: shardCoordinator, Store: pcf.data.StorageService(), StartHeaders: genesisBlocks, PoolsHolder: pcf.data.Datapool(), @@ -1271,7 +1254,7 @@ func (pcf *processComponentsFactory) newBlockTracker( FeeHandler: pcf.coreData.EconomicsData(), } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { + if shardCoordinator.SelfId() < shardCoordinator.NumberOfShards() { arguments := track.ArgShardTracker{ ArgBaseTracker: argBaseTracker, } @@ -1279,7 +1262,7 @@ func (pcf *processComponentsFactory) newBlockTracker( return track.NewShardBlockTrack(arguments) } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { + if shardCoordinator.SelfId() == core.MetachainShardId { arguments := track.ArgMetaTracker{ ArgBaseTracker: argBaseTracker, } @@ -1383,11 +1366,7 @@ func (pcf *processComponentsFactory) newMetaResolverContainerFactory( PeersRatingHandler: pcf.network.PeersRatingHandler(), PayloadValidator: payloadValidator, } - resolversContainerFactory, err := resolverscontainer.NewMetaResolversContainerFactory(resolversContainerFactoryArgs) - if err != nil { - return nil, err - } - return resolversContainerFactory, nil + return resolverscontainer.NewMetaResolversContainerFactory(resolversContainerFactoryArgs) } func (pcf *processComponentsFactory) newInterceptorContainerFactory( @@ -1399,7 +1378,8 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( peerShardMapper *networksharding.PeerShardMapper, hardforkTrigger factory.HardforkTrigger, ) (process.InterceptorsContainerFactory, process.TimeCacher, error) { - if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { + shardCoordinator := pcf.bootstrapComponents.ShardCoordinator() + if shardCoordinator.SelfId() < shardCoordinator.NumberOfShards() { return pcf.newShardInterceptorContainerFactory( headerSigVerifier, headerIntegrityVerifier, @@ -1410,7 +1390,7 @@ func (pcf *processComponentsFactory) newInterceptorContainerFactory( hardforkTrigger, ) } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { + if shardCoordinator.SelfId() == core.MetachainShardId { return pcf.newMetaInterceptorContainerFactory( headerSigVerifier, headerIntegrityVerifier, @@ -1649,10 +1629,11 @@ func (pcf *processComponentsFactory) newForkDetector( headerBlackList process.TimeCacher, blockTracker process.BlockTracker, ) (process.ForkDetector, error) { - if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { + shardCoordinator := pcf.bootstrapComponents.ShardCoordinator() + if shardCoordinator.SelfId() < shardCoordinator.NumberOfShards() { return sync.NewShardForkDetector(pcf.coreData.RoundHandler(), headerBlackList, blockTracker, pcf.coreData.GenesisNodesSetup().GetStartTime()) } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { + if shardCoordinator.SelfId() == core.MetachainShardId { return sync.NewMetaForkDetector(pcf.coreData.RoundHandler(), headerBlackList, blockTracker, pcf.coreData.GenesisNodesSetup().GetStartTime()) } @@ -1793,12 +1774,7 @@ func createNetworkShardingCollector( NodesCoordinator: nodesCoordinator, PreferredPeersHolder: preferredPeersHolder, } - psm, err := networksharding.NewPeerShardMapper(arg) - if err != nil { - return nil, err - } - - return psm, nil + return networksharding.NewPeerShardMapper(arg) } func createCache(cacheConfig config.CacheConfig) (storage.Cacher, error) { @@ -1808,82 +1784,91 @@ func createCache(cacheConfig config.CacheConfig) (storage.Cacher, error) { func checkProcessComponentsArgs(args ProcessComponentsFactoryArgs) error { baseErrMessage := "error creating process components" if check.IfNil(args.AccountsParser) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilAccountsParser) + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilAccountsParser) } - if check.IfNil(args.SmartContractParser) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilSmartContractParser) + if check.IfNil(args.GasSchedule) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilGasSchedule) } - if args.GasSchedule == nil { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilGasSchedule) + if check.IfNil(args.Data) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilDataComponentsHolder) } - if check.IfNil(args.NodesCoordinator) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilNodesCoordinator) + if check.IfNil(args.Data.Blockchain()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilBlockChainHandler) } - if check.IfNil(args.Data) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilDataComponentsHolder) + if check.IfNil(args.Data.Datapool()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilDataPoolsHolder) + } + if check.IfNil(args.Data.StorageService()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilStorageService) } if check.IfNil(args.CoreData) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilCoreComponentsHolder) + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilCoreComponentsHolder) } - if args.CoreData.EconomicsData() == nil { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilEconomicsData) + if check.IfNil(args.CoreData.EconomicsData()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilEconomicsData) } - if check.IfNil(args.CoreData.RoundHandler()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilRoundHandler) + if check.IfNil(args.CoreData.GenesisNodesSetup()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilGenesisNodesSetupHandler) } - if check.IfNil(args.Crypto) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilCryptoComponentsHolder) + if check.IfNil(args.CoreData.AddressPubKeyConverter()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilAddressPublicKeyConverter) } - if check.IfNil(args.State) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilStateComponentsHolder) + if check.IfNil(args.CoreData.EpochNotifier()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilEpochNotifier) } - if check.IfNil(args.Network) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilNetworkComponentsHolder) + if check.IfNil(args.CoreData.ValidatorPubKeyConverter()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilPubKeyConverter) } - if check.IfNil(args.RequestedItemsHandler) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilRequestedItemHandler) + if check.IfNil(args.CoreData.InternalMarshalizer()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilInternalMarshalizer) } - if check.IfNil(args.WhiteListHandler) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilWhiteListHandler) + if check.IfNil(args.CoreData.Uint64ByteSliceConverter()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilUint64ByteSliceConverter) } - if check.IfNil(args.WhiteListerVerifiedTxs) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilWhiteListVerifiedTxs) + if check.IfNil(args.Crypto) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilCryptoComponentsHolder) } - if check.IfNil(args.CoreData.EpochStartNotifierWithConfirm()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilEpochStartNotifier) + if check.IfNil(args.Crypto.BlockSignKeyGen()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilBlockSignKeyGen) } - if check.IfNil(args.CoreData.Rater()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilRater) + if check.IfNil(args.State) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilStateComponentsHolder) } - if check.IfNil(args.CoreData.RatingsData()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilRatingData) + if check.IfNil(args.State.AccountsAdapter()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilAccountsAdapter) } - if check.IfNil(args.CoreData.ValidatorPubKeyConverter()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilPubKeyConverter) + if check.IfNil(args.Network) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilNetworkComponentsHolder) } - if args.SystemSCConfig == nil { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilSystemSCConfig) + if check.IfNil(args.Network.NetworkMessenger()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilMessenger) } - if check.IfNil(args.CoreData.EpochNotifier()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilEpochNotifier) + if check.IfNil(args.Network.InputAntiFloodHandler()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilInputAntiFloodHandler) } - if check.IfNil(args.CoreData.EnableEpochsHandler()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilEnableEpochsHandler) + if args.SystemSCConfig == nil { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilSystemSCConfig) } if check.IfNil(args.BootstrapComponents) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilBootstrapComponentsHolder) + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilBootstrapComponentsHolder) } if check.IfNil(args.BootstrapComponents.ShardCoordinator()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilShardCoordinator) + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilShardCoordinator) + } + if check.IfNil(args.BootstrapComponents.EpochBootstrapParams()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilBootstrapParamsHandler) } if check.IfNil(args.StatusComponents) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilStatusComponentsHolder) + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilStatusComponentsHolder) } - if check.IfNil(args.StatusCoreComponents) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilStatusCoreComponents) + if check.IfNil(args.StatusComponents.OutportHandler()) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilOutportHandler) } - if check.IfNil(args.StatusCoreComponents.AppStatusHandler()) { - return fmt.Errorf("%s: %w", baseErrMessage, errErd.ErrNilAppStatusHandler) + if check.IfNil(args.HistoryRepo) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilHistoryRepository) + } + if check.IfNil(args.StatusCoreComponents) { + return fmt.Errorf("%s: %w", baseErrMessage, errorsMx.ErrNilStatusCoreComponents) } return nil diff --git a/factory/processing/processComponentsHandler_test.go b/factory/processing/processComponentsHandler_test.go index b8c00301261..05b5b6382bb 100644 --- a/factory/processing/processComponentsHandler_test.go +++ b/factory/processing/processComponentsHandler_test.go @@ -3,153 +3,173 @@ package processing_test import ( "testing" - "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-go/factory/mock" + errorsMx "github.com/multiversx/mx-chain-go/errors" + "github.com/multiversx/mx-chain-go/factory" processComp "github.com/multiversx/mx-chain-go/factory/processing" - componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/stretchr/testify/require" ) -// ------------ Test TestManagedProcessComponents -------------------- -func TestManagedProcessComponents_CreateWithInvalidArgsShouldErr(t *testing.T) { +func TestNewManagedProcessComponents(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) - _ = processArgs.CoreData.SetInternalMarshalizer(nil) - processComponentsFactory, _ := processComp.NewProcessComponentsFactory(processArgs) - managedProcessComponents, err := processComp.NewManagedProcessComponents(processComponentsFactory) - require.NoError(t, err) - err = managedProcessComponents.Create() - require.Error(t, err) - require.Nil(t, managedProcessComponents.NodesCoordinator()) + t.Run("nil factory should error", func(t *testing.T) { + t.Parallel() + + managedProcessComponents, err := processComp.NewManagedProcessComponents(nil) + require.Equal(t, errorsMx.ErrNilProcessComponentsFactory, err) + require.Nil(t, managedProcessComponents) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + processComponentsFactory, _ := processComp.NewProcessComponentsFactory(createMockProcessComponentsFactoryArgs()) + managedProcessComponents, err := processComp.NewManagedProcessComponents(processComponentsFactory) + require.NoError(t, err) + require.NotNil(t, managedProcessComponents) + }) } -func TestManagedProcessComponents_CreateShouldWork(t *testing.T) { +func TestManagedProcessComponents_Create(t *testing.T) { t.Parallel() - coreComponents := componentsMock.GetCoreComponents() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) - shardCoordinator.SelfIDCalled = func() uint32 { - return core.MetachainShardId - } - shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { - if core.IsSmartContractOnMetachain(address[len(address)-1:], address) { - return core.MetachainShardId - } - - return 0 - } - - shardCoordinator.CurrentShard = core.MetachainShardId - dataComponents := componentsMock.GetDataComponents(coreComponents, shardCoordinator) - cryptoComponents := componentsMock.GetCryptoComponents(coreComponents) - networkComponents := componentsMock.GetNetworkComponents(cryptoComponents) - stateComponents := componentsMock.GetStateComponents(coreComponents, shardCoordinator) - processArgs := componentsMock.GetProcessArgs( - shardCoordinator, - coreComponents, - dataComponents, - cryptoComponents, - stateComponents, - networkComponents, - ) - - componentsMock.SetShardCoordinator(t, processArgs.BootstrapComponents, shardCoordinator) - - processComponentsFactory, err := processComp.NewProcessComponentsFactory(processArgs) - require.Nil(t, err) - managedProcessComponents, err := processComp.NewManagedProcessComponents(processComponentsFactory) - require.NoError(t, err) - require.True(t, check.IfNil(managedProcessComponents.NodesCoordinator())) - require.True(t, check.IfNil(managedProcessComponents.InterceptorsContainer())) - require.True(t, check.IfNil(managedProcessComponents.ResolversFinder())) - require.True(t, check.IfNil(managedProcessComponents.RoundHandler())) - require.True(t, check.IfNil(managedProcessComponents.ForkDetector())) - require.True(t, check.IfNil(managedProcessComponents.BlockProcessor())) - require.True(t, check.IfNil(managedProcessComponents.EpochStartTrigger())) - require.True(t, check.IfNil(managedProcessComponents.EpochStartNotifier())) - require.True(t, check.IfNil(managedProcessComponents.BlackListHandler())) - require.True(t, check.IfNil(managedProcessComponents.BootStorer())) - require.True(t, check.IfNil(managedProcessComponents.HeaderSigVerifier())) - require.True(t, check.IfNil(managedProcessComponents.ValidatorsStatistics())) - require.True(t, check.IfNil(managedProcessComponents.ValidatorsProvider())) - require.True(t, check.IfNil(managedProcessComponents.BlockTracker())) - require.True(t, check.IfNil(managedProcessComponents.PendingMiniBlocksHandler())) - require.True(t, check.IfNil(managedProcessComponents.RequestHandler())) - require.True(t, check.IfNil(managedProcessComponents.TxLogsProcessor())) - require.True(t, check.IfNil(managedProcessComponents.HeaderConstructionValidator())) - require.True(t, check.IfNil(managedProcessComponents.HeaderIntegrityVerifier())) - require.True(t, check.IfNil(managedProcessComponents.CurrentEpochProvider())) - require.True(t, check.IfNil(managedProcessComponents.NodeRedundancyHandler())) - require.True(t, check.IfNil(managedProcessComponents.WhiteListHandler())) - require.True(t, check.IfNil(managedProcessComponents.WhiteListerVerifiedTxs())) - require.True(t, check.IfNil(managedProcessComponents.RequestedItemsHandler())) - require.True(t, check.IfNil(managedProcessComponents.ImportStartHandler())) - require.True(t, check.IfNil(managedProcessComponents.HistoryRepository())) - require.True(t, check.IfNil(managedProcessComponents.TransactionSimulatorProcessor())) - require.True(t, check.IfNil(managedProcessComponents.FallbackHeaderValidator())) - require.True(t, check.IfNil(managedProcessComponents.PeerShardMapper())) - require.True(t, check.IfNil(managedProcessComponents.ShardCoordinator())) - require.True(t, check.IfNil(managedProcessComponents.TxsSenderHandler())) - require.True(t, check.IfNil(managedProcessComponents.HardforkTrigger())) - require.True(t, check.IfNil(managedProcessComponents.ProcessedMiniBlocksTracker())) - - err = managedProcessComponents.Create() + t.Run("invalid params should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.PublicKeyPeerId.Type = "invalid" + processComponentsFactory, _ := processComp.NewProcessComponentsFactory(args) + managedProcessComponents, _ := processComp.NewManagedProcessComponents(processComponentsFactory) + require.NotNil(t, managedProcessComponents) + + err := managedProcessComponents.Create() + require.Error(t, err) + }) + t.Run("should work with getters", func(t *testing.T) { + t.Parallel() + + processComponentsFactory, _ := processComp.NewProcessComponentsFactory(createMockProcessComponentsFactoryArgs()) + managedProcessComponents, _ := processComp.NewManagedProcessComponents(processComponentsFactory) + require.NotNil(t, managedProcessComponents) + + require.True(t, check.IfNil(managedProcessComponents.NodesCoordinator())) + require.True(t, check.IfNil(managedProcessComponents.InterceptorsContainer())) + require.True(t, check.IfNil(managedProcessComponents.ResolversFinder())) + require.True(t, check.IfNil(managedProcessComponents.RoundHandler())) + require.True(t, check.IfNil(managedProcessComponents.ForkDetector())) + require.True(t, check.IfNil(managedProcessComponents.BlockProcessor())) + require.True(t, check.IfNil(managedProcessComponents.EpochStartTrigger())) + require.True(t, check.IfNil(managedProcessComponents.EpochStartNotifier())) + require.True(t, check.IfNil(managedProcessComponents.BlackListHandler())) + require.True(t, check.IfNil(managedProcessComponents.BootStorer())) + require.True(t, check.IfNil(managedProcessComponents.HeaderSigVerifier())) + require.True(t, check.IfNil(managedProcessComponents.ValidatorsStatistics())) + require.True(t, check.IfNil(managedProcessComponents.ValidatorsProvider())) + require.True(t, check.IfNil(managedProcessComponents.BlockTracker())) + require.True(t, check.IfNil(managedProcessComponents.PendingMiniBlocksHandler())) + require.True(t, check.IfNil(managedProcessComponents.RequestHandler())) + require.True(t, check.IfNil(managedProcessComponents.TxLogsProcessor())) + require.True(t, check.IfNil(managedProcessComponents.HeaderConstructionValidator())) + require.True(t, check.IfNil(managedProcessComponents.HeaderIntegrityVerifier())) + require.True(t, check.IfNil(managedProcessComponents.CurrentEpochProvider())) + require.True(t, check.IfNil(managedProcessComponents.NodeRedundancyHandler())) + require.True(t, check.IfNil(managedProcessComponents.WhiteListHandler())) + require.True(t, check.IfNil(managedProcessComponents.WhiteListerVerifiedTxs())) + require.True(t, check.IfNil(managedProcessComponents.RequestedItemsHandler())) + require.True(t, check.IfNil(managedProcessComponents.ImportStartHandler())) + require.True(t, check.IfNil(managedProcessComponents.HistoryRepository())) + require.True(t, check.IfNil(managedProcessComponents.TransactionSimulatorProcessor())) + require.True(t, check.IfNil(managedProcessComponents.FallbackHeaderValidator())) + require.True(t, check.IfNil(managedProcessComponents.PeerShardMapper())) + require.True(t, check.IfNil(managedProcessComponents.ShardCoordinator())) + require.True(t, check.IfNil(managedProcessComponents.TxsSenderHandler())) + require.True(t, check.IfNil(managedProcessComponents.HardforkTrigger())) + require.True(t, check.IfNil(managedProcessComponents.ProcessedMiniBlocksTracker())) + require.True(t, check.IfNil(managedProcessComponents.AccountsParser())) + require.True(t, check.IfNil(managedProcessComponents.ScheduledTxsExecutionHandler())) + require.True(t, check.IfNil(managedProcessComponents.ESDTDataStorageHandlerForAPI())) + require.True(t, check.IfNil(managedProcessComponents.ReceiptsRepository())) + + err := managedProcessComponents.Create() + require.NoError(t, err) + require.False(t, check.IfNil(managedProcessComponents.NodesCoordinator())) + require.False(t, check.IfNil(managedProcessComponents.InterceptorsContainer())) + require.False(t, check.IfNil(managedProcessComponents.ResolversFinder())) + require.False(t, check.IfNil(managedProcessComponents.RoundHandler())) + require.False(t, check.IfNil(managedProcessComponents.ForkDetector())) + require.False(t, check.IfNil(managedProcessComponents.BlockProcessor())) + require.False(t, check.IfNil(managedProcessComponents.EpochStartTrigger())) + require.False(t, check.IfNil(managedProcessComponents.EpochStartNotifier())) + require.False(t, check.IfNil(managedProcessComponents.BlackListHandler())) + require.False(t, check.IfNil(managedProcessComponents.BootStorer())) + require.False(t, check.IfNil(managedProcessComponents.HeaderSigVerifier())) + require.False(t, check.IfNil(managedProcessComponents.ValidatorsStatistics())) + require.False(t, check.IfNil(managedProcessComponents.ValidatorsProvider())) + require.False(t, check.IfNil(managedProcessComponents.BlockTracker())) + require.False(t, check.IfNil(managedProcessComponents.PendingMiniBlocksHandler())) + require.False(t, check.IfNil(managedProcessComponents.RequestHandler())) + require.False(t, check.IfNil(managedProcessComponents.TxLogsProcessor())) + require.False(t, check.IfNil(managedProcessComponents.HeaderConstructionValidator())) + require.False(t, check.IfNil(managedProcessComponents.HeaderIntegrityVerifier())) + require.False(t, check.IfNil(managedProcessComponents.CurrentEpochProvider())) + require.False(t, check.IfNil(managedProcessComponents.NodeRedundancyHandler())) + require.False(t, check.IfNil(managedProcessComponents.WhiteListHandler())) + require.False(t, check.IfNil(managedProcessComponents.WhiteListerVerifiedTxs())) + require.False(t, check.IfNil(managedProcessComponents.RequestedItemsHandler())) + require.False(t, check.IfNil(managedProcessComponents.ImportStartHandler())) + require.False(t, check.IfNil(managedProcessComponents.HistoryRepository())) + require.False(t, check.IfNil(managedProcessComponents.TransactionSimulatorProcessor())) + require.False(t, check.IfNil(managedProcessComponents.FallbackHeaderValidator())) + require.False(t, check.IfNil(managedProcessComponents.PeerShardMapper())) + require.False(t, check.IfNil(managedProcessComponents.ShardCoordinator())) + require.False(t, check.IfNil(managedProcessComponents.TxsSenderHandler())) + require.False(t, check.IfNil(managedProcessComponents.HardforkTrigger())) + require.False(t, check.IfNil(managedProcessComponents.ProcessedMiniBlocksTracker())) + require.False(t, check.IfNil(managedProcessComponents.AccountsParser())) + require.False(t, check.IfNil(managedProcessComponents.ScheduledTxsExecutionHandler())) + require.False(t, check.IfNil(managedProcessComponents.ESDTDataStorageHandlerForAPI())) + require.False(t, check.IfNil(managedProcessComponents.ReceiptsRepository())) + + require.Equal(t, factory.ProcessComponentsName, managedProcessComponents.String()) + }) +} + +func TestManagedProcessComponents_CheckSubcomponents(t *testing.T) { + t.Parallel() + + processComponentsFactory, _ := processComp.NewProcessComponentsFactory(createMockProcessComponentsFactoryArgs()) + managedProcessComponents, _ := processComp.NewManagedProcessComponents(processComponentsFactory) + require.NotNil(t, managedProcessComponents) + require.Equal(t, errorsMx.ErrNilProcessComponents, managedProcessComponents.CheckSubcomponents()) + + err := managedProcessComponents.Create() require.NoError(t, err) - require.False(t, check.IfNil(managedProcessComponents.NodesCoordinator())) - require.False(t, check.IfNil(managedProcessComponents.InterceptorsContainer())) - require.False(t, check.IfNil(managedProcessComponents.ResolversFinder())) - require.False(t, check.IfNil(managedProcessComponents.RoundHandler())) - require.False(t, check.IfNil(managedProcessComponents.ForkDetector())) - require.False(t, check.IfNil(managedProcessComponents.BlockProcessor())) - require.False(t, check.IfNil(managedProcessComponents.EpochStartTrigger())) - require.False(t, check.IfNil(managedProcessComponents.EpochStartNotifier())) - require.False(t, check.IfNil(managedProcessComponents.BlackListHandler())) - require.False(t, check.IfNil(managedProcessComponents.BootStorer())) - require.False(t, check.IfNil(managedProcessComponents.HeaderSigVerifier())) - require.False(t, check.IfNil(managedProcessComponents.ValidatorsStatistics())) - require.False(t, check.IfNil(managedProcessComponents.ValidatorsProvider())) - require.False(t, check.IfNil(managedProcessComponents.BlockTracker())) - require.False(t, check.IfNil(managedProcessComponents.PendingMiniBlocksHandler())) - require.False(t, check.IfNil(managedProcessComponents.RequestHandler())) - require.False(t, check.IfNil(managedProcessComponents.TxLogsProcessor())) - require.False(t, check.IfNil(managedProcessComponents.HeaderConstructionValidator())) - require.False(t, check.IfNil(managedProcessComponents.HeaderIntegrityVerifier())) - require.False(t, check.IfNil(managedProcessComponents.CurrentEpochProvider())) - require.False(t, check.IfNil(managedProcessComponents.NodeRedundancyHandler())) - require.False(t, check.IfNil(managedProcessComponents.WhiteListHandler())) - require.False(t, check.IfNil(managedProcessComponents.WhiteListerVerifiedTxs())) - require.False(t, check.IfNil(managedProcessComponents.RequestedItemsHandler())) - require.False(t, check.IfNil(managedProcessComponents.ImportStartHandler())) - require.False(t, check.IfNil(managedProcessComponents.HistoryRepository())) - require.False(t, check.IfNil(managedProcessComponents.TransactionSimulatorProcessor())) - require.False(t, check.IfNil(managedProcessComponents.FallbackHeaderValidator())) - require.False(t, check.IfNil(managedProcessComponents.PeerShardMapper())) - require.False(t, check.IfNil(managedProcessComponents.ShardCoordinator())) - require.False(t, check.IfNil(managedProcessComponents.TxsSenderHandler())) - require.False(t, check.IfNil(managedProcessComponents.HardforkTrigger())) - require.False(t, check.IfNil(managedProcessComponents.ProcessedMiniBlocksTracker())) - - nodeSkBytes, err := cryptoComponents.PrivateKey().ToByteArray() - require.Nil(t, err) - observerSkBytes, err := managedProcessComponents.NodeRedundancyHandler().ObserverPrivateKey().ToByteArray() - require.Nil(t, err) - require.NotEqual(t, nodeSkBytes, observerSkBytes) + + require.Nil(t, managedProcessComponents.CheckSubcomponents()) } func TestManagedProcessComponents_Close(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) - processComponentsFactory, _ := processComp.NewProcessComponentsFactory(processArgs) + processComponentsFactory, _ := processComp.NewProcessComponentsFactory(createMockProcessComponentsFactoryArgs()) managedProcessComponents, _ := processComp.NewManagedProcessComponents(processComponentsFactory) err := managedProcessComponents.Create() require.NoError(t, err) err = managedProcessComponents.Close() require.NoError(t, err) - require.Nil(t, managedProcessComponents.NodesCoordinator()) + + err = managedProcessComponents.Close() + require.NoError(t, err) +} + +func TestManagedProcessComponents_IsInterfaceNil(t *testing.T) { + t.Parallel() + + managedProcessComponents, _ := processComp.NewManagedProcessComponents(nil) + require.True(t, managedProcessComponents.IsInterfaceNil()) + + processComponentsFactory, _ := processComp.NewProcessComponentsFactory(createMockProcessComponentsFactoryArgs()) + managedProcessComponents, _ = processComp.NewManagedProcessComponents(processComponentsFactory) + require.False(t, managedProcessComponents.IsInterfaceNil()) } diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index ebae3a2c893..df5b087d2b2 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -1,102 +1,1270 @@ package processing_test import ( + "bytes" + "context" + "errors" + "math/big" "strings" "sync" "testing" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-core-go/core/keyValStorage" coreData "github.com/multiversx/mx-chain-core-go/data" - "github.com/multiversx/mx-chain-core-go/data/block" dataBlock "github.com/multiversx/mx-chain-core-go/data/block" + "github.com/multiversx/mx-chain-core-go/data/endProcess" outportCore "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-core-go/marshal" + "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/common/factory" + "github.com/multiversx/mx-chain-go/config" + retriever "github.com/multiversx/mx-chain-go/dataRetriever" + errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory/mock" processComp "github.com/multiversx/mx-chain-go/factory/processing" "github.com/multiversx/mx-chain-go/genesis" - "github.com/multiversx/mx-chain-go/process" + genesisMocks "github.com/multiversx/mx-chain-go/genesis/mock" + testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" + "github.com/multiversx/mx-chain-go/p2p" + "github.com/multiversx/mx-chain-go/sharding" + "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" + mxState "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/bootstrapMocks" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" + "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/epochNotifier" + factoryMocks "github.com/multiversx/mx-chain-go/testscommon/factory" + "github.com/multiversx/mx-chain-go/testscommon/genericMocks" + "github.com/multiversx/mx-chain-go/testscommon/guardianMocks" "github.com/multiversx/mx-chain-go/testscommon/mainFactoryMocks" + "github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock" "github.com/multiversx/mx-chain-go/testscommon/outport" + "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" + "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" + "github.com/multiversx/mx-chain-go/testscommon/state" + "github.com/multiversx/mx-chain-go/testscommon/statusHandler" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" - "github.com/stretchr/testify/assert" + "github.com/multiversx/mx-chain-go/testscommon/trie" + trieFactory "github.com/multiversx/mx-chain-go/trie/factory" + updateMocks "github.com/multiversx/mx-chain-go/update/mock" "github.com/stretchr/testify/require" ) -// ------------ Test TestProcessComponents -------------------- -func TestProcessComponents_CloseShouldWork(t *testing.T) { +func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFactoryArgs { + gasSchedule, _ := common.LoadGasScheduleConfig("../../cmd/node/config/gasSchedules/gasScheduleV1.toml") + addrPubKeyConv, _ := factory.NewPubkeyConverter(config.PubkeyConfig{ + Length: 32, + Type: "bech32", + SignatureLength: 0, + }) + valPubKeyConv, _ := factory.NewPubkeyConverter(config.PubkeyConfig{ + Length: 96, + Type: "hex", + SignatureLength: 48, + }) + return processComp.ProcessComponentsFactoryArgs{ + Config: testscommon.GetGeneralConfig(), + EpochConfig: config.EpochConfig{}, + PrefConfigs: config.PreferencesConfig{}, + ImportDBConfig: config.ImportDbConfig{}, + AccountsParser: &mock.AccountsParserStub{ + GenerateInitialTransactionsCalled: func(shardCoordinator sharding.Coordinator, initialIndexingData map[uint32]*genesis.IndexingData) ([]*dataBlock.MiniBlock, map[uint32]*outportCore.Pool, error) { + return []*dataBlock.MiniBlock{ + {}, + }, + map[uint32]*outportCore.Pool{ + 0: {}, + }, nil + }, + }, + SmartContractParser: &mock.SmartContractParserStub{}, + GasSchedule: &testscommon.GasScheduleNotifierMock{ + GasSchedule: gasSchedule, + }, + NodesCoordinator: &shardingMocks.NodesCoordinatorStub{}, + RequestedItemsHandler: &testscommon.RequestedItemsHandlerStub{}, + WhiteListHandler: &testscommon.WhiteListHandlerStub{}, + WhiteListerVerifiedTxs: &testscommon.WhiteListHandlerStub{}, + MaxRating: 100, + SystemSCConfig: &config.SystemSmartContractsConfig{ + ESDTSystemSCConfig: config.ESDTSystemSCConfig{ + BaseIssuingCost: "1000", + OwnerAddress: "erd1fpkcgel4gcmh8zqqdt043yfcn5tyx8373kg6q2qmkxzu4dqamc0swts65c", + }, + GovernanceSystemSCConfig: config.GovernanceSystemSCConfig{ + V1: config.GovernanceSystemSCConfigV1{ + ProposalCost: "500", + NumNodes: 100, + MinQuorum: 50, + MinPassThreshold: 50, + MinVetoThreshold: 50, + }, + Active: config.GovernanceSystemSCConfigActive{ + ProposalCost: "500", + MinQuorum: "50", + MinPassThreshold: "50", + MinVetoThreshold: "50", + }, + FirstWhitelistedAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", + }, + StakingSystemSCConfig: config.StakingSystemSCConfig{ + GenesisNodePrice: "2500000000000000000000", + MinStakeValue: "1", + UnJailValue: "1", + MinStepValue: "1", + UnBondPeriod: 0, + NumRoundsWithoutBleed: 0, + MaximumPercentageToBleed: 0, + BleedPercentagePerRound: 0, + MaxNumberOfNodesForStake: 10, + ActivateBLSPubKeyMessageVerification: false, + MinUnstakeTokensValue: "1", + }, + DelegationManagerSystemSCConfig: config.DelegationManagerSystemSCConfig{ + MinCreationDeposit: "100", + MinStakeAmount: "100", + ConfigChangeAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", + }, + DelegationSystemSCConfig: config.DelegationSystemSCConfig{ + MinServiceFee: 0, + MaxServiceFee: 100, + }, + }, + Version: "v1.0.0", + ImportStartHandler: &testscommon.ImportStartHandlerStub{}, + HistoryRepo: &dblookupext.HistoryRepositoryStub{}, + Data: &testsMocks.DataComponentsStub{ + DataPool: dataRetriever.NewPoolsHolderMock(), + BlockChain: &testscommon.ChainHandlerStub{ + GetGenesisHeaderHashCalled: func() []byte { + return []byte("genesis hash") + }, + GetGenesisHeaderCalled: func() coreData.HeaderHandler { + return &testscommon.HeaderHandlerStub{} + }, + }, + MbProvider: &testsMocks.MiniBlocksProviderStub{}, + Store: genericMocks.NewChainStorerMock(0), + }, + CoreData: &mock.CoreComponentsMock{ + IntMarsh: &testscommon.MarshalizerStub{}, + TxMarsh: &testscommon.MarshalizerStub{}, + UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, + AddrPubKeyConv: addrPubKeyConv, + ValPubKeyConv: valPubKeyConv, + NodesConfig: &testscommon.NodesSetupStub{ + GetShardConsensusGroupSizeCalled: func() uint32 { + return 2 + }, + GetMetaConsensusGroupSizeCalled: func() uint32 { + return 2 + }, + }, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + Hash: &testscommon.HasherStub{}, + TxVersionCheckHandler: &testscommon.TxVersionCheckerStub{}, + RatingHandler: &testscommon.RaterMock{}, + EnableEpochsHandlerField: &testscommon.EnableEpochsHandlerStub{}, + EnableRoundsHandlerField: &testscommon.EnableRoundsHandlerStub{}, + EpochNotifierWithConfirm: &updateMocks.EpochStartNotifierStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + ChanStopProcess: make(chan endProcess.ArgEndProcess, 1), + TxSignHasherField: &testscommon.HasherStub{}, + HardforkTriggerPubKeyField: []byte("hardfork pub key"), + WasmVMChangeLockerInternal: &sync.RWMutex{}, + NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, + }, + Crypto: &testsMocks.CryptoComponentsStub{ + BlKeyGen: &cryptoMocks.KeyGenStub{}, + BlockSig: &cryptoMocks.SingleSignerStub{}, + MultiSigContainer: &cryptoMocks.MultiSignerContainerMock{ + MultiSigner: &cryptoMocks.MultisignerMock{}, + }, + PrivKey: &cryptoMocks.PrivateKeyStub{}, + PubKey: &cryptoMocks.PublicKeyStub{}, + PubKeyString: "pub key string", + PubKeyBytes: []byte("pub key bytes"), + TxKeyGen: &cryptoMocks.KeyGenStub{}, + TxSig: &cryptoMocks.SingleSignerStub{}, + PeerSignHandler: &cryptoMocks.PeerSignatureHandlerStub{}, + }, + State: &testscommon.StateComponentsMock{ + Accounts: &state.AccountsStub{ + CommitCalled: func() ([]byte, error) { + return []byte(""), nil + }, + RootHashCalled: func() ([]byte, error) { + return []byte("root hash"), nil + }, + }, + PeersAcc: &state.AccountsStub{ + CommitCalled: func() ([]byte, error) { + return []byte("hash"), nil + }, + RootHashCalled: func() ([]byte, error) { + return []byte("root hash"), nil + }, + }, + Tries: &trie.TriesHolderStub{ + GetCalled: func(bytes []byte) common.Trie { + return &trie.TrieStub{} + }, + }, + AccountsAPI: &state.AccountsStub{}, + StorageManagers: map[string]common.StorageManager{ + trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, + trieFactory.PeerAccountTrie: &testscommon.StorageManagerStub{}, + }, + }, + Network: &testsMocks.NetworkComponentsStub{ + Messenger: &p2pmocks.MessengerStub{}, + InputAntiFlood: &testsMocks.P2PAntifloodHandlerStub{}, + OutputAntiFlood: &testsMocks.P2PAntifloodHandlerStub{}, + PreferredPeersHolder: &p2pmocks.PeersHolderStub{}, + PeersRatingHandlerField: &p2pmocks.PeersRatingHandlerStub{}, + }, + BootstrapComponents: &mainFactoryMocks.BootstrapComponentsStub{ + ShCoordinator: mock.NewMultiShardsCoordinatorMock(2), + BootstrapParams: &bootstrapMocks.BootstrapParamsHandlerMock{}, + HdrIntegrityVerifier: &mock.HeaderIntegrityVerifierStub{}, + GuardedAccountHandlerField: &guardianMocks.GuardedAccountHandlerStub{}, + VersionedHdrFactory: &testscommon.VersionedHeaderFactoryStub{}, + }, + StatusComponents: &testsMocks.StatusComponentsStub{ + Outport: &outport.OutportStub{}, + }, + StatusCoreComponents: &factoryMocks.StatusCoreComponentsStub{ + AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, + }, + } +} + +func TestNewProcessComponentsFactory(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) - pcf, err := processComp.NewProcessComponentsFactory(processArgs) - require.Nil(t, err) + t.Run("nil AccountsParser should error", func(t *testing.T) { + t.Parallel() - pc, err := pcf.Create() - require.Nil(t, err) + args := createMockProcessComponentsFactoryArgs() + args.AccountsParser = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilAccountsParser)) + require.Nil(t, pcf) + }) + t.Run("nil GasSchedule should error", func(t *testing.T) { + t.Parallel() - err = pc.Close() - require.NoError(t, err) -} + args := createMockProcessComponentsFactoryArgs() + args.GasSchedule = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilGasSchedule)) + require.Nil(t, pcf) + }) + t.Run("nil Data should error", func(t *testing.T) { + t.Parallel() -func TestProcessComponentsFactory_CreateWithInvalidTxAccumulatorTimeExpectError(t *testing.T) { - t.Parallel() + args := createMockProcessComponentsFactoryArgs() + args.Data = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilDataComponentsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil Blockchain should error", func(t *testing.T) { + t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) - processArgs.Config.Antiflood.TxAccumulator.MaxAllowedTimeInMilliseconds = 0 - pcf, err := processComp.NewProcessComponentsFactory(processArgs) - require.Nil(t, err) + args := createMockProcessComponentsFactoryArgs() + args.Data = &testsMocks.DataComponentsStub{ + BlockChain: &testscommon.ChainHandlerStub{}, + DataPool: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilDataPoolsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil StorageService should error", func(t *testing.T) { + t.Parallel() - instance, err := pcf.Create() - require.Nil(t, instance) - require.Error(t, err) - require.True(t, strings.Contains(err.Error(), process.ErrInvalidValue.Error())) + args := createMockProcessComponentsFactoryArgs() + args.Data = &testsMocks.DataComponentsStub{ + BlockChain: &testscommon.ChainHandlerStub{}, + DataPool: &dataRetriever.PoolsHolderStub{}, + Store: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilStorageService)) + require.Nil(t, pcf) + }) + t.Run("nil CoreData should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilCoreComponentsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil EconomicsData should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = &mock.CoreComponentsMock{ + EconomicsHandler: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilEconomicsData)) + require.Nil(t, pcf) + }) + t.Run("nil GenesisNodesSetup should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = &mock.CoreComponentsMock{ + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilGenesisNodesSetupHandler)) + require.Nil(t, pcf) + }) + t.Run("nil AddressPubKeyConverter should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = &mock.CoreComponentsMock{ + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: &testscommon.NodesSetupStub{}, + AddrPubKeyConv: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilAddressPublicKeyConverter)) + require.Nil(t, pcf) + }) + t.Run("nil EpochNotifier should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = &mock.CoreComponentsMock{ + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: &testscommon.NodesSetupStub{}, + AddrPubKeyConv: &mock.PubkeyConverterStub{}, + EpochChangeNotifier: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilEpochNotifier)) + require.Nil(t, pcf) + }) + t.Run("nil ValidatorPubKeyConverter should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = &mock.CoreComponentsMock{ + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: &testscommon.NodesSetupStub{}, + AddrPubKeyConv: &mock.PubkeyConverterStub{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + ValPubKeyConv: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilPubKeyConverter)) + require.Nil(t, pcf) + }) + t.Run("nil InternalMarshalizer should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = &mock.CoreComponentsMock{ + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: &testscommon.NodesSetupStub{}, + AddrPubKeyConv: &mock.PubkeyConverterStub{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + ValPubKeyConv: &mock.PubkeyConverterStub{}, + IntMarsh: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilInternalMarshalizer)) + require.Nil(t, pcf) + }) + t.Run("nil Uint64ByteSliceConverter should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.CoreData = &mock.CoreComponentsMock{ + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + NodesConfig: &testscommon.NodesSetupStub{}, + AddrPubKeyConv: &mock.PubkeyConverterStub{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + ValPubKeyConv: &mock.PubkeyConverterStub{}, + IntMarsh: &testscommon.MarshalizerStub{}, + UInt64ByteSliceConv: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilUint64ByteSliceConverter)) + require.Nil(t, pcf) + }) + t.Run("nil Crypto should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Crypto = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilCryptoComponentsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil BlockSignKeyGen should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Crypto = &testsMocks.CryptoComponentsStub{ + BlKeyGen: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilBlockSignKeyGen)) + require.Nil(t, pcf) + }) + t.Run("nil State should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.State = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilStateComponentsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil AccountsAdapter should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.State = &testscommon.StateComponentsMock{ + Accounts: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilAccountsAdapter)) + require.Nil(t, pcf) + }) + t.Run("nil Network should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Network = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilNetworkComponentsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil NetworkMessenger should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Network = &testsMocks.NetworkComponentsStub{ + Messenger: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilMessenger)) + require.Nil(t, pcf) + }) + t.Run("nil InputAntiFloodHandler should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Network = &testsMocks.NetworkComponentsStub{ + Messenger: &p2pmocks.MessengerStub{}, + InputAntiFlood: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilInputAntiFloodHandler)) + require.Nil(t, pcf) + }) + t.Run("nil SystemSCConfig should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.SystemSCConfig = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilSystemSCConfig)) + require.Nil(t, pcf) + }) + t.Run("nil BootstrapComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.BootstrapComponents = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilBootstrapComponentsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil ShardCoordinator should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.BootstrapComponents = &mainFactoryMocks.BootstrapComponentsStub{ + ShCoordinator: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilShardCoordinator)) + require.Nil(t, pcf) + }) + t.Run("nil EpochBootstrapParams should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.BootstrapComponents = &mainFactoryMocks.BootstrapComponentsStub{ + ShCoordinator: &testscommon.ShardsCoordinatorMock{}, + BootstrapParams: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilBootstrapParamsHandler)) + require.Nil(t, pcf) + }) + t.Run("nil StatusComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.StatusComponents = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilStatusComponentsHolder)) + require.Nil(t, pcf) + }) + t.Run("nil OutportHandler should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.StatusComponents = &testsMocks.StatusComponentsStub{ + Outport: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilOutportHandler)) + require.Nil(t, pcf) + }) + t.Run("nil HistoryRepo should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.HistoryRepo = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilHistoryRepository)) + require.Nil(t, pcf) + }) + t.Run("nil StatusCoreComponents should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.StatusCoreComponents = nil + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilStatusCoreComponents)) + require.Nil(t, pcf) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + pcf, err := processComp.NewProcessComponentsFactory(createMockProcessComponentsFactoryArgs()) + require.NoError(t, err) + require.NotNil(t, pcf) + }) } -func TestProcessComponents_IndexGenesisBlocks(t *testing.T) { +func TestProcessComponentsFactory_Create(t *testing.T) { t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(1) - processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) - processArgs.Data = &mock.DataComponentsMock{ - Storage: &storageStubs.ChainStorerStub{}, - } + expectedErr := errors.New("expected error") + t.Run("CreateCurrentEpochProvider fails should error", func(t *testing.T) { + t.Parallel() - saveBlockCalledMutex := sync.Mutex{} + args := createMockProcessComponentsFactoryArgs() + args.Config.EpochStartConfig.RoundsPerEpoch = 0 + args.PrefConfigs.FullArchive = true + testCreateWithArgs(t, args, "rounds per epoch") + }) + t.Run("NewFallbackHeaderValidator fails should error", testWithNilMarshaller(1, "Marshalizer")) + t.Run("NewHeaderSigVerifier fails should error", testWithNilMarshaller(2, "Marshalizer")) + t.Run("createNetworkShardingCollector fails due to invalid PublicKeyPeerId config should error", func(t *testing.T) { + t.Parallel() - outportHandler := &outport.OutportStub{ - HasDriversCalled: func() bool { - return true - }, - SaveBlockCalled: func(args *outportCore.ArgsSaveBlockData) { - saveBlockCalledMutex.Lock() - require.NotNil(t, args) + args := createMockProcessComponentsFactoryArgs() + args.Config.PublicKeyPeerId.Type = "invalid" + testCreateWithArgs(t, args, "cache type") + }) + t.Run("createNetworkShardingCollector fails due to invalid PublicKeyShardId config should error", func(t *testing.T) { + t.Parallel() - bodyRequired := &dataBlock.Body{ - MiniBlocks: make([]*block.MiniBlock, 4), + args := createMockProcessComponentsFactoryArgs() + args.Config.PublicKeyShardId.Type = "invalid" + testCreateWithArgs(t, args, "cache type") + }) + t.Run("prepareNetworkShardingCollector fails due to SetPeerShardResolver failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + netwCompStub, ok := args.Network.(*testsMocks.NetworkComponentsStub) + require.True(t, ok) + netwCompStub.Messenger = &p2pmocks.MessengerStub{ + SetPeerShardResolverCalled: func(peerShardResolver p2p.PeerShardResolver) error { + return expectedErr + }, + } + testCreateWithArgs(t, args, expectedErr.Error()) + }) + t.Run("newStorageResolver fails due to NewStorageServiceFactory failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.ImportDBConfig.IsImportDBMode = true + args.Config.StoragePruning.NumActivePersisters = 0 + testCreateWithArgs(t, args, "active persisters") + }) + t.Run("newStorageResolver fails due to CreateForMeta failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.ImportDBConfig.IsImportDBMode = true + args.Config.ShardHdrNonceHashStorage.Cache.Type = "invalid" + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + bootstrapCompStub.ShCoordinator = &testscommon.ShardsCoordinatorMock{ + NoShards: 2, + CurrentShard: common.MetachainShardId, + } + testCreateWithArgs(t, args, "ShardHdrNonceHashStorage") + }) + t.Run("newStorageResolver fails due to CreateForMeta failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.ImportDBConfig.IsImportDBMode = true + args.Config.ShardHdrNonceHashStorage.Cache.Type = "invalid" + testCreateWithArgs(t, args, "ShardHdrNonceHashStorage") + }) + t.Run("newResolverContainerFactory fails due to NewPeerAuthenticationPayloadValidator failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.HeartbeatV2.HeartbeatExpiryTimespanInSec = 0 + testCreateWithArgs(t, args, "expiry timespan") + }) + t.Run("newResolverContainerFactory fails due to invalid shard should error", + testWithInvalidShard(0, "could not create interceptor and resolver container factory")) + t.Run("newMetaResolverContainerFactory fails due to NewSimpleDataPacker failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + bootstrapCompStub.ShCoordinator = &testscommon.ShardsCoordinatorMock{ + NoShards: 2, + CurrentShard: common.MetachainShardId, + } + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + cnt := 0 + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + cnt++ + if cnt > 3 { + return nil + } + return &testscommon.MarshalizerStub{} + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, "marshalizer") + }) + t.Run("newShardResolverContainerFactory fails due to NewSimpleDataPacker failure should error", testWithNilMarshaller(3, "marshalizer")) + t.Run("NewResolversFinder fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.ImportDBConfig.IsImportDBMode = true // coverage + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + cnt := 0 + bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 5 { + return nil + } + return &testscommon.ShardsCoordinatorMock{ + NoShards: 2, + CurrentShard: common.MetachainShardId, // coverage } + } + testCreateWithArgs(t, args, "shard coordinator") + }) + t.Run("GetStorer TxLogsUnit fails should error", func(t *testing.T) { + t.Parallel() - txsPoolRequired := &outportCore.Pool{} + args := createMockProcessComponentsFactoryArgs() + args.ImportDBConfig.IsImportDBMode = true // coverage + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + dataCompStub.Store = &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { + return nil, expectedErr + }, + } + testCreateWithArgs(t, args, expectedErr.Error()) + }) + t.Run("NewResolversFinder fails should error", testWithNilMarshaller(5, "Marshalizer")) + t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to invalid GenesisNodePrice should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, txsPoolRequired, args.TransactionsPool) - assert.Equal(t, bodyRequired, args.Body) - saveBlockCalledMutex.Unlock() - }, - } + args := createMockProcessComponentsFactoryArgs() + args.Config.LogsAndEvents.SaveInStorageEnabled = false // coverage + args.Config.DbLookupExtensions.Enabled = true // coverage + args.SystemSCConfig.StakingSystemSCConfig.GenesisNodePrice = "invalid" + testCreateWithArgs(t, args, "invalid genesis node price") + }) + t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to NewGenesisBlockCreator failure should error", + testWithNilMarshaller(6, "Marshalizer")) + t.Run("setGenesisHeader fails due to invalid shard should error", + testWithInvalidShard(8, "genesis block does not exist")) + t.Run("newValidatorStatisticsProcessor fails due to nil genesis header should error", func(t *testing.T) { + t.Parallel() - processArgs.StatusComponents = &mainFactoryMocks.StatusComponentsStub{ - Outport: outportHandler, + args := createMockProcessComponentsFactoryArgs() + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + blockChainStub, ok := dataCompStub.BlockChain.(*testscommon.ChainHandlerStub) + require.True(t, ok) + blockChainStub.GetGenesisHeaderCalled = func() coreData.HeaderHandler { + return nil + } + testCreateWithArgs(t, args, errorsMx.ErrGenesisBlockNotInitialized.Error()) + }) + t.Run("indexGenesisBlocks fails due to CalculateHash failure should error", testWithNilMarshaller(41, "marshalizer")) + t.Run("indexGenesisBlocks fails due to GenerateInitialTransactions failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.AccountsParser = &mock.AccountsParserStub{ + GenerateInitialTransactionsCalled: func(shardCoordinator sharding.Coordinator, initialIndexingData map[uint32]*genesis.IndexingData) ([]*dataBlock.MiniBlock, map[uint32]*outportCore.Pool, error) { + return nil, nil, expectedErr + }, + } + testCreateWithArgs(t, args, expectedErr.Error()) + }) + t.Run("NewValidatorsProvider fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + pubKeyConv := args.CoreData.ValidatorPubKeyConverter() + cnt := 0 + coreCompStub.ValidatorPubKeyConverterCalled = func() core.PubkeyConverter { + cnt++ + if cnt > 2 { + return nil + } + return pubKeyConv + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, "pubkey converter") + }) + t.Run("newEpochStartTrigger fails due to invalid shard should error", + testWithInvalidShard(16, "error creating new start of epoch trigger because of invalid shard id")) + t.Run("newEpochStartTrigger fails due to NewHeaderValidator failure should error", testWithNilMarshaller(46, "Marshalizer")) + t.Run("newEpochStartTrigger fails due to NewPeerMiniBlockSyncer failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + dataPool := dataCompStub.DataPool + cnt := 0 + dataCompStub.DataPool = &dataRetriever.PoolsHolderStub{ + HeadersCalled: dataPool.Headers, + TransactionsCalled: dataPool.Transactions, + MiniBlocksCalled: dataPool.MiniBlocks, + CurrBlockTxsCalled: dataPool.CurrentBlockTxs, + TrieNodesCalled: dataPool.TrieNodes, + ValidatorsInfoCalled: func() retriever.ShardedDataCacherNotifier { + cnt++ + if cnt > 3 { + return nil + } + return dataPool.ValidatorsInfo() + }, + CloseCalled: nil, + } + testCreateWithArgs(t, args, "validators info pool") + }) + t.Run("newEpochStartTrigger fails due to NewPeerMiniBlockSyncer failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + cntShardC := 0 + bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cntShardC++ + shardC := testscommon.NewMultiShardsCoordinatorMock(2) + if cntShardC > 16 { + shardC.CurrentShard = common.MetachainShardId + } + return shardC + } + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + blockChainStub, ok := dataCompStub.BlockChain.(*testscommon.ChainHandlerStub) + require.True(t, ok) + cnt := 0 + blockChainStub.GetGenesisHeaderCalled = func() coreData.HeaderHandler { + cnt++ + if cnt > 1 { + return nil + } + return &testscommon.HeaderHandlerStub{} + } + testCreateWithArgs(t, args, errorsMx.ErrGenesisBlockNotInitialized.Error()) + }) + t.Run("newEpochStartTrigger fails due to invalid shard should error", + testWithInvalidShard(17, "genesis block does not exist")) + t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(48, "marshalizer")) + t.Run("prepareGenesisBlock fails due to CalculateHash failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + blockChainStub, ok := dataCompStub.BlockChain.(*testscommon.ChainHandlerStub) + require.True(t, ok) + cnt := 0 + blockChainStub.SetGenesisHeaderCalled = func(handler coreData.HeaderHandler) error { + cnt++ + if cnt > 1 { + return expectedErr + } + return nil + } + testCreateWithArgs(t, args, expectedErr.Error()) + }) + t.Run("saveGenesisHeaderToStorage fails due to Marshal failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + cnt := 0 + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + return &testscommon.MarshalizerStub{ + MarshalCalled: func(obj interface{}) ([]byte, error) { + cnt++ + if cnt > 38 { + return nil, expectedErr + } + return []byte(""), nil + }, + } + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, expectedErr.Error()) + }) + t.Run("GetStorer BootstrapUnit fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + store := args.Data.StorageService() + cnt := 0 + dataCompStub.Store = &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { + if unitType == retriever.BootstrapUnit { + cnt++ + if cnt > 2 { + return nil, expectedErr + } + } + return store.GetStorer(unitType) + }, + } + testCreateWithArgs(t, args, expectedErr.Error()) + }) + t.Run("NewBootstrapStorer fails should error", testWithNilMarshaller(50, "Marshalizer")) + t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(51, "Marshalizer")) + t.Run("newBlockTracker fails due to invalid shard should error", + testWithInvalidShard(19, "could not create block tracker")) + t.Run("NewMiniBlocksPoolsCleaner fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.PoolsCleanersConfig.MaxRoundsToKeepUnprocessedMiniBlocks = 0 + testCreateWithArgs(t, args, "MaxRoundsToKeepUnprocessedData") + }) + t.Run("NewTxsPoolsCleaner fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.PoolsCleanersConfig.MaxRoundsToKeepUnprocessedTransactions = 0 + testCreateWithArgs(t, args, "MaxRoundsToKeepUnprocessedData") + }) + t.Run("NewMiniBlockTrack fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + cnt := 0 + bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 22 { + return nil + } + return testscommon.NewMultiShardsCoordinatorMock(2) + } + testCreateWithArgs(t, args, "shard coordinator") + }) + t.Run("createHardforkTrigger fails due to Decode failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.Hardfork.PublicKeyToListenFrom = "invalid key" + testCreateWithArgs(t, args, "PublicKeyToListenFrom") + }) + t.Run("newInterceptorContainerFactory fails due to invalid shard should error", + testWithInvalidShard(23, "could not create interceptor container factory")) + t.Run("createExportFactoryHandler fails", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + cnt := 0 + bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > 25 { + return nil + } + return testscommon.NewMultiShardsCoordinatorMock(2) + } + testCreateWithArgs(t, args, "shard coordinator") + }) + t.Run("newForkDetector fails due to invalid shard should error", + testWithInvalidShard(27, "could not create fork detector")) + t.Run("NewCache fails for vmOutput should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.VMOutputCacher.Type = "invalid" + testCreateWithArgs(t, args, "cache type") + }) + t.Run("GetStorer ScheduledSCRsUnit fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + store := args.Data.StorageService() + dataCompStub.Store = &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { + if unitType == retriever.ScheduledSCRsUnit { + return nil, expectedErr + } + return store.GetStorer(unitType) + }, + } + testCreateWithArgs(t, args, expectedErr.Error()) + }) + t.Run("NewScheduledTxsExecution fails should error", testWithNilMarshaller(104, "Marshalizer")) + t.Run("NewESDTDataStorage fails should error", testWithNilMarshaller(105, "Marshalizer")) + t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(106, "marshalizer")) + t.Run("newBlockProcessor fails due to invalid shard should error", + testWithInvalidShard(31, "could not create block processor")) + t.Run("NewNodesSetupChecker fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + pubKeyConv := args.CoreData.ValidatorPubKeyConverter() + cnt := 0 + coreCompStub.ValidatorPubKeyConverterCalled = func() core.PubkeyConverter { + cnt++ + if cnt > 5 { + return nil + } + return pubKeyConv + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, "pubkey converter") + }) + t.Run("nodesSetupChecker.Check fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + coreCompStub.GenesisNodesSetupCalled = func() sharding.GenesisNodesSetupHandler { + return &testscommon.NodesSetupStub{ + AllInitialNodesCalled: func() []nodesCoordinator.GenesisNodeInfoHandler { + return []nodesCoordinator.GenesisNodeInfoHandler{ + &genesisMocks.GenesisNodeInfoHandlerMock{ + PubKeyBytesValue: []byte("no stake"), + }, + } + }, + GetShardConsensusGroupSizeCalled: func() uint32 { + return 2 + }, + GetMetaConsensusGroupSizeCalled: func() uint32 { + return 2 + }, + } + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, "no one staked") + }) + t.Run("NewNodeRedundancy fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + netwCompStub, ok := args.Network.(*testsMocks.NetworkComponentsStub) + require.True(t, ok) + cnt := 0 + netwCompStub.MessengerCalled = func() p2p.Messenger { + cnt++ + if cnt > 7 { + return nil + } + return &p2pmocks.MessengerStub{} + } + testCreateWithArgs(t, args, "messenger") + }) + t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(123, "marshalizer")) + t.Run("NewTxsSenderWithAccumulator fails should error", testWithNilMarshaller(124, "Marshalizer")) + t.Run("should work with indexAndReturnGenesisAccounts failing due to RootHash failure", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + statusCompStub, ok := args.StatusComponents.(*testsMocks.StatusComponentsStub) + require.True(t, ok) + statusCompStub.Outport = &outport.OutportStub{ + HasDriversCalled: func() bool { + return true + }, + } + stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) + require.True(t, ok) + accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) + require.True(t, ok) + accountsStub.RootHashCalled = func() ([]byte, error) { + return nil, expectedErr + } + pcf, _ := processComp.NewProcessComponentsFactory(args) + require.NotNil(t, pcf) + + instance, err := pcf.Create() + require.Nil(t, err) + require.NotNil(t, instance) + }) + t.Run("should work with indexAndReturnGenesisAccounts failing due to GetAllLeaves failure", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + statusCompStub, ok := args.StatusComponents.(*testsMocks.StatusComponentsStub) + require.True(t, ok) + statusCompStub.Outport = &outport.OutportStub{ + HasDriversCalled: func() bool { + return true + }, + } + stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) + require.True(t, ok) + accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) + require.True(t, ok) + accountsStub.GetAllLeavesCalled = func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { + close(leavesChannels.LeavesChan) + leavesChannels.ErrChan.Close() + return expectedErr + } + + pcf, _ := processComp.NewProcessComponentsFactory(args) + require.NotNil(t, pcf) + + instance, err := pcf.Create() + require.Nil(t, err) + require.NotNil(t, instance) + }) + t.Run("should work with indexAndReturnGenesisAccounts failing due to Unmarshal failure", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + statusCompStub, ok := args.StatusComponents.(*testsMocks.StatusComponentsStub) + require.True(t, ok) + statusCompStub.Outport = &outport.OutportStub{ + HasDriversCalled: func() bool { + return true + }, + } + stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) + require.True(t, ok) + accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) + require.True(t, ok) + accountsStub.GetAllLeavesCalled = func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { + leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("key_ok"), []byte("value")) // coverage + leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("key_invalid"), []byte("value")) + close(leavesChannels.LeavesChan) + leavesChannels.ErrChan.Close() + return nil + } + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + cnt := 0 + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + return &testscommon.MarshalizerStub{ + UnmarshalCalled: func(obj interface{}, buff []byte) error { + cnt++ + if cnt == 1 { + return nil // coverage, key_ok + } + return expectedErr + }, + } + } + args.CoreData = coreCompStub + pcf, _ := processComp.NewProcessComponentsFactory(args) + require.NotNil(t, pcf) + + instance, err := pcf.Create() + require.Nil(t, err) + require.NotNil(t, instance) + }) + t.Run("should work with indexAndReturnGenesisAccounts failing due to error on GetAllLeaves", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + statusCompStub, ok := args.StatusComponents.(*testsMocks.StatusComponentsStub) + require.True(t, ok) + statusCompStub.Outport = &outport.OutportStub{ + HasDriversCalled: func() bool { + return true + }, + } + stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) + require.True(t, ok) + accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) + require.True(t, ok) + accountsStub.GetAllLeavesCalled = func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { + close(leavesChannels.LeavesChan) + leavesChannels.ErrChan.WriteInChanNonBlocking(expectedErr) + leavesChannels.ErrChan.Close() + return nil + } + pcf, _ := processComp.NewProcessComponentsFactory(args) + require.NotNil(t, pcf) + + instance, err := pcf.Create() + require.Nil(t, err) + require.NotNil(t, instance) + }) + t.Run("should work - shard", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) + pcf, _ := processComp.NewProcessComponentsFactory(processArgs) + require.NotNil(t, pcf) + + instance, err := pcf.Create() + require.NoError(t, err) + require.NotNil(t, instance) + + err = instance.Close() + require.NoError(t, err) + }) + t.Run("should work - meta", func(t *testing.T) { + t.Parallel() + + shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) + shardCoordinator.CurrentShard = common.MetachainShardId + processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) + + protocolSustainabilityAddress := "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp" + shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { + protocolSustainabilityAddr, err := processArgs.CoreData.AddressPubKeyConverter().Decode(protocolSustainabilityAddress) + require.NoError(t, err) + if bytes.Equal(protocolSustainabilityAddr, address) { + return 0 + } + return shardCoordinator.CurrentShard + } + fundGenesisWallets(t, processArgs) + + pcf, _ := processComp.NewProcessComponentsFactory(processArgs) + require.NotNil(t, pcf) + + instance, err := pcf.Create() + require.NoError(t, err) + require.NotNil(t, instance) + + err = instance.Close() + require.NoError(t, err) + }) +} + +func fundGenesisWallets(t *testing.T, args processComp.ProcessComponentsFactoryArgs) { + accounts := args.State.AccountsAdapter() + initialNodes := args.CoreData.GenesisNodesSetup().AllInitialNodes() + nodePrice, ok := big.NewInt(0).SetString(args.SystemSCConfig.StakingSystemSCConfig.GenesisNodePrice, 10) + require.True(t, ok) + for _, node := range initialNodes { + account, err := accounts.LoadAccount(node.AddressBytes()) + require.NoError(t, err) + + userAccount := account.(mxState.UserAccountHandler) + err = userAccount.AddToBalance(nodePrice) + require.NoError(t, err) + + require.NoError(t, accounts.SaveAccount(userAccount)) + _, err = accounts.Commit() + require.NoError(t, err) } +} - pcf, err := processComp.NewProcessComponentsFactory(processArgs) - require.Nil(t, err) +func testWithNilMarshaller(nilStep int, expectedErrSubstr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + step := 0 + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + step++ + if step > nilStep { + return nil + } + return &testscommon.MarshalizerStub{} + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, expectedErrSubstr) + } +} - genesisBlocks := make(map[uint32]coreData.HeaderHandler) - indexingData := make(map[uint32]*genesis.IndexingData) +func testWithInvalidShard(failingStep int, expectedErrSubstr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() - for i := uint32(0); i < shardCoordinator.NumberOfShards(); i++ { - genesisBlocks[i] = &block.Header{} + args := createMockProcessComponentsFactoryArgs() + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + cnt := 0 + bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + cnt++ + if cnt > failingStep { + return &testscommon.ShardsCoordinatorMock{ + NoShards: 2, + CurrentShard: 3, + } + } + return testscommon.NewMultiShardsCoordinatorMock(2) + } + testCreateWithArgs(t, args, expectedErrSubstr) } +} + +func testCreateWithArgs(t *testing.T, args processComp.ProcessComponentsFactoryArgs, expectedErrSubstr string) { + pcf, _ := processComp.NewProcessComponentsFactory(args) + require.NotNil(t, pcf) - err = pcf.IndexGenesisBlocks(genesisBlocks, indexingData) - require.Nil(t, err) + instance, err := pcf.Create() + require.Error(t, err) + require.True(t, strings.Contains(err.Error(), expectedErrSubstr)) + require.Nil(t, instance) } diff --git a/genesis/errors.go b/genesis/errors.go index 2553b9650aa..77fee48171b 100644 --- a/genesis/errors.go +++ b/genesis/errors.go @@ -167,8 +167,8 @@ var ErrBLSKeyNotStaked = errors.New("bls key not staked") // ErrMissingDeployedSC signals that a delegation referenced an un-deployed contract var ErrMissingDeployedSC = errors.New("missing deployed SC") -// ErrNilGeneralSettingsConfig signals that a nil general settings config was provided -var ErrNilGeneralSettingsConfig = errors.New("nil general settings config") - // ErrNilEpochConfig signals that a nil epoch config was provided var ErrNilEpochConfig = errors.New("nil epoch config") + +// ErrNilGasSchedule signals that an operation has been attempted with a nil gas schedule +var ErrNilGasSchedule = errors.New("nil GasSchedule") diff --git a/genesis/process/genesisBlockCreator.go b/genesis/process/genesisBlockCreator.go index ba898b40414..f6a1ee38eb4 100644 --- a/genesis/process/genesisBlockCreator.go +++ b/genesis/process/genesisBlockCreator.go @@ -204,6 +204,9 @@ func checkArgumentsForBlockCreator(arg ArgsGenesisBlockCreator) error { if arg.EpochConfig == nil { return genesis.ErrNilEpochConfig } + if arg.GasSchedule == nil { + return genesis.ErrNilGasSchedule + } return nil } diff --git a/integrationTests/mock/p2pAntifloodHandlerStub.go b/integrationTests/mock/p2pAntifloodHandlerStub.go index bda3da406d5..c181d10909d 100644 --- a/integrationTests/mock/p2pAntifloodHandlerStub.go +++ b/integrationTests/mock/p2pAntifloodHandlerStub.go @@ -16,81 +16,85 @@ type P2PAntifloodHandlerStub struct { SetDebuggerCalled func(debugger process.AntifloodDebugger) error BlacklistPeerCalled func(peer core.PeerID, reason string, duration time.Duration) IsOriginatorEligibleForTopicCalled func(pid core.PeerID, topic string) error + SetPeerValidatorMapperCalled func(validatorMapper process.PeerValidatorMapper) error } // CanProcessMessage - -func (p2pahs *P2PAntifloodHandlerStub) CanProcessMessage(message p2p.MessageP2P, fromConnectedPeer core.PeerID) error { - if p2pahs.CanProcessMessageCalled == nil { +func (stub *P2PAntifloodHandlerStub) CanProcessMessage(message p2p.MessageP2P, fromConnectedPeer core.PeerID) error { + if stub.CanProcessMessageCalled == nil { return nil } - return p2pahs.CanProcessMessageCalled(message, fromConnectedPeer) + return stub.CanProcessMessageCalled(message, fromConnectedPeer) } // IsOriginatorEligibleForTopic - -func (p2pahs *P2PAntifloodHandlerStub) IsOriginatorEligibleForTopic(pid core.PeerID, topic string) error { - if p2pahs.IsOriginatorEligibleForTopicCalled != nil { - return p2pahs.IsOriginatorEligibleForTopicCalled(pid, topic) +func (stub *P2PAntifloodHandlerStub) IsOriginatorEligibleForTopic(pid core.PeerID, topic string) error { + if stub.IsOriginatorEligibleForTopicCalled != nil { + return stub.IsOriginatorEligibleForTopicCalled(pid, topic) } return nil } // CanProcessMessagesOnTopic - -func (p2pahs *P2PAntifloodHandlerStub) CanProcessMessagesOnTopic(peer core.PeerID, topic string, numMessages uint32, totalSize uint64, sequence []byte) error { - if p2pahs.CanProcessMessagesOnTopicCalled == nil { +func (stub *P2PAntifloodHandlerStub) CanProcessMessagesOnTopic(peer core.PeerID, topic string, numMessages uint32, totalSize uint64, sequence []byte) error { + if stub.CanProcessMessagesOnTopicCalled == nil { return nil } - return p2pahs.CanProcessMessagesOnTopicCalled(peer, topic, numMessages, totalSize, sequence) + return stub.CanProcessMessagesOnTopicCalled(peer, topic, numMessages, totalSize, sequence) } // ApplyConsensusSize - -func (p2pahs *P2PAntifloodHandlerStub) ApplyConsensusSize(size int) { - if p2pahs.ApplyConsensusSizeCalled != nil { - p2pahs.ApplyConsensusSizeCalled(size) +func (stub *P2PAntifloodHandlerStub) ApplyConsensusSize(size int) { + if stub.ApplyConsensusSizeCalled != nil { + stub.ApplyConsensusSizeCalled(size) } } // SetDebugger - -func (p2pahs *P2PAntifloodHandlerStub) SetDebugger(debugger process.AntifloodDebugger) error { - if p2pahs.SetDebuggerCalled != nil { - return p2pahs.SetDebuggerCalled(debugger) +func (stub *P2PAntifloodHandlerStub) SetDebugger(debugger process.AntifloodDebugger) error { + if stub.SetDebuggerCalled != nil { + return stub.SetDebuggerCalled(debugger) } return nil } // BlacklistPeer - -func (p2pahs *P2PAntifloodHandlerStub) BlacklistPeer(peer core.PeerID, reason string, duration time.Duration) { - if p2pahs.BlacklistPeerCalled != nil { - p2pahs.BlacklistPeerCalled(peer, reason, duration) +func (stub *P2PAntifloodHandlerStub) BlacklistPeer(peer core.PeerID, reason string, duration time.Duration) { + if stub.BlacklistPeerCalled != nil { + stub.BlacklistPeerCalled(peer, reason, duration) } } // ResetForTopic - -func (p2pahs *P2PAntifloodHandlerStub) ResetForTopic(_ string) { +func (stub *P2PAntifloodHandlerStub) ResetForTopic(_ string) { } // SetMaxMessagesForTopic - -func (p2pahs *P2PAntifloodHandlerStub) SetMaxMessagesForTopic(_ string, _ uint32) { +func (stub *P2PAntifloodHandlerStub) SetMaxMessagesForTopic(_ string, _ uint32) { } // SetPeerValidatorMapper - -func (p2pahs *P2PAntifloodHandlerStub) SetPeerValidatorMapper(_ process.PeerValidatorMapper) error { +func (stub *P2PAntifloodHandlerStub) SetPeerValidatorMapper(validatorMapper process.PeerValidatorMapper) error { + if stub.SetPeerValidatorMapperCalled != nil { + return stub.SetPeerValidatorMapperCalled(validatorMapper) + } return nil } // SetTopicsForAll - -func (p2pahs *P2PAntifloodHandlerStub) SetTopicsForAll(_ ...string) { +func (stub *P2PAntifloodHandlerStub) SetTopicsForAll(_ ...string) { } // Close - -func (p2pahs *P2PAntifloodHandlerStub) Close() error { +func (stub *P2PAntifloodHandlerStub) Close() error { return nil } // IsInterfaceNil - -func (p2pahs *P2PAntifloodHandlerStub) IsInterfaceNil() bool { - return p2pahs == nil +func (stub *P2PAntifloodHandlerStub) IsInterfaceNil() bool { + return stub == nil } diff --git a/process/track/baseBlockTrack.go b/process/track/baseBlockTrack.go index f4a264e5086..22eb1c86cc1 100644 --- a/process/track/baseBlockTrack.go +++ b/process/track/baseBlockTrack.go @@ -787,6 +787,9 @@ func checkTrackerNilParameters(arguments ArgBaseTracker) error { if check.IfNil(arguments.FeeHandler) { return process.ErrNilEconomicsData } + if check.IfNil(arguments.WhitelistHandler) { + return process.ErrNilWhiteListHandler + } return nil } diff --git a/process/track/baseBlockTrack_test.go b/process/track/baseBlockTrack_test.go index 7f633452179..8c919cd9ee7 100644 --- a/process/track/baseBlockTrack_test.go +++ b/process/track/baseBlockTrack_test.go @@ -307,6 +307,24 @@ func TestNewBlockTrack_ShouldErrNotarizedHeadersSliceIsNil(t *testing.T) { assert.True(t, check.IfNil(mbt)) } +func TestNewBlockTrack_ShouldErrNilWhitelistHandler(t *testing.T) { + t.Parallel() + + shardArguments := CreateShardTrackerMockArguments() + shardArguments.WhitelistHandler = nil + sbt, err := track.NewShardBlockTrack(shardArguments) + + assert.Equal(t, process.ErrNilWhiteListHandler, err) + assert.Nil(t, sbt) + + metaArguments := CreateMetaTrackerMockArguments() + metaArguments.WhitelistHandler = nil + mbt, err := track.NewMetaBlockTrack(metaArguments) + + assert.Equal(t, process.ErrNilWhiteListHandler, err) + assert.True(t, check.IfNil(mbt)) +} + func TestNewBlockTrack_ShouldWork(t *testing.T) { t.Parallel() diff --git a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go index f76a59c7150..8c9d56dca7b 100644 --- a/testscommon/mainFactoryMocks/bootstrapComponentsStub.go +++ b/testscommon/mainFactoryMocks/bootstrapComponentsStub.go @@ -14,6 +14,7 @@ type BootstrapComponentsStub struct { BootstrapParams factory.BootstrapParamsHolder NodeRole core.NodeType ShCoordinator sharding.Coordinator + ShardCoordinatorCalled func() sharding.Coordinator HdrVersionHandler nodeFactory.HeaderVersionHandler VersionedHdrFactory nodeFactory.VersionedHeaderFactory HdrIntegrityVerifier nodeFactory.HeaderIntegrityVerifierHandler @@ -52,6 +53,9 @@ func (bcs *BootstrapComponentsStub) NodeType() core.NodeType { // ShardCoordinator - func (bcs *BootstrapComponentsStub) ShardCoordinator() sharding.Coordinator { + if bcs.ShardCoordinatorCalled != nil { + return bcs.ShardCoordinatorCalled() + } return bcs.ShCoordinator } From 26fb309515b27574639c11a3a8a818b08ff41c7d Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 13 Apr 2023 17:05:21 +0300 Subject: [PATCH 288/335] tests for newShardBlockProcessor --- factory/processing/blockProcessorCreator.go | 6 +- factory/processing/processComponents_test.go | 226 ++++++++++++------- 2 files changed, 142 insertions(+), 90 deletions(-) diff --git a/factory/processing/blockProcessorCreator.go b/factory/processing/blockProcessorCreator.go index 72ebe28491e..6bcd309f3be 100644 --- a/factory/processing/blockProcessorCreator.go +++ b/factory/processing/blockProcessorCreator.go @@ -436,13 +436,11 @@ func (pcf *processComponentsFactory) newShardBlockProcessor( return nil, err } - blockProcessorComponents := &blockProcessorAndVmFactories{ + return &blockProcessorAndVmFactories{ blockProcessor: blockProcessor, vmFactoryForTxSimulate: vmFactoryTxSimulator, vmFactoryForProcessing: vmFactory, - } - - return blockProcessorComponents, nil + }, nil } func (pcf *processComponentsFactory) newMetaBlockProcessor( diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index df5b087d2b2..87cb3a83d7f 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -691,20 +691,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, "shard coordinator") }) - t.Run("GetStorer TxLogsUnit fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - args.ImportDBConfig.IsImportDBMode = true // coverage - dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) - require.True(t, ok) - dataCompStub.Store = &storageStubs.ChainStorerStub{ - GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { - return nil, expectedErr - }, - } - testCreateWithArgs(t, args, expectedErr.Error()) - }) + t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(0, retriever.TxLogsUnit)) t.Run("NewResolversFinder fails should error", testWithNilMarshaller(5, "Marshalizer")) t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to invalid GenesisNodePrice should error", func(t *testing.T) { t.Parallel() @@ -723,6 +710,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() + args.ImportDBConfig.IsImportDBMode = true // coverage dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) require.True(t, ok) blockChainStub, ok := dataCompStub.BlockChain.(*testscommon.ChainHandlerStub) @@ -744,23 +732,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, expectedErr.Error()) }) - t.Run("NewValidatorsProvider fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - pubKeyConv := args.CoreData.ValidatorPubKeyConverter() - cnt := 0 - coreCompStub.ValidatorPubKeyConverterCalled = func() core.PubkeyConverter { - cnt++ - if cnt > 2 { - return nil - } - return pubKeyConv - } - args.CoreData = coreCompStub - testCreateWithArgs(t, args, "pubkey converter") - }) + t.Run("NewValidatorsProvider fails should error", testWithNilPubKeyConv(2, "pubkey converter")) t.Run("newEpochStartTrigger fails due to invalid shard should error", testWithInvalidShard(16, "error creating new start of epoch trigger because of invalid shard id")) t.Run("newEpochStartTrigger fails due to NewHeaderValidator failure should error", testWithNilMarshaller(46, "Marshalizer")) @@ -859,27 +831,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.CoreData = coreCompStub testCreateWithArgs(t, args, expectedErr.Error()) }) - t.Run("GetStorer BootstrapUnit fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) - require.True(t, ok) - store := args.Data.StorageService() - cnt := 0 - dataCompStub.Store = &storageStubs.ChainStorerStub{ - GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { - if unitType == retriever.BootstrapUnit { - cnt++ - if cnt > 2 { - return nil, expectedErr - } - } - return store.GetStorer(unitType) - }, - } - testCreateWithArgs(t, args, expectedErr.Error()) - }) + t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(2, retriever.BootstrapUnit)) t.Run("NewBootstrapStorer fails should error", testWithNilMarshaller(50, "Marshalizer")) t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(51, "Marshalizer")) t.Run("newBlockTracker fails due to invalid shard should error", @@ -948,45 +900,58 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.VMOutputCacher.Type = "invalid" testCreateWithArgs(t, args, "cache type") }) - t.Run("GetStorer ScheduledSCRsUnit fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) - require.True(t, ok) - store := args.Data.StorageService() - dataCompStub.Store = &storageStubs.ChainStorerStub{ - GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { - if unitType == retriever.ScheduledSCRsUnit { - return nil, expectedErr - } - return store.GetStorer(unitType) - }, - } - testCreateWithArgs(t, args, expectedErr.Error()) - }) + t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(0, retriever.ScheduledSCRsUnit)) t.Run("NewScheduledTxsExecution fails should error", testWithNilMarshaller(104, "Marshalizer")) t.Run("NewESDTDataStorage fails should error", testWithNilMarshaller(105, "Marshalizer")) t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(106, "marshalizer")) t.Run("newBlockProcessor fails due to invalid shard should error", testWithInvalidShard(31, "could not create block processor")) - t.Run("NewNodesSetupChecker fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - pubKeyConv := args.CoreData.ValidatorPubKeyConverter() - cnt := 0 - coreCompStub.ValidatorPubKeyConverterCalled = func() core.PubkeyConverter { - cnt++ - if cnt > 5 { - return nil - } - return pubKeyConv - } - args.CoreData = coreCompStub - testCreateWithArgs(t, args, "pubkey converter") - }) + t.Run("newShardBlockProcessor: NewESDTTransferParser fails should error", + testWithNilMarshaller(107, "marshaller")) + t.Run("newShardBlockProcessor: createBuiltInFunctionContainer fails should error", + testWithNilAddressPubKeyConv(46, "public key converter")) + t.Run("newShardBlockProcessor: createVMFactoryShard fails due to NewBlockChainHookImpl failure should error", + testWithNilAddressPubKeyConv(47, "pubkey converter")) + t.Run("newShardBlockProcessor: NewIntermediateProcessorsContainerFactory fails should error", + testWithNilMarshaller(110, "Marshalizer")) + t.Run("newShardBlockProcessor: NewTxTypeHandler fails should error", + testWithNilAddressPubKeyConv(49, "pubkey converter")) + t.Run("newShardBlockProcessor: NewGasComputation fails should error", + testWithNilEnableEpochsHandler(13, "enable epochs handler")) + t.Run("newShardBlockProcessor: NewSmartContractProcessor fails should error", + testWithNilAddressPubKeyConv(50, "pubkey converter")) + t.Run("newShardBlockProcessor: NewRewardTxProcessor fails should error", + testWithNilAddressPubKeyConv(51, "pubkey converter")) + t.Run("newShardBlockProcessor: NewTxProcessor fails should error", + testWithNilAddressPubKeyConv(52, "pubkey converter")) + t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to NewIntermediateProcessorsContainerFactory failure should error", + testWithNilAddressPubKeyConv(53, "pubkey converter")) + t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to createBuiltInFunctionContainer failure should error", + testWithNilAddressPubKeyConv(54, "public key converter")) + t.Run("newShardBlockProcessor: createOutportDataProvider fails due to missing TransactionUnit should error", + testWithMissingStorer(3, retriever.TransactionUnit)) + t.Run("newShardBlockProcessor: createOutportDataProvider fails due to missing MiniBlockUnit should error", + testWithMissingStorer(4, retriever.MiniBlockUnit)) + t.Run("newShardBlockProcessor: NewShardProcessor fails should error", + testWithNilEnableEpochsHandler(23, "enable epochs handler")) + t.Run("newShardBlockProcessor: attachProcessDebugger fails should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.Debug.Process.Enabled = true + args.Config.Debug.Process.PollingTimeInSeconds = 0 + testCreateWithArgs(t, args, "PollingTimeInSeconds") + }) + t.Run("newShardBlockProcessor: NewBlockSizeComputation fails should error", + testWithNilMarshaller(116, "Marshalizer")) + t.Run("newShardBlockProcessor: NewPreProcessorsContainerFactory fails should error", + testWithNilMarshaller(117, "Marshalizer")) + t.Run("newShardBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", + testWithNilMarshaller(118, "Marshalizer")) + t.Run("newShardBlockProcessor: NewTransactionCoordinator fails should error", + testWithNilMarshaller(119, "Marshalizer")) + + t.Run("NewNodesSetupChecker fails should error", testWithNilPubKeyConv(5, "pubkey converter")) t.Run("nodesSetupChecker.Check fails should error", func(t *testing.T) { t.Parallel() @@ -1227,6 +1192,7 @@ func testWithNilMarshaller(nilStep int, expectedErrSubstr string) func(t *testin step := 0 coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { step++ + println(step) if step > nilStep { return nil } @@ -1237,6 +1203,94 @@ func testWithNilMarshaller(nilStep int, expectedErrSubstr string) func(t *testin } } +func testWithNilPubKeyConv(nilStep int, expectedErrSubstr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + pubKeyConv := args.CoreData.ValidatorPubKeyConverter() + step := 0 + coreCompStub.ValidatorPubKeyConverterCalled = func() core.PubkeyConverter { + step++ + if step > nilStep { + return nil + } + return pubKeyConv + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, expectedErrSubstr) + } +} + +func testWithNilAddressPubKeyConv(nilStep int, expectedErrSubstr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + pubKeyConv := args.CoreData.AddressPubKeyConverter() + step := 0 + coreCompStub.AddressPubKeyConverterCalled = func() core.PubkeyConverter { + step++ + println(step) + if step > nilStep { + return nil + } + return pubKeyConv + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, expectedErrSubstr) + } +} + +func testWithNilEnableEpochsHandler(nilStep int, expectedErrSubstr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + enableEpochsHandler := coreCompStub.EnableEpochsHandler() + step := 0 + coreCompStub.EnableEpochsHandlerCalled = func() common.EnableEpochsHandler { + step++ + println(step) + if step > nilStep { + return nil + } + return enableEpochsHandler + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, expectedErrSubstr) + } +} + +func testWithMissingStorer(failStep int, missingUnitType retriever.UnitType) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + args := createMockProcessComponentsFactoryArgs() + dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) + require.True(t, ok) + store := args.Data.StorageService() + cnt := 0 + dataCompStub.Store = &storageStubs.ChainStorerStub{ + GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { + if unitType == missingUnitType { + cnt++ + println(cnt) + if cnt > failStep { + return nil, expectedErr + } + } + return store.GetStorer(unitType) + }, + } + testCreateWithArgs(t, args, expectedErr.Error()) + } +} + func testWithInvalidShard(failingStep int, expectedErrSubstr string) func(t *testing.T) { return func(t *testing.T) { t.Parallel() From d829b0c0c9759a82f62a32ec6450561f00957383 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 13 Apr 2023 18:25:05 +0300 Subject: [PATCH 289/335] more tests on processComponents --- factory/processing/processComponents_test.go | 239 ++++++++++++------ .../factory/metachain/vmContainerFactory.go | 2 +- .../metachain/vmContainerFactory_test.go | 2 +- testscommon/stateComponentsMock.go | 16 +- 4 files changed, 176 insertions(+), 83 deletions(-) diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index 87cb3a83d7f..dfa2992a6ab 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -56,6 +56,12 @@ import ( "github.com/stretchr/testify/require" ) +const ( + unreachableStep = 10000 + blockProcessorOnMetaStep = 31 + testingProtocolSustainabilityAddress = "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp" +) + func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFactoryArgs { gasSchedule, _ := common.LoadGasScheduleConfig("../../cmd/node/config/gasSchedules/gasScheduleV1.toml") addrPubKeyConv, _ := factory.NewPubkeyConverter(config.PubkeyConfig{ @@ -166,8 +172,12 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto return 2 }, }, - EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, - EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, + EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, + EconomicsHandler: &economicsmocks.EconomicsHandlerStub{ + ProtocolSustainabilityAddressCalled: func() string { + return testingProtocolSustainabilityAddress + }, + }, Hash: &testscommon.HasherStub{}, TxVersionCheckHandler: &testscommon.TxVersionCheckerStub{}, RatingHandler: &testscommon.RaterMock{}, @@ -180,6 +190,7 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto HardforkTriggerPubKeyField: []byte("hardfork pub key"), WasmVMChangeLockerInternal: &sync.RWMutex{}, NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, + RatingsConfig: &testscommon.RatingsInfoMock{}, }, Crypto: &testsMocks.CryptoComponentsStub{ BlKeyGen: &cryptoMocks.KeyGenStub{}, @@ -194,6 +205,7 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto TxKeyGen: &cryptoMocks.KeyGenStub{}, TxSig: &cryptoMocks.SingleSignerStub{}, PeerSignHandler: &cryptoMocks.PeerSignatureHandlerStub{}, + MsgSigVerifier: &testscommon.MessageSignVerifierMock{}, }, State: &testscommon.StateComponentsMock{ Accounts: &state.AccountsStub{ @@ -580,8 +592,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.PrefConfigs.FullArchive = true testCreateWithArgs(t, args, "rounds per epoch") }) - t.Run("NewFallbackHeaderValidator fails should error", testWithNilMarshaller(1, "Marshalizer")) - t.Run("NewHeaderSigVerifier fails should error", testWithNilMarshaller(2, "Marshalizer")) + t.Run("NewFallbackHeaderValidator fails should error", testWithNilMarshaller(1, "Marshalizer", unreachableStep)) + t.Run("NewHeaderSigVerifier fails should error", testWithNilMarshaller(2, "Marshalizer", unreachableStep)) t.Run("createNetworkShardingCollector fails due to invalid PublicKeyPeerId config should error", func(t *testing.T) { t.Parallel() @@ -623,12 +635,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args := createMockProcessComponentsFactoryArgs() args.ImportDBConfig.IsImportDBMode = true args.Config.ShardHdrNonceHashStorage.Cache.Type = "invalid" - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - bootstrapCompStub.ShCoordinator = &testscommon.ShardsCoordinatorMock{ - NoShards: 2, - CurrentShard: common.MetachainShardId, - } + updateShardCoordinatorForMetaAtStep(t, args, 0) testCreateWithArgs(t, args, "ShardHdrNonceHashStorage") }) t.Run("newStorageResolver fails due to CreateForMeta failure should error", func(t *testing.T) { @@ -652,12 +659,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - bootstrapCompStub.ShCoordinator = &testscommon.ShardsCoordinatorMock{ - NoShards: 2, - CurrentShard: common.MetachainShardId, - } + updateShardCoordinatorForMetaAtStep(t, args, 0) coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) cnt := 0 coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { @@ -670,7 +672,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.CoreData = coreCompStub testCreateWithArgs(t, args, "marshalizer") }) - t.Run("newShardResolverContainerFactory fails due to NewSimpleDataPacker failure should error", testWithNilMarshaller(3, "marshalizer")) + t.Run("newShardResolverContainerFactory fails due to NewSimpleDataPacker failure should error", + testWithNilMarshaller(3, "marshalizer", unreachableStep)) t.Run("NewResolversFinder fails should error", func(t *testing.T) { t.Parallel() @@ -691,8 +694,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, "shard coordinator") }) - t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(0, retriever.TxLogsUnit)) - t.Run("NewResolversFinder fails should error", testWithNilMarshaller(5, "Marshalizer")) + t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(0, retriever.TxLogsUnit, unreachableStep)) + t.Run("NewResolversFinder fails should error", testWithNilMarshaller(5, "Marshalizer", unreachableStep)) t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to invalid GenesisNodePrice should error", func(t *testing.T) { t.Parallel() @@ -703,7 +706,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, "invalid genesis node price") }) t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to NewGenesisBlockCreator failure should error", - testWithNilMarshaller(6, "Marshalizer")) + testWithNilMarshaller(6, "Marshalizer", unreachableStep)) t.Run("setGenesisHeader fails due to invalid shard should error", testWithInvalidShard(8, "genesis block does not exist")) t.Run("newValidatorStatisticsProcessor fails due to nil genesis header should error", func(t *testing.T) { @@ -720,7 +723,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, errorsMx.ErrGenesisBlockNotInitialized.Error()) }) - t.Run("indexGenesisBlocks fails due to CalculateHash failure should error", testWithNilMarshaller(41, "marshalizer")) + t.Run("indexGenesisBlocks fails due to CalculateHash failure should error", + testWithNilMarshaller(41, "marshalizer", unreachableStep)) t.Run("indexGenesisBlocks fails due to GenerateInitialTransactions failure should error", func(t *testing.T) { t.Parallel() @@ -732,10 +736,12 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, expectedErr.Error()) }) - t.Run("NewValidatorsProvider fails should error", testWithNilPubKeyConv(2, "pubkey converter")) + t.Run("NewValidatorsProvider fails should error", + testWithNilPubKeyConv(2, "pubkey converter", unreachableStep)) t.Run("newEpochStartTrigger fails due to invalid shard should error", testWithInvalidShard(16, "error creating new start of epoch trigger because of invalid shard id")) - t.Run("newEpochStartTrigger fails due to NewHeaderValidator failure should error", testWithNilMarshaller(46, "Marshalizer")) + t.Run("newEpochStartTrigger fails due to NewHeaderValidator failure should error", + testWithNilMarshaller(46, "Marshalizer", unreachableStep)) t.Run("newEpochStartTrigger fails due to NewPeerMiniBlockSyncer failure should error", func(t *testing.T) { t.Parallel() @@ -765,17 +771,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - cntShardC := 0 - bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { - cntShardC++ - shardC := testscommon.NewMultiShardsCoordinatorMock(2) - if cntShardC > 16 { - shardC.CurrentShard = common.MetachainShardId - } - return shardC - } + updateShardCoordinatorForMetaAtStep(t, args, 16) dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) require.True(t, ok) blockChainStub, ok := dataCompStub.BlockChain.(*testscommon.ChainHandlerStub) @@ -792,7 +788,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { }) t.Run("newEpochStartTrigger fails due to invalid shard should error", testWithInvalidShard(17, "genesis block does not exist")) - t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(48, "marshalizer")) + t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(48, "marshalizer", unreachableStep)) t.Run("prepareGenesisBlock fails due to CalculateHash failure should error", func(t *testing.T) { t.Parallel() @@ -831,9 +827,9 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.CoreData = coreCompStub testCreateWithArgs(t, args, expectedErr.Error()) }) - t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(2, retriever.BootstrapUnit)) - t.Run("NewBootstrapStorer fails should error", testWithNilMarshaller(50, "Marshalizer")) - t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(51, "Marshalizer")) + t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(2, retriever.BootstrapUnit, unreachableStep)) + t.Run("NewBootstrapStorer fails should error", testWithNilMarshaller(50, "Marshalizer", unreachableStep)) + t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(51, "Marshalizer", unreachableStep)) t.Run("newBlockTracker fails due to invalid shard should error", testWithInvalidShard(19, "could not create block tracker")) t.Run("NewMiniBlocksPoolsCleaner fails should error", func(t *testing.T) { @@ -900,40 +896,50 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.VMOutputCacher.Type = "invalid" testCreateWithArgs(t, args, "cache type") }) - t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(0, retriever.ScheduledSCRsUnit)) - t.Run("NewScheduledTxsExecution fails should error", testWithNilMarshaller(104, "Marshalizer")) - t.Run("NewESDTDataStorage fails should error", testWithNilMarshaller(105, "Marshalizer")) - t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(106, "marshalizer")) + t.Run("GetStorer TxLogsUnit fails should error", + testWithMissingStorer(0, retriever.ScheduledSCRsUnit, unreachableStep)) + t.Run("NewScheduledTxsExecution fails should error", + testWithNilMarshaller(104, "Marshalizer", unreachableStep)) + t.Run("NewESDTDataStorage fails should error", + testWithNilMarshaller(105, "Marshalizer", unreachableStep)) + t.Run("NewReceiptsRepository fails should error", + testWithNilMarshaller(106, "marshalizer", unreachableStep)) t.Run("newBlockProcessor fails due to invalid shard should error", testWithInvalidShard(31, "could not create block processor")) + + // newShardBlockProcessor t.Run("newShardBlockProcessor: NewESDTTransferParser fails should error", - testWithNilMarshaller(107, "marshaller")) + testWithNilMarshaller(107, "marshaller", unreachableStep)) t.Run("newShardBlockProcessor: createBuiltInFunctionContainer fails should error", - testWithNilAddressPubKeyConv(46, "public key converter")) + testWithNilAddressPubKeyConv(46, "public key converter", unreachableStep)) t.Run("newShardBlockProcessor: createVMFactoryShard fails due to NewBlockChainHookImpl failure should error", - testWithNilAddressPubKeyConv(47, "pubkey converter")) + testWithNilAddressPubKeyConv(47, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: NewIntermediateProcessorsContainerFactory fails should error", - testWithNilMarshaller(110, "Marshalizer")) + testWithNilMarshaller(110, "Marshalizer", unreachableStep)) t.Run("newShardBlockProcessor: NewTxTypeHandler fails should error", - testWithNilAddressPubKeyConv(49, "pubkey converter")) + testWithNilAddressPubKeyConv(49, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: NewGasComputation fails should error", - testWithNilEnableEpochsHandler(13, "enable epochs handler")) + testWithNilEnableEpochsHandler(13, "enable epochs handler", unreachableStep)) t.Run("newShardBlockProcessor: NewSmartContractProcessor fails should error", - testWithNilAddressPubKeyConv(50, "pubkey converter")) + testWithNilAddressPubKeyConv(50, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: NewRewardTxProcessor fails should error", - testWithNilAddressPubKeyConv(51, "pubkey converter")) + testWithNilAddressPubKeyConv(51, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: NewTxProcessor fails should error", - testWithNilAddressPubKeyConv(52, "pubkey converter")) + testWithNilAddressPubKeyConv(52, "pubkey converter", unreachableStep)) + t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to NewReadOnlyAccountsDB failure should error", + testWithNilAccountsAdapterAPI(1, "accounts adapter", unreachableStep)) t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to NewIntermediateProcessorsContainerFactory failure should error", - testWithNilAddressPubKeyConv(53, "pubkey converter")) + testWithNilAddressPubKeyConv(53, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to createBuiltInFunctionContainer failure should error", - testWithNilAddressPubKeyConv(54, "public key converter")) + testWithNilAddressPubKeyConv(54, "public key converter", unreachableStep)) + t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to createVMFactoryShard failure should error", + testWithNilAddressPubKeyConv(55, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: createOutportDataProvider fails due to missing TransactionUnit should error", - testWithMissingStorer(3, retriever.TransactionUnit)) + testWithMissingStorer(3, retriever.TransactionUnit, unreachableStep)) t.Run("newShardBlockProcessor: createOutportDataProvider fails due to missing MiniBlockUnit should error", - testWithMissingStorer(4, retriever.MiniBlockUnit)) + testWithMissingStorer(4, retriever.MiniBlockUnit, unreachableStep)) t.Run("newShardBlockProcessor: NewShardProcessor fails should error", - testWithNilEnableEpochsHandler(23, "enable epochs handler")) + testWithNilEnableEpochsHandler(23, "enable epochs handler", unreachableStep)) t.Run("newShardBlockProcessor: attachProcessDebugger fails should error", func(t *testing.T) { t.Parallel() @@ -943,15 +949,63 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, "PollingTimeInSeconds") }) t.Run("newShardBlockProcessor: NewBlockSizeComputation fails should error", - testWithNilMarshaller(116, "Marshalizer")) + testWithNilMarshaller(116, "Marshalizer", unreachableStep)) t.Run("newShardBlockProcessor: NewPreProcessorsContainerFactory fails should error", - testWithNilMarshaller(117, "Marshalizer")) + testWithNilMarshaller(117, "Marshalizer", unreachableStep)) t.Run("newShardBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", - testWithNilMarshaller(118, "Marshalizer")) + testWithNilMarshaller(118, "Marshalizer", unreachableStep)) t.Run("newShardBlockProcessor: NewTransactionCoordinator fails should error", - testWithNilMarshaller(119, "Marshalizer")) - - t.Run("NewNodesSetupChecker fails should error", testWithNilPubKeyConv(5, "pubkey converter")) + testWithNilMarshaller(119, "Marshalizer", unreachableStep)) + + // newMetaBlockProcessor, step for meta is 31 inside newBlockProcessor + t.Run("newMetaBlockProcessor: createBuiltInFunctionContainer fails should error", + testWithNilAddressPubKeyConv(46, "public key converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: createVMFactoryMeta fails due to NewBlockChainHookImpl failure should error", + testWithNilAddressPubKeyConv(47, "pubkey converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewIntermediateProcessorsContainerFactory fails should error", + testWithNilMarshaller(110, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewESDTTransferParser fails should error", + testWithNilMarshaller(111, "marshaller", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewTxTypeHandler fails should error", + testWithNilAddressPubKeyConv(49, "pubkey converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewGasComputation fails should error", + testWithNilEnableEpochsHandler(13, "enable epochs handler", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewSmartContractProcessor fails should error", + testWithNilAddressPubKeyConv(50, "pubkey converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewMetaTxProcessor fails should error", + testWithNilAddressPubKeyConv(51, "pubkey converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to NewIntermediateProcessorsContainerFactory failure should error", + testWithNilAddressPubKeyConv(52, "pubkey converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to NewReadOnlyAccountsDB failure should error", + testWithNilAccountsAdapterAPI(1, "accounts adapter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to createBuiltInFunctionContainer failure should error", + testWithNilAddressPubKeyConv(53, "public key converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to createVMFactoryMeta failure should error", + testWithNilAddressPubKeyConv(54, "pubkey converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to NewMetaTxProcessor failure second time should error", + testWithNilAddressPubKeyConv(55, "pubkey converter", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewBlockSizeComputation fails should error", + testWithNilMarshaller(119, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewPreProcessorsContainerFactory fails should error", + testWithNilMarshaller(120, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", + testWithNilMarshaller(121, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewTransactionCoordinator fails should error", + testWithNilMarshaller(122, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewStakingToPeer fails should error", + testWithNilMarshaller(123, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewEpochStartData fails should error", + testWithNilMarshaller(124, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewEndOfEpochEconomicsDataCreator fails should error", + testWithNilMarshaller(125, "marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: GetStorer RewardTransactionUnit fails should error", + testWithMissingStorer(1, retriever.RewardTransactionUnit, blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: GetStorer MiniBlockUnit fails should error", + testWithMissingStorer(4, retriever.MiniBlockUnit, blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewRewardsCreatorProxy fails should error", + testWithNilMarshaller(126, "marshalizer", blockProcessorOnMetaStep)) + + t.Run("NewNodesSetupChecker fails should error", testWithNilPubKeyConv(5, "pubkey converter", unreachableStep)) t.Run("nodesSetupChecker.Check fails should error", func(t *testing.T) { t.Parallel() @@ -993,8 +1047,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, "messenger") }) - t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(123, "marshalizer")) - t.Run("NewTxsSenderWithAccumulator fails should error", testWithNilMarshaller(124, "Marshalizer")) + t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(123, "marshalizer", unreachableStep)) + t.Run("NewTxsSenderWithAccumulator fails should error", testWithNilMarshaller(124, "Marshalizer", unreachableStep)) t.Run("should work with indexAndReturnGenesisAccounts failing due to RootHash failure", func(t *testing.T) { t.Parallel() @@ -1141,9 +1195,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { shardCoordinator.CurrentShard = common.MetachainShardId processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) - protocolSustainabilityAddress := "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp" shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { - protocolSustainabilityAddr, err := processArgs.CoreData.AddressPubKeyConverter().Decode(protocolSustainabilityAddress) + protocolSustainabilityAddr, err := processArgs.CoreData.AddressPubKeyConverter().Decode(testingProtocolSustainabilityAddress) require.NoError(t, err) if bytes.Equal(protocolSustainabilityAddr, address) { return 0 @@ -1183,7 +1236,7 @@ func fundGenesisWallets(t *testing.T, args processComp.ProcessComponentsFactoryA } } -func testWithNilMarshaller(nilStep int, expectedErrSubstr string) func(t *testing.T) { +func testWithNilMarshaller(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { return func(t *testing.T) { t.Parallel() @@ -1192,18 +1245,18 @@ func testWithNilMarshaller(nilStep int, expectedErrSubstr string) func(t *testin step := 0 coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { step++ - println(step) if step > nilStep { return nil } return &testscommon.MarshalizerStub{} } args.CoreData = coreCompStub + updateShardCoordinatorForMetaAtStep(t, args, metaStep) testCreateWithArgs(t, args, expectedErrSubstr) } } -func testWithNilPubKeyConv(nilStep int, expectedErrSubstr string) func(t *testing.T) { +func testWithNilPubKeyConv(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { return func(t *testing.T) { t.Parallel() @@ -1219,11 +1272,12 @@ func testWithNilPubKeyConv(nilStep int, expectedErrSubstr string) func(t *testin return pubKeyConv } args.CoreData = coreCompStub + updateShardCoordinatorForMetaAtStep(t, args, metaStep) testCreateWithArgs(t, args, expectedErrSubstr) } } -func testWithNilAddressPubKeyConv(nilStep int, expectedErrSubstr string) func(t *testing.T) { +func testWithNilAddressPubKeyConv(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { return func(t *testing.T) { t.Parallel() @@ -1233,18 +1287,18 @@ func testWithNilAddressPubKeyConv(nilStep int, expectedErrSubstr string) func(t step := 0 coreCompStub.AddressPubKeyConverterCalled = func() core.PubkeyConverter { step++ - println(step) if step > nilStep { return nil } return pubKeyConv } args.CoreData = coreCompStub + updateShardCoordinatorForMetaAtStep(t, args, metaStep) testCreateWithArgs(t, args, expectedErrSubstr) } } -func testWithNilEnableEpochsHandler(nilStep int, expectedErrSubstr string) func(t *testing.T) { +func testWithNilEnableEpochsHandler(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { return func(t *testing.T) { t.Parallel() @@ -1254,18 +1308,39 @@ func testWithNilEnableEpochsHandler(nilStep int, expectedErrSubstr string) func( step := 0 coreCompStub.EnableEpochsHandlerCalled = func() common.EnableEpochsHandler { step++ - println(step) if step > nilStep { return nil } return enableEpochsHandler } args.CoreData = coreCompStub + updateShardCoordinatorForMetaAtStep(t, args, metaStep) testCreateWithArgs(t, args, expectedErrSubstr) } } -func testWithMissingStorer(failStep int, missingUnitType retriever.UnitType) func(t *testing.T) { +func testWithNilAccountsAdapterAPI(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) + require.True(t, ok) + accountsAdapterAPI := stateCompStub.AccountsAdapterAPI() + step := 0 + stateCompStub.AccountsAdapterAPICalled = func() mxState.AccountsAdapter { + step++ + if step > nilStep { + return nil + } + return accountsAdapterAPI + } + updateShardCoordinatorForMetaAtStep(t, args, metaStep) + testCreateWithArgs(t, args, expectedErrSubstr) + } +} + +func testWithMissingStorer(failStep int, missingUnitType retriever.UnitType, metaStep int) func(t *testing.T) { return func(t *testing.T) { t.Parallel() @@ -1279,7 +1354,6 @@ func testWithMissingStorer(failStep int, missingUnitType retriever.UnitType) fun GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { if unitType == missingUnitType { cnt++ - println(cnt) if cnt > failStep { return nil, expectedErr } @@ -1287,10 +1361,25 @@ func testWithMissingStorer(failStep int, missingUnitType retriever.UnitType) fun return store.GetStorer(unitType) }, } + updateShardCoordinatorForMetaAtStep(t, args, metaStep) testCreateWithArgs(t, args, expectedErr.Error()) } } +func updateShardCoordinatorForMetaAtStep(t *testing.T, args processComp.ProcessComponentsFactoryArgs, metaStep int) { + bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) + require.True(t, ok) + step := 0 + bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { + step++ + shardC := testscommon.NewMultiShardsCoordinatorMock(2) + if step > metaStep { + shardC.CurrentShard = common.MetachainShardId + } + return shardC + } +} + func testWithInvalidShard(failingStep int, expectedErrSubstr string) func(t *testing.T) { return func(t *testing.T) { t.Parallel() diff --git a/process/factory/metachain/vmContainerFactory.go b/process/factory/metachain/vmContainerFactory.go index 665be533e17..0134cda878b 100644 --- a/process/factory/metachain/vmContainerFactory.go +++ b/process/factory/metachain/vmContainerFactory.go @@ -68,7 +68,7 @@ func NewVMContainerFactory(args ArgsNewVMContainerFactory) (*vmContainerFactory, return nil, fmt.Errorf("%w in NewVMContainerFactory", process.ErrNilEconomicsData) } if check.IfNil(args.MessageSignVerifier) { - return nil, fmt.Errorf("%w in NewVMContainerFactory", process.ErrNilKeyGen) + return nil, fmt.Errorf("%w in NewVMContainerFactory", vm.ErrNilMessageSignVerifier) } if check.IfNil(args.NodesConfigProvider) { return nil, fmt.Errorf("%w in NewVMContainerFactory", process.ErrNilNodesConfigProvider) diff --git a/process/factory/metachain/vmContainerFactory_test.go b/process/factory/metachain/vmContainerFactory_test.go index 9abc40c6375..ea1a12fb3ee 100644 --- a/process/factory/metachain/vmContainerFactory_test.go +++ b/process/factory/metachain/vmContainerFactory_test.go @@ -89,7 +89,7 @@ func TestNewVMContainerFactory_NilMessageSignVerifier(t *testing.T) { vmf, err := NewVMContainerFactory(argsNewVmContainerFactory) assert.True(t, check.IfNil(vmf)) - assert.True(t, errors.Is(err, process.ErrNilKeyGen)) + assert.True(t, errors.Is(err, vm.ErrNilMessageSignVerifier)) } func TestNewVMContainerFactory_NilNodesConfigProvider(t *testing.T) { diff --git a/testscommon/stateComponentsMock.go b/testscommon/stateComponentsMock.go index 15b11bb4ad0..9a08cb328df 100644 --- a/testscommon/stateComponentsMock.go +++ b/testscommon/stateComponentsMock.go @@ -7,12 +7,13 @@ import ( // StateComponentsMock - type StateComponentsMock struct { - PeersAcc state.AccountsAdapter - Accounts state.AccountsAdapter - AccountsAPI state.AccountsAdapter - AccountsRepo state.AccountsRepository - Tries common.TriesHolder - StorageManagers map[string]common.StorageManager + PeersAcc state.AccountsAdapter + Accounts state.AccountsAdapter + AccountsAPI state.AccountsAdapter + AccountsAdapterAPICalled func() state.AccountsAdapter + AccountsRepo state.AccountsRepository + Tries common.TriesHolder + StorageManagers map[string]common.StorageManager } // Create - @@ -42,6 +43,9 @@ func (scm *StateComponentsMock) AccountsAdapter() state.AccountsAdapter { // AccountsAdapterAPI - func (scm *StateComponentsMock) AccountsAdapterAPI() state.AccountsAdapter { + if scm.AccountsAdapterAPICalled != nil { + return scm.AccountsAdapterAPICalled() + } return scm.AccountsAPI } From 7c4074097bb1cf965bdbcfd8b8d2fe9f1d437dc6 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Tue, 18 Apr 2023 15:10:13 +0300 Subject: [PATCH 290/335] added new test --- vm/systemSmartContracts/governance.go | 3 +- vm/systemSmartContracts/governance_test.go | 32 ++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 38646ff7a3d..08fdf7bbb10 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -583,7 +583,8 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.OutOfGas } - generalProposal, err := g.getProposalFromNonce(big.NewInt(0).SetBytes(args.Arguments[0])) + nonce := big.NewInt(0).SetBytes(args.Arguments[0]) + generalProposal, err := g.getProposalFromNonce(nonce) if err != nil { g.eei.AddReturnMessage("getGeneralProposal error " + err.Error()) return vmcommon.UserError diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 83e1581f070..ab6f7803e8e 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -1758,3 +1758,35 @@ func TestComputeEndResults(t *testing.T) { require.Equal(t, "Proposal passed", retMessage) require.True(t, pass.Passed) } + +func TestGovernanceContract_ProposeVoteClose(t *testing.T) { + t.Parallel() + + callerAddress := bytes.Repeat([]byte{2}, 32) + proposalIdentifier := bytes.Repeat([]byte("a"), commitHashLength) + + gsc, blockchainHook, _ := createGovernanceBlockChainHookStubContextHandler() + + callInputArgs := [][]byte{ + proposalIdentifier, + big.NewInt(50).Bytes(), + big.NewInt(55).Bytes(), + } + callInput := createVMInput(big.NewInt(500), "proposal", callerAddress, vm.GovernanceSCAddress, callInputArgs) + retCode := gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) + + currentEpoch := uint32(52) + blockchainHook.CurrentEpochCalled = func() uint32 { + return currentEpoch + } + + callInput = createVMInput(big.NewInt(0), "vote", callerAddress, vm.GovernanceSCAddress, [][]byte{big.NewInt(1).Bytes(), []byte("yes")}) + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) + + currentEpoch = 56 + callInput = createVMInput(big.NewInt(0), "closeProposal", callerAddress, vm.GovernanceSCAddress, [][]byte{big.NewInt(1).Bytes()}) + retCode = gsc.Execute(callInput) + require.Equal(t, vmcommon.Ok, retCode) +} From 8f3646ac4ef7b90cbcc1099a96dcd34eba33db3b Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 18 Apr 2023 19:16:35 +0300 Subject: [PATCH 291/335] extended coverage on api/gin and api/groups/addressGroup --- api/errors/errors.go | 6 + api/gin/common.go | 2 +- api/gin/common_test.go | 1 + api/gin/httpServer.go | 23 +- api/gin/httpServer_test.go | 87 +- api/gin/interface.go | 7 + api/gin/webServer.go | 12 +- api/gin/webServer_test.go | 176 ++++ api/gin/writers_test.go | 29 + api/groups/addressGroup.go | 18 +- api/groups/addressGroup_test.go | 1498 ++++++++++++--------------- api/mock/facadeStub.go | 14 +- testscommon/api/groupHandlerStub.go | 32 + testscommon/api/serverStub.go | 25 + 14 files changed, 1088 insertions(+), 842 deletions(-) create mode 100644 api/gin/webServer_test.go create mode 100644 api/gin/writers_test.go create mode 100644 testscommon/api/groupHandlerStub.go create mode 100644 testscommon/api/serverStub.go diff --git a/api/errors/errors.go b/api/errors/errors.go index 23049abbf12..a0c9a10526d 100644 --- a/api/errors/errors.go +++ b/api/errors/errors.go @@ -153,3 +153,9 @@ var ErrFetchingNonceGapsCannotIncludeFields = errors.New("fetching nonce gaps ca // ErrInvalidFields signals that invalid fields were provided var ErrInvalidFields = errors.New("invalid fields") + +// ErrGetESDTTokensWithRole signals an error in getting the esdt tokens with the given role for given address +var ErrGetESDTTokensWithRole = errors.New("getting esdt tokens with role error") + +// ErrNFTTokenIDsRegistered signals an error in getting the nft token ids registered by the given address +var ErrNFTTokenIDsRegistered = errors.New("getting nft token ids registered error") diff --git a/api/gin/common.go b/api/gin/common.go index 050a213c9a2..178f7439193 100644 --- a/api/gin/common.go +++ b/api/gin/common.go @@ -40,7 +40,7 @@ func checkArgs(args ArgsNewWebServer) error { } if check.IfNil(args.Facade) { - return errHandler("nil facade") + return errHandler(apiErrors.ErrNilFacadeHandler.Error()) } return nil diff --git a/api/gin/common_test.go b/api/gin/common_test.go index 9e61059eee8..46a2492de8a 100644 --- a/api/gin/common_test.go +++ b/api/gin/common_test.go @@ -46,4 +46,5 @@ func TestCommon_isLogRouteEnabled(t *testing.T) { }, } require.True(t, isLogRouteEnabled(routesConfig)) + require.False(t, isLogRouteEnabled(config.ApiRoutesConfig{})) } diff --git a/api/gin/httpServer.go b/api/gin/httpServer.go index 1cfe53bc188..12de381278d 100644 --- a/api/gin/httpServer.go +++ b/api/gin/httpServer.go @@ -9,11 +9,11 @@ import ( ) type httpServer struct { - server *http.Server + server server } // NewHttpServer returns a new instance of httpServer -func NewHttpServer(server *http.Server) (*httpServer, error) { +func NewHttpServer(server server) (*httpServer, error) { if server == nil { return nil, apiErrors.ErrNilHttpServer } @@ -27,15 +27,18 @@ func NewHttpServer(server *http.Server) (*httpServer, error) { // called on a go routine (different from the main one) func (h *httpServer) Start() { err := h.server.ListenAndServe() - if err != nil { - if err != http.ErrServerClosed { - log.Error("could not start webserver", - "error", err.Error(), - ) - } else { - log.Debug("ListenAndServe - webserver closed") - } + if err == nil { + return } + + if err == http.ErrServerClosed { + log.Debug("ListenAndServe - webserver closed") + return + } + + log.Error("could not start webserver", + "error", err.Error(), + ) } // Close will handle the stopping of the gin web server diff --git a/api/gin/httpServer_test.go b/api/gin/httpServer_test.go index 057468b2607..035f9a20f1f 100644 --- a/api/gin/httpServer_test.go +++ b/api/gin/httpServer_test.go @@ -1,17 +1,92 @@ package gin import ( + "context" + "errors" + "net/http" "testing" - "github.com/multiversx/mx-chain-core-go/core/check" - "github.com/multiversx/mx-chain-go/api/errors" + apiErrors "github.com/multiversx/mx-chain-go/api/errors" + "github.com/multiversx/mx-chain-go/testscommon/api" "github.com/stretchr/testify/require" ) -func TestNewHttpServer_NilServerShouldErr(t *testing.T) { +func TestNewHttpServer(t *testing.T) { t.Parallel() - hs, err := NewHttpServer(nil) - require.Equal(t, errors.ErrNilHttpServer, err) - require.True(t, check.IfNil(hs)) + t.Run("nil server should error", func(t *testing.T) { + t.Parallel() + + hs, err := NewHttpServer(nil) + require.Equal(t, apiErrors.ErrNilHttpServer, err) + require.Nil(t, hs) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + hs, err := NewHttpServer(&api.ServerStub{}) + require.NoError(t, err) + require.NotNil(t, hs) + }) +} + +func TestHttpServer_Start(t *testing.T) { + t.Parallel() + + t.Run("server starts", func(t *testing.T) { + t.Parallel() + + wasCalled := false + serverStub := &api.ServerStub{ + ListenAndServeCalled: func() error { + return nil + }, + ShutdownCalled: func(ctx context.Context) error { + wasCalled = true + return nil + }, + } + hs, _ := NewHttpServer(serverStub) + require.NotNil(t, hs) + + hs.Start() + require.NoError(t, hs.Close()) + require.True(t, wasCalled) + }) + t.Run("server is closed", func(t *testing.T) { + t.Parallel() + + serverStub := &api.ServerStub{ + ListenAndServeCalled: func() error { + return http.ErrServerClosed + }, + } + hs, _ := NewHttpServer(serverStub) + require.NotNil(t, hs) + + hs.Start() + }) + t.Run("server returns other error", func(t *testing.T) { + t.Parallel() + + serverStub := &api.ServerStub{ + ListenAndServeCalled: func() error { + return errors.New("other error") + }, + } + hs, _ := NewHttpServer(serverStub) + require.NotNil(t, hs) + + hs.Start() + }) +} + +func TestHttpServer_IsInterfaceNil(t *testing.T) { + t.Parallel() + + var hs *httpServer + require.True(t, hs.IsInterfaceNil()) + + hs, _ = NewHttpServer(&api.ServerStub{}) + require.False(t, hs.IsInterfaceNil()) } diff --git a/api/gin/interface.go b/api/gin/interface.go index cfc90510cee..55ba1ce9d8a 100644 --- a/api/gin/interface.go +++ b/api/gin/interface.go @@ -1,6 +1,13 @@ package gin +import "context" + type resetHandler interface { Reset() IsInterfaceNil() bool } + +type server interface { + ListenAndServe() error + Shutdown(ctx context.Context) error +} diff --git a/api/gin/webServer.go b/api/gin/webServer.go index 8b1e61cb02e..bfbaf5336d8 100644 --- a/api/gin/webServer.go +++ b/api/gin/webServer.go @@ -12,6 +12,7 @@ import ( "github.com/gin-gonic/gin" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/marshal" + "github.com/multiversx/mx-chain-go/api/errors" "github.com/multiversx/mx-chain-go/api/groups" "github.com/multiversx/mx-chain-go/api/middleware" "github.com/multiversx/mx-chain-go/api/shared" @@ -46,18 +47,20 @@ func NewGinWebServerHandler(args ArgsNewWebServer) (*webServer, error) { return nil, err } - gws := &webServer{ + return &webServer{ facade: args.Facade, antiFloodConfig: args.AntiFloodConfig, apiConfig: args.ApiConfig, - } - - return gws, nil + }, nil } // UpdateFacade updates the main api handler by closing the old server and starting it with the new facade. Returns the // new web server func (ws *webServer) UpdateFacade(facade shared.FacadeHandler) error { + if check.IfNil(facade) { + return errors.ErrNilFacadeHandler + } + ws.Lock() defer ws.Unlock() @@ -80,6 +83,7 @@ func (ws *webServer) StartHttpServer() error { defer ws.Unlock() if ws.facade.RestApiInterface() == facade.DefaultRestPortOff { + log.Debug("web server is turned off") return nil } diff --git a/api/gin/webServer_test.go b/api/gin/webServer_test.go new file mode 100644 index 00000000000..c966a2d9c98 --- /dev/null +++ b/api/gin/webServer_test.go @@ -0,0 +1,176 @@ +package gin + +import ( + "errors" + "net/http" + "strings" + "testing" + "time" + + apiErrors "github.com/multiversx/mx-chain-go/api/errors" + "github.com/multiversx/mx-chain-go/api/middleware" + "github.com/multiversx/mx-chain-go/api/mock" + "github.com/multiversx/mx-chain-go/api/shared" + "github.com/multiversx/mx-chain-go/config" + "github.com/multiversx/mx-chain-go/facade" + "github.com/multiversx/mx-chain-go/testscommon/api" + "github.com/stretchr/testify/require" +) + +func createMockArgsNewWebServer() ArgsNewWebServer { + return ArgsNewWebServer{ + Facade: &mock.FacadeStub{ + PprofEnabledCalled: func() bool { + return true // coverage + }, + }, + ApiConfig: config.ApiRoutesConfig{ + Logging: config.ApiLoggingConfig{ + LoggingEnabled: true, + ThresholdInMicroSeconds: 10, + }, + APIPackages: map[string]config.APIPackageConfig{ + "log": {Routes: []config.RouteConfig{ + { + Name: "/log", + Open: true, + }, + }}, + }, + }, + AntiFloodConfig: config.WebServerAntifloodConfig{ + WebServerAntifloodEnabled: true, + SimultaneousRequests: 1, + SameSourceRequests: 1, + SameSourceResetIntervalInSec: 1, + }, + } +} + +func TestNewGinWebServerHandler(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + args := createMockArgsNewWebServer() + args.Facade = nil + + ws, err := NewGinWebServerHandler(args) + require.True(t, errors.Is(err, apiErrors.ErrCannotCreateGinWebServer)) + require.True(t, strings.Contains(err.Error(), apiErrors.ErrNilFacadeHandler.Error())) + require.Nil(t, ws) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + ws, err := NewGinWebServerHandler(createMockArgsNewWebServer()) + require.Nil(t, err) + require.NotNil(t, ws) + }) +} + +func TestWebServer_StartHttpServer(t *testing.T) { + t.Run("RestApiInterface returns DefaultRestPortOff", func(t *testing.T) { + args := createMockArgsNewWebServer() + args.Facade = &mock.FacadeStub{ + RestApiInterfaceCalled: func() string { + return facade.DefaultRestPortOff + }, + } + + ws, _ := NewGinWebServerHandler(args) + require.NotNil(t, ws) + + err := ws.StartHttpServer() + require.Nil(t, err) + }) + t.Run("createMiddlewareLimiters returns error due to middleware.NewSourceThrottler error", func(t *testing.T) { + args := createMockArgsNewWebServer() + args.AntiFloodConfig.SameSourceRequests = 0 + ws, _ := NewGinWebServerHandler(args) + require.NotNil(t, ws) + + err := ws.StartHttpServer() + require.Equal(t, middleware.ErrInvalidMaxNumRequests, err) + }) + t.Run("createMiddlewareLimiters returns error due to middleware.NewGlobalThrottler error", func(t *testing.T) { + args := createMockArgsNewWebServer() + args.AntiFloodConfig.SimultaneousRequests = 0 + ws, _ := NewGinWebServerHandler(args) + require.NotNil(t, ws) + + err := ws.StartHttpServer() + require.Equal(t, middleware.ErrInvalidMaxNumRequests, err) + }) + t.Run("should work", func(t *testing.T) { + ws, _ := NewGinWebServerHandler(createMockArgsNewWebServer()) + require.NotNil(t, ws) + + err := ws.StartHttpServer() + require.Nil(t, err) + + time.Sleep(2 * time.Second) + + client := &http.Client{} + req, err := http.NewRequest("GET", "http://127.0.0.1:8080/log", nil) + require.Nil(t, err) + + req.Header.Set("Sec-Websocket-Version", "13") + req.Header.Set("Connection", "upgrade") + req.Header.Set("Upgrade", "websocket") + req.Header.Set("Sec-Websocket-Key", "key") + + resp, err := client.Do(req) + require.Nil(t, err) + + err = resp.Body.Close() + require.Nil(t, err) + + time.Sleep(2 * time.Second) + err = ws.Close() + require.Nil(t, err) + }) +} + +func TestWebServer_UpdateFacade(t *testing.T) { + t.Parallel() + + t.Run("update with nil facade should error", func(t *testing.T) { + t.Parallel() + + ws, _ := NewGinWebServerHandler(createMockArgsNewWebServer()) + require.NotNil(t, ws) + + err := ws.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("should work - one of the groupHandlers returns err", func(t *testing.T) { + t.Parallel() + + args := createMockArgsNewWebServer() + args.Facade = &mock.FacadeStub{ + RestApiInterfaceCalled: func() string { + return "provided interface" + }, + } + + ws, _ := NewGinWebServerHandler(args) + require.NotNil(t, ws) + + ws.groups = make(map[string]shared.GroupHandler) + ws.groups["first"] = &api.GroupHandlerStub{ + UpdateFacadeCalled: func(newFacade interface{}) error { + return errors.New("error") + }, + } + ws.groups["second"] = &api.GroupHandlerStub{ + UpdateFacadeCalled: func(newFacade interface{}) error { + return nil + }, + } + + err := ws.UpdateFacade(&mock.FacadeStub{}) + require.Nil(t, err) + }) +} diff --git a/api/gin/writers_test.go b/api/gin/writers_test.go new file mode 100644 index 00000000000..a6a1b221126 --- /dev/null +++ b/api/gin/writers_test.go @@ -0,0 +1,29 @@ +package gin + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGinWriter_Write(t *testing.T) { + t.Parallel() + + gw := ginWriter{} + + providedBuff := []byte("provided buff") + l, err := gw.Write(providedBuff) + assert.Nil(t, err) + assert.Equal(t, len(providedBuff), l) +} + +func TestGinErrorWriter_Write(t *testing.T) { + t.Parallel() + + gew := ginErrorWriter{} + + providedBuff := []byte("provided buff") + l, err := gew.Write(providedBuff) + assert.Nil(t, err) + assert.Equal(t, len(providedBuff), l) +} diff --git a/api/groups/addressGroup.go b/api/groups/addressGroup.go index e3fe2980cc5..3a356277802 100644 --- a/api/groups/addressGroup.go +++ b/api/groups/addressGroup.go @@ -297,7 +297,7 @@ func (ag *addressGroup) getValueForKey(c *gin.Context) { options, err := extractAccountQueryOptions(c) if err != nil { - shared.RespondWithValidationError(c, errors.ErrGetUsername, err) + shared.RespondWithValidationError(c, errors.ErrGetValueForKey, err) return } @@ -424,30 +424,30 @@ func (ag *addressGroup) getESDTsRoles(c *gin.Context) { func (ag *addressGroup) getESDTTokensWithRole(c *gin.Context) { addr := c.Param("address") if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, errors.ErrEmptyAddress) + shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, errors.ErrEmptyAddress) return } options, err := extractAccountQueryOptions(c) if err != nil { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, err) + shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, err) return } role := c.Param("role") if role == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, errors.ErrEmptyRole) + shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, errors.ErrEmptyRole) return } if !core.IsValidESDTRole(role) { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, fmt.Errorf("invalid role: %s", role)) + shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, fmt.Errorf("invalid role: %s", role)) return } tokens, blockInfo, err := ag.getFacade().GetESDTsWithRole(addr, role, options) if err != nil { - shared.RespondWithInternalError(c, errors.ErrGetESDTBalance, err) + shared.RespondWithInternalError(c, errors.ErrGetESDTTokensWithRole, err) return } @@ -458,19 +458,19 @@ func (ag *addressGroup) getESDTTokensWithRole(c *gin.Context) { func (ag *addressGroup) getNFTTokenIDsRegisteredByAddress(c *gin.Context) { addr := c.Param("address") if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, errors.ErrEmptyAddress) + shared.RespondWithValidationError(c, errors.ErrNFTTokenIDsRegistered, errors.ErrEmptyAddress) return } options, err := extractAccountQueryOptions(c) if err != nil { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, err) + shared.RespondWithValidationError(c, errors.ErrNFTTokenIDsRegistered, err) return } tokens, blockInfo, err := ag.getFacade().GetNFTTokenIDsRegisteredByAddress(addr, options) if err != nil { - shared.RespondWithInternalError(c, errors.ErrGetESDTBalance, err) + shared.RespondWithInternalError(c, errors.ErrNFTTokenIDsRegistered, err) return } diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index 06608594761..71c0f83aa6d 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -6,13 +6,13 @@ import ( "encoding/json" "errors" "fmt" + "io" "math/big" "net/http" "net/http/httptest" "strings" "testing" - "github.com/gin-gonic/gin" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-core-go/data/esdt" apiErrors "github.com/multiversx/mx-chain-go/api/errors" @@ -24,12 +24,6 @@ import ( "github.com/stretchr/testify/require" ) -type wrappedAcountResponse struct { - Data accountResponse `json:"data"` - Error string `json:"error"` - Code string `json:"code"` -} - type accountResponse struct { Account struct { Address string `json:"address"` @@ -161,6 +155,8 @@ type codeHashResponse struct { Code string `json:"code"` } +var expectedErr = errors.New("expected err") + func TestNewAddressGroup(t *testing.T) { t.Parallel() @@ -192,180 +188,143 @@ func TestAddressRoute_EmptyTrailReturns404(t *testing.T) { assert.Equal(t, http.StatusNotFound, resp.Code) } -func getValueForKey(dataFromResponse interface{}, key string) string { - dataMap, ok := dataFromResponse.(map[string]interface{}) - if !ok { - return "" - } - - valueI, okCast := dataMap[key] - if okCast { - return fmt.Sprintf("%v", valueI) - } - return "" -} - -func TestGetBalance_WithCorrectAddressShouldNotReturnError(t *testing.T) { +func TestAddressGroup_getAccount(t *testing.T) { t.Parallel() - amount := big.NewInt(10) - addr := "testAddress" - facade := mock.FacadeStub{ - GetBalanceCalled: func(s string, _ api.AccountQueryOptions) (i *big.Int, info api.BlockInfo, e error) { - return amount, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrCouldNotGetAccount, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + facade := &mock.FacadeStub{ + GetAccountCalled: func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { + return api.AccountResponse{}, api.BlockInfo{}, expectedErr + }, + } - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/balance", addr), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + testAddressGroup( + t, + facade, + "/address/addr", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrCouldNotGetAccount, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + facade := mock.FacadeStub{ + GetAccountCalled: func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { + return api.AccountResponse{ + Address: "addr", + Balance: big.NewInt(100).String(), + Nonce: 1, + DeveloperReward: big.NewInt(120).String(), + }, api.BlockInfo{}, nil + }, + } - balanceStr := getValueForKey(response.Data, "balance") - balanceResponse, ok := big.NewInt(0).SetString(balanceStr, 10) - assert.True(t, ok) - assert.Equal(t, amount, balanceResponse) - assert.Equal(t, "", response.Error) -} + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) -func TestGetBalance_WithWrongAddressShouldError(t *testing.T) { - t.Parallel() - otherAddress := "otherAddress" - facade := mock.FacadeStub{ - GetBalanceCalled: func(s string, _ api.AccountQueryOptions) (i *big.Int, info api.BlockInfo, e error) { - return big.NewInt(0), api.BlockInfo{}, nil - }, - } + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", fmt.Sprintf("/address/addr"), nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + response := shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + mapResponse := response.Data.(map[string]interface{}) + accResp := accountResponse{} - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/balance", otherAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + mapResponseBytes, _ := json.Marshal(&mapResponse) + _ = json.Unmarshal(mapResponseBytes, &accResp) - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, "", response.Error) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, "addr", accResp.Account.Address) + assert.Equal(t, uint64(1), accResp.Account.Nonce) + assert.Equal(t, "100", accResp.Account.Balance) + assert.Equal(t, "120", accResp.Account.DeveloperReward) + assert.Empty(t, response.Error) + }) } -func TestGetBalance_NodeGetBalanceReturnsError(t *testing.T) { +func TestAddressGroup_GetBalance(t *testing.T) { t.Parallel() - addr := "addr" - balanceError := errors.New("error") - facade := mock.FacadeStub{ - GetBalanceCalled: func(s string, _ api.AccountQueryOptions) (i *big.Int, info api.BlockInfo, e error) { - return nil, api.BlockInfo{}, balanceError - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + t.Run("empty address should error", + testErrorScenario("/address//balance", nil, + formatExpectedErr(apiErrors.ErrGetBalance, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/balance?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetBalance, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/balance", addr), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := &mock.FacadeStub{ + GetBalanceCalled: func(s string, _ api.AccountQueryOptions) (i *big.Int, info api.BlockInfo, e error) { + return nil, api.BlockInfo{}, expectedErr + }, + } - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.Equal(t, fmt.Sprintf("%s: %s", apiErrors.ErrGetBalance.Error(), balanceError.Error()), response.Error) -} + testAddressGroup( + t, + facade, + "/address/erd1alice/balance", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBalance, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() -func TestGetBalance_WithEmptyAddressShouldReturnError(t *testing.T) { - t.Parallel() - facade := mock.FacadeStub{ - GetBalanceCalled: func(s string, _ api.AccountQueryOptions) (i *big.Int, info api.BlockInfo, e error) { - return big.NewInt(0), api.BlockInfo{}, errors.New("address was empty") - }, - } + amount := big.NewInt(10) + addr := "testAddress" + facade := mock.FacadeStub{ + GetBalanceCalled: func(s string, _ api.AccountQueryOptions) (i *big.Int, info api.BlockInfo, e error) { + return amount, api.BlockInfo{}, nil + }, + } - emptyAddress := "" + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/balance", addr), nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/balance", emptyAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + response := shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.NotEmpty(t, response) - assert.True(t, strings.Contains(response.Error, - fmt.Sprintf("%s: %s", apiErrors.ErrGetBalance.Error(), apiErrors.ErrEmptyAddress.Error()), - )) + balanceStr := getValueForKey(response.Data, "balance") + balanceResponse, ok := big.NewInt(0).SetString(balanceStr, 10) + assert.True(t, ok) + assert.Equal(t, amount, balanceResponse) + assert.Equal(t, "", response.Error) + }) } -func TestGetValueForKey_NodeFailsShouldError(t *testing.T) { - t.Parallel() - - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetValueForKeyCalled: func(_ string, _ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { - return "", api.BlockInfo{}, expectedErr - }, +func getValueForKey(dataFromResponse interface{}, key string) string { + dataMap, ok := dataFromResponse.(map[string]interface{}) + if !ok { + return "" } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/key/test", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - valueForKeyResponseObj := valueForKeyResponse{} - loadResponse(resp.Body, &valueForKeyResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(valueForKeyResponseObj.Error, expectedErr.Error())) -} - -func TestGetValueForKey_ShouldWork(t *testing.T) { - t.Parallel() - - testAddress := "address" - testValue := "value" - facade := mock.FacadeStub{ - GetValueForKeyCalled: func(_ string, _ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { - return testValue, api.BlockInfo{}, nil - }, + valueI, okCast := dataMap[key] + if okCast { + return fmt.Sprintf("%v", valueI) } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/key/test", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - valueForKeyResponseObj := valueForKeyResponse{} - loadResponse(resp.Body, &valueForKeyResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, testValue, valueForKeyResponseObj.Data.Value) + return "" } -func TestGetAccounts(t *testing.T) { +func TestAddressGroup_getAccounts(t *testing.T) { t.Parallel() t.Run("wrong request, should err", func(t *testing.T) { @@ -385,17 +344,18 @@ func TestGetAccounts(t *testing.T) { require.NotEmpty(t, response.Error) require.Equal(t, shared.ReturnCodeRequestError, response.Code) }) - + t.Run("invalid query options should error", + testErrorScenario("/address/bulk?blockNonce=not-uint64", bytes.NewBuffer([]byte(`["erd1", "erd1"]`)), + formatExpectedErr(apiErrors.ErrCouldNotGetAccount, apiErrors.ErrBadUrlParams))) t.Run("facade error, should err", func(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected error") - facade := &mock.FacadeStub{ + facade := mock.FacadeStub{ GetAccountsCalled: func(_ []string, _ api.AccountQueryOptions) (map[string]*api.AccountResponse, api.BlockInfo, error) { return nil, api.BlockInfo{}, expectedErr }, } - addrGroup, _ := groups.NewAddressGroup(facade) + addrGroup, _ := groups.NewAddressGroup(&facade) ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) @@ -408,7 +368,6 @@ func TestGetAccounts(t *testing.T) { require.NotEmpty(t, response.Error) require.Equal(t, shared.ReturnCodeInternalError, response.Code) }) - t.Run("should work", func(t *testing.T) { t.Parallel() @@ -419,12 +378,12 @@ func TestGetAccounts(t *testing.T) { Nonce: 37, }, } - facade := &mock.FacadeStub{ + facade := mock.FacadeStub{ GetAccountsCalled: func(_ []string, _ api.AccountQueryOptions) (map[string]*api.AccountResponse, api.BlockInfo, error) { return expectedAccounts, api.BlockInfo{}, nil }, } - addrGroup, _ := groups.NewAddressGroup(facade) + addrGroup, _ := groups.NewAddressGroup(&facade) ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) @@ -447,820 +406,737 @@ func TestGetAccounts(t *testing.T) { }) } -func TestGetUsername_NodeFailsShouldError(t *testing.T) { +func TestAddressGroup_getUsername(t *testing.T) { t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetUsernameCalled: func(_ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { - return "", api.BlockInfo{}, expectedErr - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/username", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + t.Run("empty address should error", + testErrorScenario("/address//username", nil, + formatExpectedErr(apiErrors.ErrGetUsername, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/username?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetUsername, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - usernameResponseObj := usernameResponse{} - loadResponse(resp.Body, &usernameResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(usernameResponseObj.Error, expectedErr.Error())) -} + facade := &mock.FacadeStub{ + GetUsernameCalled: func(_ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { + return "", api.BlockInfo{}, expectedErr + }, + } -func TestGetUsername_ShouldWork(t *testing.T) { - t.Parallel() + testAddressGroup( + t, + facade, + "/address/erd1alice/username", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetUsername, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - testAddress := "address" - testUsername := "value" - facade := mock.FacadeStub{ - GetUsernameCalled: func(_ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { - return testUsername, api.BlockInfo{}, nil - }, - } + testUsername := "provided username" + facade := mock.FacadeStub{ + GetUsernameCalled: func(_ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { + return testUsername, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/username", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/username", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - usernameResponseObj := usernameResponse{} - loadResponse(resp.Body, &usernameResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, testUsername, usernameResponseObj.Data.Username) + usernameResponseObj := usernameResponse{} + loadResponse(resp.Body, &usernameResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, testUsername, usernameResponseObj.Data.Username) + }) } -func TestGetCodeHash_NodeFailsShouldError(t *testing.T) { +func TestAddressGroup_getCodeHash(t *testing.T) { t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetCodeHashCalled: func(_ string, _ api.AccountQueryOptions) ([]byte, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/code-hash", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + t.Run("empty address should error", + testErrorScenario("/address//code-hash", nil, + formatExpectedErr(apiErrors.ErrGetCodeHash, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/code-hash?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetCodeHash, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - codeHashResponseObj := codeHashResponse{} - loadResponse(resp.Body, &codeHashResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(codeHashResponseObj.Error, expectedErr.Error())) -} + facade := &mock.FacadeStub{ + GetCodeHashCalled: func(_ string, _ api.AccountQueryOptions) ([]byte, api.BlockInfo, error) { + return nil, api.BlockInfo{}, expectedErr + }, + } -func TestGetCodeHash_ShouldWork(t *testing.T) { - t.Parallel() + testAddressGroup( + t, + facade, + "/address/erd1alice/code-hash", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetCodeHash, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - testAddress := "address" - testCodeHash := []byte("value") - expectedResponseCodeHash := base64.StdEncoding.EncodeToString(testCodeHash) - facade := mock.FacadeStub{ - GetCodeHashCalled: func(_ string, _ api.AccountQueryOptions) ([]byte, api.BlockInfo, error) { - return testCodeHash, api.BlockInfo{}, nil - }, - } + testCodeHash := []byte("value") + expectedResponseCodeHash := base64.StdEncoding.EncodeToString(testCodeHash) + facade := mock.FacadeStub{ + GetCodeHashCalled: func(_ string, _ api.AccountQueryOptions) ([]byte, api.BlockInfo, error) { + return testCodeHash, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/code-hash", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/code-hash", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - codeHashResponseObj := codeHashResponse{} - loadResponse(resp.Body, &codeHashResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedResponseCodeHash, codeHashResponseObj.Data.CodeHash) + codeHashResponseObj := codeHashResponse{} + loadResponse(resp.Body, &codeHashResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedResponseCodeHash, codeHashResponseObj.Data.CodeHash) + }) } -func TestGetAccount_FailWhenFacadeStubGetAccountFails(t *testing.T) { +func TestAddressGroup_getValueForKey(t *testing.T) { t.Parallel() - returnedError := "i am an error" - facade := mock.FacadeStub{ - GetAccountCalled: func(address string, _ api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { - return api.AccountResponse{}, api.BlockInfo{}, errors.New(returnedError) - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/test", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + t.Run("empty address should error", + testErrorScenario("/address//key/test", nil, + formatExpectedErr(apiErrors.ErrGetValueForKey, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/key/test?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetValueForKey, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.Empty(t, response.Data) - assert.NotEmpty(t, response.Error) - assert.True(t, strings.Contains(response.Error, fmt.Sprintf("%s: %s", apiErrors.ErrCouldNotGetAccount.Error(), returnedError))) -} + facade := &mock.FacadeStub{ + GetValueForKeyCalled: func(_ string, _ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { + return "", api.BlockInfo{}, expectedErr + }, + } -func TestGetAccount_ReturnsSuccessfully(t *testing.T) { - t.Parallel() + testAddressGroup( + t, + facade, + "/address/erd1alice/key/test", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetValueForKey, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{ - GetAccountCalled: func(address string, _ api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { - return api.AccountResponse{ - Address: "1234", - Balance: big.NewInt(100).String(), - Nonce: 1, - DeveloperReward: big.NewInt(120).String(), - }, api.BlockInfo{}, nil - }, - } + testValue := "value" + facade := mock.FacadeStub{ + GetValueForKeyCalled: func(_ string, _ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { + return testValue, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - reqAddress := "test" - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s", reqAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/key/test", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - mapResponse := response.Data.(map[string]interface{}) - accountResponse := accountResponse{} - - mapResponseBytes, _ := json.Marshal(&mapResponse) - _ = json.Unmarshal(mapResponseBytes, &accountResponse) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, reqAddress, accountResponse.Account.Address) - assert.Equal(t, uint64(1), accountResponse.Account.Nonce) - assert.Equal(t, "100", accountResponse.Account.Balance) - assert.Equal(t, "120", accountResponse.Account.DeveloperReward) - assert.Empty(t, response.Error) + valueForKeyResponseObj := valueForKeyResponse{} + loadResponse(resp.Body, &valueForKeyResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, testValue, valueForKeyResponseObj.Data.Value) + }) } -func TestGetAccount_WithBadQueryOptionsShouldErr(t *testing.T) { +func TestAddressGroup_getGuardianData(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetAccountCalled: func(address string, _ api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { - return api.AccountResponse{Nonce: 1}, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + t.Run("empty address should error", + testErrorScenario("/address//guardian-data", nil, + formatExpectedErr(apiErrors.ErrGetGuardianData, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/guardian-data?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetGuardianData, apiErrors.ErrBadUrlParams))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - response, code := httpGetAccount(ws, "/address/alice?onFinalBlock=bad") - require.Equal(t, http.StatusBadRequest, code) - require.Contains(t, response.Error, apiErrors.ErrBadUrlParams.Error()) - - response, code = httpGetAccount(ws, "/address/alice?onStartOfEpoch=bad") - require.Equal(t, http.StatusBadRequest, code) - require.Contains(t, response.Error, apiErrors.ErrBadUrlParams.Error()) -} - -func TestGetAccount_WithQueryOptionsShouldWork(t *testing.T) { - t.Parallel() - - var calledWithAddress string - var calledWithOptions api.AccountQueryOptions - - facade := mock.FacadeStub{ - GetAccountCalled: func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { - calledWithAddress = address - calledWithOptions = options - return api.AccountResponse{Nonce: 1}, api.BlockInfo{}, nil - }, - } + facade := &mock.FacadeStub{ + GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + return api.GuardianData{}, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/guardian-data", nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetGuardianData, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + expectedGuardianData := api.GuardianData{ + ActiveGuardian: &api.Guardian{ + Address: "guardian1", + ActivationEpoch: 0, + }, + PendingGuardian: &api.Guardian{ + Address: "guardian2", + ActivationEpoch: 10, + }, + Guarded: true, + } + facade := mock.FacadeStub{ + GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { + return expectedGuardianData, api.BlockInfo{}, nil + }, + } - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - response, code := httpGetAccount(ws, "/address/alice?onFinalBlock=true") - require.Equal(t, http.StatusOK, code) - require.NotNil(t, response) - require.Equal(t, "alice", calledWithAddress) - require.Equal(t, api.AccountQueryOptions{OnFinalBlock: true}, calledWithOptions) -} + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) -func httpGetAccount(ws *gin.Engine, url string) (wrappedAcountResponse, int) { - httpRequest, _ := http.NewRequest("GET", url, nil) - httpResponse := httptest.NewRecorder() - ws.ServeHTTP(httpResponse, httpRequest) + req, _ := http.NewRequest("GET", "/address/erd1alice/guardian-data", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - accountResponse := wrappedAcountResponse{} - loadResponse(httpResponse.Body, &accountResponse) - return accountResponse, httpResponse.Code + response := guardianDataResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedGuardianData, response.Data.GuardianData) + }) } -func TestGetESDTBalance_NodeFailsShouldError(t *testing.T) { +func TestAddressGroup_getKeyValuePairs(t *testing.T) { t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdt/newToken", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - usernameResponseObj := usernameResponse{} - loadResponse(resp.Body, &usernameResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(usernameResponseObj.Error, expectedErr.Error())) -} + t.Run("empty address should error", + testErrorScenario("/address//keys", nil, + formatExpectedErr(apiErrors.ErrGetKeyValuePairs, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/keys?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetKeyValuePairs, apiErrors.ErrBadUrlParams))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() -func TestGetESDTBalance_ShouldWork(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetKeyValuePairsCalled: func(_ string, _ api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) { + return nil, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/keys", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetKeyValuePairs, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - testAddress := "address" - testValue := big.NewInt(100).String() - testProperties := []byte{byte(0), byte(1), byte(0)} - facade := mock.FacadeStub{ - GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { - return &esdt.ESDigitalToken{Value: big.NewInt(100), Properties: testProperties}, api.BlockInfo{}, nil - }, - } + pairs := map[string]string{ + "k1": "v1", + "k2": "v2", + } + facade := mock.FacadeStub{ + GetKeyValuePairsCalled: func(_ string, _ api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) { + return pairs, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdt/newToken", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/keys", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - esdtBalanceResponseObj := esdtTokenResponse{} - loadResponse(resp.Body, &esdtBalanceResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, testValue, esdtBalanceResponseObj.Data.Balance) - assert.Equal(t, "000100", esdtBalanceResponseObj.Data.Properties) + response := keyValuePairsResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, pairs, response.Data.Pairs) + }) } -func TestGetESDTNFTData_NodeFailsShouldError(t *testing.T) { +func TestAddressGroup_getESDTBalance(t *testing.T) { t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/nft/newToken/nonce/10", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtResponseObj := esdtNFTResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(esdtResponseObj.Error, expectedErr.Error())) -} + t.Run("empty address should error", + testErrorScenario("/address//esdt/newToken", nil, + formatExpectedErr(apiErrors.ErrGetESDTBalance, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/esdt/newToken?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetESDTBalance, apiErrors.ErrBadUrlParams))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() -func TestGetESDTNFTData_ShouldWork(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { + return &esdt.ESDigitalToken{}, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/esdt/newToken", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetESDTBalance, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - testAddress := "address" - testValue := big.NewInt(100).String() - testNonce := uint64(37) - testProperties := []byte{byte(1), byte(0), byte(0)} - facade := mock.FacadeStub{ - GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { - return &esdt.ESDigitalToken{ - Value: big.NewInt(100), - Properties: testProperties, - TokenMetaData: &esdt.MetaData{Nonce: testNonce, Creator: []byte(testAddress)}}, api.BlockInfo{}, nil - }, - } + testValue := big.NewInt(100).String() + testProperties := []byte{byte(0), byte(1), byte(0)} + facade := mock.FacadeStub{ + GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { + return &esdt.ESDigitalToken{Value: big.NewInt(100), Properties: testProperties}, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/nft/newToken/nonce/10", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/esdt/newToken", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - esdtResponseObj := esdtNFTResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, testValue, esdtResponseObj.Data.Balance) - assert.Equal(t, "010000", esdtResponseObj.Data.Properties) - assert.Equal(t, testAddress, esdtResponseObj.Data.Creator) - assert.Equal(t, testNonce, esdtResponseObj.Data.Nonce) + esdtBalanceResponseObj := esdtTokenResponse{} + loadResponse(resp.Body, &esdtBalanceResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, testValue, esdtBalanceResponseObj.Data.Balance) + assert.Equal(t, "000100", esdtBalanceResponseObj.Data.Properties) + }) } -func TestGetESDTTokensWithRole_InvalidRoleShouldError(t *testing.T) { +func TestAddressGroup_getESDTsRoles(t *testing.T) { t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetESDTsWithRoleCalled: func(_ string, _ string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts-with-role/invalid", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtResponseObj := esdtsWithRoleResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(esdtResponseObj.Error, "invalid role")) -} + t.Run("empty address should error", + testErrorScenario("/address//esdts/roles", nil, + formatExpectedErr(apiErrors.ErrGetRolesForAccount, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/esdts/roles?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetRolesForAccount, apiErrors.ErrBadUrlParams))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() -func TestGetESDTTokensWithRole_NodeFailsShouldError(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { + return nil, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/esdts/roles", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetRolesForAccount, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetESDTsWithRoleCalled: func(_ string, _ string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } + roles := map[string][]string{ + "token0": {"role0", "role1"}, + "token1": {"role3", "role1"}, + } + facade := mock.FacadeStub{ + GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { + return roles, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts-with-role/ESDTRoleNFTCreate", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/esdts/roles", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - esdtResponseObj := esdtsWithRoleResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(esdtResponseObj.Error, expectedErr.Error())) + response := esdtRolesResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, roles, response.Data.Roles) + }) } -func TestGetESDTTokensWithRole_ShouldWork(t *testing.T) { +func TestAddressGroup_getESDTTokensWithRole(t *testing.T) { t.Parallel() - testAddress := "address" - expectedTokens := []string{"ABC-0o9i8u", "XYZ-r5y7i9"} - facade := mock.FacadeStub{ - GetESDTsWithRoleCalled: func(address string, role string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { - return expectedTokens, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts-with-role/ESDTRoleNFTCreate", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtResponseObj := esdtsWithRoleResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedTokens, esdtResponseObj.Data.Tokens) -} + t.Run("empty address should error", + testErrorScenario("/address//esdts-with-role/ESDTRoleNFTCreate", nil, + formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, apiErrors.ErrBadUrlParams))) + t.Run("invalid role should error", + testErrorScenario("/address/erd1alice/esdts-with-role/invalid", nil, + formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, fmt.Errorf("invalid role: %s", "invalid")))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() -func TestGetNFTTokenIDsRegisteredByAddress_NodeFailsShouldError(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetESDTsWithRoleCalled: func(_ string, _ string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { + return nil, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetNFTTokenIDsRegisteredByAddressCalled: func(_ string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } + expectedTokens := []string{"ABC-0o9i8u", "XYZ-r5y7i9"} + facade := mock.FacadeStub{ + GetESDTsWithRoleCalled: func(address string, role string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { + return expectedTokens, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/registered-nfts", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - esdtResponseObj := esdtsWithRoleResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(esdtResponseObj.Error, expectedErr.Error())) + esdtResponseObj := esdtsWithRoleResponse{} + loadResponse(resp.Body, &esdtResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedTokens, esdtResponseObj.Data.Tokens) + }) } -func TestGetNFTTokenIDsRegisteredByAddress_ShouldWork(t *testing.T) { +func TestAddressGroup_getNFTTokenIDsRegisteredByAddress(t *testing.T) { t.Parallel() - testAddress := "address" - expectedTokens := []string{"ABC-0o9i8u", "XYZ-r5y7i9"} - facade := mock.FacadeStub{ - GetNFTTokenIDsRegisteredByAddressCalled: func(address string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { - return expectedTokens, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/registered-nfts", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtResponseObj := esdtsWithRoleResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedTokens, esdtResponseObj.Data.Tokens) -} + t.Run("empty address should error", + testErrorScenario("/address//registered-nfts", nil, + formatExpectedErr(apiErrors.ErrNFTTokenIDsRegistered, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/registered-nfts?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrNFTTokenIDsRegistered, apiErrors.ErrBadUrlParams))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() -func TestGetFullESDTTokens_NodeFailsShouldError(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetNFTTokenIDsRegisteredByAddressCalled: func(_ string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { + return nil, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/registered-nfts", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrNFTTokenIDsRegistered, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetAllESDTTokensCalled: func(_ string, _ api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } + expectedTokens := []string{"ABC-0o9i8u", "XYZ-r5y7i9"} + facade := mock.FacadeStub{ + GetNFTTokenIDsRegisteredByAddressCalled: func(address string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { + return expectedTokens, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdt", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/registered-nfts", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - esdtTokenResponseObj := esdtTokensCompleteResponse{} - loadResponse(resp.Body, &esdtTokenResponseObj) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(esdtTokenResponseObj.Error, expectedErr.Error())) + esdtResponseObj := esdtsWithRoleResponse{} + loadResponse(resp.Body, &esdtResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedTokens, esdtResponseObj.Data.Tokens) + }) } -func TestGetFullESDTTokens_ShouldWork(t *testing.T) { +func TestAddressGroup_getESDTNFTData(t *testing.T) { t.Parallel() - testAddress := "address" - testValue1 := "token1" - testValue2 := "token2" - facade := mock.FacadeStub{ - GetAllESDTTokensCalled: func(address string, _ api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) { - tokens := make(map[string]*esdt.ESDigitalToken) - tokens[testValue1] = &esdt.ESDigitalToken{Value: big.NewInt(10)} - tokens[testValue2] = &esdt.ESDigitalToken{Value: big.NewInt(100)} - return tokens, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdt", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtTokenResponseObj := esdtTokensCompleteResponse{} - loadResponse(resp.Body, &esdtTokenResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, 2, len(esdtTokenResponseObj.Data.Tokens)) -} + t.Run("empty address should error", + testErrorScenario("/address//nft/newToken/nonce/10", nil, + formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/nft/newToken/nonce/10?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrBadUrlParams))) + t.Run("invalid nonce should error", + testErrorScenario("/address/erd1alice/nft/newToken/nonce/not-int", nil, + formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrNonceInvalid))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() -func TestGetKeyValuePairs_WithEmptyAddressShouldReturnError(t *testing.T) { - t.Parallel() - facade := mock.FacadeStub{} + facade := &mock.FacadeStub{ + GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { + return nil, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/nft/newToken/nonce/10", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetESDTNFTData, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - emptyAddress := "" + testAddress := "address" + testValue := big.NewInt(100).String() + testNonce := uint64(37) + testProperties := []byte{byte(1), byte(0), byte(0)} + facade := mock.FacadeStub{ + GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { + return &esdt.ESDigitalToken{ + Value: big.NewInt(100), + Properties: testProperties, + TokenMetaData: &esdt.MetaData{Nonce: testNonce, Creator: []byte(testAddress)}}, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/keys", emptyAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/nft/newToken/nonce/10", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.NotEmpty(t, response) - assert.True(t, strings.Contains(response.Error, - fmt.Sprintf("%s: %s", apiErrors.ErrGetKeyValuePairs.Error(), apiErrors.ErrEmptyAddress.Error()), - )) + esdtResponseObj := esdtNFTResponse{} + loadResponse(resp.Body, &esdtResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, testValue, esdtResponseObj.Data.Balance) + assert.Equal(t, "010000", esdtResponseObj.Data.Properties) + assert.Equal(t, testAddress, esdtResponseObj.Data.Creator) + assert.Equal(t, testNonce, esdtResponseObj.Data.Nonce) + }) } -func TestGetKeyValuePairs_NodeFailsShouldError(t *testing.T) { +func TestAddressGroup_getAllESDTData(t *testing.T) { t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetKeyValuePairsCalled: func(_ string, _ api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/keys", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := &shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} + t.Run("empty address should error", + testErrorScenario("/address//esdt", nil, + formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrEmptyAddress))) + t.Run("invalid query options should error", + testErrorScenario("/address/erd1alice/esdt?blockNonce=not-uint64", nil, + formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrBadUrlParams))) + t.Run("with node fail should err", func(t *testing.T) { + t.Parallel() -func TestGetKeyValuePairs_ShouldWork(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetAllESDTTokensCalled: func(address string, options api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) { + return nil, api.BlockInfo{}, expectedErr + }, + } + testAddressGroup( + t, + facade, + "/address/erd1alice/esdt", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetESDTNFTData, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - pairs := map[string]string{ - "k1": "v1", - "k2": "v2", - } - testAddress := "address" - facade := mock.FacadeStub{ - GetKeyValuePairsCalled: func(_ string, _ api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) { - return pairs, api.BlockInfo{}, nil - }, - } + testValue1 := "token1" + testValue2 := "token2" + facade := mock.FacadeStub{ + GetAllESDTTokensCalled: func(address string, _ api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) { + tokens := make(map[string]*esdt.ESDigitalToken) + tokens[testValue1] = &esdt.ESDigitalToken{Value: big.NewInt(10)} + tokens[testValue2] = &esdt.ESDigitalToken{Value: big.NewInt(100)} + return tokens, api.BlockInfo{}, nil + }, + } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) + addrGroup, err := groups.NewAddressGroup(&facade) + require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/keys", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/address/erd1alice/esdt", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - response := keyValuePairsResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, pairs, response.Data.Pairs) + esdtTokenResponseObj := esdtTokensCompleteResponse{} + loadResponse(resp.Body, &esdtTokenResponseObj) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, 2, len(esdtTokenResponseObj.Data.Tokens)) + }) } -func TestGetGuardianData(t *testing.T) { +func TestAddressGroup_UpdateFacadeStub(t *testing.T) { t.Parallel() - testAddress := "address" - t.Run("with empty address should err", func(t *testing.T) { - facade := mock.FacadeStub{} - addrGroup, err := groups.NewAddressGroup(&facade) - require.Nil(t, err) + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + addrGroup, err := groups.NewAddressGroup(&mock.FacadeStub{}) + require.NoError(t, err) - emptyAddress := "" - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/guardian-data", emptyAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + err = addrGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.NotEmpty(t, response) - assert.True(t, strings.Contains(response.Error, - fmt.Sprintf("%s: %s", apiErrors.ErrGetGuardianData.Error(), apiErrors.ErrEmptyAddress.Error()), - )) + addrGroup, err := groups.NewAddressGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = addrGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) }) - t.Run("with node fail should err", func(t *testing.T) { - expectedErr := errors.New("expected error") + t.Run("should work", func(t *testing.T) { + t.Parallel() + + roles := map[string][]string{ + "token0": {"role0", "role1"}, + "token1": {"role3", "role1"}, + } + testAddress := "address" facade := mock.FacadeStub{ - GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { - return api.GuardianData{}, api.BlockInfo{}, expectedErr + GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { + return roles, api.BlockInfo{}, nil }, } + addrGroup, err := groups.NewAddressGroup(&facade) require.NoError(t, err) ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/guardian-data", testAddress), nil) + req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", testAddress), nil) resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - response := &shared.GenericAPIResponse{} + response := esdtRolesResponse{} loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, roles, response.Data.Roles) - }) - t.Run("should work", func(t *testing.T) { - expectedGuardianData := api.GuardianData{ - ActiveGuardian: &api.Guardian{ - Address: "guardian1", - ActivationEpoch: 0, - }, - PendingGuardian: &api.Guardian{ - Address: "guardian2", - ActivationEpoch: 10, + newErr := errors.New("new error") + newFacadeStub := mock.FacadeStub{ + GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { + return nil, api.BlockInfo{}, newErr }, - Guarded: true, } - facade := mock.FacadeStub{ - GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { - return expectedGuardianData, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) + err = addrGroup.UpdateFacade(&newFacadeStub) require.NoError(t, err) - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/guardian-data", testAddress), nil) - resp := httptest.NewRecorder() + req, _ = http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", testAddress), nil) + resp = httptest.NewRecorder() ws.ServeHTTP(resp, req) - response := guardianDataResponse{} + response = esdtRolesResponse{} loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedGuardianData, response.Data.GuardianData) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.True(t, strings.Contains(response.Error, newErr.Error())) }) } -func TestGetESDTsRoles_WithEmptyAddressShouldReturnError(t *testing.T) { +func TestAddressGroup_IsInterfaceNil(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{} - - emptyAddress := "" - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", emptyAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + addrGroup, _ := groups.NewAddressGroup(nil) + require.True(t, addrGroup.IsInterfaceNil()) - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.NotEmpty(t, response) - assert.True(t, strings.Contains(response.Error, - fmt.Sprintf("%s: %s", apiErrors.ErrGetRolesForAccount.Error(), apiErrors.ErrEmptyAddress.Error()), - )) + addrGroup, _ = groups.NewAddressGroup(&mock.FacadeStub{}) + require.False(t, addrGroup.IsInterfaceNil()) } -func TestGetESDTsRoles_NodeFailsShouldError(t *testing.T) { - t.Parallel() +func testErrorScenario(url string, body io.Reader, expectedErr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() - testAddress := "address" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { - return nil, api.BlockInfo{}, expectedErr - }, + testAddressGroup( + t, + &mock.FacadeStub{}, + url, + body, + http.StatusBadRequest, + expectedErr, + ) } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := &shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) } -func TestGetESDTsRoles_ShouldWork(t *testing.T) { - t.Parallel() - - roles := map[string][]string{ - "token0": {"role0", "role1"}, - "token1": {"role3", "role1"}, - } - testAddress := "address" - facade := mock.FacadeStub{ - GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { - return roles, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) +func testAddressGroup( + t *testing.T, + facade shared.FacadeHandler, + url string, + body io.Reader, + expectedRespCode int, + expectedRespError string, +) { + addrGroup, err := groups.NewAddressGroup(facade) require.NoError(t, err) ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", testAddress), nil) + req, _ := http.NewRequest("GET", url, body) resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - response := esdtRolesResponse{} + response := shared.GenericAPIResponse{} loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, roles, response.Data.Roles) + assert.Equal(t, expectedRespCode, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedRespError)) } -func TestAddressGroup_UpdateFacadeStub(t *testing.T) { - t.Parallel() - - roles := map[string][]string{ - "token0": {"role0", "role1"}, - "token1": {"role3", "role1"}, - } - testAddress := "address" - facade := mock.FacadeStub{ - GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { - return roles, api.BlockInfo{}, nil - }, - } - - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", testAddress), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := esdtRolesResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, roles, response.Data.Roles) - - newErr := errors.New("new error") - newFacadeStub := mock.FacadeStub{ - GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { - return nil, api.BlockInfo{}, newErr - }, - } - err = addrGroup.UpdateFacade(&newFacadeStub) - require.NoError(t, err) - - req, _ = http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", testAddress), nil) - resp = httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response = esdtRolesResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, newErr.Error())) +func formatExpectedErr(err, innerErr error) string { + return fmt.Sprintf("%s: %s", err.Error(), innerErr.Error()) } func getAddressRoutesConfig() config.ApiRoutesConfig { diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index 224a780637f..a6b64fd52fe 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -26,7 +26,7 @@ type FacadeStub struct { GetHeartbeatsHandler func() ([]data.PubKeyHeartbeat, error) GetBalanceCalled func(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo, error) GetAccountCalled func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) - GetAccountsCalled func(addresses []string, options api.AccountQueryOptions) (map[string]*api.AccountResponse, api.BlockInfo, error) + GetAccountsCalled func(addresses []string, options api.AccountQueryOptions) (map[string]*api.AccountResponse, api.BlockInfo, error) GenerateTransactionHandler func(sender string, receiver string, value *big.Int, code string) (*transaction.Transaction, error) GetTransactionHandler func(hash string, withResults bool) (*transaction.ApiTransactionResult, error) CreateTransactionHandler func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) @@ -82,6 +82,9 @@ type FacadeStub struct { GetLastPoolNonceForSenderCalled func(sender string) (uint64, error) GetTransactionsPoolNonceGapsForSenderCalled func(sender string) (*common.TransactionsPoolNonceGapsForSenderApiResponse, error) GetGasConfigsCalled func() (map[string]map[string]uint64, error) + RestApiInterfaceCalled func() string + RestAPIServerDebugModeCalled func() bool + PprofEnabledCalled func() bool } // GetTokenSupply - @@ -158,16 +161,25 @@ func (f *FacadeStub) GetThrottlerForEndpoint(endpoint string) (core.Throttler, b // RestApiInterface - func (f *FacadeStub) RestApiInterface() string { + if f.RestApiInterfaceCalled != nil { + return f.RestApiInterfaceCalled() + } return "localhost:8080" } // RestAPIServerDebugMode - func (f *FacadeStub) RestAPIServerDebugMode() bool { + if f.RestAPIServerDebugModeCalled != nil { + return f.RestAPIServerDebugModeCalled() + } return false } // PprofEnabled - func (f *FacadeStub) PprofEnabled() bool { + if f.PprofEnabledCalled != nil { + return f.PprofEnabledCalled() + } return false } diff --git a/testscommon/api/groupHandlerStub.go b/testscommon/api/groupHandlerStub.go new file mode 100644 index 00000000000..af61639d254 --- /dev/null +++ b/testscommon/api/groupHandlerStub.go @@ -0,0 +1,32 @@ +package api + +import ( + "github.com/gin-gonic/gin" + "github.com/multiversx/mx-chain-go/config" +) + +// GroupHandlerStub - +type GroupHandlerStub struct { + UpdateFacadeCalled func(facade interface{}) error + RegisterRoutesCalled func(ws *gin.RouterGroup, apiConfig config.ApiRoutesConfig) +} + +// UpdateFacade - +func (stub *GroupHandlerStub) UpdateFacade(facade interface{}) error { + if stub.UpdateFacadeCalled != nil { + return stub.UpdateFacadeCalled(facade) + } + return nil +} + +// RegisterRoutes - +func (stub *GroupHandlerStub) RegisterRoutes(ws *gin.RouterGroup, apiConfig config.ApiRoutesConfig) { + if stub.RegisterRoutesCalled != nil { + stub.RegisterRoutesCalled(ws, apiConfig) + } +} + +// IsInterfaceNil - +func (stub *GroupHandlerStub) IsInterfaceNil() bool { + return stub == nil +} diff --git a/testscommon/api/serverStub.go b/testscommon/api/serverStub.go new file mode 100644 index 00000000000..91ce7dd85ae --- /dev/null +++ b/testscommon/api/serverStub.go @@ -0,0 +1,25 @@ +package api + +import "context" + +// ServerStub - +type ServerStub struct { + ListenAndServeCalled func() error + ShutdownCalled func(ctx context.Context) error +} + +// ListenAndServe - +func (stub *ServerStub) ListenAndServe() error { + if stub.ListenAndServeCalled != nil { + return stub.ListenAndServeCalled() + } + return nil +} + +// Shutdown - +func (stub *ServerStub) Shutdown(ctx context.Context) error { + if stub.ShutdownCalled != nil { + return stub.ShutdownCalled(ctx) + } + return nil +} From ac362a958499783827c73d9ebed8cc7b03bd5a2c Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 18 Apr 2023 19:25:43 +0300 Subject: [PATCH 292/335] fix linter --- api/groups/addressGroup_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index 71c0f83aa6d..61d970d3977 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -231,7 +231,7 @@ func TestAddressGroup_getAccount(t *testing.T) { ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/addr"), nil) + req, _ := http.NewRequest("GET", "/address/addr", nil) resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) From 0d4d07ba2fe247acbfcdcc0bcc8555629f0c5ba7 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Apr 2023 10:31:06 +0300 Subject: [PATCH 293/335] extra tests for addressGroupOptions --- api/groups/addressGroupOptions_test.go | 42 ++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/api/groups/addressGroupOptions_test.go b/api/groups/addressGroupOptions_test.go index 0c546641f19..62678e6d628 100644 --- a/api/groups/addressGroupOptions_test.go +++ b/api/groups/addressGroupOptions_test.go @@ -5,12 +5,17 @@ import ( "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/data/api" + "github.com/multiversx/mx-chain-go/api/errors" "github.com/multiversx/mx-chain-go/testscommon" "github.com/stretchr/testify/require" ) func TestExtractAccountQueryOptions(t *testing.T) { + t.Parallel() + t.Run("good options", func(t *testing.T) { + t.Parallel() + options, err := extractAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("onFinalBlock=true")) require.Nil(t, err) require.True(t, options.OnFinalBlock) @@ -38,6 +43,8 @@ func TestExtractAccountQueryOptions(t *testing.T) { }) t.Run("bad options", func(t *testing.T) { + t.Parallel() + options, err := extractAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockNonce=42&blockHash=aaaa")) require.ErrorContains(t, err, "only one block coordinate") require.Equal(t, api.AccountQueryOptions{}, options) @@ -62,5 +69,40 @@ func TestExtractAccountQueryOptions(t *testing.T) { require.ErrorContains(t, err, "hintEpoch is optional, but only compatible with blockRootHash") require.Equal(t, api.AccountQueryOptions{}, options) + options, err = extractAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockNonce=aaaa")) + require.ErrorContains(t, err, errors.ErrBadUrlParams.Error()) + require.Equal(t, api.AccountQueryOptions{}, options) }) } + +func TestParseAccountQueryOptions(t *testing.T) { + t.Parallel() + + options, err := parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("onFinalBlock=test")) + require.Error(t, err) + require.Equal(t, api.AccountQueryOptions{}, options) + + options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("onStartOfEpoch=test")) + require.Error(t, err) + require.Equal(t, api.AccountQueryOptions{}, options) + + options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockNonce=test")) + require.Error(t, err) + require.Equal(t, api.AccountQueryOptions{}, options) + + options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockHash=test")) + require.Error(t, err) + require.Equal(t, api.AccountQueryOptions{}, options) + + options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockRootHash=test")) + require.Error(t, err) + require.Equal(t, api.AccountQueryOptions{}, options) + + options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("hintEpoch=test")) + require.Error(t, err) + require.Equal(t, api.AccountQueryOptions{}, options) + + options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("")) + require.NoError(t, err) + require.Equal(t, api.AccountQueryOptions{}, options) +} From a1347d2c1d125c63a289942c35044b419c3dafd0 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 19 Apr 2023 12:15:11 +0300 Subject: [PATCH 294/335] fixing tests --- .../vm/delegation/delegationScenarios_test.go | 24 +++++++++++++++---- .../vm/esdt/process/esdtProcess_test.go | 1 + 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/integrationTests/vm/delegation/delegationScenarios_test.go b/integrationTests/vm/delegation/delegationScenarios_test.go index 32d828b4516..a03f52d183f 100644 --- a/integrationTests/vm/delegation/delegationScenarios_test.go +++ b/integrationTests/vm/delegation/delegationScenarios_test.go @@ -335,7 +335,7 @@ func TestDelegationSystemDelegateUnDelegateFromTopUpWithdraw(t *testing.T) { verifyDelegatorsStake(t, tpn, "getUserUnStakedValue", delegators[:numDelegators-2], delegationScAddress, big.NewInt(delegationVal)) verifyUserUndelegatedList(t, tpn, delegationScAddress, delegators[0], []*big.Int{big.NewInt(delegationVal)}) // withdraw unDelegated delegators should not withdraw because of unBond period - processMultipleTransactions(t, tpn, delegators[:numDelegators-2], delegationScAddress, "withdraw", big.NewInt(0)) + processMultipleWithdraws(t, tpn, delegators[:numDelegators-2], delegationScAddress, vmcommon.UserError) verifyDelegatorsStake(t, tpn, "getUserActiveStake", delegators[:numDelegators-2], delegationScAddress, big.NewInt(0)) verifyDelegatorsStake(t, tpn, "getUserUnStakedValue", delegators[:numDelegators-2], delegationScAddress, big.NewInt(delegationVal)) @@ -343,7 +343,7 @@ func TestDelegationSystemDelegateUnDelegateFromTopUpWithdraw(t *testing.T) { tpn.BlockchainHook.SetCurrentHeader(&block.Header{Epoch: 1}) // withdraw unDelegated delegators should withdraw after unBond period has passed - processMultipleTransactions(t, tpn, delegators[:numDelegators-2], delegationScAddress, "withdraw", big.NewInt(0)) + processMultipleWithdraws(t, tpn, delegators[:numDelegators-2], delegationScAddress, vmcommon.Ok) verifyDelegatorIsDeleted(t, tpn, delegators[:numDelegators-2], delegationScAddress) } @@ -395,7 +395,7 @@ func TestDelegationSystemDelegateUnDelegateOnlyPartOfDelegation(t *testing.T) { verifyDelegatorsStake(t, tpn, "getUserUnStakedValue", delegators[:numDelegators-2], delegationScAddress, big.NewInt(delegationVal/2)) // withdraw unDelegated delegators should not withdraw because of unBond period - processMultipleTransactions(t, tpn, delegators[:numDelegators-2], delegationScAddress, "withdraw", big.NewInt(0)) + processMultipleWithdraws(t, tpn, delegators[:numDelegators-2], delegationScAddress, vmcommon.UserError) verifyDelegatorsStake(t, tpn, "getUserActiveStake", delegators[:numDelegators-2], delegationScAddress, big.NewInt(delegationVal/2)) verifyDelegatorsStake(t, tpn, "getUserUnStakedValue", delegators[:numDelegators-2], delegationScAddress, big.NewInt(delegationVal/2)) @@ -403,7 +403,7 @@ func TestDelegationSystemDelegateUnDelegateOnlyPartOfDelegation(t *testing.T) { tpn.BlockchainHook.SetCurrentHeader(&block.Header{Epoch: 1}) // withdraw unDelegated delegators should withdraw after unBond period has passed - processMultipleTransactions(t, tpn, delegators[:numDelegators-2], delegationScAddress, "withdraw", big.NewInt(0)) + processMultipleWithdraws(t, tpn, delegators[:numDelegators-2], delegationScAddress, vmcommon.Ok) verifyDelegatorsStake(t, tpn, "getUserActiveStake", delegators[:numDelegators-2], delegationScAddress, big.NewInt(delegationVal/2)) verifyDelegatorsStake(t, tpn, "getUserUnStakedValue", delegators[:numDelegators-2], delegationScAddress, big.NewInt(0)) @@ -890,7 +890,7 @@ func TestDelegationSystemMultipleDelegationContractsAndSameDelegatorsClaimReward tpn.BlockchainHook.SetCurrentHeader(&block.Header{Epoch: 5, Nonce: 50}) for i := range delegationScAddresses { - processMultipleTransactions(t, tpn, firstTwoDelegators, delegationScAddresses[i], "withdraw", big.NewInt(0)) + processMultipleWithdraws(t, tpn, firstTwoDelegators, delegationScAddresses[i], vmcommon.UserError) txData = "unDelegate" + "@" + intToString(uint32(quarterDelegationVal)) processMultipleTransactions(t, tpn, lastTwoDelegators, delegationScAddresses[i], txData, big.NewInt(0)) @@ -1390,6 +1390,20 @@ func processMultipleTransactions( } } +func processMultipleWithdraws( + t *testing.T, + tpn *integrationTests.TestProcessorNode, + delegatorsAddr [][]byte, + receiverAddr []byte, + expected vmcommon.ReturnCode, +) { + for i := range delegatorsAddr { + returnCode, err := processTransaction(tpn, delegatorsAddr[i], receiverAddr, "withdraw", big.NewInt(0)) + assert.Nil(t, err) + assert.Equal(t, expected, returnCode) + } +} + func txDataForFunc(function string, blsKeys [][]byte) string { txData := function diff --git a/integrationTests/vm/esdt/process/esdtProcess_test.go b/integrationTests/vm/esdt/process/esdtProcess_test.go index d161e69dc76..adf71fa47f7 100644 --- a/integrationTests/vm/esdt/process/esdtProcess_test.go +++ b/integrationTests/vm/esdt/process/esdtProcess_test.go @@ -179,6 +179,7 @@ func TestESDTCallBurnOnANonBurnableToken(t *testing.T) { OptimizeGasUsedInCrossMiniBlocksEnableEpoch: integrationTests.UnreachableEpoch, ScheduledMiniBlocksEnableEpoch: integrationTests.UnreachableEpoch, MiniBlockPartialExecutionEnableEpoch: integrationTests.UnreachableEpoch, + MultiClaimOnDelegationEnableEpoch: integrationTests.UnreachableEpoch, } nodes := integrationTests.CreateNodesWithEnableEpochs( From 9c0dd25d8a57e796c5791978451a9c78bc70ccce Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Apr 2023 13:35:57 +0300 Subject: [PATCH 295/335] extra coverage on blockGroup --- api/groups/blockGroup.go | 17 +- api/groups/blockGroup_test.go | 767 +++++++++++++++++----------------- 2 files changed, 395 insertions(+), 389 deletions(-) diff --git a/api/groups/blockGroup.go b/api/groups/blockGroup.go index ce49375137a..e8182e70327 100644 --- a/api/groups/blockGroup.go +++ b/api/groups/blockGroup.go @@ -108,7 +108,6 @@ func (bg *blockGroup) getBlockByNonce(c *gin.Context) { } shared.RespondWith(c, http.StatusOK, gin.H{"block": block}, "", shared.ReturnCodeSuccess) - } func (bg *blockGroup) getBlockByHash(c *gin.Context) { @@ -166,11 +165,7 @@ func (bg *blockGroup) getAlteredAccountsByNonce(c *gin.Context) { return } - options, err := parseAlteredAccountsForBlockQueryOptionsWithoutRequestType(c) - if err != nil { - shared.RespondWithValidationError(c, errors.ErrGetAlteredAccountsForBlock, err) - return - } + options := parseAlteredAccountsForBlockQueryOptionsWithoutRequestType(c) options.GetBlockParameters = api.GetBlockParameters{ RequestType: api.BlockFetchTypeByNonce, @@ -195,11 +190,7 @@ func (bg *blockGroup) getAlteredAccountsByHash(c *gin.Context) { return } - options, err := parseAlteredAccountsForBlockQueryOptionsWithoutRequestType(c) - if err != nil { - shared.RespondWithValidationError(c, errors.ErrGetAlteredAccountsForBlock, err) - return - } + options := parseAlteredAccountsForBlockQueryOptionsWithoutRequestType(c) options.GetBlockParameters = api.GetBlockParameters{ RequestType: api.BlockFetchTypeByHash, @@ -232,12 +223,12 @@ func parseBlockQueryOptions(c *gin.Context) (api.BlockQueryOptions, error) { return options, nil } -func parseAlteredAccountsForBlockQueryOptionsWithoutRequestType(c *gin.Context) (api.GetAlteredAccountsForBlockOptions, error) { +func parseAlteredAccountsForBlockQueryOptionsWithoutRequestType(c *gin.Context) api.GetAlteredAccountsForBlockOptions { tokensFilter := c.Request.URL.Query().Get(urlParamTokensFilter) return api.GetAlteredAccountsForBlockOptions{ TokensFilter: tokensFilter, - }, nil + } } func getQueryParamNonce(c *gin.Context) (uint64, error) { diff --git a/api/groups/blockGroup_test.go b/api/groups/blockGroup_test.go index 2ef12bc17f3..0612da89074 100644 --- a/api/groups/blockGroup_test.go +++ b/api/groups/blockGroup_test.go @@ -3,6 +3,8 @@ package groups_test import ( "encoding/hex" "errors" + "fmt" + "io" "net/http" "net/http/httptest" "strings" @@ -54,468 +56,481 @@ type blockResponse struct { Code string `json:"code"` } -func TestGetBlockByNonce_EmptyNonceUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetBlockByNonceCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &api.Block{}, nil - }, - } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/block/by-nonce", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) +var expectedErr = errors.New("expected error") - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetBlockByNonce_InvalidNonceShouldErr(t *testing.T) { +func TestBlockGroup_getBlockByNonce(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetBlockByNonceCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &api.Block{}, nil - }, - } + t.Run("empty nonce should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) + testBlockGroup(t, &mock.FacadeStub{}, "/block/by-nonce", nil, http.StatusNotFound, "") + }) + t.Run("invalid nonce should error", + testBlockGroupErrorScenario("/block/by-nonce/invalid", nil, formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockNonce))) + t.Run("invalid query options should error", + testBlockGroupErrorScenario("/block/by-nonce/10?withTxs=not-bool", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() + + facade := &mock.FacadeStub{ + GetBlockByNonceCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { + return nil, expectedErr + }, + } + + testBlockGroup( + t, + facade, + "/block/by-nonce/10", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + providedNonce := uint64(37) + expectedOptions := api.BlockQueryOptions{WithTransactions: true} + expectedBlock := api.Block{ + Nonce: 37, + Round: 39, + } + facade := mock.FacadeStub{ + GetBlockByNonceCalled: func(nonce uint64, options api.BlockQueryOptions) (*api.Block, error) { + require.Equal(t, providedNonce, nonce) + require.Equal(t, expectedOptions, options) + return &expectedBlock, nil + }, + } - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + blockGroup, err := groups.NewBlockGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/block/by-nonce/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) + url := fmt.Sprintf("/block/by-nonce/%d?withTxs=true", providedNonce) + req, _ := http.NewRequest("GET", url, nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockNonce.Error())) + response := blockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + + assert.Equal(t, expectedBlock, response.Data.Block) + }) } -func TestGetBlockByNonce_FacadeErrorShouldErr(t *testing.T) { +func TestBlockGroup_getBlockByHash(t *testing.T) { t.Parallel() - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetBlockByNonceCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return nil, expectedErr - }, - } + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) + testBlockGroup(t, &mock.FacadeStub{}, "/block/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("invalid query options should error", + testBlockGroupErrorScenario("/block/by-hash/hash?withLogs=not-bool", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() + + facade := &mock.FacadeStub{ + GetBlockByHashCalled: func(_ string, _ api.BlockQueryOptions) (*api.Block, error) { + return nil, expectedErr + }, + } + + testBlockGroup( + t, + facade, + "/block/by-hash/hash", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + providedHash := "hash" + expectedOptions := api.BlockQueryOptions{WithTransactions: true} + expectedBlock := api.Block{ + Nonce: 37, + Round: 39, + } + facade := mock.FacadeStub{ + GetBlockByHashCalled: func(hash string, options api.BlockQueryOptions) (*api.Block, error) { + require.Equal(t, providedHash, hash) + require.Equal(t, expectedOptions, options) + return &expectedBlock, nil + }, + } - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + blockGroup, err := groups.NewBlockGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/block/by-nonce/37", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) + url := fmt.Sprintf("/block/by-hash/%s?withTxs=true", providedHash) + req, _ := http.NewRequest("GET", url, nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := blockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + assert.Equal(t, expectedBlock, response.Data.Block) + }) } -func TestGetBlockByNonce_ShouldWork(t *testing.T) { +func TestBlockGroup_getBlockByRound(t *testing.T) { t.Parallel() - expectedBlock := api.Block{ - Nonce: 37, - Round: 39, - } - facade := mock.FacadeStub{ - GetBlockByNonceCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &expectedBlock, nil - }, - } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/block/by-nonce/37", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + t.Run("empty round should error", func(t *testing.T) { + t.Parallel() - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedBlock, response.Data.Block) -} - -// ---- by hash - -func TestGetBlockByHash_NoHashUrlParameterShouldErr(t *testing.T) { - t.Parallel() + testBlockGroup(t, &mock.FacadeStub{}, "/block/by-round", nil, http.StatusNotFound, "") + }) + t.Run("invalid round should error", + testBlockGroupErrorScenario("/block/by-round/invalid", nil, formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockRound))) + t.Run("invalid query options should error", + testBlockGroupErrorScenario("/block/by-round/123?withTxs=not-bool", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrBadUrlParams))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() + + facade := &mock.FacadeStub{ + GetBlockByRoundCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { + return nil, expectedErr + }, + } + + testBlockGroup( + t, + facade, + "/block/by-round/123", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + providedRound := uint64(37) + expectedOptions := api.BlockQueryOptions{WithTransactions: true} + expectedBlock := api.Block{ + Nonce: 37, + Round: 39, + } + facade := mock.FacadeStub{ + GetBlockByRoundCalled: func(round uint64, options api.BlockQueryOptions) (*api.Block, error) { + require.Equal(t, providedRound, round) + require.Equal(t, expectedOptions, options) + return &expectedBlock, nil + }, + } - facade := mock.FacadeStub{ - GetBlockByNonceCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &api.Block{}, nil - }, - } + blockGroup, err := groups.NewBlockGroup(&facade) + require.NoError(t, err) - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) + ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + url := fmt.Sprintf("/block/by-round/%d?withTxs=true", providedRound) + req, _ := http.NewRequest("GET", url, nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - req, _ := http.NewRequest("GET", "/block/by-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + response := blockResponse{} + loadResponse(resp.Body, &response) - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedBlock, response.Data.Block) + }) } -func TestGetBlockByHash_FacadeErrorShouldErr(t *testing.T) { +func TestBlockGroup_getAlteredAccountsByNonce(t *testing.T) { t.Parallel() - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetBlockByHashCalled: func(_ string, _ api.BlockQueryOptions) (*api.Block, error) { - return nil, expectedErr - }, - } + t.Run("empty nonce should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) + testBlockGroup(t, &mock.FacadeStub{}, "/block/altered-accounts/by-nonce", nil, http.StatusNotFound, "") + }) + t.Run("invalid nonce should error", + testBlockGroupErrorScenario("/block/altered-accounts/by-nonce/invalid", nil, + formatExpectedErr(apiErrors.ErrGetAlteredAccountsForBlock, apiErrors.ErrInvalidBlockRound))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() + + facade := &mock.FacadeStub{ + GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { + return nil, expectedErr + }, + } + + testBlockGroup( + t, + facade, + "/block/altered-accounts/by-nonce/123", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetAlteredAccountsForBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + providedNonce := uint64(37) + expectedOptions := api.GetAlteredAccountsForBlockOptions{ + GetBlockParameters: api.GetBlockParameters{ + RequestType: api.BlockFetchTypeByNonce, + Nonce: providedNonce, + }, + } + expectedResponse := []*outport.AlteredAccount{ + { + Address: "alice", + Balance: "100000", + }, + } - req, _ := http.NewRequest("GET", "/block/by-hash/hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := mock.FacadeStub{ + GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { + require.Equal(t, expectedOptions, options) + return expectedResponse, nil + }, + } - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusInternalServerError, resp.Code) + blockGroup, err := groups.NewBlockGroup(&facade) + require.NoError(t, err) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + + url := fmt.Sprintf("/block/altered-accounts/by-nonce/%d", providedNonce) + response, code := httpGetAlteredAccountsForBlockBlock(ws, url) + require.Equal(t, http.StatusOK, code) + require.Equal(t, expectedResponse, response.Data.Accounts) + require.Empty(t, response.Error) + require.Equal(t, string(shared.ReturnCodeSuccess), response.Code) + }) } -func TestGetBlockByHash_ShouldWork(t *testing.T) { +func TestBlockGroup_getAlteredAccountsByHash(t *testing.T) { t.Parallel() - expectedBlock := api.Block{ - Nonce: 37, - Round: 39, - } - facade := mock.FacadeStub{ - GetBlockByHashCalled: func(_ string, _ api.BlockQueryOptions) (*api.Block, error) { - return &expectedBlock, nil - }, - } + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) + testBlockGroup(t, &mock.FacadeStub{}, "/block/altered-accounts/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("invalid hash should error", + testBlockGroupErrorScenario("/block/altered-accounts/by-hash/hash", nil, + apiErrors.ErrGetAlteredAccountsForBlock.Error())) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() + + providedHash := hex.EncodeToString([]byte("hash")) + facade := &mock.FacadeStub{ + GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { + return nil, expectedErr + }, + } + + testBlockGroup( + t, + facade, + "/block/altered-accounts/by-hash/"+providedHash, + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetAlteredAccountsForBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + providedHash := hex.EncodeToString([]byte("hash")) + expectedOptions := api.GetAlteredAccountsForBlockOptions{ + GetBlockParameters: api.GetBlockParameters{ + RequestType: api.BlockFetchTypeByHash, + Hash: []byte("hash"), + }, + } + expectedResponse := []*outport.AlteredAccount{ + { + Address: "alice", + Balance: "100000", + }, + } - req, _ := http.NewRequest("GET", "/block/by-hash/hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := mock.FacadeStub{ + GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { + require.Equal(t, providedHash, hex.EncodeToString(options.Hash)) + require.Equal(t, expectedOptions, options) + return expectedResponse, nil + }, + } - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + blockGroup, err := groups.NewBlockGroup(&facade) + require.NoError(t, err) - assert.Equal(t, expectedBlock, response.Data.Block) -} + ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) -func getBlockRoutesConfig() config.ApiRoutesConfig { - return config.ApiRoutesConfig{ - APIPackages: map[string]config.APIPackageConfig{ - "block": { - Routes: []config.RouteConfig{ - {Name: "/by-nonce/:nonce", Open: true}, - {Name: "/by-hash/:hash", Open: true}, - {Name: "/by-round/:round", Open: true}, - {Name: "/altered-accounts/by-nonce/:nonce", Open: true}, - {Name: "/altered-accounts/by-hash/:hash", Open: true}, - }, - }, - }, - } + url := fmt.Sprintf("/block/altered-accounts/by-hash/%s", providedHash) + response, code := httpGetAlteredAccountsForBlockBlock(ws, url) + require.Equal(t, http.StatusOK, code) + require.Equal(t, expectedResponse, response.Data.Accounts) + require.Empty(t, response.Error) + require.Equal(t, string(shared.ReturnCodeSuccess), response.Code) + }) } -// ---- by round - -func TestGetBlockByRound_WrongFacadeShouldErr(t *testing.T) { +func TestBlockGroup_IsInterfaceNil(t *testing.T) { t.Parallel() - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetBlockByRoundCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + blockGroup, _ := groups.NewBlockGroup(nil) + require.True(t, blockGroup.IsInterfaceNil()) - req, _ := http.NewRequest("GET", "/block/by-round/2", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := blockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + blockGroup, _ = groups.NewBlockGroup(&mock.FacadeStub{}) + require.False(t, blockGroup.IsInterfaceNil()) } -func TestGetBlockByRound_EmptyRoundUrlParameterShouldErr(t *testing.T) { +func TestBlockGroup_UpdateFacadeStub(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetBlockByRoundCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &api.Block{}, nil - }, - } + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) + blockGroup, err := groups.NewBlockGroup(&mock.FacadeStub{}) + require.NoError(t, err) - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + err = blockGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/block/by-round", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + blockGroup, err := groups.NewBlockGroup(&mock.FacadeStub{}) + require.NoError(t, err) - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} + err = blockGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + expectedBlock := api.Block{ + Nonce: 37, + Round: 39, + } + facade := mock.FacadeStub{ + GetBlockByNonceCalled: func(nonce uint64, options api.BlockQueryOptions) (*api.Block, error) { + return &expectedBlock, nil + }, + } -func TestGetBlockByRound_InvalidRoundShouldErr(t *testing.T) { - t.Parallel() + blockGroup, err := groups.NewBlockGroup(&facade) + require.NoError(t, err) - facade := mock.FacadeStub{ - GetBlockByNonceCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &api.Block{}, nil - }, - } + ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", "/block/by-nonce/10", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + response := blockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedBlock, response.Data.Block) - req, _ := http.NewRequest("GET", "/block/by-round/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + newFacade := mock.FacadeStub{ + GetBlockByNonceCalled: func(nonce uint64, options api.BlockQueryOptions) (*api.Block, error) { + return nil, expectedErr + }, + } + err = blockGroup.UpdateFacade(&newFacade) + require.NoError(t, err) - response := blockResponse{} - loadResponse(resp.Body, &response) + req, _ = http.NewRequest("GET", "/block/by-nonce/10", nil) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockRound.Error())) + response = blockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + }) } -func TestGetBlockByRound_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetBlockByRoundCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/block/by-round/37", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := blockResponse{} - loadResponse(resp.Body, &response) +func httpGetAlteredAccountsForBlockBlock(ws *gin.Engine, url string) (alteredAccountsForBlockResponse, int) { + httpRequest, _ := http.NewRequest("GET", url, nil) + httpResponse := httptest.NewRecorder() + ws.ServeHTTP(httpResponse, httpRequest) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + response := alteredAccountsForBlockResponse{} + loadResponse(httpResponse.Body, &response) + return response, httpResponse.Code } -func TestGetBlockByRound_ShouldWork(t *testing.T) { - t.Parallel() - - expectedBlock := api.Block{ - Nonce: 37, - Round: 39, - } - facade := mock.FacadeStub{ - GetBlockByRoundCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &expectedBlock, nil - }, +func testBlockGroupErrorScenario(url string, body io.Reader, expectedErr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + testBlockGroup( + t, + &mock.FacadeStub{}, + url, + body, + http.StatusBadRequest, + expectedErr, + ) } +} - blockGroup, err := groups.NewBlockGroup(&facade) +func testBlockGroup( + t *testing.T, + facade shared.FacadeHandler, + url string, + body io.Reader, + expectedRespCode int, + expectedRespError string, +) { + blockGroup, err := groups.NewBlockGroup(facade) require.NoError(t, err) ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - req, _ := http.NewRequest("GET", "/block/by-round/37", nil) + req, _ := http.NewRequest("GET", url, body) resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) response := blockResponse{} loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedBlock, response.Data.Block) -} - -func TestGetBlockByRound_WithBadBlockQueryOptionsShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetBlockByRoundCalled: func(_ uint64, _ api.BlockQueryOptions) (*api.Block, error) { - return &api.Block{}, nil - }, - } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - response, code := httpGetBlock(ws, "/block/by-round/37?withTxs=bad") - require.Equal(t, http.StatusBadRequest, code) - require.Contains(t, response.Error, apiErrors.ErrBadUrlParams.Error()) - - response, code = httpGetBlock(ws, "/block/by-round/37?withLogs=bad") - require.Equal(t, http.StatusBadRequest, code) - require.Contains(t, response.Error, apiErrors.ErrBadUrlParams.Error()) -} - -func TestGetBlockByRound_WithBlockQueryOptionsShouldWork(t *testing.T) { - t.Parallel() - - var calledWithRound uint64 - var calledWithOptions api.BlockQueryOptions - - facade := mock.FacadeStub{ - GetBlockByRoundCalled: func(round uint64, options api.BlockQueryOptions) (*api.Block, error) { - calledWithRound = round - calledWithOptions = options - return &api.Block{}, nil - }, - } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - response, code := httpGetBlock(ws, "/block/by-round/37?withTxs=true") - require.Equal(t, http.StatusOK, code) - require.NotNil(t, response) - require.Equal(t, uint64(37), calledWithRound) - require.Equal(t, api.BlockQueryOptions{WithTransactions: true}, calledWithOptions) - - response, code = httpGetBlock(ws, "/block/by-round/38?withTxs=true&withLogs=true") - require.Equal(t, http.StatusOK, code) - require.NotNil(t, response) - require.Equal(t, uint64(38), calledWithRound) - require.Equal(t, api.BlockQueryOptions{WithTransactions: true, WithLogs: true}, calledWithOptions) + assert.Equal(t, expectedRespCode, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedRespError)) } -func TestGetAlteredAccountsByNonce_ShouldWork(t *testing.T) { - t.Parallel() - - expectedResponse := []*outport.AlteredAccount{ - { - Address: "alice", - Balance: "100000", - }, - } - - facade := mock.FacadeStub{ - GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { - require.Equal(t, api.BlockFetchTypeByNonce, options.RequestType) - require.Equal(t, uint64(37), options.Nonce) - - return expectedResponse, nil - }, - } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - response, code := httpGetAlteredAccountsForBlockBlock(ws, "/block/altered-accounts/by-nonce/37") - require.Equal(t, http.StatusOK, code) - require.Equal(t, expectedResponse, response.Data.Accounts) - require.Empty(t, response.Error) - require.Equal(t, string(shared.ReturnCodeSuccess), response.Code) +func formatExpectedErr(err, innerErr error) string { + return fmt.Sprintf("%s: %s", err.Error(), innerErr.Error()) } -func TestGetAlteredAccountsByHash_ShouldWork(t *testing.T) { - t.Parallel() - - expectedResponse := []*outport.AlteredAccount{ - { - Address: "alice", - Balance: "100000", - }, - } - facade := mock.FacadeStub{ - GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { - require.Equal(t, api.BlockFetchTypeByHash, options.RequestType) - require.Equal(t, "aabb", hex.EncodeToString(options.Hash)) - - return expectedResponse, nil +func getBlockRoutesConfig() config.ApiRoutesConfig { + return config.ApiRoutesConfig{ + APIPackages: map[string]config.APIPackageConfig{ + "block": { + Routes: []config.RouteConfig{ + {Name: "/by-nonce/:nonce", Open: true}, + {Name: "/by-hash/:hash", Open: true}, + {Name: "/by-round/:round", Open: true}, + {Name: "/altered-accounts/by-nonce/:nonce", Open: true}, + {Name: "/altered-accounts/by-hash/:hash", Open: true}, + }, + }, }, } - - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - response, code := httpGetAlteredAccountsForBlockBlock(ws, "/block/altered-accounts/by-hash/aabb") - require.Equal(t, http.StatusOK, code) - require.Equal(t, expectedResponse, response.Data.Accounts) - require.Empty(t, response.Error) - require.Equal(t, string(shared.ReturnCodeSuccess), response.Code) -} - -func httpGetBlock(ws *gin.Engine, url string) (blockResponse, int) { - httpRequest, _ := http.NewRequest("GET", url, nil) - httpResponse := httptest.NewRecorder() - ws.ServeHTTP(httpResponse, httpRequest) - - blockResponse := blockResponse{} - loadResponse(httpResponse.Body, &blockResponse) - return blockResponse, httpResponse.Code -} - -func httpGetAlteredAccountsForBlockBlock(ws *gin.Engine, url string) (alteredAccountsForBlockResponse, int) { - httpRequest, _ := http.NewRequest("GET", url, nil) - httpResponse := httptest.NewRecorder() - ws.ServeHTTP(httpResponse, httpRequest) - - response := alteredAccountsForBlockResponse{} - loadResponse(httpResponse.Body, &response) - return response, httpResponse.Code } From 212584db2e6ae4aa2521596bb1afc8679a054646 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Apr 2023 13:36:47 +0300 Subject: [PATCH 296/335] fix test name --- api/groups/addressGroup_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index 61d970d3977..cbc84549090 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -1018,7 +1018,7 @@ func TestAddressGroup_getAllESDTData(t *testing.T) { }) } -func TestAddressGroup_UpdateFacadeStub(t *testing.T) { +func TestAddressGroup_UpdateFacade(t *testing.T) { t.Parallel() t.Run("nil facade should error", func(t *testing.T) { @@ -1068,12 +1068,12 @@ func TestAddressGroup_UpdateFacadeStub(t *testing.T) { assert.Equal(t, roles, response.Data.Roles) newErr := errors.New("new error") - newFacadeStub := mock.FacadeStub{ + newFacade := mock.FacadeStub{ GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { return nil, api.BlockInfo{}, newErr }, } - err = addrGroup.UpdateFacade(&newFacadeStub) + err = addrGroup.UpdateFacade(&newFacade) require.NoError(t, err) req, _ = http.NewRequest("GET", fmt.Sprintf("/address/%s/esdts/roles", testAddress), nil) From 792647cab0c1ab4c58baa5a95fff3f3ed31664d8 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Apr 2023 15:03:54 +0300 Subject: [PATCH 297/335] fix after review, error name --- api/errors/errors.go | 4 ++-- api/groups/addressGroup.go | 6 +++--- api/groups/addressGroup_test.go | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/api/errors/errors.go b/api/errors/errors.go index a0c9a10526d..29b83893519 100644 --- a/api/errors/errors.go +++ b/api/errors/errors.go @@ -157,5 +157,5 @@ var ErrInvalidFields = errors.New("invalid fields") // ErrGetESDTTokensWithRole signals an error in getting the esdt tokens with the given role for given address var ErrGetESDTTokensWithRole = errors.New("getting esdt tokens with role error") -// ErrNFTTokenIDsRegistered signals an error in getting the nft token ids registered by the given address -var ErrNFTTokenIDsRegistered = errors.New("getting nft token ids registered error") +// ErrRegisteredNFTTokenIDs signals an error in getting the registered nft token ids by the given address +var ErrRegisteredNFTTokenIDs = errors.New("getting registered nft token ids error") diff --git a/api/groups/addressGroup.go b/api/groups/addressGroup.go index 3a356277802..39a6ac93511 100644 --- a/api/groups/addressGroup.go +++ b/api/groups/addressGroup.go @@ -458,19 +458,19 @@ func (ag *addressGroup) getESDTTokensWithRole(c *gin.Context) { func (ag *addressGroup) getNFTTokenIDsRegisteredByAddress(c *gin.Context) { addr := c.Param("address") if addr == "" { - shared.RespondWithValidationError(c, errors.ErrNFTTokenIDsRegistered, errors.ErrEmptyAddress) + shared.RespondWithValidationError(c, errors.ErrRegisteredNFTTokenIDs, errors.ErrEmptyAddress) return } options, err := extractAccountQueryOptions(c) if err != nil { - shared.RespondWithValidationError(c, errors.ErrNFTTokenIDsRegistered, err) + shared.RespondWithValidationError(c, errors.ErrRegisteredNFTTokenIDs, err) return } tokens, blockInfo, err := ag.getFacade().GetNFTTokenIDsRegisteredByAddress(addr, options) if err != nil { - shared.RespondWithInternalError(c, errors.ErrNFTTokenIDsRegistered, err) + shared.RespondWithInternalError(c, errors.ErrRegisteredNFTTokenIDs, err) return } diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index cbc84549090..cdd73ebc565 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -851,10 +851,10 @@ func TestAddressGroup_getNFTTokenIDsRegisteredByAddress(t *testing.T) { t.Run("empty address should error", testErrorScenario("/address//registered-nfts", nil, - formatExpectedErr(apiErrors.ErrNFTTokenIDsRegistered, apiErrors.ErrEmptyAddress))) + formatExpectedErr(apiErrors.ErrRegisteredNFTTokenIDs, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", testErrorScenario("/address/erd1alice/registered-nfts?blockNonce=not-uint64", nil, - formatExpectedErr(apiErrors.ErrNFTTokenIDsRegistered, apiErrors.ErrBadUrlParams))) + formatExpectedErr(apiErrors.ErrRegisteredNFTTokenIDs, apiErrors.ErrBadUrlParams))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -869,7 +869,7 @@ func TestAddressGroup_getNFTTokenIDsRegisteredByAddress(t *testing.T) { "/address/erd1alice/registered-nfts", nil, http.StatusInternalServerError, - formatExpectedErr(apiErrors.ErrNFTTokenIDsRegistered, expectedErr), + formatExpectedErr(apiErrors.ErrRegisteredNFTTokenIDs, expectedErr), ) }) t.Run("should work", func(t *testing.T) { From 9b478d6b6e50c367c316f2d17ac216f86cd8183f Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 19 Apr 2023 15:05:30 +0300 Subject: [PATCH 298/335] fixed issue on metachain when treating tx with invalid username --- process/transaction/metaProcess.go | 8 +++++ process/transaction/metaProcess_test.go | 42 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/process/transaction/metaProcess.go b/process/transaction/metaProcess.go index 4724438b20d..e5606426ec7 100644 --- a/process/transaction/metaProcess.go +++ b/process/transaction/metaProcess.go @@ -1,6 +1,7 @@ package transaction import ( + "errors" "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/transaction" @@ -108,6 +109,13 @@ func (txProc *metaTxProcessor) ProcessTransaction(tx *transaction.Transaction) ( err = txProc.checkTxValues(tx, acntSnd, acntDst, false) if err != nil { + if errors.Is(err, process.ErrUserNameDoesNotMatchInCrossShardTx) { + errProcessIfErr := txProc.processIfTxErrorCrossShard(tx, err.Error()) + if errProcessIfErr != nil { + return 0, errProcessIfErr + } + return vmcommon.UserError, nil + } return 0, err } diff --git a/process/transaction/metaProcess_test.go b/process/transaction/metaProcess_test.go index babe9ff0458..11635f4d999 100644 --- a/process/transaction/metaProcess_test.go +++ b/process/transaction/metaProcess_test.go @@ -2,6 +2,9 @@ package transaction_test import ( "bytes" + "github.com/multiversx/mx-chain-core-go/core" + "github.com/multiversx/mx-chain-go/sharding" + "github.com/multiversx/mx-chain-go/vm" "math/big" "testing" @@ -446,3 +449,42 @@ func TestMetaTxProcessor_ProcessTransactionBuiltInCallTxShouldWork(t *testing.T) assert.True(t, builtInCalled) assert.Equal(t, 0, saveAccountCalled) } + +func TestMetaTxProcessor_ProcessTransactionWithInvalidUsernameShouldNotError(t *testing.T) { + t.Parallel() + + tx := &transaction.Transaction{} + tx.Nonce = 0 + tx.SndAddr = bytes.Repeat([]byte{1}, 32) + tx.RcvAddr = vm.GovernanceSCAddress + tx.RcvUserName = []byte("username") + tx.Value = big.NewInt(45) + tx.GasPrice = 1 + tx.GasLimit = 1 + + acntDst, err := state.NewUserAccount(tx.RcvAddr) + assert.Nil(t, err) + + called := false + adb := createAccountStub(tx.SndAddr, tx.RcvAddr, acntDst, acntDst) + scProcessor := &testscommon.SCProcessorMock{ + ProcessIfErrorCalled: func(acntSnd state.UserAccountHandler, txHash []byte, tx data.TransactionHandler, returnCode string, returnMessage []byte, snapshot int, gasLocked uint64) error { + called = true + return nil + }, + } + + args := createMockNewMetaTxArgs() + args.Accounts = adb + args.ScProcessor = scProcessor + args.ShardCoordinator, _ = sharding.NewMultiShardCoordinator(3, core.MetachainShardId) + txProc, _ := txproc.NewMetaTxProcessor(args) + + err = txProc.VerifyTransaction(tx) + assert.Equal(t, err, process.ErrUserNameDoesNotMatchInCrossShardTx) + + returnCode, err := txProc.ProcessTransaction(tx) + assert.Nil(t, err) + assert.Equal(t, vmcommon.UserError, returnCode) + assert.True(t, called) +} From 727ce944b80c13e362735c9af0e6230043abc094 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Wed, 19 Apr 2023 15:36:45 +0300 Subject: [PATCH 299/335] goimports --- process/transaction/metaProcess.go | 1 + process/transaction/metaProcess_test.go | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/process/transaction/metaProcess.go b/process/transaction/metaProcess.go index e5606426ec7..4e7f96841f9 100644 --- a/process/transaction/metaProcess.go +++ b/process/transaction/metaProcess.go @@ -2,6 +2,7 @@ package transaction import ( "errors" + "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/transaction" diff --git a/process/transaction/metaProcess_test.go b/process/transaction/metaProcess_test.go index 11635f4d999..96f45d97d56 100644 --- a/process/transaction/metaProcess_test.go +++ b/process/transaction/metaProcess_test.go @@ -2,22 +2,22 @@ package transaction_test import ( "bytes" - "github.com/multiversx/mx-chain-core-go/core" - "github.com/multiversx/mx-chain-go/sharding" - "github.com/multiversx/mx-chain-go/vm" "math/big" "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/transaction" "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/process/coordinator" "github.com/multiversx/mx-chain-go/process/mock" txproc "github.com/multiversx/mx-chain-go/process/transaction" + "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/state" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/hashingMocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" + "github.com/multiversx/mx-chain-go/vm" vmcommon "github.com/multiversx/mx-chain-vm-common-go" "github.com/multiversx/mx-chain-vm-common-go/builtInFunctions" "github.com/multiversx/mx-chain-vm-common-go/parsers" From 3b75ee8e72b552e97dfc82c47def9d361ca68150 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Apr 2023 16:13:22 +0300 Subject: [PATCH 300/335] extra tests for hardforkGroup --- api/groups/hardforkGroup_test.go | 114 +++++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 14 deletions(-) diff --git a/api/groups/hardforkGroup_test.go b/api/groups/hardforkGroup_test.go index 0c25c71e03f..61f977341ad 100644 --- a/api/groups/hardforkGroup_test.go +++ b/api/groups/hardforkGroup_test.go @@ -6,6 +6,7 @@ import ( "errors" "net/http" "net/http/httptest" + "strings" "sync/atomic" "testing" @@ -18,7 +19,7 @@ import ( "github.com/stretchr/testify/require" ) -type TriggerResponse struct { +type triggerResponse struct { Status string `json:"status"` } @@ -38,10 +39,9 @@ func TestNewHardforkGroup(t *testing.T) { }) } -func TestTrigger_TriggerCanNotExecuteShouldErr(t *testing.T) { +func TestHardforkGroup_TriggerCanNotExecuteShouldErr(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected error") hardforkFacade := &mock.HardforkFacade{ TriggerCalled: func(_ uint32, _ bool) error { return expectedErr @@ -69,7 +69,7 @@ func TestTrigger_TriggerCanNotExecuteShouldErr(t *testing.T) { assert.Contains(t, response.Error, expectedErr.Error()) } -func TestTrigger_TriggerWrongRequestTypeShouldErr(t *testing.T) { +func TestHardforkGroup_TriggerWrongRequestTypeShouldErr(t *testing.T) { t.Parallel() hardforkGroup, err := groups.NewHardforkGroup(&mock.HardforkFacade{}) @@ -81,13 +81,13 @@ func TestTrigger_TriggerWrongRequestTypeShouldErr(t *testing.T) { resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - triggerResponse := TriggerResponse{} - loadResponse(resp.Body, &triggerResponse) + triggerResp := triggerResponse{} + loadResponse(resp.Body, &triggerResp) assert.Equal(t, resp.Code, http.StatusBadRequest) } -func TestTrigger_ManualShouldWork(t *testing.T) { +func TestHardforkGroup_ManualShouldWork(t *testing.T) { t.Parallel() recoveredEpoch := uint32(0) @@ -118,17 +118,17 @@ func TestTrigger_ManualShouldWork(t *testing.T) { response := shared.GenericAPIResponse{} loadResponse(resp.Body, &response) - triggerResponse := TriggerResponse{} + triggerResp := triggerResponse{} mapResponseData := response.Data.(map[string]interface{}) mapResponseBytes, _ := json.Marshal(&mapResponseData) - _ = json.Unmarshal(mapResponseBytes, &triggerResponse) + _ = json.Unmarshal(mapResponseBytes, &triggerResp) assert.Equal(t, resp.Code, http.StatusOK) - assert.Equal(t, groups.ExecManualTrigger, triggerResponse.Status) + assert.Equal(t, groups.ExecManualTrigger, triggerResp.Status) assert.Equal(t, hr.Epoch, atomic.LoadUint32(&recoveredEpoch)) } -func TestTrigger_BroadcastShouldWork(t *testing.T) { +func TestHardforkGroup_BroadcastShouldWork(t *testing.T) { t.Parallel() hardforkFacade := &mock.HardforkFacade{ @@ -156,13 +156,99 @@ func TestTrigger_BroadcastShouldWork(t *testing.T) { response := shared.GenericAPIResponse{} loadResponse(resp.Body, &response) - triggerResponse := TriggerResponse{} + triggerResp := triggerResponse{} mapResponseData := response.Data.(map[string]interface{}) mapResponseBytes, _ := json.Marshal(&mapResponseData) - _ = json.Unmarshal(mapResponseBytes, &triggerResponse) + _ = json.Unmarshal(mapResponseBytes, &triggerResp) assert.Equal(t, resp.Code, http.StatusOK) - assert.Equal(t, groups.ExecBroadcastTrigger, triggerResponse.Status) + assert.Equal(t, groups.ExecBroadcastTrigger, triggerResp.Status) +} + +func TestHardforkGroup_IsInterfaceNil(t *testing.T) { + t.Parallel() + + hardforkGroup, _ := groups.NewHardforkGroup(nil) + require.True(t, hardforkGroup.IsInterfaceNil()) + + hardforkGroup, _ = groups.NewHardforkGroup(&mock.FacadeStub{}) + require.False(t, hardforkGroup.IsInterfaceNil()) +} + +func TestHardforkGroup_UpdateFacadeStub(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + hardforkGroup, err := groups.NewHardforkGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = hardforkGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() + + hardforkGroup, err := groups.NewHardforkGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = hardforkGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + hardforkFacade := &mock.HardforkFacade{ + TriggerCalled: func(_ uint32, _ bool) error { + return nil + }, + IsSelfTriggerCalled: func() bool { + return true + }, + } + + hardforkGroup, err := groups.NewHardforkGroup(hardforkFacade) + require.NoError(t, err) + + ws := startWebServer(hardforkGroup, "hardfork", getHardforkRoutesConfig()) + + hr := &groups.HardforkRequest{ + Epoch: 4, + } + buffHr, _ := json.Marshal(hr) + req, _ := http.NewRequest("POST", "/hardfork/trigger", bytes.NewBuffer(buffHr)) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + + triggerResp := triggerResponse{} + mapResponseData := response.Data.(map[string]interface{}) + mapResponseBytes, _ := json.Marshal(&mapResponseData) + _ = json.Unmarshal(mapResponseBytes, &triggerResp) + + assert.Equal(t, resp.Code, http.StatusOK) + assert.Equal(t, groups.ExecBroadcastTrigger, triggerResp.Status) + + newFacade := &mock.HardforkFacade{ + TriggerCalled: func(_ uint32, _ bool) error { + return expectedErr + }, + } + err = hardforkGroup.UpdateFacade(newFacade) + require.NoError(t, err) + + req, _ = http.NewRequest("POST", "/hardfork/trigger", bytes.NewBuffer(buffHr)) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response = shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + }) } func getHardforkRoutesConfig() config.ApiRoutesConfig { From 0694896984101bf8a0b67584a2f2a87d40d31846 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 19 Apr 2023 19:18:49 +0300 Subject: [PATCH 301/335] extra tests for internalBlockGroup --- api/groups/internalGroup_test.go | 2058 ++++++++++++------------------ 1 file changed, 812 insertions(+), 1246 deletions(-) diff --git a/api/groups/internalGroup_test.go b/api/groups/internalGroup_test.go index c36cd07e0c8..3e1f6f84730 100644 --- a/api/groups/internalGroup_test.go +++ b/api/groups/internalGroup_test.go @@ -3,6 +3,7 @@ package groups_test import ( "bytes" "errors" + "io" "net/http" "net/http/httptest" "strings" @@ -12,6 +13,7 @@ import ( apiErrors "github.com/multiversx/mx-chain-go/api/errors" "github.com/multiversx/mx-chain-go/api/groups" "github.com/multiversx/mx-chain-go/api/mock" + "github.com/multiversx/mx-chain-go/api/shared" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/state" @@ -77,6 +79,18 @@ type internalValidatorsInfoResponse struct { Code string `json:"code"` } +var ( + expectedRawBlockOutput = bytes.Repeat([]byte("1"), 10) + expectedMetaBlock = block.MetaBlock{ + Nonce: 15, + Epoch: 15, + } + expectedShardBlock = block.Header{ + Nonce: 15, + Round: 15, + } +) + func TestNewInternalBlockGroup(t *testing.T) { t.Parallel() @@ -93,1423 +107,865 @@ func TestNewInternalBlockGroup(t *testing.T) { }) } -// ---- RAW - -// ---- MetaBlock - by nonce - -func TestGetRawMetaBlockByNonce_EmptyNonceUrlParameterShouldErr(t *testing.T) { +func TestInternalBlockGroup_getMetaBlockByNonce(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } + t.Run("empty nonce should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/metablock/by-nonce", nil, http.StatusNotFound, "") + }) + t.Run("invalid nonce should error", + testInternalGroupErrorScenario("/internal/raw/metablock/by-nonce/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockNonce))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + facade := &mock.FacadeStub{ + GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-nonce", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + testInternalGroup( + t, + facade, + "/internal/raw/metablock/by-nonce/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} + facade := mock.FacadeStub{ + GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } -func TestGetRawMetaBlockByNonce_InvalidNonceShouldErr(t *testing.T) { - t.Parallel() + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-nonce/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) +} - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-nonce/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) +func TestInternalBlockGroup_getRawMetaBlockByRound(t *testing.T) { + t.Parallel() - response := rawBlockResponse{} - loadResponse(resp.Body, &response) + t.Run("empty round should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockNonce.Error())) -} + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/metablock/by-round", nil, http.StatusNotFound, "") + }) + t.Run("invalid round should error", + testInternalGroupErrorScenario("/internal/raw/metablock/by-round/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockRound))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() -func TestGetRawMetaBlockByNonce_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return nil, expectedErr - }, - } + testInternalGroup( + t, + facade, + "/internal/raw/metablock/by-round/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + facade := mock.FacadeStub{ + GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - response := rawBlockResponse{} - loadResponse(resp.Body, &response) + req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-round/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) } -func TestGetRawMetaBlockByNonce_ShouldWork(t *testing.T) { +func TestInternalBlockGroup_getRawMetaBlockByHash(t *testing.T) { t.Parallel() - expectedOutput := bytes.Repeat([]byte("1"), 10) + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/metablock/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + facade := &mock.FacadeStub{ + GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return nil, expectedErr + }, + } - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + testInternalGroup( + t, + facade, + "/internal/raw/metablock/by-hash/dummyhash", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := mock.FacadeStub{ + GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - assert.Equal(t, expectedOutput, response.Data.Block) -} + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) -// ---- MetaBlock - by round + req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) +} -func TestGetRawMetaBlockByRound_EmptyRoundUrlParameterShouldErr(t *testing.T) { +func TestInternalBlockGroup_getRawStartOfEpochMetaBlock(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } + t.Run("empty epoch should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/startofepoch/metablock/by-epoch/", nil, http.StatusNotFound, "") + }) + t.Run("invalid epoch should error", + testInternalGroupErrorScenario("/internal/raw/startofepoch/metablock/by-epoch/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidEpoch))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + facade := &mock.FacadeStub{ + GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { + return nil, expectedErr + }, + } - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-round", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + testInternalGroup( + t, + facade, + "/internal/raw/startofepoch/metablock/by-epoch/1", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} + facade := mock.FacadeStub{ + GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } -func TestGetRawMetaBlockByRound_InvalidRoundShouldErr(t *testing.T) { - t.Parallel() + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", "/internal/raw/startofepoch/metablock/by-epoch/1", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) +} - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-round/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) +func TestInternalBlockGroup_getRawShardBlockByNonce(t *testing.T) { + t.Parallel() - response := rawBlockResponse{} - loadResponse(resp.Body, &response) + t.Run("empty nonce should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockRound.Error())) -} + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/shardblock/by-nonce", nil, http.StatusNotFound, "") + }) + t.Run("invalid nonce should error", + testInternalGroupErrorScenario("/internal/raw/shardblock/by-nonce/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockNonce))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() -func TestGetRawMetaBlockByRound_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return nil, expectedErr - }, - } + testInternalGroup( + t, + facade, + "/internal/raw/shardblock/by-nonce/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + facade := mock.FacadeStub{ + GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - response := rawBlockResponse{} - loadResponse(resp.Body, &response) + req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-nonce/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) } -func TestGetRawMetaBlockByRound_ShouldWork(t *testing.T) { +func TestInternalBlockGroup_getRawShardBlockByRound(t *testing.T) { t.Parallel() - expectedOutput := bytes.Repeat([]byte("1"), 10) - - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + t.Run("empty round should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/shardblock/by-round", nil, http.StatusNotFound, "") + }) + t.Run("invalid round should error", + testInternalGroupErrorScenario("/internal/raw/shardblock/by-round/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockRound))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := &mock.FacadeStub{ + GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } - response := rawBlockResponse{} - loadResponse(resp.Body, &response) + testInternalGroup( + t, + facade, + "/internal/raw/shardblock/by-round/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedOutput, response.Data.Block) -} + facade := mock.FacadeStub{ + GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } -// ---- MetaBlock - by hash + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) -func TestGetRawMetaBlockByHash_NoHashUrlParameterShouldErr(t *testing.T) { - t.Parallel() + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - facade := mock.FacadeStub{ - GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return []byte{}, nil - }, - } + req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-round/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) +} - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) +func TestInternalBlockGroup_getRawShardBlockByHash(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/shardblock/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() -func TestGetRawMetaBlockByHash_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return nil, expectedErr + }, + } - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return nil, expectedErr - }, - } + testInternalGroup( + t, + facade, + "/internal/raw/shardblock/by-hash/dummyhash", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + facade := mock.FacadeStub{ + GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-hash/dummyhash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - response := rawBlockResponse{} - loadResponse(resp.Body, &response) + req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) } -func TestGetRawMetaBlockByHash_ShouldWork(t *testing.T) { +func TestInternalBlockGroup_getRawMiniBlockByHash(t *testing.T) { t.Parallel() - expectedOutput := bytes.Repeat([]byte("1"), 10) + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{ - GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return expectedOutput, nil - }, - } + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/miniblock/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("empty epoch should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/raw/miniblock/by-hash/aaa/epoch", nil, http.StatusNotFound, "") + }) + t.Run("invalid epoch should error", + testInternalGroupErrorScenario("/internal/raw/miniblock/by-hash/aaaa/epoch/not-uint", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidEpoch))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + facade := &mock.FacadeStub{ + GetInternalMiniBlockByHashCalled: func(format common.ApiOutputFormat, txHash string, epoch uint32) (interface{}, error) { + return nil, expectedErr + }, + } - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- StartOfEpoch MetaBlock - raw - -func TestGetRawStartOfEpochMetaBlock_NoEpochUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/startofepoch/metablock/by-epoch/a", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) -} - -func TestGetRawStartOfEpochMetaBlock_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/startofepoch/metablock/by-epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} - -func TestGetRawStartOfEpochMetaBlock_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := bytes.Repeat([]byte("1"), 10) - - facade := mock.FacadeStub{ - GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/startofepoch/metablock/by-epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ----------------- Shard Block --------------- - -func TestGetRawShardBlockByNonce_EmptyNonceUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-nonce", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetRawShardBlockByNonce_InvalidNonceShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-nonce/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) -} - -func TestGetRawShardBlockByNonce_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := bytes.Repeat([]byte("1"), 10) - - facade := mock.FacadeStub{ - GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- ShardBlock - by round - -func TestGetRawShardBlockByRound_EmptyRoundUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-round", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetRawShardBlockByRound_InvalidRoundShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-round/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockRound.Error())) -} - -func TestGetRawShardBlockByRound_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} - -func TestGetRawShardBlockByRound_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := bytes.Repeat([]byte("1"), 10) - - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- ShardBlock - by hash - -func TestGetRawShardBlockByHash_NoHashUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetRawShardBlockByHash_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-hash/dummyhash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} - -func TestGetRawShardBlockByHash_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := bytes.Repeat([]byte("1"), 10) - - facade := mock.FacadeStub{ - GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- MiniBlock - -func TestGetRawMiniBlockByHash_NoHashUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMiniBlockByHashCalled: func(_ common.ApiOutputFormat, _ string, epoch uint32) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/miniblock/by-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetRawMiniBlockByHash_NoEpochUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMiniBlockByHashCalled: func(_ common.ApiOutputFormat, _ string, epoch uint32) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/miniblock/by-hash/aaaa/epoch", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetRawMiniBlockByHash_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := bytes.Repeat([]byte("1"), 10) - - facade := mock.FacadeStub{ - GetInternalMiniBlockByHashCalled: func(format common.ApiOutputFormat, hash string, epoch uint32) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/miniblock/by-hash/aaaa/epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- JSON - -// ---- MetaBlock - by nonce - -func TestGetInternalMetaBlockByNonce_EmptyNonceUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-nonce", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetInternalMetaBlockByNonce_InvalidNonceShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-nonce/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockNonce.Error())) -} - -func TestGetInternalMetaBlockByNonce_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} - -func TestGetInternalMetaBlockByNonce_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := block.MetaBlock{ - Nonce: 15, - Epoch: 15, - } - - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- MetaBlock - by round - -func TestGetInternalMetaBlockByRound_EmptyRoundUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-round", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetInternalMetaBlockByRound_InvalidRoundShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-round/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockRound.Error())) -} - -func TestGetInternalMetaBlockByRound_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} - -func TestGetInternalMetaBlockByRound_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := block.MetaBlock{ - Nonce: 15, - Epoch: 15, - } - - facade := mock.FacadeStub{ - GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- MetaBlock - by hash - -func TestGetInternalMetaBlockByHash_NoHashUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetInternalMetaBlockByHash_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-hash/dummyhash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} - -func TestGetInternalMetaBlockByHash_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := block.MetaBlock{ - Nonce: 15, - Epoch: 15, - } - - facade := mock.FacadeStub{ - GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return expectedOutput, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedOutput, response.Data.Block) -} - -// ---- StartOfEpoch MetaBlock - json - -func TestGetInternalStartOfEpochMetaBlock_NoEpochUrlParameterShouldErr(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/startofepoch/metablock/by-epoch", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} - -func TestGetInternalStartOfEpochMetaBlock_FacadeErrorShouldErr(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/startofepoch/metablock/by-epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} - -func TestGetInternalStartOfEpochMetaBlock_ShouldWork(t *testing.T) { - t.Parallel() - - expectedOutput := bytes.Repeat([]byte("1"), 10) + testInternalGroup( + t, + facade, + "/internal/raw/miniblock/by-hash/aaaa/epoch/1", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{ - GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { - return expectedOutput, nil - }, - } + facade := mock.FacadeStub{ + GetInternalMiniBlockByHashCalled: func(format common.ApiOutputFormat, hash string, epoch uint32) (interface{}, error) { + return expectedRawBlockOutput, nil + }, + } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - req, _ := http.NewRequest("GET", "/internal/json/startofepoch/metablock/by-epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/internal/raw/miniblock/by-hash/aaaa/epoch/1", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := rawMiniBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedOutput, response.Data.Block) + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) } -// ----------------- Shard Block --------------- - -func TestGetInternalShardBlockByNonce_EmptyNonceUrlParameterShouldErr(t *testing.T) { - t.Parallel() +func testInternalGroupErrorScenario(url string, body io.Reader, expectedErr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{ - GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, + testInternalGroup( + t, + &mock.FacadeStub{}, + url, + body, + http.StatusBadRequest, + expectedErr, + ) } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-nonce", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) } -func TestGetInternalShardBlockByNonce_InvalidNonceShouldErr(t *testing.T) { +func TestInternalBlockGroup_getJSONMetaBlockByNonce(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-nonce/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) -} + t.Run("empty nonce should error", func(t *testing.T) { + t.Parallel() -func TestGetInternalShardBlockByNonce_ShouldWork(t *testing.T) { - t.Parallel() + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/metablock/by-nonce", nil, http.StatusNotFound, "") + }) + t.Run("invalid nonce should error", + testInternalGroupErrorScenario("/internal/json/metablock/by-nonce/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockNonce))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - expectedOutput := block.Header{ - Nonce: 15, - Round: 15, - } + facade := &mock.FacadeStub{ + GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } - facade := mock.FacadeStub{ - GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } + testInternalGroup( + t, + facade, + "/internal/json/metablock/by-nonce/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + facade := mock.FacadeStub{ + GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedMetaBlock, nil + }, + } - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + req, _ := http.NewRequest("GET", "/internal/json/metablock/by-nonce/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, expectedOutput, response.Data.Block) + response := internalMetaBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedMetaBlock, response.Data.Block) + }) } -// ---- ShardBlock - by round - -func TestGetInternalShardBlockByRound_EmptyRoundUrlParameterShouldErr(t *testing.T) { +func TestInternalBlockGroup_getJSONMetaBlockByRound(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-round", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + t.Run("empty round should error", func(t *testing.T) { + t.Parallel() - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/metablock/by-round", nil, http.StatusNotFound, "") + }) + t.Run("invalid round should error", + testInternalGroupErrorScenario("/internal/json/metablock/by-round/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockRound))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() -func TestGetInternalShardBlockByRound_InvalidRoundShouldErr(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return []byte{}, nil - }, - } + testInternalGroup( + t, + facade, + "/internal/json/metablock/by-round/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + facade := mock.FacadeStub{ + GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedMetaBlock, nil + }, + } - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-round/invalid", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) + req, _ := http.NewRequest("GET", "/internal/json/metablock/by-round/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrInvalidBlockRound.Error())) + response := internalMetaBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedMetaBlock, response.Data.Block) + }) } -func TestGetInternalShardBlockByRound_FacadeErrorShouldErr(t *testing.T) { +func TestInternalBlockGroup_getJSONMetaBlockByHash(t *testing.T) { t.Parallel() - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/metablock/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) + facade := &mock.FacadeStub{ + GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return nil, expectedErr + }, + } - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} + testInternalGroup( + t, + facade, + "/internal/json/metablock/by-hash/dummyhash", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() -func TestGetInternalShardBlockByRound_ShouldWork(t *testing.T) { - t.Parallel() + facade := mock.FacadeStub{ + GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return expectedMetaBlock, nil + }, + } - expectedOutput := block.Header{ - Nonce: 15, - Round: 15, - } + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - facade := mock.FacadeStub{ - GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { - return expectedOutput, nil - }, - } + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", "/internal/json/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + response := internalMetaBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedMetaBlock, response.Data.Block) + }) +} - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) +func TestInternalBlockGroup_getJSONStartOfEpochMetaBlock(t *testing.T) { + t.Parallel() - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) + t.Run("empty epoch should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedOutput, response.Data.Block) -} + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/startofepoch/metablock/by-epoch/", nil, http.StatusNotFound, "") + }) + t.Run("invalid epoch should error", + testInternalGroupErrorScenario("/internal/json/startofepoch/metablock/by-epoch/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidEpoch))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() -// ---- ShardBlock - by hash + facade := &mock.FacadeStub{ + GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { + return nil, expectedErr + }, + } -func TestGetInternalShardBlockByHash_NoHashUrlParameterShouldErr(t *testing.T) { - t.Parallel() + testInternalGroup( + t, + facade, + "/internal/json/startofepoch/metablock/by-epoch/1", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{ - GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return []byte{}, nil - }, - } + facade := mock.FacadeStub{ + GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { + return expectedMetaBlock, nil + }, + } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/internal/json/startofepoch/metablock/by-epoch/1", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) + response := internalMetaBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedMetaBlock, response.Data.Block) + }) } -func TestGetInternalShardBlockByHash_FacadeErrorShouldErr(t *testing.T) { +func TestInternalBlockGroup_getJSONShardBlockByNonce(t *testing.T) { t.Parallel() - expectedErr := errors.New("local err") - facade := mock.FacadeStub{ - GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return nil, expectedErr - }, - } - - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + t.Run("empty nonce should error", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-hash/dummyhash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/shardblock/by-nonce", nil, http.StatusNotFound, "") + }) + t.Run("invalid nonce should error", + testInternalGroupErrorScenario("/internal/json/shardblock/by-nonce/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockNonce))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) + facade := &mock.FacadeStub{ + GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) -} + testInternalGroup( + t, + facade, + "/internal/json/shardblock/by-nonce/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() -func TestGetInternalShardBlockByHash_ShouldWork(t *testing.T) { - t.Parallel() + facade := mock.FacadeStub{ + GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedShardBlock, nil + }, + } - expectedOutput := block.Header{ - Nonce: 15, - Round: 15, - } + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - facade := mock.FacadeStub{ - GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { - return expectedOutput, nil - }, - } + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-nonce/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + response := internalShardBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedShardBlock, response.Data.Block) + }) +} - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) +func TestInternalBlockGroup_getJSONShardBlockByRound(t *testing.T) { + t.Parallel() - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + t.Run("empty round should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, expectedOutput, response.Data.Block) -} + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/shardblock/by-round", nil, http.StatusNotFound, "") + }) + t.Run("invalid round should error", + testInternalGroupErrorScenario("/internal/json/shardblock/by-round/invalid", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidBlockRound))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() -// ---- MiniBlock + facade := &mock.FacadeStub{ + GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return nil, expectedErr + }, + } -func TestGetInternalMiniBlockByHash_EmptyHashUrlParameterShouldErr(t *testing.T) { - t.Parallel() + testInternalGroup( + t, + facade, + "/internal/json/shardblock/by-round/15", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{ - GetInternalMiniBlockByHashCalled: func(_ common.ApiOutputFormat, _ string, epoch uint32) (interface{}, error) { - return []byte{}, nil - }, - } + facade := mock.FacadeStub{ + GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { + return expectedShardBlock, nil + }, + } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - req, _ := http.NewRequest("GET", "/internal/json/miniblock/by-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-round/15", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - response := internalMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) + response := internalShardBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedShardBlock, response.Data.Block) + }) } -func TestGetInternalMiniBlockByHash_NoEpochUrlParameterShouldErr(t *testing.T) { +func TestInternalBlockGroup_getJSONShardBlockByHash(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - GetInternalMiniBlockByHashCalled: func(_ common.ApiOutputFormat, _ string, epoch uint32) (interface{}, error) { - return []byte{}, nil - }, - } + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/shardblock/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + facade := &mock.FacadeStub{ + GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return nil, expectedErr + }, + } - req, _ := http.NewRequest("GET", "/internal/json/miniblock/by-hash/aaaa/epoch", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + testInternalGroup( + t, + facade, + "/internal/json/shardblock/by-hash/dummyhash", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - response := rawMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusNotFound, resp.Code) -} + facade := mock.FacadeStub{ + GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { + return expectedShardBlock, nil + }, + } -func TestGetInternalMiniBlockByHash_ShouldWork(t *testing.T) { - t.Parallel() + blockGroup, err := groups.NewInternalBlockGroup(&facade) + require.NoError(t, err) - expectedOutput := block.MiniBlock{} + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - facade := mock.FacadeStub{ - GetInternalMiniBlockByHashCalled: func(_ common.ApiOutputFormat, _ string, epoch uint32) (interface{}, error) { - return expectedOutput, nil - }, - } + req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) + response := internalShardBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedShardBlock, response.Data.Block) + }) +} - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) +func TestInternalBlockGroup_getJSONMiniBlockByHash(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/internal/json/miniblock/by-hash/dummyhash/epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + t.Run("empty hash should error", func(t *testing.T) { + t.Parallel() - response := internalMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/miniblock/by-hash", nil, http.StatusNotFound, "") + }) + t.Run("empty epoch should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, expectedOutput, response.Data.Block) -} + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/miniblock/by-hash/aaa/epoch", nil, http.StatusNotFound, "") + }) + t.Run("invalid epoch should error", + testInternalGroupErrorScenario("/internal/json/miniblock/by-hash/aaaa/epoch/not-uint", nil, + formatExpectedErr(apiErrors.ErrGetBlock, apiErrors.ErrInvalidEpoch))) + t.Run("facade error should error", func(t *testing.T) { + t.Parallel() -func TestGetInternalStartOfEpochValidatorsInfo(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + GetInternalMiniBlockByHashCalled: func(format common.ApiOutputFormat, txHash string, epoch uint32) (interface{}, error) { + return nil, expectedErr + }, + } - t.Run("no epoch param should fail", func(t *testing.T) { + testInternalGroup( + t, + facade, + "/internal/json/miniblock/by-hash/aaaa/epoch/1", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetBlock, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { t.Parallel() facade := mock.FacadeStub{ - GetInternalStartOfEpochValidatorsInfoCalled: func(epoch uint32) ([]*state.ShardValidatorInfo, error) { - return make([]*state.ShardValidatorInfo, 0), nil + GetInternalMiniBlockByHashCalled: func(format common.ApiOutputFormat, hash string, epoch uint32) (interface{}, error) { + return block.MiniBlock{}, nil }, } @@ -1518,26 +974,65 @@ func TestGetInternalStartOfEpochValidatorsInfo(t *testing.T) { ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - req, _ := http.NewRequest("GET", "/internal/json/startofepoch/validators/by-epoch/aaa", nil) + req, _ := http.NewRequest("GET", "/internal/json/miniblock/by-hash/aaaa/epoch/1", nil) resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) - response := internalValidatorsInfoResponse{} + response := internalMiniBlockResponse{} loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(response.Error, apiErrors.ErrGetValidatorsInfo.Error())) + assert.Equal(t, http.StatusOK, resp.Code) + + assert.Equal(t, block.MiniBlock{}, response.Data.Block) }) +} + +func TestInternalBlockGroup_getJSONStartOfEpochValidatorsInfo(t *testing.T) { + t.Parallel() + t.Run("empty epoch should error", func(t *testing.T) { + t.Parallel() + + testInternalGroup(t, &mock.FacadeStub{}, "/internal/json/startofepoch/validators/by-epoch", nil, http.StatusNotFound, "") + }) + t.Run("invalid epoch should error", + testInternalGroupErrorScenario("/internal/json/startofepoch/validators/by-epoch/not-uint", nil, + formatExpectedErr(apiErrors.ErrGetValidatorsInfo, apiErrors.ErrInvalidEpoch))) t.Run("facade error should fail", func(t *testing.T) { t.Parallel() - expectedErr := errors.New("facade error") - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalStartOfEpochValidatorsInfoCalled: func(epoch uint32) ([]*state.ShardValidatorInfo, error) { return nil, expectedErr }, } + testInternalGroup( + t, + facade, + "/internal/json/startofepoch/validators/by-epoch/1", + nil, + http.StatusInternalServerError, + formatExpectedErr(apiErrors.ErrGetValidatorsInfo, expectedErr), + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + expectedOutput := []*state.ShardValidatorInfo{ + { + PublicKey: []byte("pubkey1"), + ShardId: 0, + Index: 1, + TempRating: 500, + }, + } + + facade := mock.FacadeStub{ + GetInternalStartOfEpochValidatorsInfoCalled: func(epoch uint32) ([]*state.ShardValidatorInfo, error) { + return expectedOutput, nil + }, + } + blockGroup, err := groups.NewInternalBlockGroup(&facade) require.NoError(t, err) @@ -1549,11 +1044,43 @@ func TestGetInternalStartOfEpochValidatorsInfo(t *testing.T) { response := internalValidatorsInfoResponse{} loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + assert.Equal(t, expectedOutput, response.Data.ValidatorsInfo) + }) +} + +func TestInternalBlockGroup_IsInterfaceNil(t *testing.T) { + t.Parallel() + + blockGroup, _ := groups.NewInternalBlockGroup(nil) + require.True(t, blockGroup.IsInterfaceNil()) + + blockGroup, _ = groups.NewInternalBlockGroup(&mock.FacadeStub{}) + require.False(t, blockGroup.IsInterfaceNil()) +} + +func TestInternalBlockGroup_UpdateFacadeStub(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + blockGroup, err := groups.NewInternalBlockGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = blockGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() + + blockGroup, err := groups.NewInternalBlockGroup(&mock.FacadeStub{}) + require.NoError(t, err) + err = blockGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) t.Run("should work", func(t *testing.T) { t.Parallel() @@ -1566,13 +1093,13 @@ func TestGetInternalStartOfEpochValidatorsInfo(t *testing.T) { }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalStartOfEpochValidatorsInfoCalled: func(epoch uint32) ([]*state.ShardValidatorInfo, error) { return expectedOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) + blockGroup, err := groups.NewInternalBlockGroup(facade) require.NoError(t, err) ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) @@ -1586,8 +1113,47 @@ func TestGetInternalStartOfEpochValidatorsInfo(t *testing.T) { assert.Equal(t, http.StatusOK, resp.Code) assert.Equal(t, expectedOutput, response.Data.ValidatorsInfo) + + newFacade := &mock.FacadeStub{ + GetInternalStartOfEpochValidatorsInfoCalled: func(epoch uint32) ([]*state.ShardValidatorInfo, error) { + return nil, expectedErr + }, + } + err = blockGroup.UpdateFacade(newFacade) + require.NoError(t, err) + + req, _ = http.NewRequest("GET", "/internal/json/startofepoch/validators/by-epoch/1", nil) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response = internalValidatorsInfoResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedErr.Error())) }) +} +func testInternalGroup( + t *testing.T, + facade shared.FacadeHandler, + url string, + body io.Reader, + expectedRespCode int, + expectedRespError string, +) { + internalGroup, err := groups.NewInternalBlockGroup(facade) + require.NoError(t, err) + + ws := startWebServer(internalGroup, "internal", getInternalBlockRoutesConfig()) + + req, _ := http.NewRequest("GET", url, body) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := rawBlockResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, expectedRespCode, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedRespError)) } func getInternalBlockRoutesConfig() config.ApiRoutesConfig { From e7e7433b9d750366d53cfb5d10400595fb3ba80d Mon Sep 17 00:00:00 2001 From: robertsasu Date: Thu, 20 Apr 2023 18:04:58 +0300 Subject: [PATCH 302/335] keeping order of scheduled txs when bootstrapping --- epochStart/bootstrap/startInEpochScheduled.go | 16 +++++++++++----- .../bootstrap/startInEpochScheduled_test.go | 6 +++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/epochStart/bootstrap/startInEpochScheduled.go b/epochStart/bootstrap/startInEpochScheduled.go index 807d81729f5..3381a723863 100644 --- a/epochStart/bootstrap/startInEpochScheduled.go +++ b/epochStart/bootstrap/startInEpochScheduled.go @@ -254,7 +254,7 @@ func (ses *startInEpochWithScheduledDataSyncer) prepareScheduledIntermediateTxs( additionalData := header.GetAdditionalData() if additionalData != nil { - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMap(miniBlocks, scheduledIntermediateTxs) + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(miniBlocks, scheduledIntermediateTxs) gasAndFees := scheduled.GasAndFees{ AccumulatedFees: additionalData.GetScheduledAccumulatedFees(), DeveloperFees: additionalData.GetScheduledDeveloperFees(), @@ -343,16 +343,22 @@ func isScheduledIntermediateTx( return isScheduledIntermediateTransaction && isTxExecutedInSelfShard } -func getScheduledIntermediateTxsMap( +func getScheduledIntermediateTxsMapInOrder( miniBlocks map[string]*block.MiniBlock, intermediateTxs map[string]data.TransactionHandler, ) map[block.Type][]data.TransactionHandler { intermediateTxsMap := make(map[block.Type][]data.TransactionHandler) - for txHash, tx := range intermediateTxs { - blockType := getBlockTypeOfTx([]byte(txHash), miniBlocks) - intermediateTxsMap[blockType] = append(intermediateTxsMap[blockType], tx) + for _, miniBlock := range miniBlocks { + for _, hash := range miniBlock.TxHashes { + txHandler, ok := intermediateTxs[string(hash)] + if !ok { + continue + } + + intermediateTxsMap[miniBlock.Type] = append(intermediateTxsMap[miniBlock.Type], txHandler) + } } return intermediateTxsMap diff --git a/epochStart/bootstrap/startInEpochScheduled_test.go b/epochStart/bootstrap/startInEpochScheduled_test.go index fe1e23afcae..6f83be7828c 100644 --- a/epochStart/bootstrap/startInEpochScheduled_test.go +++ b/epochStart/bootstrap/startInEpochScheduled_test.go @@ -418,7 +418,7 @@ func TestStartInEpochWithScheduledDataSyncer_getScheduledIntermediateTxsMap(t *t TxHashes: [][]byte{[]byte("hash4")}, } - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMap(miniBlocks, intermediateTxs) + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(miniBlocks, intermediateTxs) require.Equal(t, 2, len(scheduledIntermediateTxsMap)) require.Equal(t, 3, len(scheduledIntermediateTxsMap[block.SmartContractResultBlock])) require.Equal(t, 1, len(scheduledIntermediateTxsMap[block.InvalidBlock])) @@ -443,7 +443,7 @@ func TestStartInEpochWithScheduledDataSyncer_saveScheduledInfoNoScheduledRootHas }, } - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMap(make(map[string]*block.MiniBlock), scheduledIntermediateTxs) + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(make(map[string]*block.MiniBlock), scheduledIntermediateTxs) scheduledInfo := &process.ScheduledInfo{ RootHash: nil, IntermediateTxs: scheduledIntermediateTxsMap, @@ -501,7 +501,7 @@ func TestStartInEpochWithScheduledDataSyncer_saveScheduledInfo(t *testing.T) { }, } - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMap(make(map[string]*block.MiniBlock), scheduledIntermediateTxs) + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(make(map[string]*block.MiniBlock), scheduledIntermediateTxs) scheduledInfo := &process.ScheduledInfo{ RootHash: scheduledRootHash, IntermediateTxs: scheduledIntermediateTxsMap, From 151a53958f9a4d2a54f81f22ae25425cd25284fd Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Thu, 20 Apr 2023 18:11:50 +0300 Subject: [PATCH 303/335] extra tests for networkGroup, nodeGroup, proofGroup, validatorGroup, vmValuesGroup --- api/groups/networkGroup_test.go | 78 +++++++++++++++++ api/groups/nodeGroup_test.go | 135 ++++++++++++++++++++++++++++ api/groups/proofGroup_test.go | 88 +++++++++++++++++++ api/groups/validatorGroup_test.go | 84 ++++++++++++++++++ api/groups/vmValuesGroup_test.go | 140 ++++++++++++++++++++++++++++++ api/mock/facadeStub.go | 6 +- 6 files changed, 530 insertions(+), 1 deletion(-) diff --git a/api/groups/networkGroup_test.go b/api/groups/networkGroup_test.go index e8602254f0b..d8b8d2a9d7c 100644 --- a/api/groups/networkGroup_test.go +++ b/api/groups/networkGroup_test.go @@ -932,6 +932,84 @@ func TestGetGasConfigs(t *testing.T) { }) } +func TestNetworkGroup_UpdateFacade(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + networkGroup, err := groups.NewNetworkGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = networkGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() + + networkGroup, err := groups.NewNetworkGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = networkGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + builtInCost := map[string]uint64{ + "val1": 1, + } + expectedMap := map[string]map[string]uint64{ + common.BuiltInCost: builtInCost, + } + facade := mock.FacadeStub{ + GetGasConfigsCalled: func() (map[string]map[string]uint64, error) { + return expectedMap, nil + }, + } + networkGroup, err := groups.NewNetworkGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(networkGroup, "network", getNetworkRoutesConfig()) + + req, _ := http.NewRequest("GET", "/network/gas-configs", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, resp.Code, http.StatusOK) + response := gasConfigsResponse{} + 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 + }, + } + err = networkGroup.UpdateFacade(&newFacade) + require.NoError(t, err) + + req, _ = http.NewRequest("GET", "/network/gas-configs", nil) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.True(t, strings.Contains(response.Error, expectedErr.Error())) + }) +} + +func TestNetworkGroup_IsInterfaceNil(t *testing.T) { + t.Parallel() + + networkGroup, _ := groups.NewNetworkGroup(nil) + require.True(t, networkGroup.IsInterfaceNil()) + + networkGroup, _ = groups.NewNetworkGroup(&mock.FacadeStub{}) + require.False(t, networkGroup.IsInterfaceNil()) +} + func getNetworkRoutesConfig() config.ApiRoutesConfig { return config.ApiRoutesConfig{ APIPackages: map[string]config.APIPackageConfig{ diff --git a/api/groups/nodeGroup_test.go b/api/groups/nodeGroup_test.go index 03195eb875b..3331c8d3ccc 100644 --- a/api/groups/nodeGroup_test.go +++ b/api/groups/nodeGroup_test.go @@ -318,6 +318,31 @@ func TestP2PStatusMetrics_ShouldDisplayNonP2pMetrics(t *testing.T) { assert.False(t, strings.Contains(respStr, key)) } +func TestQueryDebug_ShouldBindJSONErrorsShouldErr(t *testing.T) { + t.Parallel() + + facade := mock.FacadeStub{ + GetQueryHandlerCalled: func(name string) (handler debug.QueryHandler, err error) { + return nil, nil + }, + } + + nodeGroup, err := groups.NewNodeGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(nodeGroup, "node", getNodeRoutesConfig()) + + req, _ := http.NewRequest("POST", "/node/debug", bytes.NewBuffer([]byte("invalid data"))) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + queryResponse := &generalResponse{} + loadResponse(resp.Body, queryResponse) + + assert.Equal(t, http.StatusBadRequest, resp.Code) + assert.Contains(t, queryResponse.Error, apiErrors.ErrValidation.Error()) +} + func TestQueryDebug_GetQueryErrorsShouldErr(t *testing.T) { t.Parallel() @@ -454,6 +479,32 @@ func TestPeerInfo_PeerInfoShouldWork(t *testing.T) { assert.NotNil(t, responseInfo["info"]) } +func TestEpochStartData_InvalidEpochShouldErr(t *testing.T) { + t.Parallel() + + facade := mock.FacadeStub{ + GetEpochStartDataAPICalled: func(epoch uint32) (*common.EpochStartDataAPI, error) { + return nil, nil + }, + } + + nodeGroup, err := groups.NewNodeGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(nodeGroup, "node", getNodeRoutesConfig()) + + req, _ := http.NewRequest("GET", "/node/epoch-start/invalid", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := &shared.GenericAPIResponse{} + loadResponse(resp.Body, response) + + assert.Equal(t, http.StatusBadRequest, resp.Code) + assert.True(t, strings.Contains(response.Error, apiErrors.ErrValidation.Error())) + assert.True(t, strings.Contains(response.Error, apiErrors.ErrBadUrlParams.Error())) +} + func TestEpochStartData_FacadeErrorsShouldErr(t *testing.T) { t.Parallel() @@ -572,6 +623,90 @@ func TestPrometheusMetrics_ShouldWork(t *testing.T) { assert.True(t, keyAndValueFoundInResponse) } +func TestNodeGroup_UpdateFacade(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + nodeGroup, err := groups.NewNodeGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = nodeGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() + + nodeGroup, err := groups.NewNodeGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = nodeGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + statusMetricsProvider := statusHandler.NewStatusMetrics() + key := "test-key" + value := uint64(37) + statusMetricsProvider.SetUInt64Value(key, value) + + facade := mock.FacadeStub{} + facade.StatusMetricsHandler = func() external.StatusMetricsHandler { + return statusMetricsProvider + } + + nodeGroup, err := groups.NewNodeGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(nodeGroup, "node", getNodeRoutesConfig()) + + req, _ := http.NewRequest("GET", "/node/metrics", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + respBytes, _ := ioutil.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)) + assert.True(t, keyAndValueFoundInResponse) + + expectedErr := errors.New("expected error") + newFacade := mock.FacadeStub{ + StatusMetricsHandler: func() external.StatusMetricsHandler { + return &testscommon.StatusMetricsStub{ + StatusMetricsWithoutP2PPrometheusStringCalled: func() (string, error) { + return "", expectedErr + }, + } + }, + } + + err = nodeGroup.UpdateFacade(&newFacade) + require.NoError(t, err) + + req, _ = http.NewRequest("GET", "/node/metrics", nil) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, http.StatusInternalServerError, resp.Code) + response := &shared.GenericAPIResponse{} + loadResponse(resp.Body, response) + assert.Equal(t, expectedErr.Error(), response.Error) + }) +} + +func TestNodeGroup_IsInterfaceNil(t *testing.T) { + t.Parallel() + + nodeGroup, _ := groups.NewNodeGroup(nil) + require.True(t, nodeGroup.IsInterfaceNil()) + + nodeGroup, _ = groups.NewNodeGroup(&mock.FacadeStub{}) + require.False(t, nodeGroup.IsInterfaceNil()) +} + func loadResponseAsString(rsp io.Reader, response *statusResponse) { buff, err := ioutil.ReadAll(rsp) if err != nil { diff --git a/api/groups/proofGroup_test.go b/api/groups/proofGroup_test.go index 481070d60ab..4c1ab926c57 100644 --- a/api/groups/proofGroup_test.go +++ b/api/groups/proofGroup_test.go @@ -379,6 +379,94 @@ func TestVerifyProof(t *testing.T) { assert.True(t, isValid) } +func TestProofGroup_UpdateFacade(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + proofGroup, err := groups.NewProofGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = proofGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() + + proofGroup, err := groups.NewProofGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = proofGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + rootHash := "rootHash" + address := "address" + validProof := []string{hex.EncodeToString([]byte("valid")), hex.EncodeToString([]byte("proof"))} + verifyProofParams := groups.VerifyProofRequest{ + RootHash: rootHash, + Address: address, + Proof: validProof, + } + verifyProofBytes, _ := json.Marshal(verifyProofParams) + + facade := &mock.FacadeStub{ + VerifyProofCalled: func(rH string, addr string, proof [][]byte) (bool, error) { + return true, nil + }, + } + + proofGroup, err := groups.NewProofGroup(facade) + require.NoError(t, err) + + ws := startWebServer(proofGroup, "proof", getProofRoutesConfig()) + + req, _ := http.NewRequest("POST", "/proof/verify", bytes.NewBuffer(verifyProofBytes)) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + assert.Equal(t, shared.ReturnCodeSuccess, response.Code) + responseMap, ok := response.Data.(map[string]interface{}) + assert.True(t, ok) + isValid, ok := responseMap["ok"].(bool) + assert.True(t, ok) + assert.True(t, isValid) + + verifyProfErr := fmt.Errorf("VerifyProof err") + newFacade := &mock.FacadeStub{ + VerifyProofCalled: func(rootHash string, address string, proof [][]byte) (bool, error) { + return false, verifyProfErr + }, + } + + err = proofGroup.UpdateFacade(newFacade) + require.NoError(t, err) + + req, _ = http.NewRequest("POST", "/proof/verify", bytes.NewBuffer(verifyProofBytes)) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + loadResponse(resp.Body, &response) + assert.Equal(t, shared.ReturnCodeInternalError, response.Code) + assert.True(t, strings.Contains(response.Error, apiErrors.ErrVerifyProof.Error())) + }) +} + +func TestProofGroup_IsInterfaceNil(t *testing.T) { + t.Parallel() + + proofGroup, _ := groups.NewProofGroup(nil) + require.True(t, proofGroup.IsInterfaceNil()) + + proofGroup, _ = groups.NewProofGroup(&mock.FacadeStub{}) + require.False(t, proofGroup.IsInterfaceNil()) +} + func getProofRoutesConfig() config.ApiRoutesConfig { return config.ApiRoutesConfig{ APIPackages: map[string]config.APIPackageConfig{ diff --git a/api/groups/validatorGroup_test.go b/api/groups/validatorGroup_test.go index c82a61d2efb..6d64e84c247 100644 --- a/api/groups/validatorGroup_test.go +++ b/api/groups/validatorGroup_test.go @@ -106,6 +106,90 @@ func TestValidatorStatistics_ReturnsSuccessfully(t *testing.T) { assert.Equal(t, validatorStatistics.Result, mapToReturn) } +func TestValidatorGroup_UpdateFacade(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + validatorGroup, err := groups.NewValidatorGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = validatorGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() + + validatorGroup, err := groups.NewValidatorGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = validatorGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + mapToReturn := make(map[string]*state.ValidatorApiResponse) + mapToReturn["test"] = &state.ValidatorApiResponse{ + NumLeaderSuccess: 5, + NumLeaderFailure: 2, + NumValidatorSuccess: 7, + NumValidatorFailure: 3, + } + facade := mock.FacadeStub{ + ValidatorStatisticsHandler: func() (map[string]*state.ValidatorApiResponse, error) { + return mapToReturn, nil + }, + } + validatorGroup, err := groups.NewValidatorGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(validatorGroup, "validator", getValidatorRoutesConfig()) + + req, _ := http.NewRequest("GET", "/validator/statistics", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + response := shared.GenericAPIResponse{} + loadResponse(resp.Body, &response) + validatorStatistics := ValidatorStatisticsResponse{} + mapResponseData := response.Data.(map[string]interface{}) + mapResponseDataBytes, _ := json.Marshal(mapResponseData) + _ = json.Unmarshal(mapResponseDataBytes, &validatorStatistics) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, validatorStatistics.Result, mapToReturn) + + expectedErr := errors.New("expected error") + newFacade := mock.FacadeStub{ + ValidatorStatisticsHandler: func() (map[string]*state.ValidatorApiResponse, error) { + return nil, expectedErr + }, + } + + err = validatorGroup.UpdateFacade(&newFacade) + require.NoError(t, err) + + req, _ = http.NewRequest("GET", "/validator/statistics", nil) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + loadResponse(resp.Body, &response) + assert.Equal(t, http.StatusBadRequest, resp.Code) + assert.Contains(t, response.Error, expectedErr.Error()) + }) +} + +func TestValidatorGroup_IsInterfaceNil(t *testing.T) { + t.Parallel() + + validatorGroup, _ := groups.NewValidatorGroup(nil) + require.True(t, validatorGroup.IsInterfaceNil()) + + validatorGroup, _ = groups.NewValidatorGroup(&mock.FacadeStub{}) + require.False(t, validatorGroup.IsInterfaceNil()) +} + func getValidatorRoutesConfig() config.ApiRoutesConfig { return config.ApiRoutesConfig{ APIPackages: map[string]config.APIPackageConfig{ diff --git a/api/groups/vmValuesGroup_test.go b/api/groups/vmValuesGroup_test.go index a3b06e1c46e..bd140d07b6f 100644 --- a/api/groups/vmValuesGroup_test.go +++ b/api/groups/vmValuesGroup_test.go @@ -247,6 +247,7 @@ func TestAllRoutes_WhenNoVMReturnDataShouldErr(t *testing.T) { ScAddress: dummyScAddress, FuncName: "function", Args: []string{}, + CallValue: "1", } response := simpleResponse{} @@ -276,6 +277,145 @@ func TestAllRoutes_WhenBadJsonShouldErr(t *testing.T) { requireErrorOnGetSingleValueRoutes(t, &facade, []byte("dummy"), apiErrors.ErrInvalidJSONRequest) } +func TestAllRoutes_DecodeAddressPubkeyFailsShouldErr(t *testing.T) { + t.Parallel() + + expectedErr := errors.New("expected error") + cnt := 0 + facade := mock.FacadeStub{ + DecodeAddressPubkeyCalled: func(pk string) ([]byte, error) { + cnt++ + if cnt > 1 { + return nil, expectedErr + } + return hex.DecodeString(pk) + }, + ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + return &vm.VMOutputApi{}, nil + }, + } + + request := groups.VMValueRequest{ + ScAddress: dummyScAddress, + FuncName: "function", + Args: []string{}, + CallerAddr: dummyScAddress, + } + requireErrorOnGetSingleValueRoutes(t, &facade, request, expectedErr) +} + +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 + }, + } + + request := groups.VMValueRequest{ + ScAddress: dummyScAddress, + FuncName: "function", + Args: []string{}, + CallerAddr: dummyScAddress, // coverage + CallValue: "not an int", + } + requireErrorOnGetSingleValueRoutes(t, &facade, request, errors.New("non numeric call value")) +} + +func TestVMValuesGroup_UpdateFacade(t *testing.T) { + t.Parallel() + + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() + + group, err := groups.NewVmValuesGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = group.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() + + group, err := groups.NewVmValuesGroup(&mock.FacadeStub{}) + require.NoError(t, err) + + err = group.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() + + valueBuff, _ := hex.DecodeString("DEADBEEF") + facade := &mock.FacadeStub{ + ExecuteSCQueryHandler: func(query *process.SCQuery) (vmOutput *vm.VMOutputApi, e error) { + + return &vm.VMOutputApi{ + ReturnData: [][]byte{valueBuff}, + ReturnCode: "NOK", // coverage + }, nil + }, + } + + request := groups.VMValueRequest{ + ScAddress: dummyScAddress, + FuncName: "function", + Args: []string{}, + } + requestAsBytes, _ := json.Marshal(request) + group, err := groups.NewVmValuesGroup(facade) + require.NoError(t, err) + + server := startWebServer(group, "vm-values", getVmValuesRoutesConfig()) + + httpRequest, _ := http.NewRequest("POST", "/vm-values/hex", bytes.NewBuffer(requestAsBytes)) + responseRecorder := httptest.NewRecorder() + server.ServeHTTP(responseRecorder, httpRequest) + + responseI := shared.GenericAPIResponse{} + loadResponse(responseRecorder.Body, &responseI) + responseDataMap := responseI.Data.(map[string]interface{}) + responseDataMapBytes, _ := json.Marshal(responseDataMap) + response := &simpleResponse{} + _ = json.Unmarshal(responseDataMapBytes, response) + require.Equal(t, http.StatusOK, responseRecorder.Code) + require.Contains(t, responseI.Error, "NOK") + 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) { + + return &vm.VMOutputApi{ + ReturnData: nil, + }, expectedErr + }, + } + + err = group.UpdateFacade(newFacade) + require.NoError(t, err) + + httpRequest, _ = http.NewRequest("POST", "/vm-values/hex", bytes.NewBuffer(requestAsBytes)) + responseRecorder = httptest.NewRecorder() + server.ServeHTTP(responseRecorder, httpRequest) + loadResponse(responseRecorder.Body, &responseI) + require.Equal(t, http.StatusBadRequest, responseRecorder.Code) + require.Contains(t, responseI.Error, expectedErr.Error()) + }) +} + +func TestVMValuesGroup_IsInterfaceNil(t *testing.T) { + t.Parallel() + + group, _ := groups.NewVmValuesGroup(nil) + require.True(t, group.IsInterfaceNil()) + + group, _ = groups.NewVmValuesGroup(&mock.FacadeStub{}) + require.False(t, group.IsInterfaceNil()) +} + func doPost(t *testing.T, facade interface{}, url string, request interface{}, response interface{}) int { // Serialize if not already requestAsBytes, ok := request.([]byte) diff --git a/api/mock/facadeStub.go b/api/mock/facadeStub.go index 224a780637f..bad25d4a0aa 100644 --- a/api/mock/facadeStub.go +++ b/api/mock/facadeStub.go @@ -26,7 +26,7 @@ type FacadeStub struct { GetHeartbeatsHandler func() ([]data.PubKeyHeartbeat, error) GetBalanceCalled func(address string, options api.AccountQueryOptions) (*big.Int, api.BlockInfo, error) GetAccountCalled func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) - GetAccountsCalled func(addresses []string, options api.AccountQueryOptions) (map[string]*api.AccountResponse, api.BlockInfo, error) + GetAccountsCalled func(addresses []string, options api.AccountQueryOptions) (map[string]*api.AccountResponse, api.BlockInfo, error) GenerateTransactionHandler func(sender string, receiver string, value *big.Int, code string) (*transaction.Transaction, error) GetTransactionHandler func(hash string, withResults bool) (*transaction.ApiTransactionResult, error) CreateTransactionHandler func(txArgs *external.ArgsCreateTransaction) (*transaction.Transaction, []byte, error) @@ -82,6 +82,7 @@ type FacadeStub struct { GetLastPoolNonceForSenderCalled func(sender string) (uint64, error) GetTransactionsPoolNonceGapsForSenderCalled func(sender string) (*common.TransactionsPoolNonceGapsForSenderApiResponse, error) GetGasConfigsCalled func() (map[string]map[string]uint64, error) + DecodeAddressPubkeyCalled func(pk string) ([]byte, error) } // GetTokenSupply - @@ -352,6 +353,9 @@ func (f *FacadeStub) EncodeAddressPubkey(pk []byte) (string, error) { // DecodeAddressPubkey - func (f *FacadeStub) DecodeAddressPubkey(pk string) ([]byte, error) { + if f.DecodeAddressPubkeyCalled != nil { + return f.DecodeAddressPubkeyCalled(pk) + } return hex.DecodeString(pk) } From 247dcdcf1f72d9d5939523109486e25d0e12677f Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 21 Apr 2023 09:24:36 +0300 Subject: [PATCH 304/335] added unit test --- .../bootstrap/startInEpochScheduled_test.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/epochStart/bootstrap/startInEpochScheduled_test.go b/epochStart/bootstrap/startInEpochScheduled_test.go index 6f83be7828c..48edaaaab6b 100644 --- a/epochStart/bootstrap/startInEpochScheduled_test.go +++ b/epochStart/bootstrap/startInEpochScheduled_test.go @@ -392,12 +392,18 @@ func TestStartInEpochWithScheduledDataSyncer_getScheduledIntermediateTxsMap(t *t tx2 := &smartContractResult.SmartContractResult{Nonce: 1} tx3 := &transaction.Transaction{Nonce: 2} tx4 := &smartContractResult.SmartContractResult{Nonce: 3} + tx5 := &smartContractResult.SmartContractResult{Nonce: 5} + tx6 := &smartContractResult.SmartContractResult{Nonce: 6} + tx7 := &smartContractResult.SmartContractResult{Nonce: 7} intermediateTxs := map[string]data.TransactionHandler{ "hash1": tx1, "hash2": tx2, "hash3": tx3, "hash4": tx4, + "5hash": tx5, + "3hash": tx6, + "hash6": tx7, } miniBlocks := make(map[string]*block.MiniBlock) @@ -415,14 +421,20 @@ func TestStartInEpochWithScheduledDataSyncer_getScheduledIntermediateTxsMap(t *t } miniBlocks["4"] = &block.MiniBlock{ Type: block.SmartContractResultBlock, - TxHashes: [][]byte{[]byte("hash4")}, + TxHashes: [][]byte{[]byte("hash4"), []byte("5hash"), []byte("3hash"), []byte("hash6")}, } scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(miniBlocks, intermediateTxs) require.Equal(t, 2, len(scheduledIntermediateTxsMap)) - require.Equal(t, 3, len(scheduledIntermediateTxsMap[block.SmartContractResultBlock])) + require.Equal(t, 6, len(scheduledIntermediateTxsMap[block.SmartContractResultBlock])) require.Equal(t, 1, len(scheduledIntermediateTxsMap[block.InvalidBlock])) assert.Equal(t, tx3, scheduledIntermediateTxsMap[block.InvalidBlock][0]) + assert.Equal(t, tx1, scheduledIntermediateTxsMap[block.SmartContractResultBlock][0]) + assert.Equal(t, tx2, scheduledIntermediateTxsMap[block.SmartContractResultBlock][1]) + assert.Equal(t, tx4, scheduledIntermediateTxsMap[block.SmartContractResultBlock][2]) + assert.Equal(t, tx5, scheduledIntermediateTxsMap[block.SmartContractResultBlock][3]) + assert.Equal(t, tx6, scheduledIntermediateTxsMap[block.SmartContractResultBlock][4]) + assert.Equal(t, tx7, scheduledIntermediateTxsMap[block.SmartContractResultBlock][5]) } func TestStartInEpochWithScheduledDataSyncer_saveScheduledInfoNoScheduledRootHash(t *testing.T) { From d4c5d65e27022d6b2379b03b2e40edaafbb3ba5a Mon Sep 17 00:00:00 2001 From: robertsasu Date: Fri, 21 Apr 2023 12:14:58 +0300 Subject: [PATCH 305/335] added unit test --- epochStart/bootstrap/startInEpochScheduled.go | 15 ++++++++++++--- .../bootstrap/startInEpochScheduled_test.go | 12 +++++++++--- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/epochStart/bootstrap/startInEpochScheduled.go b/epochStart/bootstrap/startInEpochScheduled.go index 3381a723863..265cf4dcc72 100644 --- a/epochStart/bootstrap/startInEpochScheduled.go +++ b/epochStart/bootstrap/startInEpochScheduled.go @@ -254,7 +254,11 @@ func (ses *startInEpochWithScheduledDataSyncer) prepareScheduledIntermediateTxs( additionalData := header.GetAdditionalData() if additionalData != nil { - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(miniBlocks, scheduledIntermediateTxs) + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder( + header.GetMiniBlockHeaderHandlers(), + miniBlocks, + scheduledIntermediateTxs, + ) gasAndFees := scheduled.GasAndFees{ AccumulatedFees: additionalData.GetScheduledAccumulatedFees(), DeveloperFees: additionalData.GetScheduledDeveloperFees(), @@ -344,13 +348,18 @@ func isScheduledIntermediateTx( } func getScheduledIntermediateTxsMapInOrder( + miniBlockHeaderHandlerList []data.MiniBlockHeaderHandler, miniBlocks map[string]*block.MiniBlock, intermediateTxs map[string]data.TransactionHandler, ) map[block.Type][]data.TransactionHandler { - intermediateTxsMap := make(map[block.Type][]data.TransactionHandler) - for _, miniBlock := range miniBlocks { + for _, mbHeader := range miniBlockHeaderHandlerList { + miniBlock, ok := miniBlocks[string(mbHeader.GetHash())] + if !ok { + continue + } + for _, hash := range miniBlock.TxHashes { txHandler, ok := intermediateTxs[string(hash)] if !ok { diff --git a/epochStart/bootstrap/startInEpochScheduled_test.go b/epochStart/bootstrap/startInEpochScheduled_test.go index 48edaaaab6b..7a649b01718 100644 --- a/epochStart/bootstrap/startInEpochScheduled_test.go +++ b/epochStart/bootstrap/startInEpochScheduled_test.go @@ -424,7 +424,13 @@ func TestStartInEpochWithScheduledDataSyncer_getScheduledIntermediateTxsMap(t *t TxHashes: [][]byte{[]byte("hash4"), []byte("5hash"), []byte("3hash"), []byte("hash6")}, } - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(miniBlocks, intermediateTxs) + miniBlockHeaders := make([]data.MiniBlockHeaderHandler, 4) + miniBlockHeaders[0] = &block.MiniBlockHeader{Hash: []byte("1")} + miniBlockHeaders[1] = &block.MiniBlockHeader{Hash: []byte("2")} + miniBlockHeaders[2] = &block.MiniBlockHeader{Hash: []byte("3")} + miniBlockHeaders[3] = &block.MiniBlockHeader{Hash: []byte("4")} + + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(miniBlockHeaders, miniBlocks, intermediateTxs) require.Equal(t, 2, len(scheduledIntermediateTxsMap)) require.Equal(t, 6, len(scheduledIntermediateTxsMap[block.SmartContractResultBlock])) require.Equal(t, 1, len(scheduledIntermediateTxsMap[block.InvalidBlock])) @@ -455,7 +461,7 @@ func TestStartInEpochWithScheduledDataSyncer_saveScheduledInfoNoScheduledRootHas }, } - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(make(map[string]*block.MiniBlock), scheduledIntermediateTxs) + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(make([]data.MiniBlockHeaderHandler, 0), make(map[string]*block.MiniBlock), scheduledIntermediateTxs) scheduledInfo := &process.ScheduledInfo{ RootHash: nil, IntermediateTxs: scheduledIntermediateTxsMap, @@ -513,7 +519,7 @@ func TestStartInEpochWithScheduledDataSyncer_saveScheduledInfo(t *testing.T) { }, } - scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(make(map[string]*block.MiniBlock), scheduledIntermediateTxs) + scheduledIntermediateTxsMap := getScheduledIntermediateTxsMapInOrder(make([]data.MiniBlockHeaderHandler, 0), make(map[string]*block.MiniBlock), scheduledIntermediateTxs) scheduledInfo := &process.ScheduledInfo{ RootHash: scheduledRootHash, IntermediateTxs: scheduledIntermediateTxsMap, From 02fa72b7ad4f80572f76a06eaf0b0a6ba2f5880a Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 21 Apr 2023 16:14:41 +0300 Subject: [PATCH 306/335] extra tests for transactionGroup --- api/groups/transactionGroup_test.go | 1722 +++++++++++++-------------- 1 file changed, 835 insertions(+), 887 deletions(-) diff --git a/api/groups/transactionGroup_test.go b/api/groups/transactionGroup_test.go index 3052f52ecdc..5331f85bbbc 100644 --- a/api/groups/transactionGroup_test.go +++ b/api/groups/transactionGroup_test.go @@ -6,7 +6,6 @@ import ( "encoding/json" "errors" "fmt" - "math/big" "net/http" "net/http/httptest" "strings" @@ -129,1045 +128,994 @@ type txPoolNonceGapsForSenderResponse struct { Code string `json:"code"` } -func TestGetTransaction_WithCorrectHashShouldReturnTransaction(t *testing.T) { - sender := "sender" - receiver := "receiver" - value := "10" - txData := []byte("data") - hash := "hash" - guardian := "guardian" - facade := mock.FacadeStub{ - GetTransactionHandler: func(hash string, withEvents bool) (i *dataTx.ApiTransactionResult, e error) { - return &dataTx.ApiTransactionResult{ - Sender: sender, - Receiver: receiver, - Data: txData, - Value: value, - GuardianAddr: guardian, - }, nil - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - req, _ := http.NewRequest("GET", "/transaction/"+hash, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := transactionResponse{} - loadResponse(resp.Body, &response) - - txResp := response.Data.TxResp - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, sender, txResp.Sender) - assert.Equal(t, receiver, txResp.Receiver) - assert.Equal(t, value, txResp.Value) - assert.Equal(t, txData, txResp.Data) - assert.Equal(t, guardian, txResp.GuardianAddr) -} - -func TestGetTransaction_WithUnknownHashShouldReturnNil(t *testing.T) { - sender := "sender" - receiver := "receiver" - value := "10" - txData := []byte("data") - wrongHash := "wronghash" - facade := mock.FacadeStub{ - GetTransactionHandler: func(hash string, withEvents bool) (*dataTx.ApiTransactionResult, error) { - if hash == wrongHash { - return nil, errors.New("local error") - } - return &dataTx.ApiTransactionResult{ - Sender: sender, - Receiver: receiver, - Data: txData, - Value: value, - }, nil - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - req, _ := http.NewRequest("GET", "/transaction/"+wrongHash, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txResp := transactionResponse{} - loadResponse(resp.Body, &txResp) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.Empty(t, txResp.Data) -} - -func TestGetTransaction_ErrorWithExceededNumGoRoutines(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetThrottlerForEndpointCalled: func(_ string) (core.Throttler, bool) { - return &mock.ThrottlerStub{ - CanProcessCalled: func() bool { return false }, - }, true - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - req, _ := http.NewRequest("GET", "/transaction/eeee", nil) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txResp := transactionResponse{} - loadResponse(resp.Body, &txResp) - - assert.Equal(t, http.StatusTooManyRequests, resp.Code) - assert.True(t, strings.Contains(txResp.Error, apiErrors.ErrTooManyRequests.Error())) - assert.Equal(t, string(shared.ReturnCodeSystemBusy), txResp.Code) - assert.Empty(t, txResp.Data) -} - -func TestSendTransaction_ErrorWithExceededNumGoRoutines(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetThrottlerForEndpointCalled: func(_ string) (core.Throttler, bool) { - return &mock.ThrottlerStub{ - CanProcessCalled: func() bool { return false }, - }, true - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - tx := groups.SendTxRequest{} - - jsonBytes, _ := json.Marshal(tx) - req, _ := http.NewRequest("POST", "/transaction/send", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txResp := sendSingleTxResponse{} - loadResponse(resp.Body, &txResp) - - assert.Equal(t, http.StatusTooManyRequests, resp.Code) - assert.True(t, strings.Contains(txResp.Error, apiErrors.ErrTooManyRequests.Error())) - assert.Equal(t, string(shared.ReturnCodeSystemBusy), txResp.Code) - assert.Empty(t, txResp.Data) -} - -func TestSendTransaction_WrongParametersShouldErrorOnValidation(t *testing.T) { - t.Parallel() - sender := "sender" - receiver := "receiver" - value := "ishouldbeint" - data := "data" - - facade := mock.FacadeStub{} - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - jsonStr := fmt.Sprintf(`{"sender":"%s", "receiver":"%s", "value":%s, "data":"%s"}`, - sender, - receiver, - value, - data, - ) - - req, _ := http.NewRequest("POST", "/transaction/send", bytes.NewBuffer([]byte(jsonStr))) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txResp := sendSingleTxResponse{} - loadResponse(resp.Body, &txResp) - - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.Contains(t, txResp.Error, apiErrors.ErrValidation.Error()) - assert.Empty(t, txResp.Data) -} - -func TestSendTransaction_ErrorWhenFacadeSendTransactionError(t *testing.T) { - t.Parallel() - sender := "sender" - receiver := "receiver" - value := big.NewInt(10) - data := "data" - signature := "aabbccdd" - errorString := "send transaction error" - - facade := mock.FacadeStub{ - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - return nil, nil, nil - }, - SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, err error) { - return 0, errors.New(errorString) - }, - ValidateTransactionHandler: func(tx *dataTx.Transaction) error { - return nil - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - jsonStr := fmt.Sprintf(`{"sender":"%s", "receiver":"%s", "value":"%s", "signature":"%s", "data":"%s"}`, - sender, - receiver, - value, - signature, - data, - ) - - req, _ := http.NewRequest("POST", "/transaction/send", bytes.NewBuffer([]byte(jsonStr))) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txResp := sendSingleTxResponse{} - loadResponse(resp.Body, &txResp) - - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.Contains(t, txResp.Error, errorString) - assert.Empty(t, txResp.Data) -} - -func TestSendTransaction_ReturnsSuccessfully(t *testing.T) { - t.Parallel() - nonce := uint64(1) - sender := "sender" - receiver := "receiver" - value := big.NewInt(10) - data := "data" - signature := "aabbccdd" - hexTxHash := "deadbeef" - - facade := mock.FacadeStub{ - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - txHash, _ := hex.DecodeString(hexTxHash) - return nil, txHash, nil - }, - SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, err error) { - return 1, nil - }, - ValidateTransactionHandler: func(tx *dataTx.Transaction) error { - return nil - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - jsonStr := fmt.Sprintf( - `{"nonce": %d, "sender": "%s", "receiver": "%s", "value": "%s", "signature": "%s", "data": "%s"}`, +var ( + sender = "sender" + receiver = "receiver" + value = "10" + txData = []byte("data") + hash = "hash" + guardian = "guardian" + signature = "aabbccdd" + expectedErr = errors.New("expected error") + nonce = uint64(1) + hexTxHash = "deadbeef" + jsonTxStr = fmt.Sprintf(`{"nonce": %d, "sender":"%s", "receiver":"%s", "value":"%s", "signature":"%s", "data":"%s"}`, nonce, sender, receiver, value, signature, - data, + txData, ) +) - req, _ := http.NewRequest("POST", "/transaction/send", bytes.NewBuffer([]byte(jsonStr))) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := sendSingleTxResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, response.Error) - assert.Equal(t, hexTxHash, response.Data.TxHash) -} - -func TestSendMultipleTransactions_ErrorWithExceededNumGoRoutines(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{ - GetThrottlerForEndpointCalled: func(_ string) (core.Throttler, bool) { - return &mock.ThrottlerStub{ - CanProcessCalled: func() bool { return false }, - }, true - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - tx0 := groups.SendTxRequest{} - txs := []*groups.SendTxRequest{&tx0} - - jsonBytes, _ := json.Marshal(txs) - req, _ := http.NewRequest("POST", "/transaction/send-multiple", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txResp := sendMultipleTxsResponse{} - loadResponse(resp.Body, &txResp) - - assert.Equal(t, http.StatusTooManyRequests, resp.Code) - assert.True(t, strings.Contains(txResp.Error, apiErrors.ErrTooManyRequests.Error())) - assert.Equal(t, string(shared.ReturnCodeSystemBusy), txResp.Code) - assert.Empty(t, txResp.Data) -} - -func TestSendMultipleTransactions_WrongPayloadShouldErrorOnValidation(t *testing.T) { - t.Parallel() - - facade := mock.FacadeStub{} - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - jsonStr := `{"wrong": json}` - - req, _ := http.NewRequest("POST", "/transaction/send-multiple", bytes.NewBuffer([]byte(jsonStr))) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txResp := sendMultipleTxsResponse{} - loadResponse(resp.Body, &txResp) - - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.Contains(t, txResp.Error, apiErrors.ErrValidation.Error()) - assert.Empty(t, txResp.Data) -} - -func TestSendMultipleTransactions_OkPayloadShouldWork(t *testing.T) { - t.Parallel() - - createTxWasCalled := false - sendBulkTxsWasCalled := false - - facade := mock.FacadeStub{ - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - createTxWasCalled = true - return &dataTx.Transaction{}, make([]byte, 0), nil - }, - SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, e error) { - sendBulkTxsWasCalled = true - return 0, nil - }, - ValidateTransactionHandler: func(tx *dataTx.Transaction) error { - return nil - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - tx0 := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - tx1 := tx0 - tx1.Sender = "sender2" - txs := []*groups.SendTxRequest{&tx0, &tx1} - - jsonBytes, _ := json.Marshal(txs) - - req, _ := http.NewRequest("POST", "/transaction/send-multiple", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txCostResp := sendMultipleTxsResponse{} - loadResponse(resp.Body, &txCostResp) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.True(t, createTxWasCalled) - assert.True(t, sendBulkTxsWasCalled) -} - -func TestComputeTransactionGasLimit(t *testing.T) { +func TestTransactionsGroup_getTransaction(t *testing.T) { t.Parallel() - expectedGasLimit := uint64(37) - - facade := mock.FacadeStub{ - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - return &dataTx.Transaction{}, nil, nil - }, - ComputeTransactionGasLimitHandler: func(tx *dataTx.Transaction) (*dataTx.CostResponse, error) { - return &dataTx.CostResponse{ - GasUnits: expectedGasLimit, - ReturnMessage: "", - }, nil - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - tx0 := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - - jsonBytes, _ := json.Marshal(tx0) - - req, _ := http.NewRequest("POST", "/transaction/cost", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txCostResp := transactionCostResponse{} - loadResponse(resp.Body, &txCostResp) + t.Run("number of go routines exceeded", testExceededNumGoRoutines("/transaction/eeee", nil)) + t.Run("invalid params should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedGasLimit, txCostResp.Data.Cost) -} + facade := mock.FacadeStub{ + GetTransactionHandler: func(hash string, withEvents bool) (*dataTx.ApiTransactionResult, error) { + require.Fail(t, "should have not been called") + return &dataTx.ApiTransactionResult{}, nil + }, + } -func TestSimulateTransaction_BadRequestShouldErr(t *testing.T) { - t.Parallel() + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - facade := mock.FacadeStub{} + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", "/transaction/hash?withResults=not-bool", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + txResp := transactionResponse{} + loadResponse(resp.Body, &txResp) - req, _ := http.NewRequest("POST", "/transaction/simulate", bytes.NewBuffer([]byte("invalid bytes"))) + assert.Equal(t, http.StatusBadRequest, resp.Code) + assert.Empty(t, txResp.Data) + }) + t.Run("facade returns error should error", func(t *testing.T) { + t.Parallel() - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := mock.FacadeStub{ + GetTransactionHandler: func(hash string, withEvents bool) (*dataTx.ApiTransactionResult, error) { + return nil, expectedErr + }, + } - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - assert.Equal(t, http.StatusBadRequest, resp.Code) -} + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) -func TestSimulateTransaction_CreateErrorsShouldErr(t *testing.T) { - t.Parallel() + req, _ := http.NewRequest("GET", "/transaction/hash", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - processTxWasCalled := false - - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { - processTxWasCalled = true - return &txSimData.SimulationResults{ - Status: "ok", - FailReason: "no reason", - ScResults: nil, - Receipts: nil, - Hash: "hash", - }, nil - }, - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - return nil, nil, expectedErr - }, - ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { - return nil - }, - } + txResp := transactionResponse{} + loadResponse(resp.Body, &txResp) - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.Empty(t, txResp.Data) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + facade := mock.FacadeStub{ + GetTransactionHandler: func(hash string, withEvents bool) (i *dataTx.ApiTransactionResult, e error) { + return &dataTx.ApiTransactionResult{ + Sender: sender, + Receiver: receiver, + Data: txData, + Value: value, + GuardianAddr: guardian, + }, nil + }, + } - tx := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - jsonBytes, _ := json.Marshal(tx) + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - req, _ := http.NewRequest("POST", "/transaction/simulate", bytes.NewBuffer(jsonBytes)) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("GET", "/transaction/"+hash, nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) + response := transactionResponse{} + loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.False(t, processTxWasCalled) - assert.Contains(t, simulateResponse.Error, expectedErr.Error()) + txResp := response.Data.TxResp + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, sender, txResp.Sender) + assert.Equal(t, receiver, txResp.Receiver) + assert.Equal(t, value, txResp.Value) + assert.Equal(t, txData, txResp.Data) + assert.Equal(t, guardian, txResp.GuardianAddr) + }) } -func TestSimulateTransaction_ValidateErrorsShouldErr(t *testing.T) { +func TestTransactionGroup_sendTransaction(t *testing.T) { t.Parallel() - processTxWasCalled := false - - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { - processTxWasCalled = true - return &txSimData.SimulationResults{ - Status: "ok", - FailReason: "no reason", - ScResults: nil, - Receipts: nil, - Hash: "hash", - }, nil - }, - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - return &dataTx.Transaction{}, []byte("hash"), nil - }, - ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { - return expectedErr - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - tx := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - jsonBytes, _ := json.Marshal(tx) - - req, _ := http.NewRequest("POST", "/transaction/simulate", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) - - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.False(t, processTxWasCalled) - assert.Contains(t, simulateResponse.Error, expectedErr.Error()) -} - -func TestSimulateTransaction_CannotParseParameterShouldErr(t *testing.T) { - t.Parallel() + t.Run("number of go routines exceeded", testExceededNumGoRoutines("/transaction/send", &groups.SendTxRequest{})) + t.Run("invalid params should error", testTransactionGroupErrorScenario("/transaction/send", "POST", jsonTxStr, http.StatusBadRequest, apiErrors.ErrValidation)) + t.Run("CreateTransaction error should error", func(t *testing.T) { + t.Parallel() - facade := mock.FacadeStub{} + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, expectedErr + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + require.Fail(t, "should have not been called") + return nil + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/send", + "POST", + &groups.SendTxRequest{}, + http.StatusBadRequest, + expectedErr, + ) + }) + t.Run("ValidateTransaction error should error", func(t *testing.T) { + t.Parallel() - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, nil + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + return expectedErr + }, + SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, err error) { + require.Fail(t, "should have not been called") + return 0, nil + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/send", + "POST", + &groups.SendTxRequest{}, + http.StatusBadRequest, + expectedErr, + ) + }) + t.Run("SendBulkTransactions error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, nil + }, + SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, err error) { + return 0, expectedErr + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + return nil + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/send", + "POST", + &groups.SendTxRequest{}, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - tx := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - jsonBytes, _ := json.Marshal(tx) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + txHash, _ := hex.DecodeString(hexTxHash) + return nil, txHash, nil + }, + SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, err error) { + return 1, nil + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + return nil + }, + } + transactionGroup, err := groups.NewTransactionGroup(facade) + require.NoError(t, err) - req, _ := http.NewRequest("POST", "/transaction/simulate?checkSignature=tttt", bytes.NewBuffer(jsonBytes)) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + req, _ := http.NewRequest("POST", "/transaction/send", bytes.NewBuffer([]byte(jsonTxStr))) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) + response := sendSingleTxResponse{} + loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.Equal(t, apiErrors.ErrValidation.Error(), simulateResponse.Error) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Empty(t, response.Error) + assert.Equal(t, hexTxHash, response.Data.TxHash) + }) } -func TestSimulateTransaction_UseQueryParameterShouldWork(t *testing.T) { +func TestTransactionGroup_sendMultipleTransactions(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ - ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { - assert.True(t, bypassSignature) - return nil - }, - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - return &dataTx.Transaction{}, []byte("hash"), nil - }, - SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { - return &txSimData.SimulationResults{}, nil - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - tx := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - jsonBytes, _ := json.Marshal(tx) + t.Run("number of go routines exceeded", testExceededNumGoRoutines("/transaction/send-multiple", &groups.SendTxRequest{})) + t.Run("invalid params should error", testTransactionGroupErrorScenario("/transaction/send-multiple", "POST", jsonTxStr, http.StatusBadRequest, apiErrors.ErrValidation)) + t.Run("CreateTransaction error should continue, error on SendBulkTransactions", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("POST", "/transaction/simulate?bypassSignature=true", bytes.NewBuffer(jsonBytes)) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, expectedErr + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + require.Fail(t, "should not have been called") + return nil + }, + SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (uint64, error) { + require.Zero(t, len(txs)) + return 0, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/send-multiple", + "POST", + []*groups.SendTxRequest{{}}, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("ValidateTransaction error should continue, error on SendBulkTransactions", func(t *testing.T) { + t.Parallel() - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, nil + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + return expectedErr + }, + SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (uint64, error) { + require.Zero(t, len(txs)) + return 0, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/send-multiple", + "POST", + []*groups.SendTxRequest{{}}, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("SendBulkTransactions error error", func(t *testing.T) { + t.Parallel() - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, nil + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + return nil + }, + SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (uint64, error) { + require.Equal(t, 1, len(txs)) + return 0, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/send-multiple", + "POST", + []*groups.SendTxRequest{{}}, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusOK, resp.Code) -} + createTxWasCalled := false + sendBulkTxsWasCalled := false -func TestSimulateTransaction_ProcessErrorsShouldErr(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + createTxWasCalled = true + return &dataTx.Transaction{}, make([]byte, 0), nil + }, + SendBulkTransactionsHandler: func(txs []*dataTx.Transaction) (u uint64, e error) { + sendBulkTxsWasCalled = true + return 0, nil + }, + ValidateTransactionHandler: func(tx *dataTx.Transaction) error { + return nil + }, + } - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { - return nil, expectedErr - }, - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - return &dataTx.Transaction{}, []byte("hash"), nil - }, - ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { - return nil - }, - } + transactionGroup, err := groups.NewTransactionGroup(facade) + require.NoError(t, err) - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + tx0 := groups.SendTxRequest{ + Sender: "sender1", + Receiver: "receiver1", + Value: "100", + Data: make([]byte, 0), + Nonce: 0, + GasPrice: 0, + GasLimit: 0, + Signature: "", + } + tx1 := tx0 + tx1.Sender = "sender2" + txs := []*groups.SendTxRequest{&tx0, &tx1} - tx := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - jsonBytes, _ := json.Marshal(tx) + jsonBytes, _ := json.Marshal(txs) - req, _ := http.NewRequest("POST", "/transaction/simulate", bytes.NewBuffer(jsonBytes)) + req, _ := http.NewRequest("POST", "/transaction/send-multiple", bytes.NewBuffer(jsonBytes)) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) + txCostResp := sendMultipleTxsResponse{} + loadResponse(resp.Body, &txCostResp) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.Contains(t, simulateResponse.Error, expectedErr.Error()) + assert.Equal(t, http.StatusOK, resp.Code) + assert.True(t, createTxWasCalled) + assert.True(t, sendBulkTxsWasCalled) + }) } -func TestSimulateTransaction(t *testing.T) { +func TestTransactionGroup_computeTransactionGasLimit(t *testing.T) { t.Parallel() - processTxWasCalled := false - - facade := mock.FacadeStub{ - SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { - processTxWasCalled = true - return &txSimData.SimulationResults{ - Status: "ok", - FailReason: "no reason", - ScResults: nil, - Receipts: nil, - Hash: "hash", - }, nil - }, - CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { - return &dataTx.Transaction{}, []byte("hash"), nil - }, - ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { - return nil - }, - } + t.Run("invalid params should error", testTransactionGroupErrorScenario("/transaction/cost", "POST", jsonTxStr, http.StatusBadRequest, apiErrors.ErrValidation)) + t.Run("CreateTransaction error should error", func(t *testing.T) { + t.Parallel() - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, expectedErr + }, + ComputeTransactionGasLimitHandler: func(tx *dataTx.Transaction) (*dataTx.CostResponse, error) { + require.Fail(t, "should not have been called") + return nil, nil + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/cost", + "POST", + &groups.SendTxRequest{}, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("ComputeTransactionGasLimit error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, nil + }, + ComputeTransactionGasLimitHandler: func(tx *dataTx.Transaction) (*dataTx.CostResponse, error) { + return nil, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/cost", + "POST", + &groups.SendTxRequest{}, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - tx := groups.SendTxRequest{ - Sender: "sender1", - Receiver: "receiver1", - Value: "100", - Data: make([]byte, 0), - Nonce: 0, - GasPrice: 0, - GasLimit: 0, - Signature: "", - } - jsonBytes, _ := json.Marshal(tx) + expectedGasLimit := uint64(37) - req, _ := http.NewRequest("POST", "/transaction/simulate", bytes.NewBuffer(jsonBytes)) + facade := mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return &dataTx.Transaction{}, nil, nil + }, + ComputeTransactionGasLimitHandler: func(tx *dataTx.Transaction) (*dataTx.CostResponse, error) { + return &dataTx.CostResponse{ + GasUnits: expectedGasLimit, + ReturnMessage: "", + }, nil + }, + } - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - assert.Equal(t, http.StatusOK, resp.Code) - assert.True(t, processTxWasCalled) - assert.Equal(t, string(shared.ReturnCodeSuccess), simulateResponse.Code) -} + tx0 := groups.SendTxRequest{ + Sender: "sender1", + Receiver: "receiver1", + Value: "100", + Data: make([]byte, 0), + Nonce: 0, + GasPrice: 0, + GasLimit: 0, + Signature: "", + } -func TestGetTransactionsPoolShouldError(t *testing.T) { - t.Parallel() + jsonBytes, _ := json.Marshal(tx0) - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetTransactionsPoolCalled: func(fields string) (*common.TransactionsPoolAPIResponse, error) { - return nil, expectedErr - }, - } + req, _ := http.NewRequest("POST", "/transaction/cost", bytes.NewBuffer(jsonBytes)) - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + txCostResp := transactionCostResponse{} + loadResponse(resp.Body, &txCostResp) - req, _ := http.NewRequest("GET", "/transaction/pool", nil) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Equal(t, expectedGasLimit, txCostResp.Data.Cost) + }) +} - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) +func TestTransactionGroup_simulateTransaction(t *testing.T) { + t.Parallel() - txsPoolResp := generalResponse{} - loadResponse(resp.Body, &txsPoolResp) + t.Run("number of go routines exceeded", testExceededNumGoRoutines("/transaction/simulate", &groups.SendTxRequest{})) + t.Run("invalid param transaction should error", testTransactionGroupErrorScenario("/transaction/simulate", "POST", jsonTxStr, http.StatusBadRequest, apiErrors.ErrValidation)) + t.Run("invalid param checkSignature should error", testTransactionGroupErrorScenario("/transaction/simulate?checkSignature=not-bool", "POST", &groups.SendTxRequest{}, http.StatusBadRequest, apiErrors.ErrValidation)) + t.Run("CreateTransaction error should error", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(txsPoolResp.Error, expectedErr.Error())) -} + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, expectedErr + }, + ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { + require.Fail(t, "should have not been called") + return nil + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/simulate", + "POST", + &groups.SendTxRequest{}, + http.StatusBadRequest, + expectedErr, + ) + }) + t.Run("ValidateTransactionForSimulation error should error", func(t *testing.T) { + t.Parallel() -func TestGetTransactionsPoolShouldWork(t *testing.T) { - t.Parallel() + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, nil + }, + ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { + return expectedErr + }, + SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { + require.Fail(t, "should have not been called") + return nil, nil + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/simulate", + "POST", + &groups.SendTxRequest{}, + http.StatusBadRequest, + expectedErr, + ) + }) + t.Run("SimulateTransactionExecution error should error", func(t *testing.T) { + t.Parallel() - expectedTxPool := &common.TransactionsPoolAPIResponse{ - RegularTransactions: []common.Transaction{ - { - TxFields: map[string]interface{}{ - "hash": "tx", - }, + facade := &mock.FacadeStub{ + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return nil, nil, nil }, - { - TxFields: map[string]interface{}{ - "hash": "tx2", - }, + ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { + return nil }, - }, - } - facade := mock.FacadeStub{ - GetTransactionsPoolCalled: func(fields string) (*common.TransactionsPoolAPIResponse, error) { - return expectedTxPool, nil - }, - } + SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { + return nil, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/simulate", + "POST", + &groups.SendTxRequest{}, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + processTxWasCalled := false + + facade := mock.FacadeStub{ + SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { + processTxWasCalled = true + return &txSimData.SimulationResults{ + Status: "ok", + FailReason: "no reason", + ScResults: nil, + Receipts: nil, + Hash: "hash", + }, nil + }, + CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { + return &dataTx.Transaction{}, []byte("hash"), nil + }, + ValidateTransactionForSimulationHandler: func(tx *dataTx.Transaction, bypassSignature bool) error { + return nil + }, + } - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) + + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - req, _ := http.NewRequest("GET", "/transaction/pool", nil) + tx := groups.SendTxRequest{ + Sender: "sender1", + Receiver: "receiver1", + Value: "100", + Data: make([]byte, 0), + Nonce: 0, + GasPrice: 0, + GasLimit: 0, + Signature: "", + } + jsonBytes, _ := json.Marshal(tx) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + req, _ := http.NewRequest("POST", "/transaction/simulate", bytes.NewBuffer(jsonBytes)) + + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - txsPoolResp := txsPoolResponse{} - loadResponse(resp.Body, &txsPoolResp) + simulateResponse := simulateTxResponse{} + loadResponse(resp.Body, &simulateResponse) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, txsPoolResp.Error) - assert.Equal(t, *expectedTxPool, txsPoolResp.Data.TxPool) + assert.Equal(t, http.StatusOK, resp.Code) + assert.True(t, processTxWasCalled) + assert.Equal(t, string(shared.ReturnCodeSuccess), simulateResponse.Code) + }) } -func TestGetTransactionsPoolForSenderShouldError(t *testing.T) { +func TestTransactionGroup_getTransactionsPool(t *testing.T) { t.Parallel() - query := "?by-sender=sender" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetTransactionsPoolForSenderCalled: func(sender, fields string) (*common.TransactionsPoolForSenderApiResponse, error) { - return nil, expectedErr - }, - } + t.Run("number of go routines exceeded", testExceededNumGoRoutines("/transaction/pool", nil)) + t.Run("invalid last-nonce param should error", testTransactionGroupErrorScenario("/transaction/pool?last-nonce=not-bool", "GET", nil, http.StatusBadRequest, apiErrors.ErrValidation)) + t.Run("invalid nonce-gaps param should error", testTransactionGroupErrorScenario("/transaction/pool?nonce-gaps=not-bool", "GET", nil, http.StatusBadRequest, apiErrors.ErrValidation)) + t.Run("empty sender, requesting latest nonce", testTxPoolWithInvalidQuery("?last-nonce=true", apiErrors.ErrEmptySenderToGetLatestNonce)) + t.Run("empty sender, requesting nonce gaps", testTxPoolWithInvalidQuery("?nonce-gaps=true", apiErrors.ErrEmptySenderToGetNonceGaps)) + t.Run("fields + latest nonce", testTxPoolWithInvalidQuery("?fields=sender,receiver&last-nonce=true", apiErrors.ErrFetchingLatestNonceCannotIncludeFields)) + t.Run("fields + nonce gaps", testTxPoolWithInvalidQuery("?fields=sender,receiver&nonce-gaps=true", apiErrors.ErrFetchingNonceGapsCannotIncludeFields)) + t.Run("fields has spaces", testTxPoolWithInvalidQuery("?fields=sender ,receiver", apiErrors.ErrInvalidFields)) + t.Run("fields has numbers", testTxPoolWithInvalidQuery("?fields=sender1", apiErrors.ErrInvalidFields)) + t.Run("GetTransactionsPool error should error", func(t *testing.T) { + t.Parallel() - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + facade := &mock.FacadeStub{ + GetTransactionsPoolCalled: func(fields string) (*common.TransactionsPoolAPIResponse, error) { + return nil, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/pool", + "GET", + nil, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("GetTransactionsPoolForSender error should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + facade := &mock.FacadeStub{ + GetTransactionsPoolForSenderCalled: func(sender, fields string) (*common.TransactionsPoolForSenderApiResponse, error) { + return nil, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/pool?by-sender=sender", + "GET", + nil, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("GetLastPoolNonceForSender error should error", func(t *testing.T) { + t.Parallel() - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + facade := &mock.FacadeStub{ + GetLastPoolNonceForSenderCalled: func(sender string) (uint64, error) { + return 0, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/pool?by-sender=sender&last-nonce=true", + "GET", + nil, + http.StatusInternalServerError, + expectedErr, + ) + }) + t.Run("GetTransactionsPoolNonceGapsForSender error should error", func(t *testing.T) { + t.Parallel() - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + facade := &mock.FacadeStub{ + GetTransactionsPoolNonceGapsForSenderCalled: func(sender string) (*common.TransactionsPoolNonceGapsForSenderApiResponse, error) { + return nil, expectedErr + }, + } + testTransactionsGroup( + t, + facade, + "/transaction/pool?by-sender=sender&nonce-gaps=true", + "GET", + nil, + http.StatusInternalServerError, + expectedErr, + ) + }) - txsForSenderResp := poolForSenderResponse{} - loadResponse(resp.Body, &txsForSenderResp) + t.Run("should work", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(txsForSenderResp.Error, expectedErr.Error())) -} + expectedTxPool := &common.TransactionsPoolAPIResponse{ + RegularTransactions: []common.Transaction{ + { + TxFields: map[string]interface{}{ + "hash": "tx", + }, + }, + { + TxFields: map[string]interface{}{ + "hash": "tx2", + }, + }, + }, + } + facade := mock.FacadeStub{ + GetTransactionsPoolCalled: func(fields string) (*common.TransactionsPoolAPIResponse, error) { + return expectedTxPool, nil + }, + } + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) -func TestGetTransactionsPoolForSenderShouldWork(t *testing.T) { - t.Parallel() + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + + req, _ := http.NewRequest("GET", "/transaction/pool", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - expectedSender := "sender" - providedFields := "sender,receiver" - query := "?by-sender=" + expectedSender + "&fields=" + providedFields - expectedResp := &common.TransactionsPoolForSenderApiResponse{ - Transactions: []common.Transaction{ - { - TxFields: map[string]interface{}{ - "hash": "txHash1", - "sender": expectedSender, - "receiver": "receiver1", + txsPoolResp := txsPoolResponse{} + loadResponse(resp.Body, &txsPoolResp) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Empty(t, txsPoolResp.Error) + assert.Equal(t, *expectedTxPool, txsPoolResp.Data.TxPool) + }) + t.Run("should work for sender", func(t *testing.T) { + t.Parallel() + + expectedSender := "sender" + providedFields := "sender,receiver" + query := "?by-sender=" + expectedSender + "&fields=" + providedFields + expectedResp := &common.TransactionsPoolForSenderApiResponse{ + Transactions: []common.Transaction{ + { + TxFields: map[string]interface{}{ + "hash": "txHash1", + "sender": expectedSender, + "receiver": "receiver1", + }, }, - }, - { - TxFields: map[string]interface{}{ - "hash": "txHash2", - "sender": expectedSender, - "receiver": "receiver2", + { + TxFields: map[string]interface{}{ + "hash": "txHash2", + "sender": expectedSender, + "receiver": "receiver2", + }, }, }, - }, - } - facade := mock.FacadeStub{ - GetTransactionsPoolForSenderCalled: func(sender, fields string) (*common.TransactionsPoolForSenderApiResponse, error) { - return expectedResp, nil - }, - } + } + facade := mock.FacadeStub{ + GetTransactionsPoolForSenderCalled: func(sender, fields string) (*common.TransactionsPoolForSenderApiResponse, error) { + return expectedResp, nil + }, + } + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + txsForSenderResp := poolForSenderResponse{} + loadResponse(resp.Body, &txsForSenderResp) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Empty(t, txsForSenderResp.Error) + assert.Equal(t, *expectedResp, txsForSenderResp.Data.TxPool) + }) + t.Run("should work for last pool nonce", func(t *testing.T) { + t.Parallel() - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + expectedSender := "sender" + query := "?by-sender=" + expectedSender + "&last-nonce=true" + expectedNonce := uint64(33) + facade := mock.FacadeStub{ + GetLastPoolNonceForSenderCalled: func(sender string) (uint64, error) { + return expectedNonce, nil + }, + } + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - txsForSenderResp := poolForSenderResponse{} - loadResponse(resp.Body, &txsForSenderResp) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, txsForSenderResp.Error) - assert.Equal(t, *expectedResp, txsForSenderResp.Data.TxPool) -} + req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) -func TestGetLastPoolNonceForSenderShouldError(t *testing.T) { - t.Parallel() + lastPoolNonceResp := lastPoolNonceForSenderResponse{} + loadResponse(resp.Body, &lastPoolNonceResp) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Empty(t, lastPoolNonceResp.Error) + assert.Equal(t, expectedNonce, lastPoolNonceResp.Data.Nonce) + }) + t.Run("should work for nonce gaps", func(t *testing.T) { + t.Parallel() - query := "?by-sender=sender&last-nonce=true" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetLastPoolNonceForSenderCalled: func(sender string) (uint64, error) { - return 0, expectedErr - }, - } + expectedSender := "sender" + query := "?by-sender=" + expectedSender + "&nonce-gaps=true" + expectedNonceGaps := &common.TransactionsPoolNonceGapsForSenderApiResponse{ + Sender: expectedSender, + Gaps: []common.NonceGapApiResponse{ + { + From: 33, + To: 60, + }, + }, + } + facade := mock.FacadeStub{ + GetTransactionsPoolNonceGapsForSenderCalled: func(sender string) (*common.TransactionsPoolNonceGapsForSenderApiResponse, error) { + return expectedNonceGaps, nil + }, + } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - lastPoolNonceResp := lastPoolNonceForSenderResponse{} - loadResponse(resp.Body, &lastPoolNonceResp) + nonceGapsResp := txPoolNonceGapsForSenderResponse{} + loadResponse(resp.Body, &nonceGapsResp) - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(lastPoolNonceResp.Error, expectedErr.Error())) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Empty(t, nonceGapsResp.Error) + assert.Equal(t, *expectedNonceGaps, nonceGapsResp.Data.NonceGaps) + }) } -func TestGetLastPoolNonceForSenderShouldWork(t *testing.T) { - t.Parallel() - - expectedSender := "sender" - query := "?by-sender=" + expectedSender + "&last-nonce=true" - expectedNonce := uint64(33) - facade := mock.FacadeStub{ - GetLastPoolNonceForSenderCalled: func(sender string) (uint64, error) { - return expectedNonce, nil - }, - } +func testTxPoolWithInvalidQuery(query string, expectedErr error) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + transactionGroup, err := groups.NewTransactionGroup(&mock.FacadeStub{}) + require.NoError(t, err) - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - lastPoolNonceResp := lastPoolNonceForSenderResponse{} - loadResponse(resp.Body, &lastPoolNonceResp) + txResp := &transactionResponse{} + loadResponse(resp.Body, txResp) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, lastPoolNonceResp.Error) - assert.Equal(t, expectedNonce, lastPoolNonceResp.Data.Nonce) + assert.Equal(t, http.StatusBadRequest, resp.Code) + assert.True(t, strings.Contains(txResp.Error, apiErrors.ErrValidation.Error())) + assert.True(t, strings.Contains(txResp.Error, expectedErr.Error())) + } } -func TestGetTransactionsPoolNonceGapsForSenderShouldError(t *testing.T) { +func TestTransactionsGroup_UpdateFacade(t *testing.T) { t.Parallel() - query := "?by-sender=sender&nonce-gaps=true" - expectedErr := errors.New("expected error") - facade := mock.FacadeStub{ - GetTransactionsPoolNonceGapsForSenderCalled: func(sender string) (*common.TransactionsPoolNonceGapsForSenderApiResponse, error) { - return nil, expectedErr - }, - } - - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + t.Run("nil facade should error", func(t *testing.T) { + t.Parallel() - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + transactionGroup, err := groups.NewTransactionGroup(&mock.FacadeStub{}) + require.NoError(t, err) - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + err = transactionGroup.UpdateFacade(nil) + require.Equal(t, apiErrors.ErrNilFacadeHandler, err) + }) + t.Run("cast failure should error", func(t *testing.T) { + t.Parallel() - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + transactionGroup, err := groups.NewTransactionGroup(&mock.FacadeStub{}) + require.NoError(t, err) - nonceGapsResp := txPoolNonceGapsForSenderResponse{} - loadResponse(resp.Body, &nonceGapsResp) + err = transactionGroup.UpdateFacade("this is not a facade handler") + require.True(t, errors.Is(err, apiErrors.ErrFacadeWrongTypeAssertion)) + }) + t.Run("should work", func(t *testing.T) { + t.Parallel() - assert.Equal(t, http.StatusInternalServerError, resp.Code) - assert.True(t, strings.Contains(nonceGapsResp.Error, expectedErr.Error())) -} + expectedTxPool := &common.TransactionsPoolAPIResponse{ + RegularTransactions: []common.Transaction{ + { + TxFields: map[string]interface{}{ + "hash": "tx", + }, + }, + }, + } + facade := mock.FacadeStub{ + GetTransactionsPoolCalled: func(fields string) (*common.TransactionsPoolAPIResponse, error) { + return expectedTxPool, nil + }, + } -func TestGetTransactionsPoolNonceGapsForSenderShouldWork(t *testing.T) { - t.Parallel() + transactionGroup, err := groups.NewTransactionGroup(&facade) + require.NoError(t, err) - expectedSender := "sender" - query := "?by-sender=" + expectedSender + "&nonce-gaps=true" - expectedNonceGaps := &common.TransactionsPoolNonceGapsForSenderApiResponse{ - Sender: expectedSender, - Gaps: []common.NonceGapApiResponse{ - { - From: 33, - To: 60, - }, - }, - } - facade := mock.FacadeStub{ - GetTransactionsPoolNonceGapsForSenderCalled: func(sender string) (*common.TransactionsPoolNonceGapsForSenderApiResponse, error) { - return expectedNonceGaps, nil - }, - } + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) + req, _ := http.NewRequest("GET", "/transaction/pool", nil) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + txsPoolResp := txsPoolResponse{} + loadResponse(resp.Body, &txsPoolResp) + assert.Equal(t, http.StatusOK, resp.Code) + assert.Empty(t, txsPoolResp.Error) + assert.Equal(t, *expectedTxPool, txsPoolResp.Data.TxPool) - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) + newFacade := mock.FacadeStub{ + GetTransactionsPoolCalled: func(fields string) (*common.TransactionsPoolAPIResponse, error) { + return nil, expectedErr + }, + } - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + err = transactionGroup.UpdateFacade(&newFacade) + require.NoError(t, err) - nonceGapsResp := txPoolNonceGapsForSenderResponse{} - loadResponse(resp.Body, &nonceGapsResp) + req, _ = http.NewRequest("GET", "/transaction/pool", nil) + resp = httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, nonceGapsResp.Error) - assert.Equal(t, *expectedNonceGaps, nonceGapsResp.Data.NonceGaps) + loadResponse(resp.Body, &txsPoolResp) + assert.Equal(t, http.StatusInternalServerError, resp.Code) + assert.True(t, strings.Contains(txsPoolResp.Error, expectedErr.Error())) + }) } -func TestGetTransactionsPoolInvalidQueries(t *testing.T) { +func TestTransactionsGroup_IsInterfaceNil(t *testing.T) { t.Parallel() - t.Run("empty sender, requesting latest nonce", testTxPoolWithInvalidQuery("?last-nonce=true", apiErrors.ErrEmptySenderToGetLatestNonce)) - t.Run("empty sender, requesting nonce gaps", testTxPoolWithInvalidQuery("?nonce-gaps=true", apiErrors.ErrEmptySenderToGetNonceGaps)) - t.Run("fields + latest nonce", testTxPoolWithInvalidQuery("?fields=sender,receiver&last-nonce=true", apiErrors.ErrFetchingLatestNonceCannotIncludeFields)) - t.Run("fields + nonce gaps", testTxPoolWithInvalidQuery("?fields=sender,receiver&nonce-gaps=true", apiErrors.ErrFetchingNonceGapsCannotIncludeFields)) - t.Run("fields has spaces", testTxPoolWithInvalidQuery("?fields=sender ,receiver", apiErrors.ErrInvalidFields)) - t.Run("fields has numbers", testTxPoolWithInvalidQuery("?fields=sender1", apiErrors.ErrInvalidFields)) + transactionGroup, _ := groups.NewTransactionGroup(nil) + require.True(t, transactionGroup.IsInterfaceNil()) + + transactionGroup, _ = groups.NewTransactionGroup(&mock.FacadeStub{}) + require.False(t, transactionGroup.IsInterfaceNil()) } -func testTxPoolWithInvalidQuery(query string, expectedErr error) func(t *testing.T) { +func testTransactionGroupErrorScenario( + url string, + method string, + body interface{}, + expectedCode int, + expectedError error, +) func(t *testing.T) { return func(t *testing.T) { t.Parallel() - transactionGroup, err := groups.NewTransactionGroup(&mock.FacadeStub{}) - require.NoError(t, err) + testTransactionsGroup( + t, + &mock.FacadeStub{}, + url, + method, + body, + expectedCode, + expectedError) + } +} - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) +func testExceededNumGoRoutines(url string, body interface{}) func(t *testing.T) { + return func(t *testing.T) { + facade := &mock.FacadeStub{ + GetThrottlerForEndpointCalled: func(_ string) (core.Throttler, bool) { + return &mock.ThrottlerStub{ + CanProcessCalled: func() bool { return false }, + }, true + }, + } + + testTransactionsGroup( + t, + facade, + url, + "GET", + body, + http.StatusTooManyRequests, + apiErrors.ErrTooManyRequests, + ) + } +} - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) +func testTransactionsGroup( + t *testing.T, + facade shared.FacadeHandler, + url string, + method string, + body interface{}, + expectedRespCode int, + expectedRespError error, +) { + transactionGroup, err := groups.NewTransactionGroup(facade) + require.NoError(t, err) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - txResp := &transactionResponse{} - loadResponse(resp.Body, txResp) + jsonBytes, _ := json.Marshal(body) + req, _ := http.NewRequest(method, url, bytes.NewBuffer(jsonBytes)) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) - assert.Equal(t, http.StatusBadRequest, resp.Code) - assert.True(t, strings.Contains(txResp.Error, apiErrors.ErrValidation.Error())) - assert.True(t, strings.Contains(txResp.Error, expectedErr.Error())) - } + txResp := shared.GenericAPIResponse{} + loadResponse(resp.Body, &txResp) + + assert.Equal(t, expectedRespCode, resp.Code) + assert.True(t, strings.Contains(txResp.Error, expectedRespError.Error())) + assert.Empty(t, txResp.Data) } func getTransactionRoutesConfig() config.ApiRoutesConfig { From 85d19c4331907896fcc3d0ef02b0ec8b77242bdf Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 21 Apr 2023 17:08:53 +0300 Subject: [PATCH 307/335] - fixes after merge --- common/enablers/enableEpochsHandler.go | 2 +- common/enablers/epochFlags.go | 2 - factory/api/apiResolverFactory_test.go | 2 +- go.mod | 16 ++--- go.sum | 40 ++++++------- integrationTests/testProcessorNode.go | 6 +- .../vm/txsFee/guardAccount_test.go | 42 ++++++++----- node/external/transactionAPI/unmarshaller.go | 8 +-- node/node.go | 10 ++-- node/nodeRunner_test.go | 1 + node/node_test.go | 60 ++++++++++--------- process/dataValidators/txValidator_test.go | 2 +- .../interceptedTransaction_test.go | 48 +++++++-------- storage/clean/oldDataCleanerProvider_test.go | 10 ++-- storage/factory/storageServiceFactory_test.go | 20 +------ trie/patriciaMerkleTrie_test.go | 2 +- 16 files changed, 133 insertions(+), 138 deletions(-) diff --git a/common/enablers/enableEpochsHandler.go b/common/enablers/enableEpochsHandler.go index f056ac7964b..359e376a212 100644 --- a/common/enablers/enableEpochsHandler.go +++ b/common/enablers/enableEpochsHandler.go @@ -119,7 +119,7 @@ func (handler *enableEpochsHandler) EpochConfirmed(epoch uint32, _ uint64) { handler.setFlagValue(epoch >= handler.enableEpochsConfig.WipeSingleNFTLiquidityDecreaseEnableEpoch, handler.wipeSingleNFTLiquidityDecreaseFlag, "wipeSingleNFTLiquidityDecreaseFlag", epoch, handler.enableEpochsConfig.WipeSingleNFTLiquidityDecreaseEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch, handler.alwaysSaveTokenMetaDataFlag, "alwaysSaveTokenMetaDataFlag", epoch, handler.enableEpochsConfig.AlwaysSaveTokenMetaDataEnableEpoch) handler.setFlagValue(epoch >= handler.enableEpochsConfig.MultiClaimOnDelegationEnableEpoch, handler.multiClaimOnDelegationFlag, "multiClaimOnDelegationFlag", epoch, handler.enableEpochsConfig.MultiClaimOnDelegationEnableEpoch) - handler.setFlagValue(epoch >= handler.enableEpochsConfig.SetGuardianEnableEpoch, handler.setGuardianFlag, "setGuardianFlag") + handler.setFlagValue(epoch >= handler.enableEpochsConfig.SetGuardianEnableEpoch, handler.setGuardianFlag, "setGuardianFlag", epoch, handler.enableEpochsConfig.SetGuardianEnableEpoch) } func (handler *enableEpochsHandler) setFlagValue(value bool, flag *atomic.Flag, flagName string, epoch uint32, flagEpoch uint32) { diff --git a/common/enablers/epochFlags.go b/common/enablers/epochFlags.go index e8ccaed39ed..7ff321a43f0 100644 --- a/common/enablers/epochFlags.go +++ b/common/enablers/epochFlags.go @@ -90,7 +90,6 @@ type epochFlagsHolder struct { maxBlockchainHookCountersFlag *atomic.Flag wipeSingleNFTLiquidityDecreaseFlag *atomic.Flag alwaysSaveTokenMetaDataFlag *atomic.Flag - guardAccountFlag *atomic.Flag setGuardianFlag *atomic.Flag multiClaimOnDelegationFlag *atomic.Flag } @@ -182,7 +181,6 @@ func newEpochFlagsHolder() *epochFlagsHolder { maxBlockchainHookCountersFlag: &atomic.Flag{}, wipeSingleNFTLiquidityDecreaseFlag: &atomic.Flag{}, alwaysSaveTokenMetaDataFlag: &atomic.Flag{}, - guardAccountFlag: &atomic.Flag{}, // TODO(jls) -> chekc here setGuardianFlag: &atomic.Flag{}, multiClaimOnDelegationFlag: &atomic.Flag{}, } diff --git a/factory/api/apiResolverFactory_test.go b/factory/api/apiResolverFactory_test.go index 24c157a1c3f..5b20c07d6fc 100644 --- a/factory/api/apiResolverFactory_test.go +++ b/factory/api/apiResolverFactory_test.go @@ -291,7 +291,7 @@ func createMockSCQueryElementArgs() api.SCQueryElementArgs { }, EpochConfig: &config.EpochConfig{}, CoreComponents: &mock.CoreComponentsMock{ - AddrPubKeyConv: &mock.PubkeyConverterStub{ + AddrPubKeyConv: &testscommon.PubkeyConverterStub{ DecodeCalled: func(humanReadable string) ([]byte, error) { return []byte(humanReadable), nil }, diff --git a/go.mod b/go.mod index eaf0a747dda..d3e9aa0e192 100644 --- a/go.mod +++ b/go.mod @@ -13,16 +13,16 @@ 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.0 + github.com/multiversx/mx-chain-core-go v1.2.1-0.20230421123655-43ef5c8bf7c6 github.com/multiversx/mx-chain-crypto-go v1.2.6 - github.com/multiversx/mx-chain-es-indexer-go v1.4.0 + github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230421124228-ea27f41fc61c github.com/multiversx/mx-chain-logger-go v1.0.11 - github.com/multiversx/mx-chain-p2p-go v1.0.15 - github.com/multiversx/mx-chain-storage-go v1.0.7 - github.com/multiversx/mx-chain-vm-common-go v1.4.0 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.52 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.53 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.79 + github.com/multiversx/mx-chain-p2p-go v1.0.16-0.20230421124738-1cff98a3d302 + github.com/multiversx/mx-chain-storage-go v1.0.8 + github.com/multiversx/mx-chain-vm-common-go v1.4.1-0.20230421123923-6b8b9b23e272 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53-0.20230421125408-4c158d29a357 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54-0.20230421130005-c59375a795c6 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80-0.20230421130618-1d8f0fbf9d5e 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 2e6958ced94..eac6d50fbef 100644 --- a/go.sum +++ b/go.sum @@ -617,30 +617,26 @@ 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.1.31/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.1.34/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -github.com/multiversx/mx-chain-core-go v1.2.0 h1:K539hKZKcHjBiFQpowFbA3BUd95Fe5+FLC+rKBOFZF0= -github.com/multiversx/mx-chain-core-go v1.2.0/go.mod h1:8gGEQv6BWuuJwhd25qqhCOZbBSv9mk+hLeKvinSaSMk= -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.0 h1:t2UCfbLRbFPBWK1IC1/qOVg+2D6y189xZZ1BoV83gq8= -github.com/multiversx/mx-chain-es-indexer-go v1.4.0/go.mod h1:3glMXvE42VvLlUdiMMtQoDr6uKYS6RGb0icRgyAGXIY= +github.com/multiversx/mx-chain-core-go v1.2.1-0.20230421123655-43ef5c8bf7c6 h1:B9UF0Kj/xQZvMh5SAy4+q/rCCiXcnnF+g2dFSFMkmOM= +github.com/multiversx/mx-chain-core-go v1.2.1-0.20230421123655-43ef5c8bf7c6/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-0.20230421124228-ea27f41fc61c h1:wDpPMYxMx8JeQjpdqc3QHjrniJFfotm77j09W/7UPp4= +github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230421124228-ea27f41fc61c/go.mod h1:0d6KMXEwhsIxrjdScNWIfqWE13rpAouSp9m+tm2Rrsw= 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.15 h1:H7273huZG/zAR6MPvWuXwBEVBsJWH1MeSIDshYV0nh0= -github.com/multiversx/mx-chain-p2p-go v1.0.15/go.mod h1:hUE4H8kGJk3u9gTqeetF3uhjJpnfdV/hALKsJ6bMI+8= -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.36/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.3.37/go.mod h1:sZ2COLCxvf2GxAAJHGmGqWybObLtFuk2tZUyGqnMXE8= -github.com/multiversx/mx-chain-vm-common-go v1.4.0 h1:0i0cJZJOXGzqYzwtKFHSr2yGmnFAdizOuISK8HgsnYo= -github.com/multiversx/mx-chain-vm-common-go v1.4.0/go.mod h1:odBJC92ANA8zLtPh/wwajUUGJOaS88F5QYGf0t8Wgzw= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50 h1:ScUq7/wq78vthMTQ6v5Ux1DvSMQMHxQ2Sl7aPP26q1w= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.50/go.mod h1:e3uYdgoKzs3puaznbmSjDcRisJc5Do4tpg7VqyYwoek= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51 h1:axtp5/mpA+xYJ1cu4KtAGETV4t6v6/tNfQh0HCclBYY= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.51/go.mod h1:oKj32V2nkd+KGNOL6emnwVkDRPpciwHHDqBmeorcL8k= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77 h1:3Yh4brS5/Jye24l5AKy+Q6Yci6Rv55pHyj9/GR3AYos= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.77/go.mod h1:3IaAOHc1JfxL5ywQZIrcaHQu5+CVdZNDaoY64NGOtUE= +github.com/multiversx/mx-chain-p2p-go v1.0.16-0.20230421124738-1cff98a3d302 h1:bw+/We1vYnvI27q9EPquzpx6RcrDa+n7saFKivM8KVo= +github.com/multiversx/mx-chain-p2p-go v1.0.16-0.20230421124738-1cff98a3d302/go.mod h1:4sEcFYRHFqe1CAaZiiJ9ihww2rnKYgW+triOhPARQY8= +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.4.1-0.20230421123923-6b8b9b23e272 h1:0fycWHx3T5tl43D5MTfBvmm01nnPo0R6cQCiDV7+zno= +github.com/multiversx/mx-chain-vm-common-go v1.4.1-0.20230421123923-6b8b9b23e272/go.mod h1:xlPYEjbq25Vv5JLV7nW6DFG21tC5Z2d/+QqvAO9y/eY= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53-0.20230421125408-4c158d29a357 h1:D8/fhYFlPSVNo96jvEg9uq4pIdXdMu78/JpWRCJpdOU= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53-0.20230421125408-4c158d29a357/go.mod h1:58/EJ5dISKBctrCBTKwrKHPM7ndnLUQwpyUWo0+5HD4= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54-0.20230421130005-c59375a795c6 h1:PLKUHpmBCY2Dbue3nuIAIXwFy9Dc4wFWclGDWkoCVoc= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54-0.20230421130005-c59375a795c6/go.mod h1:PQQBykZw5UAkkSa11NrvNorOsbchpQYsW3BoUpJsC8I= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80-0.20230421130618-1d8f0fbf9d5e h1:f+F7hriTbXVCYCN5BIBglwR/HUSAVdjas1G7OiHMw5M= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80-0.20230421130618-1d8f0fbf9d5e/go.mod h1:bvZFLIRg9bGiuauGmydZLy3H63b8Crl8226D0YUOwWU= 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= diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index 49e4b3a8578..88f9f463165 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -2414,7 +2414,7 @@ func (tpn *TestProcessorNode) SendTransaction(tx *dataTransaction.Transaction) ( return "", err } - txArgs := &external.ArgsCreateTransaction{ + txArgsLocal := &external.ArgsCreateTransaction{ Nonce: tx.Nonce, Value: tx.Value.String(), Receiver: encodedRcvAddr, @@ -2428,10 +2428,10 @@ func (tpn *TestProcessorNode) SendTransaction(tx *dataTransaction.Transaction) ( ChainID: string(tx.ChainID), Version: tx.Version, Options: tx.Options, - Guardian: TestAddressPubkeyConverter.Encode(tx.GuardianAddr), + Guardian: TestAddressPubkeyConverter.SilentEncode(tx.GuardianAddr, log), GuardianSigHex: hex.EncodeToString(tx.GuardianSignature), } - tx, txHash, err := tpn.Node.CreateTransaction(txArgs) + tx, txHash, err := tpn.Node.CreateTransaction(txArgsLocal) if err != nil { return "", err } diff --git a/integrationTests/vm/txsFee/guardAccount_test.go b/integrationTests/vm/txsFee/guardAccount_test.go index 1c98ac644f9..01bab1228a5 100644 --- a/integrationTests/vm/txsFee/guardAccount_test.go +++ b/integrationTests/vm/txsFee/guardAccount_test.go @@ -41,11 +41,16 @@ const setGuardianGas = uint64(250000) const transferGas = uint64(1000) var ( - alice = []byte("alice-12345678901234567890123456") - bob = []byte("bob-1234567890123456789012345678") - charlie = []byte("charlie-123456789012345678901234") - david = []byte("david-12345678901234567890123456") - allAddresses = [][]byte{alice, bob, charlie, david} + alice = []byte("alice-12345678901234567890123456") + bob = []byte("bob-1234567890123456789012345678") + charlie = []byte("charlie-123456789012345678901234") + david = []byte("david-12345678901234567890123456") + allAddresses = map[string][]byte{ + "alice": alice, + "bob": bob, + "charlie": charlie, + "david": david, + } uuid = []byte("uuid") transferValue = big.NewInt(2000000) initialMint = big.NewInt(1000000000000000000) @@ -136,7 +141,10 @@ func getLatestGasScheduleVersion(tb testing.TB, directoryToSearch string) string return gasSchedule } -func mintAddress(tb testing.TB, testContext *vm.VMTestContext, address []byte, value *big.Int) { +func mintAddress(tb testing.TB, testContext *vm.VMTestContext, address []byte, value *big.Int, addressDescription string) { + addressString := integrationTests.TestAddressPubkeyConverter.SilentEncode(address, log) + log.Info("minting "+addressDescription+" address", "address", addressString, "value", value) + accnt, err := testContext.Accounts.LoadAccount(address) require.Nil(tb, err) @@ -327,7 +335,9 @@ func testGuardianData( } require.NotNil(tb, guardian) - assert.Equal(tb, info.address, guardian.Address) + expectedAddress := integrationTests.TestAddressPubkeyConverter.SilentEncode(info.address, log) + providedAddress := integrationTests.TestAddressPubkeyConverter.SilentEncode(guardian.Address, log) + assert.Equal(tb, expectedAddress, providedAddress) assert.Equal(tb, info.uuid, guardian.ServiceUID) assert.Equal(tb, info.epoch, guardian.ActivationEpoch) } @@ -345,7 +355,7 @@ func TestGuardAccount_ShouldErrorIfInstantSetIsDoneOnANotProtectedAccount(t *tes defer testContext.Close() // alice is the user, bob is the guardian - mintAddress(t, testContext, alice, initialMint) + mintAddress(t, testContext, alice, initialMint, "alice") expectedStatus := createUnGuardedAccountStatus() testGuardianStatus(t, testContext, alice, expectedStatus) @@ -362,7 +372,7 @@ func TestGuardAccount_ShouldSetGuardianOnANotProtectedAccount(t *testing.T) { defer testContext.Close() // alice is the user, bob is the guardian - mintAddress(t, testContext, alice, initialMint) + mintAddress(t, testContext, alice, initialMint, "alice") expectedStatus := createUnGuardedAccountStatus() testGuardianStatus(t, testContext, alice, expectedStatus) @@ -457,7 +467,7 @@ func TestGuardAccount_SendingFundsWhileProtectedAndNotProtected(t *testing.T) { defer testContext.Close() // alice is the user, bob is the guardian, charlie is the receiver, david is the wrong guardian - mintAddress(t, testContext, alice, initialMint) + mintAddress(t, testContext, alice, initialMint, "alice") expectedStatus := createUnGuardedAccountStatus() testGuardianStatus(t, testContext, alice, expectedStatus) @@ -581,8 +591,8 @@ func TestGuardAccount_Scenario1(t *testing.T) { defer testContext.Close() // step 1 - mint addresses - for _, address := range allAddresses { - mintAddress(t, testContext, address, initialMint) + for addressDescription, address := range allAddresses { + mintAddress(t, testContext, address, initialMint, addressDescription) } expectedStatus := createUnGuardedAccountStatus() for _, address := range allAddresses { @@ -863,8 +873,8 @@ func TestGuardAccounts_RelayedTransactionV1(t *testing.T) { defer testContext.Close() // step 1 - mint addresses - for _, address := range allAddresses { - mintAddress(t, testContext, address, initialMint) + for addressDescription, address := range allAddresses { + mintAddress(t, testContext, address, initialMint, addressDescription) } expectedStatus := createUnGuardedAccountStatus() for _, address := range allAddresses { @@ -983,8 +993,8 @@ func TestGuardAccounts_RelayedTransactionV2(t *testing.T) { defer testContext.Close() // step 1 - mint addresses - for _, address := range allAddresses { - mintAddress(t, testContext, address, initialMint) + for addressDescription, address := range allAddresses { + mintAddress(t, testContext, address, initialMint, addressDescription) } expectedStatus := createUnGuardedAccountStatus() for _, address := range allAddresses { diff --git a/node/external/transactionAPI/unmarshaller.go b/node/external/transactionAPI/unmarshaller.go index e3a8b6757ee..c9526217f4f 100644 --- a/node/external/transactionAPI/unmarshaller.go +++ b/node/external/transactionAPI/unmarshaller.go @@ -129,11 +129,11 @@ func (tu *txUnmarshaller) prepareNormalTx(tx *transaction.Transaction) *transact } if len(tx.GuardianAddr) > 0 { - apiTx.GuardianAddr = tu.addressPubKeyConverter.Encode(tx.GuardianAddr) + apiTx.GuardianAddr = tu.addressPubKeyConverter.SilentEncode(tx.GuardianAddr, log) apiTx.GuardianSignature = hex.EncodeToString(tx.GuardianSignature) } - return apiTx, nil + return apiTx } func (tu *txUnmarshaller) prepareInvalidTx(tx *transaction.Transaction) *transaction.ApiTransactionResult { @@ -159,11 +159,11 @@ func (tu *txUnmarshaller) prepareInvalidTx(tx *transaction.Transaction) *transac } if len(tx.GuardianAddr) > 0 { - apiTx.GuardianAddr = tu.addressPubKeyConverter.Encode(tx.GuardianAddr) + apiTx.GuardianAddr = tu.addressPubKeyConverter.SilentEncode(tx.GuardianAddr, log) apiTx.GuardianSignature = hex.EncodeToString(tx.GuardianSignature) } - return apiTx, nil + return apiTx } func (tu *txUnmarshaller) prepareRewardTx(tx *rewardTxData.RewardTx) *transaction.ApiTransactionResult { diff --git a/node/node.go b/node/node.go index c1728d0af0f..3de7c9610a4 100644 --- a/node/node.go +++ b/node/node.go @@ -400,14 +400,14 @@ func (n *Node) getPendingAndActiveGuardians( if active != nil { activeGuardian = &api.Guardian{ - Address: n.coreComponents.AddressPubKeyConverter().Encode(active.Address), + Address: n.coreComponents.AddressPubKeyConverter().SilentEncode(active.Address, log), ActivationEpoch: active.ActivationEpoch, ServiceUID: string(active.ServiceUID), } } if pending != nil { pendingGuardian = &api.Guardian{ - Address: n.coreComponents.AddressPubKeyConverter().Encode(pending.Address), + Address: n.coreComponents.AddressPubKeyConverter().SilentEncode(pending.Address, log), ActivationEpoch: pending.ActivationEpoch, ServiceUID: string(pending.ServiceUID), } @@ -654,9 +654,9 @@ func (n *Node) GetAllESDTTokens(address string, options api.AccountQueryOptions, } if esdtToken.TokenMetaData != nil { - esdtTokenCreatorAddr, err := n.coreComponents.AddressPubKeyConverter().Encode(esdtToken.TokenMetaData.Creator) - if err != nil { - return nil, api.BlockInfo{}, err + esdtTokenCreatorAddr, errEncode := n.coreComponents.AddressPubKeyConverter().Encode(esdtToken.TokenMetaData.Creator) + if errEncode != nil { + return nil, api.BlockInfo{}, errEncode } esdtToken.TokenMetaData.Creator = []byte(esdtTokenCreatorAddr) tokenName = adjustNftTokenIdentifier(tokenName, esdtToken.TokenMetaData.Nonce) diff --git a/node/nodeRunner_test.go b/node/nodeRunner_test.go index a7dd9dac1a1..ce0242db3f7 100644 --- a/node/nodeRunner_test.go +++ b/node/nodeRunner_test.go @@ -83,6 +83,7 @@ func createConfigs(tb testing.TB) *config.Configs { WorkingDir: tempDir, NoKeyProvided: true, Version: "test version", + DbDir: path.Join(tempDir, "db"), }, ImportDbConfig: &config.ImportDbConfig{}, ConfigurationPathsHolder: &config.ConfigurationPathsHolder{ diff --git a/node/node_test.go b/node/node_test.go index baeb7920e45..e8309d770dd 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -2560,7 +2560,7 @@ func TestCreateTransaction_InvalidGuardianSigShouldErr(t *testing.T) { coreComponents.VmMarsh = getMarshalizer() coreComponents.TxMarsh = getMarshalizer() coreComponents.Hash = getHasher() - coreComponents.AddrPubKeyConv = &mock.PubkeyConverterStub{ + coreComponents.AddrPubKeyConv = &testscommon.PubkeyConverterStub{ DecodeCalled: func(hexAddress string) ([]byte, error) { return []byte(hexAddress), nil }, @@ -2596,7 +2596,7 @@ func TestCreateTransaction_InvalidGuardianAddressLenShouldErr(t *testing.T) { coreComponents.Hash = getHasher() encodedAddressLen := 8 - coreComponents.AddrPubKeyConv = &mock.PubkeyConverterStub{ + coreComponents.AddrPubKeyConv = &testscommon.PubkeyConverterStub{ DecodeCalled: func(hexAddress string) ([]byte, error) { return []byte(hexAddress), nil }, @@ -2631,7 +2631,7 @@ func TestCreateTransaction_AddressPubKeyConverterDecode(t *testing.T) { minAddrLen := 4 encodedAddressLen := 8 - addrPubKeyConverter := &mock.PubkeyConverterStub{ + addrPubKeyConverter := &testscommon.PubkeyConverterStub{ DecodeCalled: func(hexAddress string) ([]byte, error) { if len(hexAddress) < minAddrLen { return nil, errors.New("decode error") @@ -4547,7 +4547,7 @@ func TestNode_setTxGuardianData(t *testing.T) { node.WithCoreComponents(coreComponents), ) guardianPubKey := bytes.Repeat([]byte{1}, lenPubKey) - guardian := coreComponents.AddrPubKeyConv.Encode(guardianPubKey) + guardian, _ := coreComponents.AddrPubKeyConv.Encode(guardianPubKey) guardianSig := []byte("guardian sig") guardianSigHex := hex.EncodeToString(guardianSig) @@ -4590,10 +4590,10 @@ func TestNode_setTxGuardianData(t *testing.T) { func TestNode_GetGuardianData(t *testing.T) { userAddressBytes := bytes.Repeat([]byte{3}, 32) - acc, _ := state.NewUserAccount(userAddressBytes) - accDB := &stateMock.AccountsStub{ + testAccount, _ := state.NewUserAccount(userAddressBytes) + testAccountsDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return acc, nil, nil + return testAccount, nil, nil }, RecreateTrieCalled: func(_ []byte) error { return nil @@ -4605,14 +4605,14 @@ func TestNode_GetGuardianData(t *testing.T) { coreComponents.VmMarsh = getMarshalizer() coreComponents.Hash = getHasher() coreComponents.AddrPubKeyConv = createMockPubkeyConverter() - stateComponents := getDefaultStateComponents() + testStateComponents := getDefaultStateComponents() args := state.ArgsAccountsRepository{ - FinalStateAccountsWrapper: accDB, - CurrentStateAccountsWrapper: accDB, - HistoricalStateAccountsWrapper: accDB, + FinalStateAccountsWrapper: testAccountsDB, + CurrentStateAccountsWrapper: testAccountsDB, + HistoricalStateAccountsWrapper: testAccountsDB, } - stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) - userAddress := coreComponents.AddressPubKeyConverter().Encode(userAddressBytes) + testStateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + userAddress, _ := coreComponents.AddressPubKeyConverter().Encode(userAddressBytes) g1 := &guardians.Guardian{ Address: bytes.Repeat([]byte{1}, 32), ActivationEpoch: 0, @@ -4621,30 +4621,32 @@ func TestNode_GetGuardianData(t *testing.T) { Address: bytes.Repeat([]byte{2}, 32), ActivationEpoch: 1, } + addressG1, _ := coreComponents.AddressPubKeyConverter().Encode(g1.Address) apiG1 := &api.Guardian{ - Address: coreComponents.AddressPubKeyConverter().Encode(g1.Address), + Address: addressG1, ActivationEpoch: g1.ActivationEpoch, } + addressG2, _ := coreComponents.AddressPubKeyConverter().Encode(g2.Address) apiG2 := &api.Guardian{ - Address: coreComponents.AddressPubKeyConverter().Encode(g2.Address), + Address: addressG2, ActivationEpoch: g2.ActivationEpoch, } t.Run("error on loadUserAccountHandlerByAddress", func(t *testing.T) { accDB := &stateMock.AccountsStub{ GetAccountWithBlockInfoCalled: func(address []byte, options common.RootHashHolder) (vmcommon.AccountHandler, common.BlockInfo, error) { - return acc, nil, nil + return testAccount, nil, nil }, RecreateTrieCalled: func(_ []byte) error { return nil }, } stateComponents := getDefaultStateComponents() - args := state.ArgsAccountsRepository{ + argsLocal := state.ArgsAccountsRepository{ FinalStateAccountsWrapper: accDB, CurrentStateAccountsWrapper: accDB, HistoricalStateAccountsWrapper: accDB, } - stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(argsLocal) n, _ := node.NewNode( node.WithDataComponents(dataComponents), node.WithCoreComponents(coreComponents), @@ -4667,12 +4669,12 @@ func TestNode_GetGuardianData(t *testing.T) { }, } stateComponents := getDefaultStateComponents() - args := state.ArgsAccountsRepository{ + argsLocal := state.ArgsAccountsRepository{ FinalStateAccountsWrapper: accDB, CurrentStateAccountsWrapper: accDB, HistoricalStateAccountsWrapper: accDB, } - stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(argsLocal) n, _ := node.NewNode( node.WithDataComponents(dataComponents), node.WithCoreComponents(coreComponents), @@ -4699,7 +4701,7 @@ func TestNode_GetGuardianData(t *testing.T) { n, _ := node.NewNode( node.WithDataComponents(dataComponents), node.WithCoreComponents(coreComponents), - node.WithStateComponents(stateComponents), + node.WithStateComponents(testStateComponents), node.WithBootstrapComponents(bootstrapComponents), ) guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) @@ -4717,7 +4719,7 @@ func TestNode_GetGuardianData(t *testing.T) { n, _ := node.NewNode( node.WithDataComponents(dataComponents), node.WithCoreComponents(coreComponents), - node.WithStateComponents(stateComponents), + node.WithStateComponents(testStateComponents), node.WithBootstrapComponents(bootstrapComponents), ) guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) @@ -4739,7 +4741,7 @@ func TestNode_GetGuardianData(t *testing.T) { n, _ := node.NewNode( node.WithDataComponents(dataComponents), node.WithCoreComponents(coreComponents), - node.WithStateComponents(stateComponents), + node.WithStateComponents(testStateComponents), node.WithBootstrapComponents(bootstrapComponents), ) guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) @@ -4761,7 +4763,7 @@ func TestNode_GetGuardianData(t *testing.T) { n, _ := node.NewNode( node.WithDataComponents(dataComponents), node.WithCoreComponents(coreComponents), - node.WithStateComponents(stateComponents), + node.WithStateComponents(testStateComponents), node.WithBootstrapComponents(bootstrapComponents), ) guardianData, blockInfo, err := n.GetGuardianData(userAddress, api.AccountQueryOptions{}) @@ -4785,12 +4787,12 @@ func TestNode_GetGuardianData(t *testing.T) { }, } stateComponents := getDefaultStateComponents() - args := state.ArgsAccountsRepository{ + argsLocal := state.ArgsAccountsRepository{ FinalStateAccountsWrapper: accDB, CurrentStateAccountsWrapper: accDB, HistoricalStateAccountsWrapper: accDB, } - stateComponents.AccountsRepo, _ = state.NewAccountsRepository(args) + stateComponents.AccountsRepo, _ = state.NewAccountsRepository(argsLocal) bootstrapComponents := getDefaultBootstrapComponents() bootstrapComponents.GuardedAccountHandlerField = &guardianMocks.GuardedAccountHandlerStub{ GetConfiguredGuardiansCalled: func(uah state.UserAccountHandler) (active *guardians.Guardian, pending *guardians.Guardian, err error) { @@ -4829,12 +4831,14 @@ func TestNode_getPendingAndActiveGuardians(t *testing.T) { ActivationEpoch: 1, } + addressG1, _ := coreComponents.AddrPubKeyConv.Encode(g1.Address) expectedG1 := &api.Guardian{ - Address: coreComponents.AddrPubKeyConv.Encode(g1.Address), + Address: addressG1, ActivationEpoch: g1.ActivationEpoch, } + addressG2, _ := coreComponents.AddrPubKeyConv.Encode(g2.Address) expectedG2 := &api.Guardian{ - Address: coreComponents.AddrPubKeyConv.Encode(g2.Address), + Address: addressG2, ActivationEpoch: g2.ActivationEpoch, } diff --git a/process/dataValidators/txValidator_test.go b/process/dataValidators/txValidator_test.go index 1a164d416fe..7037932bb02 100644 --- a/process/dataValidators/txValidator_test.go +++ b/process/dataValidators/txValidator_test.go @@ -157,7 +157,7 @@ func TestNewTxValidator_NilTxVersionCheckerShouldErr(t *testing.T) { adb, shardCoordinator, &testscommon.WhiteListHandlerStub{}, - mock.NewPubkeyConverterMock(32), + testscommon.NewPubkeyConverterMock(32), nil, maxNonceDeltaAllowed, ) diff --git a/process/transaction/interceptedTransaction_test.go b/process/transaction/interceptedTransaction_test.go index 699b42e6b5b..74efd6716b0 100644 --- a/process/transaction/interceptedTransaction_test.go +++ b/process/transaction/interceptedTransaction_test.go @@ -99,7 +99,7 @@ func createInterceptedTxWithTxFeeHandlerAndVersionChecker(tx *dataTransaction.Tr &hashingMocks.HasherMock{}, createKeyGenMock(), createDummySigner(), - &mock.PubkeyConverterStub{ + &testscommon.PubkeyConverterStub{ LenCalled: func() int { return 32 }, @@ -1688,11 +1688,11 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { }, } setGuardianBuiltinCallData := []byte("SetGuardian@xxxx") - tx1 := &dataTransaction.Transaction{ + testTx1 := &dataTransaction.Transaction{ GasPrice: maxAllowedGasPriceSetGuardian / 2, Data: setGuardianBuiltinCallData, } - tx2 := &dataTransaction.Transaction{ + testTx2 := &dataTransaction.Transaction{ GasPrice: maxAllowedGasPriceSetGuardian * 2, Data: setGuardianBuiltinCallData, } @@ -1703,9 +1703,9 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { return true }, } - inTx1, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(tx1, feeHandler, txVersionChecker) + inTx1, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(testTx1, feeHandler, txVersionChecker) require.Nil(t, err) - inTx2, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(tx2, feeHandler, txVersionChecker) + inTx2, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(testTx2, feeHandler, txVersionChecker) require.Nil(t, err) errMaxGasPrice := inTx1.CheckMaxGasPrice() @@ -1715,9 +1715,9 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { require.Nil(t, errMaxGasPrice) }) t.Run("not guarded Tx, not setGuardian always OK", func(t *testing.T) { - tx1 := *tx1 + tx1 := *testTx1 tx1.Data = []byte("dummy") - tx2 := *tx2 + tx2 := *testTx2 tx2.Data = []byte("dummy") txVersionChecker := &testscommon.TxVersionCheckerStub{ @@ -1738,9 +1738,9 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { require.Nil(t, errMaxGasPrice) }) t.Run("not guarded Tx with setGuardian call and price lower than max or equal OK", func(t *testing.T) { - tx1 := *tx1 + tx1 := *testTx1 tx1.GasPrice = maxAllowedGasPriceSetGuardian - tx2 := *tx2 + tx2 := *testTx2 tx2.GasPrice = maxAllowedGasPriceSetGuardian / 2 txVersionChecker := &testscommon.TxVersionCheckerStub{ @@ -1761,7 +1761,7 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { require.Nil(t, errMaxGasPrice) }) t.Run("not guarded Tx with setGuardian call and price higher than max err", func(t *testing.T) { - tx1 := *tx1 + tx1 := *testTx1 tx1.GasPrice = maxAllowedGasPriceSetGuardian * 2 txVersionChecker := &testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *dataTransaction.Transaction) bool { @@ -1780,7 +1780,7 @@ func TestInterceptedTransaction_checkMaxGasPrice(t *testing.T) { func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { t.Parallel() - txVersionChecker := testscommon.TxVersionCheckerStub{ + testTxVersionChecker := testscommon.TxVersionCheckerStub{ IsGuardedTransactionCalled: func(tx *dataTransaction.Transaction) bool { return true }, @@ -1790,15 +1790,15 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { return 1000 }, } - tx := dataTransaction.Transaction{ + testTx := dataTransaction.Transaction{ Data: []byte("some data"), GuardianAddr: []byte("guardian addr"), GuardianSignature: []byte("guardian signature"), } t.Run("get data for signing with error", func(t *testing.T) { - tx := tx - txVersionChecker := txVersionChecker + tx := testTx + txVersionChecker := testTxVersionChecker txVersionChecker.IsSignedWithHashCalled = func(tx *dataTransaction.Transaction) bool { return true } @@ -1808,9 +1808,9 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { require.Equal(t, process.ErrTransactionSignedWithHashIsNotEnabled, err) }) t.Run("nil guardian sig", func(t *testing.T) { - tx := tx + tx := testTx tx.GuardianSignature = nil - inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &testTxVersionChecker) require.Nil(t, err) err = inTx.VerifyGuardianSig(&tx) @@ -1818,9 +1818,9 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { require.Contains(t, err.Error(), "guardian's signature") }) t.Run("normal TX with not empty guardian address", func(t *testing.T) { - tx := tx + tx := testTx tx.GuardianAddr = []byte("guardian addr") - txVersionChecker := txVersionChecker + txVersionChecker := testTxVersionChecker txVersionChecker.IsGuardedTransactionCalled = func(tx *dataTransaction.Transaction) bool { return false } @@ -1831,10 +1831,10 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { require.True(t, errors.Is(err, process.ErrGuardianAddressNotExpected)) }) t.Run("normal TX with guardian sig", func(t *testing.T) { - tx := tx + tx := testTx tx.GuardianAddr = nil tx.GuardianSignature = []byte("guardian signature") - txVersionChecker := txVersionChecker + txVersionChecker := testTxVersionChecker txVersionChecker.IsGuardedTransactionCalled = func(tx *dataTransaction.Transaction) bool { return false } @@ -1845,9 +1845,9 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { require.True(t, errors.Is(err, process.ErrGuardianSignatureNotExpected)) }) t.Run("wrong guardian sig", func(t *testing.T) { - tx := tx + tx := testTx tx.GuardianSignature = sigBad - inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &testTxVersionChecker) require.Nil(t, err) err = inTx.VerifyGuardianSig(&tx) @@ -1855,9 +1855,9 @@ func TestInterceptedTransaction_VerifyGuardianSig(t *testing.T) { require.Contains(t, err.Error(), "guardian's signature") }) t.Run("correct guardian sig", func(t *testing.T) { - tx := tx + tx := testTx tx.GuardianSignature = sigOk - inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &txVersionChecker) + inTx, err := createInterceptedTxWithTxFeeHandlerAndVersionChecker(&tx, feeHandler, &testTxVersionChecker) require.Nil(t, err) err = inTx.VerifyGuardianSig(&tx) diff --git a/storage/clean/oldDataCleanerProvider_test.go b/storage/clean/oldDataCleanerProvider_test.go index fa5e9cbf310..85cbd3a47e9 100644 --- a/storage/clean/oldDataCleanerProvider_test.go +++ b/storage/clean/oldDataCleanerProvider_test.go @@ -28,7 +28,7 @@ func TestNewOldDataCleanerProvider(t *testing.T) { args := createMockArgOldDataCleanerProvider() args.NodeTypeProvider = nil odcp, err := NewOldDataCleanerProvider(args) - require.True(t, check.IfNil(odcp)) + require.Nil(t, odcp) require.Equal(t, storage.ErrNilNodeTypeProvider, err) }) t.Run("nil ManagedPeersHolder should error", func(t *testing.T) { @@ -37,16 +37,15 @@ func TestNewOldDataCleanerProvider(t *testing.T) { args := createMockArgOldDataCleanerProvider() args.ManagedPeersHolder = nil odcp, err := NewOldDataCleanerProvider(args) - require.True(t, check.IfNil(odcp)) + require.Nil(t, odcp) require.Equal(t, storage.ErrNilManagedPeersHolder, err) }) - //TODO(jls) check test here t.Run("should work", func(t *testing.T) { t.Parallel() odcp, err := NewOldDataCleanerProvider(createMockArgOldDataCleanerProvider()) require.NoError(t, err) - require.False(t, check.IfNil(odcp)) + require.NotNil(t, odcp) }) } @@ -143,6 +142,7 @@ func TestOldDataCleanerProvider_IsInterfaceNil(t *testing.T) { var odcp *oldDataCleanerProvider require.True(t, odcp.IsInterfaceNil()) - odcp, _ = NewOldDataCleanerProvider(&nodeTypeProviderMock.NodeTypeProviderStub{}, config.StoragePruningConfig{}) + args := createMockArgOldDataCleanerProvider() + odcp, _ = NewOldDataCleanerProvider(args) require.False(t, odcp.IsInterfaceNil()) } diff --git a/storage/factory/storageServiceFactory_test.go b/storage/factory/storageServiceFactory_test.go index cda7e0c408a..2d5cf95522a 100644 --- a/storage/factory/storageServiceFactory_test.go +++ b/storage/factory/storageServiceFactory_test.go @@ -8,6 +8,7 @@ import ( "github.com/multiversx/mx-chain-go/config" "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/storage/mock" + "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -19,9 +20,7 @@ func createMockArgument(t *testing.T) StorageServiceFactoryArgs { return StorageServiceFactoryArgs{ Config: config.Config{ - StateTriesConfig: config.StateTriesConfig{ - SnapshotsEnabled: true, - }, + StateTriesConfig: config.StateTriesConfig{}, StoragePruning: config.StoragePruningConfig{ Enabled: true, NumActivePersisters: 3, @@ -75,6 +74,7 @@ func createMockArgument(t *testing.T) StorageServiceFactoryArgs { StorageType: ProcessStorageService, CurrentEpoch: 0, CreateTrieEpochRootHashStorer: true, + ManagedPeersHolder: &testscommon.ManagedPeersHolderStub{}, } } @@ -449,20 +449,6 @@ func TestStorageServiceFactory_CreateForShard(t *testing.T) { assert.Equal(t, expectedStorers, len(allStorers)) _ = storageService.CloseAll() }) - t.Run("should work if the snapshots are not enabled", func(t *testing.T) { - t.Parallel() - - args := createMockArgument(t) - args.Config.StateTriesConfig.SnapshotsEnabled = false - storageServiceFactory, _ := NewStorageServiceFactory(args) - storageService, err := storageServiceFactory.CreateForShard() - assert.Nil(t, err) - assert.False(t, check.IfNil(storageService)) - allStorers := storageService.GetAllStorers() - expectedStorers := 25 - assert.Equal(t, expectedStorers, len(allStorers)) - _ = storageService.CloseAll() - }) } func TestStorageServiceFactory_CreateForMeta(t *testing.T) { diff --git a/trie/patriciaMerkleTrie_test.go b/trie/patriciaMerkleTrie_test.go index 0f687922f21..ae93bf933e4 100644 --- a/trie/patriciaMerkleTrie_test.go +++ b/trie/patriciaMerkleTrie_test.go @@ -1009,7 +1009,7 @@ func TestPatriciaMerkleTrie_ConcurrentOperations(t *testing.T) { case 12: trieIteratorChannels := &common.TrieIteratorChannels{ LeavesChan: make(chan core.KeyValueHolder, 1000), - ErrChan: make(chan error, 1000), + ErrChan: errChan.NewErrChanWrapper(), } err := tr.GetAllLeavesOnChannel( From c3ee2d66f96fad37d41a246e04ff14c1780aba10 Mon Sep 17 00:00:00 2001 From: jules01 Date: Fri, 21 Apr 2023 18:14:07 +0300 Subject: [PATCH 308/335] - skipped a test in `-race` mode --- node/external/timemachine/fee/memoryFootprint/memory_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/node/external/timemachine/fee/memoryFootprint/memory_test.go b/node/external/timemachine/fee/memoryFootprint/memory_test.go index fe1ea0d40e9..9ac5146a4ba 100644 --- a/node/external/timemachine/fee/memoryFootprint/memory_test.go +++ b/node/external/timemachine/fee/memoryFootprint/memory_test.go @@ -14,6 +14,10 @@ import ( // keep this test in a separate package as to not be influenced by other the tests from the same package func TestFeeComputer_MemoryFootprint(t *testing.T) { + if testing.Short() { + t.Skip("this test is not relevant and will fail if started with -race") + } + numEpochs := 10000 maxFootprintNumBytes := 48_000_000 From 315e8b46c45a8ed91e71f332e7841ca387b91346 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 24 Apr 2023 09:23:45 +0300 Subject: [PATCH 309/335] consistency change --- vm/systemSmartContracts/governance.go | 8 ++++---- vm/systemSmartContracts/governance_test.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 08fdf7bbb10..5a80b0d6acf 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -852,7 +852,7 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error minQuorumOutOfStake := core.GetIntTrimmedPercentageOfValue(totalStake, float64(baseConfig.MinQuorum)) if totalVotes.Cmp(minQuorumOutOfStake) == -1 { - g.eei.AddReturnMessage("Proposal did not reach minQuorum") + g.eei.Finish([]byte("Proposal did not reach minQuorum")) proposal.Passed = false return nil } @@ -860,18 +860,18 @@ func (g *governanceContract) computeEndResults(proposal *GeneralProposal) error minVetoOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, float64(baseConfig.MinVetoThreshold)) if proposal.Veto.Cmp(minVetoOfTotalVotes) >= 0 { proposal.Passed = false - g.eei.AddReturnMessage("Proposal vetoed") + g.eei.Finish([]byte("Proposal vetoed")) return nil } minPassOfTotalVotes := core.GetIntTrimmedPercentageOfValue(totalVotes, float64(baseConfig.MinPassThreshold)) if proposal.Yes.Cmp(minPassOfTotalVotes) >= 0 && proposal.Yes.Cmp(proposal.No) > 0 { - g.eei.AddReturnMessage("Proposal passed") + g.eei.Finish([]byte("Proposal passed")) proposal.Passed = true return nil } - g.eei.AddReturnMessage("Proposal rejected") + g.eei.Finish([]byte("Proposal rejected")) proposal.Passed = false return nil } diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index ab6f7803e8e..37c5567bcd7 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -1697,8 +1697,8 @@ func TestComputeEndResults(t *testing.T) { GetBalanceCalled: func(_ []byte) *big.Int { return big.NewInt(100) }, - AddReturnMessageCalled: func(msg string) { - retMessage = msg + FinishCalled: func(value []byte) { + retMessage = string(value) }, } gsc, _ := NewGovernanceContract(args) From 494909ca33c346c7d58dd4595464abaf32ef8207 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 24 Apr 2023 13:15:16 +0300 Subject: [PATCH 310/335] consistency change --- vm/systemSmartContracts/governance.go | 4 ++-- vm/systemSmartContracts/governance_test.go | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/vm/systemSmartContracts/governance.go b/vm/systemSmartContracts/governance.go index 5a80b0d6acf..2e97f2ccb97 100644 --- a/vm/systemSmartContracts/governance.go +++ b/vm/systemSmartContracts/governance.go @@ -617,7 +617,7 @@ func (g *governanceContract) closeProposal(args *vmcommon.ContractCallInput) vmc return vmcommon.UserError } - err = g.eei.Transfer(args.RecipientAddr, args.CallerAddr, generalProposal.ProposalCost, nil, 0) + err = g.eei.Transfer(args.CallerAddr, args.RecipientAddr, generalProposal.ProposalCost, nil, 0) if err != nil { g.eei.AddReturnMessage(err.Error()) return vmcommon.UserError @@ -975,7 +975,7 @@ func (g *governanceContract) getDelegatedContractInfo(scAddress []byte, referenc if err != nil { return nil, err } - log.Error("total stake" + " " + totalStake.String()) + scVoteInfo.TotalPower.Set(totalVotingPower) scVoteInfo.TotalStake.Set(totalStake) diff --git a/vm/systemSmartContracts/governance_test.go b/vm/systemSmartContracts/governance_test.go index 37c5567bcd7..3faf8489503 100644 --- a/vm/systemSmartContracts/governance_test.go +++ b/vm/systemSmartContracts/governance_test.go @@ -875,12 +875,10 @@ func TestGovernanceContract_DelegateVoteMoreErrors(t *testing.T) { require.Equal(t, vmcommon.UserError, retCode) require.True(t, strings.Contains(eei.GetReturnMessage(), "not enough voting power to cast this vote")) - fmt.Println("should work") callInput.Arguments[3] = big.NewInt(12).Bytes() retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.Ok, retCode) - fmt.Println("next run") retCode = gsc.Execute(callInput) require.Equal(t, vmcommon.UserError, retCode) require.True(t, strings.Contains(eei.GetReturnMessage(), "double vote is not allowed")) From 60650e889301dcc74e5c8828fb4223b02e3fadb4 Mon Sep 17 00:00:00 2001 From: jules01 Date: Mon, 24 Apr 2023 15:03:28 +0300 Subject: [PATCH 311/335] - proper releases --- go.mod | 14 +++++++------- go.sum | 28 ++++++++++++++-------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index d3e9aa0e192..bba09a4e3c7 100644 --- a/go.mod +++ b/go.mod @@ -13,16 +13,16 @@ 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.20230421123655-43ef5c8bf7c6 + github.com/multiversx/mx-chain-core-go v1.2.1 github.com/multiversx/mx-chain-crypto-go v1.2.6 - github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230421124228-ea27f41fc61c + 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-0.20230421124738-1cff98a3d302 + github.com/multiversx/mx-chain-p2p-go v1.0.16 github.com/multiversx/mx-chain-storage-go v1.0.8 - github.com/multiversx/mx-chain-vm-common-go v1.4.1-0.20230421123923-6b8b9b23e272 - github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53-0.20230421125408-4c158d29a357 - github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54-0.20230421130005-c59375a795c6 - github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80-0.20230421130618-1d8f0fbf9d5e + github.com/multiversx/mx-chain-vm-common-go v1.4.1 + github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53 + github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54 + github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80 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 eac6d50fbef..3b5e4647240 100644 --- a/go.sum +++ b/go.sum @@ -617,26 +617,26 @@ 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-0.20230421123655-43ef5c8bf7c6 h1:B9UF0Kj/xQZvMh5SAy4+q/rCCiXcnnF+g2dFSFMkmOM= -github.com/multiversx/mx-chain-core-go v1.2.1-0.20230421123655-43ef5c8bf7c6/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-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-0.20230421124228-ea27f41fc61c h1:wDpPMYxMx8JeQjpdqc3QHjrniJFfotm77j09W/7UPp4= -github.com/multiversx/mx-chain-es-indexer-go v1.4.1-0.20230421124228-ea27f41fc61c/go.mod h1:0d6KMXEwhsIxrjdScNWIfqWE13rpAouSp9m+tm2Rrsw= +github.com/multiversx/mx-chain-es-indexer-go v1.4.1 h1:gD/D7xZP7OL8L/ZZ3SoOfKjVHrU0iUxIG2AbidHFTUc= +github.com/multiversx/mx-chain-es-indexer-go v1.4.1/go.mod h1:o+LWvL+UEKx1lrFhkV2SfxoaFybKro3ZLN4HOMGXDos= 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.16-0.20230421124738-1cff98a3d302 h1:bw+/We1vYnvI27q9EPquzpx6RcrDa+n7saFKivM8KVo= -github.com/multiversx/mx-chain-p2p-go v1.0.16-0.20230421124738-1cff98a3d302/go.mod h1:4sEcFYRHFqe1CAaZiiJ9ihww2rnKYgW+triOhPARQY8= +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-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.4.1-0.20230421123923-6b8b9b23e272 h1:0fycWHx3T5tl43D5MTfBvmm01nnPo0R6cQCiDV7+zno= -github.com/multiversx/mx-chain-vm-common-go v1.4.1-0.20230421123923-6b8b9b23e272/go.mod h1:xlPYEjbq25Vv5JLV7nW6DFG21tC5Z2d/+QqvAO9y/eY= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53-0.20230421125408-4c158d29a357 h1:D8/fhYFlPSVNo96jvEg9uq4pIdXdMu78/JpWRCJpdOU= -github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53-0.20230421125408-4c158d29a357/go.mod h1:58/EJ5dISKBctrCBTKwrKHPM7ndnLUQwpyUWo0+5HD4= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54-0.20230421130005-c59375a795c6 h1:PLKUHpmBCY2Dbue3nuIAIXwFy9Dc4wFWclGDWkoCVoc= -github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54-0.20230421130005-c59375a795c6/go.mod h1:PQQBykZw5UAkkSa11NrvNorOsbchpQYsW3BoUpJsC8I= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80-0.20230421130618-1d8f0fbf9d5e h1:f+F7hriTbXVCYCN5BIBglwR/HUSAVdjas1G7OiHMw5M= -github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80-0.20230421130618-1d8f0fbf9d5e/go.mod h1:bvZFLIRg9bGiuauGmydZLy3H63b8Crl8226D0YUOwWU= +github.com/multiversx/mx-chain-vm-common-go v1.4.1 h1:HHZF9zU4WsMbfLrCarx3ESM95caWUrPBleGHKdsbzgc= +github.com/multiversx/mx-chain-vm-common-go v1.4.1/go.mod h1:K6yCdro8VohzYI6GwjGzTO+fJiPgO5coo2sgQb+zA24= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53 h1:HGbatzgIhVPJASN3ADnygH4MrKypAidOVtZkHkY/jKw= +github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53/go.mod h1:STVJW9m/TUJ9Q64W/T4P/KuhP5fPb+cCb6Q4gSehWJg= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54 h1:bl2essObOEDwVWci71hJ2QO5AYTsKk6IlzRK0i8y63w= +github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54/go.mod h1:1rgU8wXdn76S7rZx+4YS6ObK+M1XiSdPoPmXVq8fuZE= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80 h1:iiOXTcwvfjQXlchlVnSdNeqHYKVn/k7s/MsHfk/wrr0= +github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80/go.mod h1:Be8y+QBPSKacW2TJaaQSeKYNGtCenFt4dpBOAnICAcc= 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 4f3be0916c97c40486bbfd0bb1bb6894b84a8847 Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 24 Apr 2023 16:03:47 +0300 Subject: [PATCH 312/335] fixes after merge --- .../metachain/intermediateProcessorsContainerFactory_test.go | 2 +- .../shard/intermediateProcessorsContainerFactory_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go index f35c91c2b15..327ac2b6812 100644 --- a/process/factory/metachain/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/metachain/intermediateProcessorsContainerFactory_test.go @@ -26,7 +26,7 @@ func createMockArgsNewIntermediateProcessorsFactory() metachain.ArgsNewIntermedi PubkeyConverter: createMockPubkeyConverter(), Store: &storageStubs.ChainStorerStub{}, PoolsHolder: dataRetrieverMock.NewPoolsHolderMock(), - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, } return args diff --git a/process/factory/shard/intermediateProcessorsContainerFactory_test.go b/process/factory/shard/intermediateProcessorsContainerFactory_test.go index eb03654fd97..a3aae67c19c 100644 --- a/process/factory/shard/intermediateProcessorsContainerFactory_test.go +++ b/process/factory/shard/intermediateProcessorsContainerFactory_test.go @@ -60,7 +60,7 @@ func createMockArgsNewIntermediateProcessorsFactory() shard.ArgsNewIntermediateP PubkeyConverter: createMockPubkeyConverter(), Store: &storageStubs.ChainStorerStub{}, PoolsHolder: createDataPools(), - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, } return args From a4f40976bc9583e8e0604015983dd2d6a965440f Mon Sep 17 00:00:00 2001 From: robertsasu Date: Mon, 24 Apr 2023 16:12:04 +0300 Subject: [PATCH 313/335] fixes after merge --- .../postprocess/intermediateResults_test.go | 20 +++++++++---------- process/coordinator/process_test.go | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/process/block/postprocess/intermediateResults_test.go b/process/block/postprocess/intermediateResults_test.go index 277a1cbaaf9..67633564fea 100644 --- a/process/block/postprocess/intermediateResults_test.go +++ b/process/block/postprocess/intermediateResults_test.go @@ -38,7 +38,7 @@ func createMockArgsNewIntermediateResultsProcessor() ArgsNewIntermediateResultsP Store: &storage.ChainStorerStub{}, BlockType: block.SmartContractResultBlock, CurrTxs: &mock.TxForCurrentBlockStub{}, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, } @@ -258,7 +258,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsShardIdMismatch } args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = shardC - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -319,7 +319,7 @@ func TestIntermediateResultsProcessor_AddIntermediateTransactionsAddrGood(t *tes nrShards := 5 args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -387,7 +387,7 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksNothingInCache(t * nrShards := 5 args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -407,7 +407,7 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksNotCrossShard(t *t nrShards := 5 args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -439,7 +439,7 @@ func TestIntermediateResultsProcessor_CreateAllInterMiniBlocksCrossShard(t *test shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = shardCoordinator - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -579,7 +579,7 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyMiniBlockMissmatc shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = shardCoordinator - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, @@ -623,11 +623,11 @@ func TestIntermediateResultsProcessor_VerifyInterMiniBlocksBodyShouldPass(t *tes shardCoordinator := mock.NewMultiShardsCoordinatorMock(uint32(nrShards)) args := createMockArgsNewIntermediateResultsProcessor() args.Coordinator = shardCoordinator - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockCalled: func() uint64 { return maxGasLimitPerBlock }, - MaxGasLimitPerBlockCalled: func() uint64 { + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return maxGasLimitPerBlock }, } @@ -873,7 +873,7 @@ func TestIntermediateResultsProcessor_SplitMiniBlocksIfNeededShouldWork(t *testi args.Coordinator = shardCoordinator args.Hasher = hasher args.Marshalizer = marshalizer - args.EconomicsFee = &mock.FeeHandlerStub{ + args.EconomicsFee = &economicsmocks.EconomicsHandlerStub{ MaxGasLimitPerMiniBlockForSafeCrossShardCalled: func() uint64 { return gasLimit }, diff --git a/process/coordinator/process_test.go b/process/coordinator/process_test.go index 23c41babbe4..87017fcf030 100644 --- a/process/coordinator/process_test.go +++ b/process/coordinator/process_test.go @@ -555,7 +555,7 @@ func createInterimProcessorContainer() process.IntermediateProcessorContainer { PubkeyConverter: createMockPubkeyConverter(), Store: initStore(), PoolsHolder: initDataPool([]byte("test_hash1")), - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, } preFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) @@ -2190,7 +2190,7 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsNilOrMiss(t *testi PubkeyConverter: createMockPubkeyConverter(), Store: &storageStubs.ChainStorerStub{}, PoolsHolder: tdp, - EconomicsFee: &mock.FeeHandlerStub{}, + EconomicsFee: &economicsmocks.EconomicsHandlerStub{}, EnableEpochsHandler: &testscommon.EnableEpochsHandlerStub{IsKeepExecOrderOnCreatedSCRsEnabledField: true}, } preFactory, _ := shard.NewIntermediateProcessorsContainerFactory(argsFactory) @@ -2246,8 +2246,8 @@ func TestTransactionCoordinator_VerifyCreatedBlockTransactionsOk(t *testing.T) { PubkeyConverter: createMockPubkeyConverter(), Store: &storageStubs.ChainStorerStub{}, PoolsHolder: tdp, - EconomicsFee: &mock.FeeHandlerStub{ - MaxGasLimitPerBlockCalled: func() uint64 { + EconomicsFee: &economicsmocks.EconomicsHandlerStub{ + MaxGasLimitPerBlockCalled: func(_ uint32) uint64 { return MaxGasLimitPerBlock }, }, From 514eeaff65a8b9784fbad2d8441e0dea700a455c Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Apr 2023 19:55:07 +0300 Subject: [PATCH 314/335] fixes after merge --- factory/crypto/cryptoComponents.go | 10 ---------- factory/crypto/cryptoComponents_test.go | 1 + factory/data/dataComponents.go | 12 ------------ factory/data/dataComponents_test.go | 13 ++++++------- integrationTests/testProcessorNode.go | 1 - 5 files changed, 7 insertions(+), 30 deletions(-) diff --git a/factory/crypto/cryptoComponents.go b/factory/crypto/cryptoComponents.go index 80c221c4ed2..153f5486bd4 100644 --- a/factory/crypto/cryptoComponents.go +++ b/factory/crypto/cryptoComponents.go @@ -356,11 +356,6 @@ func (ccf *cryptoComponentsFactory) readCryptoParams(keygen crypto.KeyGenerator) return nil, err } - cp.privateKeyBytes, err = cp.privateKey.ToByteArray() - if err != nil { - return nil, err - } - cp.publicKey = cp.privateKey.GeneratePublic() if len(readPk) > 0 { cp.publicKeyBytes, err = cp.publicKey.ToByteArray() @@ -396,11 +391,6 @@ func (ccf *cryptoComponentsFactory) generateCryptoParams( return nil, err } - cp.privateKeyBytes, err = cp.privateKey.ToByteArray() - if err != nil { - return nil, err - } - cp.publicKeyString, err = ccf.validatorPubKeyConverter.Encode(cp.publicKeyBytes) if err != nil { return nil, err diff --git a/factory/crypto/cryptoComponents_test.go b/factory/crypto/cryptoComponents_test.go index e8dda632dce..1593cd3f234 100644 --- a/factory/crypto/cryptoComponents_test.go +++ b/factory/crypto/cryptoComponents_test.go @@ -144,6 +144,7 @@ func TestCryptoComponentsFactory_CreateOK(t *testing.T) { require.NoError(t, err) require.NotNil(t, cc) assert.Equal(t, 0, len(cc.GetManagedPeersHolder().GetManagedKeysByCurrentNode())) + assert.Nil(t, cc.Close()) } func TestCryptoComponentsFactory_CreateWithDisabledSig(t *testing.T) { diff --git a/factory/data/dataComponents.go b/factory/data/dataComponents.go index aa9d95b3eb6..0585a6c4dad 100644 --- a/factory/data/dataComponents.go +++ b/factory/data/dataComponents.go @@ -64,24 +64,12 @@ func NewDataComponentsFactory(args DataComponentsFactoryArgs) (*dataComponentsFa if check.IfNil(args.Core) { return nil, errors.ErrNilCoreComponents } - if check.IfNil(args.Core.PathHandler()) { - return nil, errors.ErrNilPathHandler - } - if check.IfNil(args.Core.EpochStartNotifierWithConfirm()) { - return nil, errors.ErrNilEpochStartNotifier - } if check.IfNil(args.StatusCore) { return nil, errors.ErrNilStatusCoreComponents } - if check.IfNil(args.StatusCore.AppStatusHandler()) { - return nil, errors.ErrNilAppStatusHandler - } if check.IfNil(args.Crypto) { return nil, errors.ErrNilCryptoComponents } - if check.IfNil(args.Crypto.ManagedPeersHolder()) { - return nil, errors.ErrNilManagedPeersHolder - } return &dataComponentsFactory{ config: args.Config, diff --git a/factory/data/dataComponents_test.go b/factory/data/dataComponents_test.go index c39beb9bc15..2be2d501378 100644 --- a/factory/data/dataComponents_test.go +++ b/factory/data/dataComponents_test.go @@ -9,7 +9,6 @@ import ( errorsMx "github.com/multiversx/mx-chain-go/errors" dataComp "github.com/multiversx/mx-chain-go/factory/data" "github.com/multiversx/mx-chain-go/factory/mock" - "github.com/multiversx/mx-chain-go/testscommon" componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/stretchr/testify/require" @@ -41,29 +40,29 @@ func TestNewDataComponentsFactory(t *testing.T) { require.Nil(t, dcf) require.Equal(t, errorsMx.ErrNilCoreComponents, err) }) - t.Run("nil epoch start notifier should error", func(t *testing.T) { + t.Run("nil status core components should error", func(t *testing.T) { t.Parallel() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - args.EpochStartNotifier = nil + args.StatusCore = nil dcf, err := dataComp.NewDataComponentsFactory(args) require.Nil(t, dcf) - require.Equal(t, errorsMx.ErrNilEpochStartNotifier, err) + require.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) }) - t.Run("nil status core components should error", func(t *testing.T) { + t.Run("nil crypto components should error", func(t *testing.T) { t.Parallel() shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) coreComponents := componentsMock.GetCoreComponents() args := componentsMock.GetDataArgs(coreComponents, shardCoordinator) - args.StatusCore = nil + args.Crypto = nil dcf, err := dataComp.NewDataComponentsFactory(args) require.Nil(t, dcf) - require.Equal(t, errorsMx.ErrNilStatusCoreComponents, err) + require.Equal(t, errorsMx.ErrNilCryptoComponents, err) }) t.Run("should work", func(t *testing.T) { t.Parallel() diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index a0700789d0a..3562b13240a 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -766,7 +766,6 @@ func (tpn *TestProcessorNode) initTestNodeWithArgs(args ArgTestProcessorNode) { TestHasher, tpn.Messenger, tpn.ShardCoordinator, - tpn.OwnAccount.SkTxSign, tpn.OwnAccount.PeerSigHandler, tpn.DataPool.Headers(), tpn.InterceptorsContainer, From b28425a58349889a72607c9309e5222c90e5446d Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Apr 2023 20:02:15 +0300 Subject: [PATCH 315/335] fixes after merge --- .../heartbeat/heartbeatV2Components_test.go | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/factory/heartbeat/heartbeatV2Components_test.go b/factory/heartbeat/heartbeatV2Components_test.go index 847255d379f..06ff8958b40 100644 --- a/factory/heartbeat/heartbeatV2Components_test.go +++ b/factory/heartbeat/heartbeatV2Components_test.go @@ -10,7 +10,6 @@ import ( "github.com/multiversx/mx-chain-go/config" errorsMx "github.com/multiversx/mx-chain-go/errors" heartbeatComp "github.com/multiversx/mx-chain-go/factory/heartbeat" - "github.com/multiversx/mx-chain-go/factory/mock" testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" "github.com/multiversx/mx-chain-go/p2p" "github.com/multiversx/mx-chain-go/sharding" @@ -50,7 +49,7 @@ func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2Co return []byte("hardfork pub key") }, ValidatorPubKeyConverterCalled: func() core.PubkeyConverter { - return &mock.PubkeyConverterStub{} + return &testscommon.PubkeyConverterStub{} }, }, DataComponents: &testsMocks.DataComponentsStub{ @@ -68,8 +67,9 @@ func createMockHeartbeatV2ComponentsFactoryArgs() heartbeatComp.ArgHeartbeatV2Co Messenger: &p2pmocks.MessengerStub{}, }, CryptoComponents: &testsMocks.CryptoComponentsStub{ - PrivKey: &cryptoMocks.PrivateKeyStub{}, - PeerSignHandler: &testsMocks.PeerSignatureHandler{}, + PrivKey: &cryptoMocks.PrivateKeyStub{}, + PeerSignHandler: &testsMocks.PeerSignatureHandler{}, + ManagedPeersHolderField: &testscommon.ManagedPeersHolderStub{}, }, ProcessComponents: &testsMocks.ProcessComponentsStub{ EpochTrigger: &testsMocks.EpochStartTriggerStub{}, @@ -92,17 +92,18 @@ func createMockConfig() config.Config { HeartbeatV2: config.HeartbeatV2Config{ PeerAuthenticationTimeBetweenSendsInSec: 1, PeerAuthenticationTimeBetweenSendsWhenErrorInSec: 1, - PeerAuthenticationThresholdBetweenSends: 0.1, + PeerAuthenticationTimeThresholdBetweenSends: 0.1, HeartbeatTimeBetweenSendsInSec: 1, HeartbeatTimeBetweenSendsDuringBootstrapInSec: 1, HeartbeatTimeBetweenSendsWhenErrorInSec: 1, - HeartbeatThresholdBetweenSends: 0.1, + HeartbeatTimeThresholdBetweenSends: 0.1, HeartbeatExpiryTimespanInSec: 30, MinPeersThreshold: 0.8, - DelayBetweenRequestsInSec: 10, - MaxTimeoutInSec: 60, + DelayBetweenPeerAuthenticationRequestsInSec: 10, + PeerAuthenticationMaxTimeoutForRequestsInSec: 60, + PeerAuthenticationTimeBetweenChecksInSec: 1, PeerShardTimeBetweenSendsInSec: 5, - PeerShardThresholdBetweenSends: 0.1, + PeerShardTimeThresholdBetweenSends: 0.1, MaxMissingKeysInRequest: 100, MaxDurationPeerUnresponsiveInSec: 10, HideInactiveValidatorIntervalInSec: 60, @@ -337,7 +338,7 @@ func TestHeartbeatV2Components_Create(t *testing.T) { t.Parallel() args := createMockHeartbeatV2ComponentsFactoryArgs() - args.Config.HeartbeatV2.DelayBetweenRequestsInSec = 0 + args.Config.HeartbeatV2.DelayBetweenPeerAuthenticationRequestsInSec = 0 hcf, err := heartbeatComp.NewHeartbeatV2ComponentsFactory(args) assert.NotNil(t, hcf) assert.NoError(t, err) From 98175031667aa08ff6b6ad1a50abc613b46fc957 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Apr 2023 20:24:19 +0300 Subject: [PATCH 316/335] fixes after merge --- consensus/mock/mockTestInitializer.go | 2 +- factory/consensus/consensusComponents_test.go | 28 +++++++++++-------- integrationTests/mock/cryptoComponentsStub.go | 8 ++++-- testscommon/components/default.go | 4 +-- .../consensus}/signingHandlerStub.go | 2 +- 5 files changed, 27 insertions(+), 17 deletions(-) rename {consensus/mock => testscommon/consensus}/signingHandlerStub.go (99%) diff --git a/consensus/mock/mockTestInitializer.go b/consensus/mock/mockTestInitializer.go index 4468c3d338b..6fa62a5a49d 100644 --- a/consensus/mock/mockTestInitializer.go +++ b/consensus/mock/mockTestInitializer.go @@ -205,7 +205,7 @@ func InitConsensusCoreWithMultiSigner(multiSigner crypto.MultiSigner) *Consensus messageSigningHandler := &MessageSigningHandlerStub{} peerBlacklistHandler := &PeerBlacklistHandlerStub{} multiSignerContainer := cryptoMocks.NewMultiSignerContainerMock(multiSigner) - signingHandler := &SigningHandlerStub{} + signingHandler := &consensusMocks.SigningHandlerStub{} container := &ConsensusCoreMock{ blockChain: blockChain, diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index ec539503107..08c115ae6d5 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -50,7 +50,7 @@ func createMockConsensusComponentsFactoryArgs() consensusComp.ConsensusComponent }, }, UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, - AddrPubKeyConv: &mock.PubkeyConverterStub{}, + AddrPubKeyConv: &testscommon.PubkeyConverterStub{}, WatchdogTimer: &testscommon.WatchdogMock{}, AlarmSch: &testscommon.AlarmSchedulerStub{}, NtpSyncTimer: &testscommon.SyncTimerStub{}, @@ -79,8 +79,10 @@ func createMockConsensusComponentsFactoryArgs() consensusComp.ConsensusComponent MultiSigContainer: &cryptoMocks.MultiSignerContainerMock{ MultiSigner: &cryptoMocks.MultisignerMock{}, }, - BlKeyGen: &cryptoMocks.KeyGenStub{}, - BlockSig: &cryptoMocks.SingleSignerStub{}, + BlKeyGen: &cryptoMocks.KeyGenStub{}, + BlockSig: &cryptoMocks.SingleSignerStub{}, + KeysHandlerField: &testscommon.KeysHandlerStub{}, + SigHandler: &consensusMocks.SigningHandlerStub{}, }, DataComponents: &testsMocks.DataComponentsStub{ DataPool: &dataRetriever.PoolsHolderStub{ @@ -865,22 +867,26 @@ func TestConsensusComponentsFactory_Create(t *testing.T) { require.Equal(t, expectedErr, err) require.Nil(t, cc) }) - t.Run("createBlsSignatureHandler fails due ToByteArray failure should error", func(t *testing.T) { + t.Run("createConsensusState fails due to nil KeysHandler should error", func(t *testing.T) { t.Parallel() args := createMockConsensusComponentsFactoryArgs() cryptoCompStub, ok := args.CryptoComponents.(*testsMocks.CryptoComponentsStub) require.True(t, ok) - cryptoCompStub.PrivKey = &cryptoMocks.PrivateKeyStub{ - ToByteArrayStub: func() ([]byte, error) { - return nil, expectedErr - }, + cnt := 0 + cryptoCompStub.KeysHandlerCalled = func() consensus.KeysHandler { + cnt++ + if cnt > 0 { + return nil + } + return &testscommon.KeysHandlerStub{} } ccf, _ := consensusComp.NewConsensusComponentsFactory(args) require.NotNil(t, ccf) cc, err := ccf.Create() - require.Equal(t, expectedErr, err) + require.Error(t, err) + require.Contains(t, err.Error(), "keys handler") require.Nil(t, cc) }) t.Run("NewConsensusCore failure should error", func(t *testing.T) { @@ -889,13 +895,13 @@ func TestConsensusComponentsFactory_Create(t *testing.T) { args := createMockConsensusComponentsFactoryArgs() cryptoCompStub, ok := args.CryptoComponents.(*testsMocks.CryptoComponentsStub) require.True(t, ok) - cryptoCompStub.BlockSig = nil + cryptoCompStub.SigHandler = nil ccf, _ := consensusComp.NewConsensusComponentsFactory(args) require.NotNil(t, ccf) cc, err := ccf.Create() require.Error(t, err) - require.True(t, strings.Contains(err.Error(), "single signer")) + require.True(t, strings.Contains(err.Error(), "signing handler")) require.Nil(t, cc) }) t.Run("GetSubroundsFactory failure should error", func(t *testing.T) { diff --git a/integrationTests/mock/cryptoComponentsStub.go b/integrationTests/mock/cryptoComponentsStub.go index 1741bc3a51e..e2a64f1fcfb 100644 --- a/integrationTests/mock/cryptoComponentsStub.go +++ b/integrationTests/mock/cryptoComponentsStub.go @@ -14,13 +14,13 @@ import ( // CryptoComponentsStub - type CryptoComponentsStub struct { PubKey crypto.PublicKey - PublicKeyCalled func() crypto.PublicKey + PublicKeyCalled func() crypto.PublicKey PrivKey crypto.PrivateKey P2pPubKey crypto.PublicKey P2pPrivKey crypto.PrivateKey PubKeyBytes []byte PubKeyString string - PrivKeyBytes []byte + PrivKeyBytes []byte BlockSig crypto.SingleSigner TxSig crypto.SingleSigner P2pSig crypto.SingleSigner @@ -32,6 +32,7 @@ type CryptoComponentsStub struct { MsgSigVerifier vm.MessageSignVerifier ManagedPeersHolderField common.ManagedPeersHolder KeysHandlerField consensus.KeysHandler + KeysHandlerCalled func() consensus.KeysHandler SigHandler consensus.SigningHandler mutMultiSig sync.RWMutex } @@ -173,6 +174,9 @@ func (ccs *CryptoComponentsStub) ManagedPeersHolder() common.ManagedPeersHolder // KeysHandler - func (ccs *CryptoComponentsStub) KeysHandler() consensus.KeysHandler { + if ccs.KeysHandlerCalled != nil { + return ccs.KeysHandlerCalled() + } return ccs.KeysHandlerField } diff --git a/testscommon/components/default.go b/testscommon/components/default.go index e931bb47d69..167348d0bf7 100644 --- a/testscommon/components/default.go +++ b/testscommon/components/default.go @@ -5,10 +5,10 @@ import ( crypto "github.com/multiversx/mx-chain-crypto-go" "github.com/multiversx/mx-chain-go/common" - consensusMocks "github.com/multiversx/mx-chain-go/consensus/mock" "github.com/multiversx/mx-chain-go/factory/mock" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/testscommon" + "github.com/multiversx/mx-chain-go/testscommon/consensus" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" dataRetrieverTests "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" @@ -72,7 +72,7 @@ func GetDefaultCryptoComponents() *mock.CryptoComponentsMock { TxKeyGen: &mock.KeyGenMock{}, P2PKeyGen: &mock.KeyGenMock{}, MsgSigVerifier: &testscommon.MessageSignVerifierMock{}, - SigHandler: &consensusMocks.SigningHandlerStub{}, + SigHandler: &consensus.SigningHandlerStub{}, } } diff --git a/consensus/mock/signingHandlerStub.go b/testscommon/consensus/signingHandlerStub.go similarity index 99% rename from consensus/mock/signingHandlerStub.go rename to testscommon/consensus/signingHandlerStub.go index 33c4121d74c..e389ce864b3 100644 --- a/consensus/mock/signingHandlerStub.go +++ b/testscommon/consensus/signingHandlerStub.go @@ -1,4 +1,4 @@ -package mock +package consensus // SigningHandlerStub implements SigningHandler interface type SigningHandlerStub struct { From 1fd7feb5998882ebab88e9c46c5599b13f57564f Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Apr 2023 20:50:48 +0300 Subject: [PATCH 317/335] some fixes after merge --- factory/processing/processComponents.go | 2 +- factory/processing/processComponents_test.go | 68 ++++++++++---------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index dde67569aec..3c543396258 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -911,7 +911,7 @@ func (pcf *processComponentsFactory) indexAndReturnGenesisAccounts() (map[string encodedAddress, err := pcf.coreData.AddressPubKeyConverter().Encode(userAccount.AddressBytes()) if err != nil { - return nil, err + return map[string]*outport.AlteredAccount{}, err } genesisAccounts[encodedAddress] = &outport.AlteredAccount{ diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index dfa2992a6ab..c7769c5494f 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -68,6 +68,7 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto Length: 32, Type: "bech32", SignatureLength: 0, + Hrp: "erd", }) valPubKeyConv, _ := factory.NewPubkeyConverter(config.PubkeyConfig{ Length: 96, @@ -198,14 +199,15 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto MultiSigContainer: &cryptoMocks.MultiSignerContainerMock{ MultiSigner: &cryptoMocks.MultisignerMock{}, }, - PrivKey: &cryptoMocks.PrivateKeyStub{}, - PubKey: &cryptoMocks.PublicKeyStub{}, - PubKeyString: "pub key string", - PubKeyBytes: []byte("pub key bytes"), - TxKeyGen: &cryptoMocks.KeyGenStub{}, - TxSig: &cryptoMocks.SingleSignerStub{}, - PeerSignHandler: &cryptoMocks.PeerSignatureHandlerStub{}, - MsgSigVerifier: &testscommon.MessageSignVerifierMock{}, + PrivKey: &cryptoMocks.PrivateKeyStub{}, + PubKey: &cryptoMocks.PublicKeyStub{}, + PubKeyString: "pub key string", + PubKeyBytes: []byte("pub key bytes"), + TxKeyGen: &cryptoMocks.KeyGenStub{}, + TxSig: &cryptoMocks.SingleSignerStub{}, + PeerSignHandler: &cryptoMocks.PeerSignatureHandlerStub{}, + MsgSigVerifier: &testscommon.MessageSignVerifierMock{}, + ManagedPeersHolderField: &testscommon.ManagedPeersHolderStub{}, }, State: &testscommon.StateComponentsMock{ Accounts: &state.AccountsStub{ @@ -365,7 +367,7 @@ func TestNewProcessComponentsFactory(t *testing.T) { args.CoreData = &mock.CoreComponentsMock{ EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, NodesConfig: &testscommon.NodesSetupStub{}, - AddrPubKeyConv: &mock.PubkeyConverterStub{}, + AddrPubKeyConv: &testscommon.PubkeyConverterStub{}, EpochChangeNotifier: nil, } pcf, err := processComp.NewProcessComponentsFactory(args) @@ -379,7 +381,7 @@ func TestNewProcessComponentsFactory(t *testing.T) { args.CoreData = &mock.CoreComponentsMock{ EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, NodesConfig: &testscommon.NodesSetupStub{}, - AddrPubKeyConv: &mock.PubkeyConverterStub{}, + AddrPubKeyConv: &testscommon.PubkeyConverterStub{}, EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, ValPubKeyConv: nil, } @@ -394,9 +396,9 @@ func TestNewProcessComponentsFactory(t *testing.T) { args.CoreData = &mock.CoreComponentsMock{ EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, NodesConfig: &testscommon.NodesSetupStub{}, - AddrPubKeyConv: &mock.PubkeyConverterStub{}, + AddrPubKeyConv: &testscommon.PubkeyConverterStub{}, EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, - ValPubKeyConv: &mock.PubkeyConverterStub{}, + ValPubKeyConv: &testscommon.PubkeyConverterStub{}, IntMarsh: nil, } pcf, err := processComp.NewProcessComponentsFactory(args) @@ -410,9 +412,9 @@ func TestNewProcessComponentsFactory(t *testing.T) { args.CoreData = &mock.CoreComponentsMock{ EconomicsHandler: &economicsmocks.EconomicsHandlerStub{}, NodesConfig: &testscommon.NodesSetupStub{}, - AddrPubKeyConv: &mock.PubkeyConverterStub{}, + AddrPubKeyConv: &testscommon.PubkeyConverterStub{}, EpochChangeNotifier: &epochNotifier.EpochNotifierStub{}, - ValPubKeyConv: &mock.PubkeyConverterStub{}, + ValPubKeyConv: &testscommon.PubkeyConverterStub{}, IntMarsh: &testscommon.MarshalizerStub{}, UInt64ByteSliceConv: nil, } @@ -903,19 +905,19 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Run("NewESDTDataStorage fails should error", testWithNilMarshaller(105, "Marshalizer", unreachableStep)) t.Run("NewReceiptsRepository fails should error", - testWithNilMarshaller(106, "marshalizer", unreachableStep)) + testWithNilMarshaller(107, "marshalizer", unreachableStep)) t.Run("newBlockProcessor fails due to invalid shard should error", testWithInvalidShard(31, "could not create block processor")) // newShardBlockProcessor t.Run("newShardBlockProcessor: NewESDTTransferParser fails should error", - testWithNilMarshaller(107, "marshaller", unreachableStep)) + testWithNilMarshaller(108, "marshaller", unreachableStep)) t.Run("newShardBlockProcessor: createBuiltInFunctionContainer fails should error", testWithNilAddressPubKeyConv(46, "public key converter", unreachableStep)) t.Run("newShardBlockProcessor: createVMFactoryShard fails due to NewBlockChainHookImpl failure should error", testWithNilAddressPubKeyConv(47, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: NewIntermediateProcessorsContainerFactory fails should error", - testWithNilMarshaller(110, "Marshalizer", unreachableStep)) + testWithNilMarshaller(111, "Marshalizer", unreachableStep)) t.Run("newShardBlockProcessor: NewTxTypeHandler fails should error", testWithNilAddressPubKeyConv(49, "pubkey converter", unreachableStep)) t.Run("newShardBlockProcessor: NewGasComputation fails should error", @@ -949,13 +951,13 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, "PollingTimeInSeconds") }) t.Run("newShardBlockProcessor: NewBlockSizeComputation fails should error", - testWithNilMarshaller(116, "Marshalizer", unreachableStep)) - t.Run("newShardBlockProcessor: NewPreProcessorsContainerFactory fails should error", testWithNilMarshaller(117, "Marshalizer", unreachableStep)) - t.Run("newShardBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", + t.Run("newShardBlockProcessor: NewPreProcessorsContainerFactory fails should error", testWithNilMarshaller(118, "Marshalizer", unreachableStep)) - t.Run("newShardBlockProcessor: NewTransactionCoordinator fails should error", + t.Run("newShardBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", testWithNilMarshaller(119, "Marshalizer", unreachableStep)) + t.Run("newShardBlockProcessor: NewTransactionCoordinator fails should error", + testWithNilMarshaller(120, "Marshalizer", unreachableStep)) // newMetaBlockProcessor, step for meta is 31 inside newBlockProcessor t.Run("newMetaBlockProcessor: createBuiltInFunctionContainer fails should error", @@ -963,9 +965,9 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Run("newMetaBlockProcessor: createVMFactoryMeta fails due to NewBlockChainHookImpl failure should error", testWithNilAddressPubKeyConv(47, "pubkey converter", blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: NewIntermediateProcessorsContainerFactory fails should error", - testWithNilMarshaller(110, "Marshalizer", blockProcessorOnMetaStep)) + testWithNilMarshaller(111, "Marshalizer", blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: NewESDTTransferParser fails should error", - testWithNilMarshaller(111, "marshaller", blockProcessorOnMetaStep)) + testWithNilMarshaller(112, "marshaller", blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: NewTxTypeHandler fails should error", testWithNilAddressPubKeyConv(49, "pubkey converter", blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: NewGasComputation fails should error", @@ -985,25 +987,25 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to NewMetaTxProcessor failure second time should error", testWithNilAddressPubKeyConv(55, "pubkey converter", blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: NewBlockSizeComputation fails should error", - testWithNilMarshaller(119, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewPreProcessorsContainerFactory fails should error", testWithNilMarshaller(120, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", + t.Run("newMetaBlockProcessor: NewPreProcessorsContainerFactory fails should error", testWithNilMarshaller(121, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewTransactionCoordinator fails should error", + t.Run("newMetaBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", testWithNilMarshaller(122, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewStakingToPeer fails should error", + t.Run("newMetaBlockProcessor: NewTransactionCoordinator fails should error", testWithNilMarshaller(123, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewEpochStartData fails should error", + t.Run("newMetaBlockProcessor: NewStakingToPeer fails should error", testWithNilMarshaller(124, "Marshalizer", blockProcessorOnMetaStep)) + t.Run("newMetaBlockProcessor: NewEpochStartData fails should error", + testWithNilMarshaller(125, "Marshalizer", blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: NewEndOfEpochEconomicsDataCreator fails should error", - testWithNilMarshaller(125, "marshalizer", blockProcessorOnMetaStep)) + testWithNilMarshaller(126, "marshalizer", blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: GetStorer RewardTransactionUnit fails should error", testWithMissingStorer(1, retriever.RewardTransactionUnit, blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: GetStorer MiniBlockUnit fails should error", testWithMissingStorer(4, retriever.MiniBlockUnit, blockProcessorOnMetaStep)) t.Run("newMetaBlockProcessor: NewRewardsCreatorProxy fails should error", - testWithNilMarshaller(126, "marshalizer", blockProcessorOnMetaStep)) + testWithNilMarshaller(127, "marshalizer", blockProcessorOnMetaStep)) t.Run("NewNodesSetupChecker fails should error", testWithNilPubKeyConv(5, "pubkey converter", unreachableStep)) t.Run("nodesSetupChecker.Check fails should error", func(t *testing.T) { @@ -1047,8 +1049,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, "messenger") }) - t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(123, "marshalizer", unreachableStep)) - t.Run("NewTxsSenderWithAccumulator fails should error", testWithNilMarshaller(124, "Marshalizer", unreachableStep)) + t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(124, "marshalizer", unreachableStep)) + t.Run("NewTxsSenderWithAccumulator fails should error", testWithNilMarshaller(125, "Marshalizer", unreachableStep)) t.Run("should work with indexAndReturnGenesisAccounts failing due to RootHash failure", func(t *testing.T) { t.Parallel() From e7cc52ea5a414f30cac6fc3dda5f7ba9c6cc4ad0 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Mon, 24 Apr 2023 20:56:02 +0300 Subject: [PATCH 318/335] fixed tests --- consensus/spos/bls/subroundEndRound_test.go | 21 ++++++++++--------- consensus/spos/bls/subroundSignature_test.go | 7 ++++--- consensus/spos/consensusCoreValidator_test.go | 2 +- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/consensus/spos/bls/subroundEndRound_test.go b/consensus/spos/bls/subroundEndRound_test.go index 7e1a7eb83af..1cf43a179c0 100644 --- a/consensus/spos/bls/subroundEndRound_test.go +++ b/consensus/spos/bls/subroundEndRound_test.go @@ -20,6 +20,7 @@ import ( "github.com/multiversx/mx-chain-go/p2p" "github.com/multiversx/mx-chain-go/p2p/factory" "github.com/multiversx/mx-chain-go/testscommon" + consensusMocks "github.com/multiversx/mx-chain-go/testscommon/consensus" "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" "github.com/stretchr/testify/assert" @@ -329,7 +330,7 @@ func TestSubroundEndRound_DoEndRoundJobErrAggregatingSigShouldFail(t *testing.T) container := mock.InitConsensusCore() sr := *initSubroundEndRoundWithContainer(container, &statusHandler.AppStatusHandlerStub{}) - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ AggregateSigsCalled: func(bitmap []byte, epoch uint32) ([]byte, error) { return nil, crypto.ErrNilHasher }, @@ -543,7 +544,7 @@ func TestSubroundEndRound_CheckIfSignatureIsFilled(t *testing.T) { expectedSignature := []byte("signature") container := mock.InitConsensusCore() - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ CreateSignatureForPublicKeyCalled: func(publicKeyBytes []byte, msg []byte) ([]byte, error) { var receivedHdr block.Header _ = container.Marshalizer().Unmarshal(&receivedHdr, msg) @@ -957,7 +958,7 @@ func TestVerifyNodesOnAggSigVerificationFail(t *testing.T) { sr := *initSubroundEndRoundWithContainer(container, &statusHandler.AppStatusHandlerStub{}) expectedErr := errors.New("exptected error") - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ SignatureShareCalled: func(index uint16) ([]byte, error) { return nil, expectedErr }, @@ -979,7 +980,7 @@ func TestVerifyNodesOnAggSigVerificationFail(t *testing.T) { sr := *initSubroundEndRoundWithContainer(container, &statusHandler.AppStatusHandlerStub{}) expectedErr := errors.New("exptected error") - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ SignatureShareCalled: func(index uint16) ([]byte, error) { return nil, nil }, @@ -1005,7 +1006,7 @@ func TestVerifyNodesOnAggSigVerificationFail(t *testing.T) { container := mock.InitConsensusCore() sr := *initSubroundEndRoundWithContainer(container, &statusHandler.AppStatusHandlerStub{}) - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ SignatureShareCalled: func(index uint16) ([]byte, error) { return nil, nil }, @@ -1050,7 +1051,7 @@ func TestComputeAddSigOnValidNodes(t *testing.T) { sr := *initSubroundEndRoundWithContainer(container, &statusHandler.AppStatusHandlerStub{}) expectedErr := errors.New("exptected error") - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ AggregateSigsCalled: func(bitmap []byte, epoch uint32) ([]byte, error) { return nil, expectedErr }, @@ -1071,7 +1072,7 @@ func TestComputeAddSigOnValidNodes(t *testing.T) { sr := *initSubroundEndRoundWithContainer(container, &statusHandler.AppStatusHandlerStub{}) expectedErr := errors.New("exptected error") - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ SetAggregatedSigCalled: func(_ []byte) error { return expectedErr }, @@ -1110,7 +1111,7 @@ func TestSubroundEndRound_DoEndRoundJobByLeaderVerificationFail(t *testing.T) { verifySigShareNumCalls := 0 verifyFirstCall := true - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ SignatureShareCalled: func(index uint16) ([]byte, error) { return nil, nil }, @@ -1157,7 +1158,7 @@ func TestSubroundEndRound_DoEndRoundJobByLeaderVerificationFail(t *testing.T) { verifySigShareNumCalls := 0 verifyFirstCall := true - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ SignatureShareCalled: func(index uint16) ([]byte, error) { return nil, nil }, @@ -1420,7 +1421,7 @@ func TestVerifyInvalidSigners(t *testing.T) { } wasCalled := false - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ VerifySingleSignatureCalled: func(publicKeyBytes []byte, message []byte, signature []byte) error { wasCalled = true return errors.New("expected err") diff --git a/consensus/spos/bls/subroundSignature_test.go b/consensus/spos/bls/subroundSignature_test.go index 613d1f315e8..d327a6ea206 100644 --- a/consensus/spos/bls/subroundSignature_test.go +++ b/consensus/spos/bls/subroundSignature_test.go @@ -11,6 +11,7 @@ import ( "github.com/multiversx/mx-chain-go/consensus/spos" "github.com/multiversx/mx-chain-go/consensus/spos/bls" "github.com/multiversx/mx-chain-go/testscommon" + consensusMocks "github.com/multiversx/mx-chain-go/testscommon/consensus" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" "github.com/pkg/errors" "github.com/stretchr/testify/assert" @@ -277,7 +278,7 @@ func TestSubroundSignature_DoSignatureJob(t *testing.T) { sr.Data = []byte("X") err := errors.New("create signature share error") - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ CreateSignatureShareForPublicKeyCalled: func(msg []byte, index uint16, epoch uint32, publicKeyBytes []byte) ([]byte, error) { return nil, err }, @@ -287,7 +288,7 @@ func TestSubroundSignature_DoSignatureJob(t *testing.T) { r = sr.DoSignatureJob() assert.False(t, r) - signingHandler = &mock.SigningHandlerStub{ + signingHandler = &consensusMocks.SigningHandlerStub{ CreateSignatureShareForPublicKeyCalled: func(msg []byte, index uint16, epoch uint32, publicKeyBytes []byte) ([]byte, error) { return []byte("SIG"), nil }, @@ -367,7 +368,7 @@ func TestSubroundSignature_ReceivedSignatureStoreShareFailed(t *testing.T) { errStore := errors.New("signature share store failed") storeSigShareCalled := false - signingHandler := &mock.SigningHandlerStub{ + signingHandler := &consensusMocks.SigningHandlerStub{ VerifySignatureShareCalled: func(index uint16, sig, msg []byte, epoch uint32) error { return nil }, diff --git a/consensus/spos/consensusCoreValidator_test.go b/consensus/spos/consensusCoreValidator_test.go index 41b965887b1..acdc008cbe8 100644 --- a/consensus/spos/consensusCoreValidator_test.go +++ b/consensus/spos/consensusCoreValidator_test.go @@ -34,7 +34,7 @@ func initConsensusDataContainer() *ConsensusCore { messageSigningHandler := &mock.MessageSigningHandlerStub{} peerBlacklistHandler := &mock.PeerBlacklistHandlerStub{} multiSignerContainer := cryptoMocks.NewMultiSignerContainerMock(multiSignerMock) - signingHandler := &mock.SigningHandlerStub{} + signingHandler := &consensusMocks.SigningHandlerStub{} return &ConsensusCore{ blockChain: blockChain, From 375dbcf472426397af3b879d41111c2d07ec6cab Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 25 Apr 2023 10:33:02 +0300 Subject: [PATCH 319/335] fix after review - added empty line --- factory/core/coreComponentsHandler_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/factory/core/coreComponentsHandler_test.go b/factory/core/coreComponentsHandler_test.go index 8d345b2516a..9c22a9a2f22 100644 --- a/factory/core/coreComponentsHandler_test.go +++ b/factory/core/coreComponentsHandler_test.go @@ -136,6 +136,7 @@ func TestManagedCoreComponents_CheckSubcomponents(t *testing.T) { require.NoError(t, err) require.Nil(t, managedCoreComponents.CheckSubcomponents()) } + func TestManagedCoreComponents_Close(t *testing.T) { t.Parallel() From cbaa587ceb9e0ba822fca730576c02cf1208a425 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Tue, 25 Apr 2023 17:16:09 +0300 Subject: [PATCH 320/335] fixes after review --- factory/consensus/consensusComponents.go | 3 +++ factory/consensus/consensusComponents_test.go | 26 ++++++------------- integrationTests/mock/cryptoComponentsStub.go | 1 - .../{rounderMock.go => roundHandlerMock.go} | 0 4 files changed, 11 insertions(+), 19 deletions(-) rename testscommon/{rounderMock.go => roundHandlerMock.go} (100%) diff --git a/factory/consensus/consensusComponents.go b/factory/consensus/consensusComponents.go index 526274429d9..1529bf7d30d 100644 --- a/factory/consensus/consensusComponents.go +++ b/factory/consensus/consensusComponents.go @@ -711,6 +711,9 @@ func checkArgs(args ConsensusComponentsFactoryArgs) error { if check.IfNil(args.ProcessComponents.RoundHandler()) { return errors.ErrNilRoundHandler } + if check.IfNil(args.ProcessComponents.HardforkTrigger()) { + return errors.ErrNilHardforkTrigger + } if check.IfNil(args.StateComponents) { return errors.ErrNilStateComponentsHolder } diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index 08c115ae6d5..d0512e51fdf 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -269,7 +269,7 @@ func TestNewConsensusComponentsFactory(t *testing.T) { require.Nil(t, ccf) require.Equal(t, errorsMx.ErrNilNetworkComponentsHolder, err) }) - t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Run("nil Messenger should error", func(t *testing.T) { t.Parallel() args := createMockConsensusComponentsFactoryArgs() @@ -316,7 +316,7 @@ func TestNewConsensusComponentsFactory(t *testing.T) { require.Nil(t, ccf) require.Equal(t, errorsMx.ErrNilShardCoordinator, err) }) - t.Run("nil ShardCoordinator should error", func(t *testing.T) { + t.Run("nil RoundHandler should error", func(t *testing.T) { t.Parallel() args := createMockConsensusComponentsFactoryArgs() @@ -330,30 +330,20 @@ func TestNewConsensusComponentsFactory(t *testing.T) { require.Nil(t, ccf) require.Equal(t, errorsMx.ErrNilRoundHandler, err) }) - t.Run("nil NetworkComponents should error", func(t *testing.T) { - t.Parallel() - - args := createMockConsensusComponentsFactoryArgs() - args.ProcessComponents = &testsMocks.ProcessComponentsStub{ - NodesCoord: nil, - } - ccf, err := consensusComp.NewConsensusComponentsFactory(args) - - require.Nil(t, ccf) - require.Equal(t, errorsMx.ErrNilNodesCoordinator, err) - }) - t.Run("nil NetworkComponents should error", func(t *testing.T) { + t.Run("nil HardforkTrigger should error", func(t *testing.T) { t.Parallel() args := createMockConsensusComponentsFactoryArgs() args.ProcessComponents = &testsMocks.ProcessComponentsStub{ - NodesCoord: &shardingMocks.NodesCoordinatorStub{}, - ShardCoord: nil, + NodesCoord: &shardingMocks.NodesCoordinatorStub{}, + ShardCoord: &testscommon.ShardsCoordinatorMock{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + HardforkTriggerField: nil, } ccf, err := consensusComp.NewConsensusComponentsFactory(args) require.Nil(t, ccf) - require.Equal(t, errorsMx.ErrNilShardCoordinator, err) + require.Equal(t, errorsMx.ErrNilHardforkTrigger, err) }) t.Run("nil StateComponents should error", func(t *testing.T) { t.Parallel() diff --git a/integrationTests/mock/cryptoComponentsStub.go b/integrationTests/mock/cryptoComponentsStub.go index 7c1de05ec22..53abe25fe9b 100644 --- a/integrationTests/mock/cryptoComponentsStub.go +++ b/integrationTests/mock/cryptoComponentsStub.go @@ -20,7 +20,6 @@ type CryptoComponentsStub struct { P2pPrivKey crypto.PrivateKey PubKeyBytes []byte PubKeyString string - PrivKeyBytes []byte BlockSig crypto.SingleSigner TxSig crypto.SingleSigner P2pSig crypto.SingleSigner diff --git a/testscommon/rounderMock.go b/testscommon/roundHandlerMock.go similarity index 100% rename from testscommon/rounderMock.go rename to testscommon/roundHandlerMock.go From 1c56539506f1520b44ac667b8df22d54c75f15ae Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 26 Apr 2023 12:05:14 +0300 Subject: [PATCH 321/335] fixes after review --- api/errors/errors.go | 3 + api/gin/common.go | 6 +- api/groups/addressGroup.go | 205 +++++------- api/groups/addressGroupOptions_test.go | 6 + api/groups/addressGroup_test.go | 414 ++++++++++++------------- 5 files changed, 298 insertions(+), 336 deletions(-) diff --git a/api/errors/errors.go b/api/errors/errors.go index 29b83893519..7ec06e15201 100644 --- a/api/errors/errors.go +++ b/api/errors/errors.go @@ -159,3 +159,6 @@ var ErrGetESDTTokensWithRole = errors.New("getting esdt tokens with role error") // ErrRegisteredNFTTokenIDs signals an error in getting the registered nft token ids by the given address var ErrRegisteredNFTTokenIDs = errors.New("getting registered nft token ids error") + +// ErrInvalidRole signals that an invalid role was provided +var ErrInvalidRole = errors.New("invalid role") diff --git a/api/gin/common.go b/api/gin/common.go index 178f7439193..2b6ae6d725e 100644 --- a/api/gin/common.go +++ b/api/gin/common.go @@ -35,12 +35,8 @@ func skValidator( } func checkArgs(args ArgsNewWebServer) error { - errHandler := func(details string) error { - return fmt.Errorf("%w: %s", apiErrors.ErrCannotCreateGinWebServer, details) - } - if check.IfNil(args.Facade) { - return errHandler(apiErrors.ErrNilFacadeHandler.Error()) + return fmt.Errorf("%w: %s", apiErrors.ErrCannotCreateGinWebServer, apiErrors.ErrNilFacadeHandler.Error()) } return nil diff --git a/api/groups/addressGroup.go b/api/groups/addressGroup.go index 39a6ac93511..410ef8c73c3 100644 --- a/api/groups/addressGroup.go +++ b/api/groups/addressGroup.go @@ -172,13 +172,7 @@ func NewAddressGroup(facade addressFacadeHandler) (*addressGroup, error) { // getAccount returns a response containing information about the account correlated with provided address func (ag *addressGroup) getAccount(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrCouldNotGetAccount, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrCouldNotGetAccount, err) return @@ -220,13 +214,7 @@ func (ag *addressGroup) getAccounts(c *gin.Context) { // getBalance returns the balance for the address parameter func (ag *addressGroup) getBalance(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetBalance, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetBalance, err) return @@ -243,13 +231,7 @@ func (ag *addressGroup) getBalance(c *gin.Context) { // getUsername returns the username for the address parameter func (ag *addressGroup) getUsername(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetUsername, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetUsername, err) return @@ -266,15 +248,9 @@ func (ag *addressGroup) getUsername(c *gin.Context) { // getCodeHash returns the code hash for the address parameter func (ag *addressGroup) getCodeHash(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetCodeHash, errors.ErrEmptyAddress) - return - } - - options, err := parseAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { - shared.RespondWithValidationError(c, errors.ErrGetCodeHash, errors.ErrBadUrlParams) + shared.RespondWithValidationError(c, errors.ErrGetCodeHash, err) return } @@ -318,13 +294,7 @@ func (ag *addressGroup) getValueForKey(c *gin.Context) { // getGuardianData returns the guardian data and guarded state for a given account func (ag *addressGroup) getGuardianData(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetGuardianData, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetGuardianData, err) return @@ -341,13 +311,7 @@ func (ag *addressGroup) getGuardianData(c *gin.Context) { // addressGroup returns all the key-value pairs for the given address func (ag *addressGroup) getKeyValuePairs(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetKeyValuePairs, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetKeyValuePairs, err) return @@ -364,24 +328,12 @@ func (ag *addressGroup) getKeyValuePairs(c *gin.Context) { // getESDTBalance returns the balance for the given address and esdt token func (ag *addressGroup) getESDTBalance(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, tokenIdentifier, options, err := extractGetESDTBalanceParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, err) return } - tokenIdentifier := c.Param("tokenIdentifier") - if tokenIdentifier == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTBalance, errors.ErrEmptyTokenIdentifier) - return - } - esdtData, blockInfo, err := ag.getFacade().GetESDTData(addr, tokenIdentifier, 0, options) if err != nil { shared.RespondWithInternalError(c, errors.ErrGetESDTBalance, err) @@ -399,13 +351,7 @@ func (ag *addressGroup) getESDTBalance(c *gin.Context) { // getESDTsRoles returns the token identifiers and roles for a given address func (ag *addressGroup) getESDTsRoles(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetRolesForAccount, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetRolesForAccount, err) return @@ -422,29 +368,12 @@ func (ag *addressGroup) getESDTsRoles(c *gin.Context) { // getESDTTokensWithRole returns the token identifiers where a given address has the given role func (ag *addressGroup) getESDTTokensWithRole(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, role, options, err := extractGetESDTTokensWithRoleParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, err) return } - role := c.Param("role") - if role == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, errors.ErrEmptyRole) - return - } - - if !core.IsValidESDTRole(role) { - shared.RespondWithValidationError(c, errors.ErrGetESDTTokensWithRole, fmt.Errorf("invalid role: %s", role)) - return - } - tokens, blockInfo, err := ag.getFacade().GetESDTsWithRole(addr, role, options) if err != nil { shared.RespondWithInternalError(c, errors.ErrGetESDTTokensWithRole, err) @@ -456,13 +385,7 @@ func (ag *addressGroup) getESDTTokensWithRole(c *gin.Context) { // getNFTTokenIDsRegisteredByAddress returns the token identifiers of the tokens where a given address is the owner func (ag *addressGroup) getNFTTokenIDsRegisteredByAddress(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrRegisteredNFTTokenIDs, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrRegisteredNFTTokenIDs, err) return @@ -479,37 +402,13 @@ func (ag *addressGroup) getNFTTokenIDsRegisteredByAddress(c *gin.Context) { // getESDTNFTData returns the nft data for the given token func (ag *addressGroup) getESDTNFTData(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTNFTData, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, tokenIdentifier, nonce, options, err := extractGetESDTNFTDataParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetESDTNFTData, err) return } - tokenIdentifier := c.Param("tokenIdentifier") - if tokenIdentifier == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTNFTData, errors.ErrEmptyTokenIdentifier) - return - } - - nonceAsStr := c.Param("nonce") - if nonceAsStr == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTNFTData, errors.ErrNonceInvalid) - return - } - - nonceAsBigInt, okConvert := big.NewInt(0).SetString(nonceAsStr, 10) - if !okConvert { - shared.RespondWithValidationError(c, errors.ErrGetESDTNFTData, errors.ErrNonceInvalid) - return - } - - esdtData, blockInfo, err := ag.getFacade().GetESDTData(addr, tokenIdentifier, nonceAsBigInt.Uint64(), options) + esdtData, blockInfo, err := ag.getFacade().GetESDTData(addr, tokenIdentifier, nonce.Uint64(), options) if err != nil { shared.RespondWithInternalError(c, errors.ErrGetESDTNFTData, err) return @@ -521,13 +420,7 @@ func (ag *addressGroup) getESDTNFTData(c *gin.Context) { // getAllESDTData returns the tokens list from this account func (ag *addressGroup) getAllESDTData(c *gin.Context) { - addr := c.Param("address") - if addr == "" { - shared.RespondWithValidationError(c, errors.ErrGetESDTNFTData, errors.ErrEmptyAddress) - return - } - - options, err := extractAccountQueryOptions(c) + addr, options, err := extractBaseParams(c) if err != nil { shared.RespondWithValidationError(c, errors.ErrGetESDTNFTData, err) return @@ -575,6 +468,76 @@ func (ag *addressGroup) getFacade() addressFacadeHandler { return ag.facade } +func extractBaseParams(c *gin.Context) (string, api.AccountQueryOptions, error) { + addr := c.Param("address") + if addr == "" { + return "", api.AccountQueryOptions{}, errors.ErrEmptyAddress + } + + options, err := extractAccountQueryOptions(c) + if err != nil { + return "", api.AccountQueryOptions{}, err + } + + return addr, options, nil +} + +func extractGetESDTBalanceParams(c *gin.Context) (string, string, api.AccountQueryOptions, error) { + addr, options, err := extractBaseParams(c) + if err != nil { + return "", "", api.AccountQueryOptions{}, err + } + + tokenIdentifier := c.Param("tokenIdentifier") + if tokenIdentifier == "" { + return "", "", api.AccountQueryOptions{}, errors.ErrEmptyTokenIdentifier + } + + return addr, tokenIdentifier, options, nil +} + +func extractGetESDTTokensWithRoleParams(c *gin.Context) (string, string, api.AccountQueryOptions, error) { + addr, options, err := extractBaseParams(c) + if err != nil { + return "", "", api.AccountQueryOptions{}, err + } + + role := c.Param("role") + if role == "" { + return "", "", api.AccountQueryOptions{}, errors.ErrEmptyRole + } + + if !core.IsValidESDTRole(role) { + return "", "", api.AccountQueryOptions{}, fmt.Errorf("%w: %s", errors.ErrInvalidRole, role) + } + + return addr, role, options, nil +} + +func extractGetESDTNFTDataParams(c *gin.Context) (string, string, *big.Int, api.AccountQueryOptions, error) { + addr, options, err := extractBaseParams(c) + if err != nil { + return "", "", nil, api.AccountQueryOptions{}, err + } + + tokenIdentifier := c.Param("tokenIdentifier") + if tokenIdentifier == "" { + return "", "", nil, api.AccountQueryOptions{}, errors.ErrEmptyTokenIdentifier + } + + nonceAsStr := c.Param("nonce") + if nonceAsStr == "" { + return "", "", nil, api.AccountQueryOptions{}, errors.ErrNonceInvalid + } + + nonceAsBigInt, okConvert := big.NewInt(0).SetString(nonceAsStr, 10) + if !okConvert { + return "", "", nil, api.AccountQueryOptions{}, errors.ErrNonceInvalid + } + + return addr, tokenIdentifier, nonceAsBigInt, options, nil +} + // UpdateFacade will update the facade func (ag *addressGroup) UpdateFacade(newFacade interface{}) error { if newFacade == nil { diff --git a/api/groups/addressGroupOptions_test.go b/api/groups/addressGroupOptions_test.go index 62678e6d628..e27b8b4294d 100644 --- a/api/groups/addressGroupOptions_test.go +++ b/api/groups/addressGroupOptions_test.go @@ -80,26 +80,32 @@ func TestParseAccountQueryOptions(t *testing.T) { options, err := parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("onFinalBlock=test")) require.Error(t, err) + require.Contains(t, err.Error(), "invalid syntax") require.Equal(t, api.AccountQueryOptions{}, options) options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("onStartOfEpoch=test")) require.Error(t, err) + require.Contains(t, err.Error(), "invalid syntax") require.Equal(t, api.AccountQueryOptions{}, options) options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockNonce=test")) require.Error(t, err) + require.Contains(t, err.Error(), "invalid syntax") require.Equal(t, api.AccountQueryOptions{}, options) options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockHash=test")) require.Error(t, err) + require.Contains(t, err.Error(), "invalid byte") require.Equal(t, api.AccountQueryOptions{}, options) options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("blockRootHash=test")) require.Error(t, err) + require.Contains(t, err.Error(), "invalid byte") require.Equal(t, api.AccountQueryOptions{}, options) options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("hintEpoch=test")) require.Error(t, err) + require.Contains(t, err.Error(), "invalid syntax") require.Equal(t, api.AccountQueryOptions{}, options) options, err = parseAccountQueryOptions(testscommon.CreateGinContextWithRawQuery("")) diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index cdd73ebc565..a8b3cf91cb1 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -192,7 +192,7 @@ func TestAddressGroup_getAccount(t *testing.T) { t.Parallel() t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrCouldNotGetAccount, apiErrors.ErrBadUrlParams))) t.Run("facade error should error", func(t *testing.T) { t.Parallel() @@ -207,6 +207,7 @@ func TestAddressGroup_getAccount(t *testing.T) { t, facade, "/address/addr", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrCouldNotGetAccount, expectedErr), @@ -215,7 +216,7 @@ func TestAddressGroup_getAccount(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetAccountCalled: func(address string, options api.AccountQueryOptions) (api.AccountResponse, api.BlockInfo, error) { return api.AccountResponse{ Address: "addr", @@ -226,24 +227,15 @@ func TestAddressGroup_getAccount(t *testing.T) { }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + response := &shared.GenericAPIResponse{} + loadAddressGroupResponse(t, facade, "/address/addr", "GET", nil, response) - req, _ := http.NewRequest("GET", "/address/addr", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) mapResponse := response.Data.(map[string]interface{}) accResp := accountResponse{} mapResponseBytes, _ := json.Marshal(&mapResponse) _ = json.Unmarshal(mapResponseBytes, &accResp) - assert.Equal(t, http.StatusOK, resp.Code) assert.Equal(t, "addr", accResp.Account.Address) assert.Equal(t, uint64(1), accResp.Account.Nonce) assert.Equal(t, "100", accResp.Account.Balance) @@ -252,14 +244,14 @@ func TestAddressGroup_getAccount(t *testing.T) { }) } -func TestAddressGroup_GetBalance(t *testing.T) { +func TestAddressGroup_getBalance(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//balance", nil, + testErrorScenario("/address//balance", "GET", nil, formatExpectedErr(apiErrors.ErrGetBalance, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/balance?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/balance?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetBalance, apiErrors.ErrBadUrlParams))) t.Run("facade error should error", func(t *testing.T) { t.Parallel() @@ -274,6 +266,7 @@ func TestAddressGroup_GetBalance(t *testing.T) { t, facade, "/address/erd1alice/balance", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetBalance, expectedErr), @@ -284,24 +277,21 @@ func TestAddressGroup_GetBalance(t *testing.T) { amount := big.NewInt(10) addr := "testAddress" - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetBalanceCalled: func(s string, _ api.AccountQueryOptions) (i *big.Int, info api.BlockInfo, e error) { return amount, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", fmt.Sprintf("/address/%s/balance", addr), nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := shared.GenericAPIResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &shared.GenericAPIResponse{} + loadAddressGroupResponse( + t, + facade, + fmt.Sprintf("/address/%s/balance", addr), + "GET", + nil, + response, + ) balanceStr := getValueForKey(response.Data, "balance") balanceResponse, ok := big.NewInt(0).SetString(balanceStr, 10) @@ -345,7 +335,7 @@ func TestAddressGroup_getAccounts(t *testing.T) { require.Equal(t, shared.ReturnCodeRequestError, response.Code) }) t.Run("invalid query options should error", - testErrorScenario("/address/bulk?blockNonce=not-uint64", bytes.NewBuffer([]byte(`["erd1", "erd1"]`)), + testErrorScenario("/address/bulk?blockNonce=not-uint64", "POST", bytes.NewBuffer([]byte(`["erd1", "erd1"]`)), formatExpectedErr(apiErrors.ErrCouldNotGetAccount, apiErrors.ErrBadUrlParams))) t.Run("facade error, should err", func(t *testing.T) { t.Parallel() @@ -378,18 +368,11 @@ func TestAddressGroup_getAccounts(t *testing.T) { Nonce: 37, }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetAccountsCalled: func(_ []string, _ api.AccountQueryOptions) (map[string]*api.AccountResponse, api.BlockInfo, error) { return expectedAccounts, api.BlockInfo{}, nil }, } - addrGroup, _ := groups.NewAddressGroup(&facade) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("POST", "/address/bulk", bytes.NewBuffer([]byte(`["erd1", "erd1"]`))) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) type responseType struct { Data struct { @@ -398,8 +381,16 @@ func TestAddressGroup_getAccounts(t *testing.T) { Error string `json:"error"` Code shared.ReturnCode `json:"code"` } - response := responseType{} - loadResponse(resp.Body, &response) + response := &responseType{} + loadAddressGroupResponse( + t, + facade, + "/address/bulk", + "POST", + bytes.NewBuffer([]byte(`["erd1", "erd1"]`)), + response, + ) + require.Empty(t, response.Error) require.Equal(t, shared.ReturnCodeSuccess, response.Code) require.Equal(t, expectedAccounts, response.Data.Accounts) @@ -410,10 +401,10 @@ func TestAddressGroup_getUsername(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//username", nil, + testErrorScenario("/address//username", "GET", nil, formatExpectedErr(apiErrors.ErrGetUsername, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/username?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/username?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetUsername, apiErrors.ErrBadUrlParams))) t.Run("facade error should error", func(t *testing.T) { t.Parallel() @@ -428,6 +419,7 @@ func TestAddressGroup_getUsername(t *testing.T) { t, facade, "/address/erd1alice/username", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetUsername, expectedErr), @@ -437,24 +429,21 @@ func TestAddressGroup_getUsername(t *testing.T) { t.Parallel() testUsername := "provided username" - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetUsernameCalled: func(_ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { return testUsername, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/username", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - usernameResponseObj := usernameResponse{} - loadResponse(resp.Body, &usernameResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + usernameResponseObj := &usernameResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/username", + "GET", + nil, + usernameResponseObj, + ) assert.Equal(t, testUsername, usernameResponseObj.Data.Username) }) } @@ -463,10 +452,10 @@ func TestAddressGroup_getCodeHash(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//code-hash", nil, + testErrorScenario("/address//code-hash", "GET", nil, formatExpectedErr(apiErrors.ErrGetCodeHash, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/code-hash?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/code-hash?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetCodeHash, apiErrors.ErrBadUrlParams))) t.Run("facade error should error", func(t *testing.T) { t.Parallel() @@ -481,6 +470,7 @@ func TestAddressGroup_getCodeHash(t *testing.T) { t, facade, "/address/erd1alice/code-hash", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetCodeHash, expectedErr), @@ -491,24 +481,21 @@ func TestAddressGroup_getCodeHash(t *testing.T) { testCodeHash := []byte("value") expectedResponseCodeHash := base64.StdEncoding.EncodeToString(testCodeHash) - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetCodeHashCalled: func(_ string, _ api.AccountQueryOptions) ([]byte, api.BlockInfo, error) { return testCodeHash, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/code-hash", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - codeHashResponseObj := codeHashResponse{} - loadResponse(resp.Body, &codeHashResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + codeHashResponseObj := &codeHashResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/code-hash", + "GET", + nil, + codeHashResponseObj, + ) assert.Equal(t, expectedResponseCodeHash, codeHashResponseObj.Data.CodeHash) }) } @@ -517,10 +504,10 @@ func TestAddressGroup_getValueForKey(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//key/test", nil, + testErrorScenario("/address//key/test", "GET", nil, formatExpectedErr(apiErrors.ErrGetValueForKey, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/key/test?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/key/test?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetValueForKey, apiErrors.ErrBadUrlParams))) t.Run("facade error should error", func(t *testing.T) { t.Parallel() @@ -535,6 +522,7 @@ func TestAddressGroup_getValueForKey(t *testing.T) { t, facade, "/address/erd1alice/key/test", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetValueForKey, expectedErr), @@ -544,24 +532,21 @@ func TestAddressGroup_getValueForKey(t *testing.T) { t.Parallel() testValue := "value" - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetValueForKeyCalled: func(_ string, _ string, _ api.AccountQueryOptions) (string, api.BlockInfo, error) { return testValue, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/key/test", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - valueForKeyResponseObj := valueForKeyResponse{} - loadResponse(resp.Body, &valueForKeyResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + valueForKeyResponseObj := &valueForKeyResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/key/test", + "GET", + nil, + valueForKeyResponseObj, + ) assert.Equal(t, testValue, valueForKeyResponseObj.Data.Value) }) } @@ -570,10 +555,10 @@ func TestAddressGroup_getGuardianData(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//guardian-data", nil, + testErrorScenario("/address//guardian-data", "GET", nil, formatExpectedErr(apiErrors.ErrGetGuardianData, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/guardian-data?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/guardian-data?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetGuardianData, apiErrors.ErrBadUrlParams))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -586,7 +571,9 @@ func TestAddressGroup_getGuardianData(t *testing.T) { testAddressGroup( t, facade, - "/address/erd1alice/guardian-data", nil, + "/address/erd1alice/guardian-data", + "GET", + nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetGuardianData, expectedErr), ) @@ -605,24 +592,21 @@ func TestAddressGroup_getGuardianData(t *testing.T) { }, Guarded: true, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetGuardianDataCalled: func(address string, options api.AccountQueryOptions) (api.GuardianData, api.BlockInfo, error) { return expectedGuardianData, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/guardian-data", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := guardianDataResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &guardianDataResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/guardian-data", + "GET", + nil, + response, + ) assert.Equal(t, expectedGuardianData, response.Data.GuardianData) }) } @@ -631,10 +615,10 @@ func TestAddressGroup_getKeyValuePairs(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//keys", nil, + testErrorScenario("/address//keys", "GET", nil, formatExpectedErr(apiErrors.ErrGetKeyValuePairs, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/keys?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/keys?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetKeyValuePairs, apiErrors.ErrBadUrlParams))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -648,6 +632,7 @@ func TestAddressGroup_getKeyValuePairs(t *testing.T) { t, facade, "/address/erd1alice/keys", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetKeyValuePairs, expectedErr), @@ -660,24 +645,21 @@ func TestAddressGroup_getKeyValuePairs(t *testing.T) { "k1": "v1", "k2": "v2", } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetKeyValuePairsCalled: func(_ string, _ api.AccountQueryOptions) (map[string]string, api.BlockInfo, error) { return pairs, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/keys", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := keyValuePairsResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &keyValuePairsResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/keys", + "GET", + nil, + response, + ) assert.Equal(t, pairs, response.Data.Pairs) }) } @@ -686,10 +668,10 @@ func TestAddressGroup_getESDTBalance(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//esdt/newToken", nil, + testErrorScenario("/address//esdt/newToken", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTBalance, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/esdt/newToken?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/esdt/newToken?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTBalance, apiErrors.ErrBadUrlParams))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -703,6 +685,7 @@ func TestAddressGroup_getESDTBalance(t *testing.T) { t, facade, "/address/erd1alice/esdt/newToken", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetESDTBalance, expectedErr), @@ -713,24 +696,21 @@ func TestAddressGroup_getESDTBalance(t *testing.T) { testValue := big.NewInt(100).String() testProperties := []byte{byte(0), byte(1), byte(0)} - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { return &esdt.ESDigitalToken{Value: big.NewInt(100), Properties: testProperties}, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/esdt/newToken", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtBalanceResponseObj := esdtTokenResponse{} - loadResponse(resp.Body, &esdtBalanceResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + esdtBalanceResponseObj := &esdtTokenResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/esdt/newToken", + "GET", + nil, + esdtBalanceResponseObj, + ) assert.Equal(t, testValue, esdtBalanceResponseObj.Data.Balance) assert.Equal(t, "000100", esdtBalanceResponseObj.Data.Properties) }) @@ -740,10 +720,10 @@ func TestAddressGroup_getESDTsRoles(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//esdts/roles", nil, + testErrorScenario("/address//esdts/roles", "GET", nil, formatExpectedErr(apiErrors.ErrGetRolesForAccount, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/esdts/roles?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/esdts/roles?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetRolesForAccount, apiErrors.ErrBadUrlParams))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -757,6 +737,7 @@ func TestAddressGroup_getESDTsRoles(t *testing.T) { t, facade, "/address/erd1alice/esdts/roles", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetRolesForAccount, expectedErr), @@ -769,24 +750,21 @@ func TestAddressGroup_getESDTsRoles(t *testing.T) { "token0": {"role0", "role1"}, "token1": {"role3", "role1"}, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetESDTsRolesCalled: func(_ string, _ api.AccountQueryOptions) (map[string][]string, api.BlockInfo, error) { return roles, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/esdts/roles", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := esdtRolesResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &esdtRolesResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/esdts/roles", + "GET", + nil, + response, + ) assert.Equal(t, roles, response.Data.Roles) }) } @@ -795,13 +773,13 @@ func TestAddressGroup_getESDTTokensWithRole(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//esdts-with-role/ESDTRoleNFTCreate", nil, + testErrorScenario("/address//esdts-with-role/ESDTRoleNFTCreate", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, apiErrors.ErrBadUrlParams))) t.Run("invalid role should error", - testErrorScenario("/address/erd1alice/esdts-with-role/invalid", nil, + testErrorScenario("/address/erd1alice/esdts-with-role/invalid", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, fmt.Errorf("invalid role: %s", "invalid")))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -815,6 +793,7 @@ func TestAddressGroup_getESDTTokensWithRole(t *testing.T) { t, facade, "/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetESDTTokensWithRole, expectedErr), @@ -824,24 +803,21 @@ func TestAddressGroup_getESDTTokensWithRole(t *testing.T) { t.Parallel() expectedTokens := []string{"ABC-0o9i8u", "XYZ-r5y7i9"} - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetESDTsWithRoleCalled: func(address string, role string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { return expectedTokens, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtResponseObj := esdtsWithRoleResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + esdtResponseObj := &esdtsWithRoleResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/esdts-with-role/ESDTRoleNFTCreate", + "GET", + nil, + esdtResponseObj, + ) assert.Equal(t, expectedTokens, esdtResponseObj.Data.Tokens) }) } @@ -850,10 +826,10 @@ func TestAddressGroup_getNFTTokenIDsRegisteredByAddress(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//registered-nfts", nil, + testErrorScenario("/address//registered-nfts", "GET", nil, formatExpectedErr(apiErrors.ErrRegisteredNFTTokenIDs, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/registered-nfts?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/registered-nfts?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrRegisteredNFTTokenIDs, apiErrors.ErrBadUrlParams))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -867,6 +843,7 @@ func TestAddressGroup_getNFTTokenIDsRegisteredByAddress(t *testing.T) { t, facade, "/address/erd1alice/registered-nfts", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrRegisteredNFTTokenIDs, expectedErr), @@ -876,24 +853,21 @@ func TestAddressGroup_getNFTTokenIDsRegisteredByAddress(t *testing.T) { t.Parallel() expectedTokens := []string{"ABC-0o9i8u", "XYZ-r5y7i9"} - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetNFTTokenIDsRegisteredByAddressCalled: func(address string, _ api.AccountQueryOptions) ([]string, api.BlockInfo, error) { return expectedTokens, api.BlockInfo{}, nil }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/registered-nfts", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtResponseObj := esdtsWithRoleResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + esdtResponseObj := &esdtsWithRoleResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/registered-nfts", + "GET", + nil, + esdtResponseObj, + ) assert.Equal(t, expectedTokens, esdtResponseObj.Data.Tokens) }) } @@ -902,13 +876,13 @@ func TestAddressGroup_getESDTNFTData(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//nft/newToken/nonce/10", nil, + testErrorScenario("/address//nft/newToken/nonce/10", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/nft/newToken/nonce/10?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/nft/newToken/nonce/10?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrBadUrlParams))) t.Run("invalid nonce should error", - testErrorScenario("/address/erd1alice/nft/newToken/nonce/not-int", nil, + testErrorScenario("/address/erd1alice/nft/newToken/nonce/not-int", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrNonceInvalid))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -922,6 +896,7 @@ func TestAddressGroup_getESDTNFTData(t *testing.T) { t, facade, "/address/erd1alice/nft/newToken/nonce/10", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetESDTNFTData, expectedErr), @@ -934,7 +909,7 @@ func TestAddressGroup_getESDTNFTData(t *testing.T) { testValue := big.NewInt(100).String() testNonce := uint64(37) testProperties := []byte{byte(1), byte(0), byte(0)} - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetESDTDataCalled: func(_ string, _ string, _ uint64, _ api.AccountQueryOptions) (*esdt.ESDigitalToken, api.BlockInfo, error) { return &esdt.ESDigitalToken{ Value: big.NewInt(100), @@ -943,18 +918,15 @@ func TestAddressGroup_getESDTNFTData(t *testing.T) { }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/nft/newToken/nonce/10", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtResponseObj := esdtNFTResponse{} - loadResponse(resp.Body, &esdtResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + esdtResponseObj := &esdtNFTResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/nft/newToken/nonce/10", + "GET", + nil, + esdtResponseObj, + ) assert.Equal(t, testValue, esdtResponseObj.Data.Balance) assert.Equal(t, "010000", esdtResponseObj.Data.Properties) assert.Equal(t, testAddress, esdtResponseObj.Data.Creator) @@ -966,10 +938,10 @@ func TestAddressGroup_getAllESDTData(t *testing.T) { t.Parallel() t.Run("empty address should error", - testErrorScenario("/address//esdt", nil, + testErrorScenario("/address//esdt", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrEmptyAddress))) t.Run("invalid query options should error", - testErrorScenario("/address/erd1alice/esdt?blockNonce=not-uint64", nil, + testErrorScenario("/address/erd1alice/esdt?blockNonce=not-uint64", "GET", nil, formatExpectedErr(apiErrors.ErrGetESDTNFTData, apiErrors.ErrBadUrlParams))) t.Run("with node fail should err", func(t *testing.T) { t.Parallel() @@ -983,6 +955,7 @@ func TestAddressGroup_getAllESDTData(t *testing.T) { t, facade, "/address/erd1alice/esdt", + "GET", nil, http.StatusInternalServerError, formatExpectedErr(apiErrors.ErrGetESDTNFTData, expectedErr), @@ -993,7 +966,7 @@ func TestAddressGroup_getAllESDTData(t *testing.T) { testValue1 := "token1" testValue2 := "token2" - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetAllESDTTokensCalled: func(address string, _ api.AccountQueryOptions) (map[string]*esdt.ESDigitalToken, api.BlockInfo, error) { tokens := make(map[string]*esdt.ESDigitalToken) tokens[testValue1] = &esdt.ESDigitalToken{Value: big.NewInt(10)} @@ -1002,18 +975,15 @@ func TestAddressGroup_getAllESDTData(t *testing.T) { }, } - addrGroup, err := groups.NewAddressGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - - req, _ := http.NewRequest("GET", "/address/erd1alice/esdt", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - esdtTokenResponseObj := esdtTokensCompleteResponse{} - loadResponse(resp.Body, &esdtTokenResponseObj) - assert.Equal(t, http.StatusOK, resp.Code) + esdtTokenResponseObj := &esdtTokensCompleteResponse{} + loadAddressGroupResponse( + t, + facade, + "/address/erd1alice/esdt", + "GET", + nil, + esdtTokenResponseObj, + ) assert.Equal(t, 2, len(esdtTokenResponseObj.Data.Tokens)) }) } @@ -1097,7 +1067,7 @@ func TestAddressGroup_IsInterfaceNil(t *testing.T) { require.False(t, addrGroup.IsInterfaceNil()) } -func testErrorScenario(url string, body io.Reader, expectedErr string) func(t *testing.T) { +func testErrorScenario(url string, method string, body io.Reader, expectedErr string) func(t *testing.T) { return func(t *testing.T) { t.Parallel() @@ -1105,6 +1075,7 @@ func testErrorScenario(url string, body io.Reader, expectedErr string) func(t *t t, &mock.FacadeStub{}, url, + method, body, http.StatusBadRequest, expectedErr, @@ -1112,10 +1083,33 @@ func testErrorScenario(url string, body io.Reader, expectedErr string) func(t *t } } +func loadAddressGroupResponse( + t *testing.T, + facade shared.FacadeHandler, + url string, + method string, + body io.Reader, + destination interface{}, +) { + addrGroup, err := groups.NewAddressGroup(facade) + require.NoError(t, err) + + ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) + + req, _ := http.NewRequest(method, url, body) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, http.StatusOK, resp.Code) + + loadResponse(resp.Body, destination) +} + func testAddressGroup( t *testing.T, facade shared.FacadeHandler, url string, + method string, body io.Reader, expectedRespCode int, expectedRespError string, @@ -1125,7 +1119,7 @@ func testAddressGroup( ws := startWebServer(addrGroup, "address", getAddressRoutesConfig()) - req, _ := http.NewRequest("GET", url, body) + req, _ := http.NewRequest(method, url, body) resp := httptest.NewRecorder() ws.ServeHTTP(resp, req) From 7f02f2271b1681e5a42e5b869e058e9fcf88bf32 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 26 Apr 2023 12:47:28 +0300 Subject: [PATCH 322/335] fixes after review --- api/groups/blockGroup_test.go | 140 +++++----- api/groups/hardforkGroup_test.go | 2 +- api/groups/internalGroup_test.go | 446 ++++++++++++++----------------- 3 files changed, 277 insertions(+), 311 deletions(-) diff --git a/api/groups/blockGroup_test.go b/api/groups/blockGroup_test.go index 0612da89074..1f6d7b50f1a 100644 --- a/api/groups/blockGroup_test.go +++ b/api/groups/blockGroup_test.go @@ -10,7 +10,6 @@ import ( "strings" "testing" - "github.com/gin-gonic/gin" "github.com/multiversx/mx-chain-core-go/data/api" "github.com/multiversx/mx-chain-core-go/data/outport" apiErrors "github.com/multiversx/mx-chain-go/api/errors" @@ -98,7 +97,7 @@ func TestBlockGroup_getBlockByNonce(t *testing.T) { Nonce: 37, Round: 39, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetBlockByNonceCalled: func(nonce uint64, options api.BlockQueryOptions) (*api.Block, error) { require.Equal(t, providedNonce, nonce) require.Equal(t, expectedOptions, options) @@ -106,20 +105,15 @@ func TestBlockGroup_getBlockByNonce(t *testing.T) { }, } - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - url := fmt.Sprintf("/block/by-nonce/%d?withTxs=true", providedNonce) - req, _ := http.NewRequest("GET", url, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - + response := &blockResponse{} + loadBlockGroupResponse( + t, + facade, + fmt.Sprintf("/block/by-nonce/%d?withTxs=true", providedNonce), + "GET", + nil, + response, + ) assert.Equal(t, expectedBlock, response.Data.Block) }) } @@ -162,7 +156,7 @@ func TestBlockGroup_getBlockByHash(t *testing.T) { Nonce: 37, Round: 39, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetBlockByHashCalled: func(hash string, options api.BlockQueryOptions) (*api.Block, error) { require.Equal(t, providedHash, hash) require.Equal(t, expectedOptions, options) @@ -170,20 +164,15 @@ func TestBlockGroup_getBlockByHash(t *testing.T) { }, } - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - url := fmt.Sprintf("/block/by-hash/%s?withTxs=true", providedHash) - req, _ := http.NewRequest("GET", url, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := blockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - + response := &blockResponse{} + loadBlockGroupResponse( + t, + facade, + fmt.Sprintf("/block/by-hash/%s?withTxs=true", providedHash), + "GET", + nil, + response, + ) assert.Equal(t, expectedBlock, response.Data.Block) }) } @@ -228,7 +217,7 @@ func TestBlockGroup_getBlockByRound(t *testing.T) { Nonce: 37, Round: 39, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetBlockByRoundCalled: func(round uint64, options api.BlockQueryOptions) (*api.Block, error) { require.Equal(t, providedRound, round) require.Equal(t, expectedOptions, options) @@ -236,20 +225,15 @@ func TestBlockGroup_getBlockByRound(t *testing.T) { }, } - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - url := fmt.Sprintf("/block/by-round/%d?withTxs=true", providedRound) - req, _ := http.NewRequest("GET", url, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := blockResponse{} - loadResponse(resp.Body, &response) - - assert.Equal(t, http.StatusOK, resp.Code) + response := &blockResponse{} + loadBlockGroupResponse( + t, + facade, + fmt.Sprintf("/block/by-round/%d?withTxs=true", providedRound), + "GET", + nil, + response, + ) assert.Equal(t, expectedBlock, response.Data.Block) }) } @@ -300,21 +284,22 @@ func TestBlockGroup_getAlteredAccountsByNonce(t *testing.T) { }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { require.Equal(t, expectedOptions, options) return expectedResponse, nil }, } - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - url := fmt.Sprintf("/block/altered-accounts/by-nonce/%d", providedNonce) - response, code := httpGetAlteredAccountsForBlockBlock(ws, url) - require.Equal(t, http.StatusOK, code) + response := &alteredAccountsForBlockResponse{} + loadBlockGroupResponse( + t, + facade, + fmt.Sprintf("/block/altered-accounts/by-nonce/%d", providedNonce), + "GET", + nil, + response, + ) require.Equal(t, expectedResponse, response.Data.Accounts) require.Empty(t, response.Error) require.Equal(t, string(shared.ReturnCodeSuccess), response.Code) @@ -368,7 +353,7 @@ func TestBlockGroup_getAlteredAccountsByHash(t *testing.T) { }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetAlteredAccountsForBlockCalled: func(options api.GetAlteredAccountsForBlockOptions) ([]*outport.AlteredAccount, error) { require.Equal(t, providedHash, hex.EncodeToString(options.Hash)) require.Equal(t, expectedOptions, options) @@ -376,14 +361,15 @@ func TestBlockGroup_getAlteredAccountsByHash(t *testing.T) { }, } - blockGroup, err := groups.NewBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) - - url := fmt.Sprintf("/block/altered-accounts/by-hash/%s", providedHash) - response, code := httpGetAlteredAccountsForBlockBlock(ws, url) - require.Equal(t, http.StatusOK, code) + response := &alteredAccountsForBlockResponse{} + loadBlockGroupResponse( + t, + facade, + fmt.Sprintf("/block/altered-accounts/by-hash/%s", providedHash), + "GET", + nil, + response, + ) require.Equal(t, expectedResponse, response.Data.Accounts) require.Empty(t, response.Error) require.Equal(t, string(shared.ReturnCodeSuccess), response.Code) @@ -467,14 +453,26 @@ func TestBlockGroup_UpdateFacadeStub(t *testing.T) { }) } -func httpGetAlteredAccountsForBlockBlock(ws *gin.Engine, url string) (alteredAccountsForBlockResponse, int) { - httpRequest, _ := http.NewRequest("GET", url, nil) - httpResponse := httptest.NewRecorder() - ws.ServeHTTP(httpResponse, httpRequest) +func loadBlockGroupResponse( + t *testing.T, + facade shared.FacadeHandler, + url string, + method string, + body io.Reader, + destination interface{}, +) { + blockGroup, err := groups.NewBlockGroup(facade) + require.NoError(t, err) + + ws := startWebServer(blockGroup, "block", getBlockRoutesConfig()) + + req, _ := http.NewRequest(method, url, body) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, http.StatusOK, resp.Code) - response := alteredAccountsForBlockResponse{} - loadResponse(httpResponse.Body, &response) - return response, httpResponse.Code + loadResponse(resp.Body, destination) } func testBlockGroupErrorScenario(url string, body io.Reader, expectedErr string) func(t *testing.T) { diff --git a/api/groups/hardforkGroup_test.go b/api/groups/hardforkGroup_test.go index 61f977341ad..b5ff8928ccc 100644 --- a/api/groups/hardforkGroup_test.go +++ b/api/groups/hardforkGroup_test.go @@ -39,7 +39,7 @@ func TestNewHardforkGroup(t *testing.T) { }) } -func TestHardforkGroup_TriggerCanNotExecuteShouldErr(t *testing.T) { +func TestHardforkGroup_TriggerCannotExecuteShouldErr(t *testing.T) { t.Parallel() hardforkFacade := &mock.HardforkFacade{ diff --git a/api/groups/internalGroup_test.go b/api/groups/internalGroup_test.go index 3e1f6f84730..92f34ac9320 100644 --- a/api/groups/internalGroup_test.go +++ b/api/groups/internalGroup_test.go @@ -139,24 +139,21 @@ func TestInternalBlockGroup_getMetaBlockByNonce(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &rawBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/raw/metablock/by-nonce/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedRawBlockOutput, response.Data.Block) }) } @@ -193,24 +190,21 @@ func TestInternalBlockGroup_getRawMetaBlockByRound(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &rawBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/raw/metablock/by-round/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedRawBlockOutput, response.Data.Block) }) } @@ -244,24 +238,21 @@ func TestInternalBlockGroup_getRawMetaBlockByHash(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &rawBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/raw/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", + "GET", + nil, + response, + ) assert.Equal(t, expectedRawBlockOutput, response.Data.Block) }) } @@ -298,24 +289,21 @@ func TestInternalBlockGroup_getRawStartOfEpochMetaBlock(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/startofepoch/metablock/by-epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &rawBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/raw/startofepoch/metablock/by-epoch/1", + "GET", + nil, + response, + ) assert.Equal(t, expectedRawBlockOutput, response.Data.Block) }) } @@ -352,24 +340,21 @@ func TestInternalBlockGroup_getRawShardBlockByNonce(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &rawBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/raw/shardblock/by-nonce/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedRawBlockOutput, response.Data.Block) }) } @@ -406,24 +391,21 @@ func TestInternalBlockGroup_getRawShardBlockByRound(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &rawBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/raw/shardblock/by-round/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedRawBlockOutput, response.Data.Block) }) } @@ -457,24 +439,21 @@ func TestInternalBlockGroup_getRawShardBlockByHash(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &rawBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/raw/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", + "GET", + nil, + response, + ) assert.Equal(t, expectedRawBlockOutput, response.Data.Block) }) } @@ -516,42 +495,23 @@ func TestInternalBlockGroup_getRawMiniBlockByHash(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMiniBlockByHashCalled: func(format common.ApiOutputFormat, hash string, epoch uint32) (interface{}, error) { return expectedRawBlockOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/raw/miniblock/by-hash/aaaa/epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := rawMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - - assert.Equal(t, expectedRawBlockOutput, response.Data.Block) - }) -} - -func testInternalGroupErrorScenario(url string, body io.Reader, expectedErr string) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - testInternalGroup( + response := &rawMiniBlockResponse{} + loadInternalBlockGroupResponse( t, - &mock.FacadeStub{}, - url, - body, - http.StatusBadRequest, - expectedErr, + facade, + "/internal/raw/miniblock/by-hash/aaaa/epoch/1", + "GET", + nil, + response, ) - } + assert.Equal(t, expectedRawBlockOutput, response.Data.Block) + }) } func TestInternalBlockGroup_getJSONMetaBlockByNonce(t *testing.T) { @@ -586,24 +546,21 @@ func TestInternalBlockGroup_getJSONMetaBlockByNonce(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMetaBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedMetaBlock, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &internalMetaBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/metablock/by-nonce/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedMetaBlock, response.Data.Block) }) } @@ -640,24 +597,21 @@ func TestInternalBlockGroup_getJSONMetaBlockByRound(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMetaBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedMetaBlock, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &internalMetaBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/metablock/by-round/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedMetaBlock, response.Data.Block) }) } @@ -691,24 +645,21 @@ func TestInternalBlockGroup_getJSONMetaBlockByHash(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMetaBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { return expectedMetaBlock, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &internalMetaBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/metablock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", + "GET", + nil, + response, + ) assert.Equal(t, expectedMetaBlock, response.Data.Block) }) } @@ -745,24 +696,21 @@ func TestInternalBlockGroup_getJSONStartOfEpochMetaBlock(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalStartOfEpochMetaBlockCalled: func(_ common.ApiOutputFormat, epoch uint32) (interface{}, error) { return expectedMetaBlock, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/startofepoch/metablock/by-epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMetaBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &internalMetaBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/startofepoch/metablock/by-epoch/1", + "GET", + nil, + response, + ) assert.Equal(t, expectedMetaBlock, response.Data.Block) }) } @@ -799,24 +747,21 @@ func TestInternalBlockGroup_getJSONShardBlockByNonce(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalShardBlockByNonceCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedShardBlock, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-nonce/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &internalShardBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/shardblock/by-nonce/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedShardBlock, response.Data.Block) }) } @@ -853,24 +798,21 @@ func TestInternalBlockGroup_getJSONShardBlockByRound(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalShardBlockByRoundCalled: func(_ common.ApiOutputFormat, _ uint64) (interface{}, error) { return expectedShardBlock, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-round/15", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &internalShardBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/shardblock/by-round/15", + "GET", + nil, + response, + ) assert.Equal(t, expectedShardBlock, response.Data.Block) }) } @@ -904,24 +846,21 @@ func TestInternalBlockGroup_getJSONShardBlockByHash(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalShardBlockByHashCalled: func(_ common.ApiOutputFormat, _ string) (interface{}, error) { return expectedShardBlock, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalShardBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &internalShardBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/shardblock/by-hash/d08089f2ab739520598fd7aeed08c427460fe94f286383047f3f61951afc4e00", + "GET", + nil, + response, + ) assert.Equal(t, expectedShardBlock, response.Data.Block) }) } @@ -963,25 +902,21 @@ func TestInternalBlockGroup_getJSONMiniBlockByHash(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalMiniBlockByHashCalled: func(format common.ApiOutputFormat, hash string, epoch uint32) (interface{}, error) { return block.MiniBlock{}, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/miniblock/by-hash/aaaa/epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalMiniBlockResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - + response := &internalMiniBlockResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/miniblock/by-hash/aaaa/epoch/1", + "GET", + nil, + response, + ) assert.Equal(t, block.MiniBlock{}, response.Data.Block) }) } @@ -1027,25 +962,21 @@ func TestInternalBlockGroup_getJSONStartOfEpochValidatorsInfo(t *testing.T) { }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetInternalStartOfEpochValidatorsInfoCalled: func(epoch uint32) ([]*state.ShardValidatorInfo, error) { return expectedOutput, nil }, } - blockGroup, err := groups.NewInternalBlockGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) - - req, _ := http.NewRequest("GET", "/internal/json/startofepoch/validators/by-epoch/1", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := internalValidatorsInfoResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) - + response := &internalValidatorsInfoResponse{} + loadInternalBlockGroupResponse( + t, + facade, + "/internal/json/startofepoch/validators/by-epoch/1", + "GET", + nil, + response, + ) assert.Equal(t, expectedOutput, response.Data.ValidatorsInfo) }) } @@ -1133,6 +1064,43 @@ func TestInternalBlockGroup_UpdateFacadeStub(t *testing.T) { }) } +func loadInternalBlockGroupResponse( + t *testing.T, + facade shared.FacadeHandler, + url string, + method string, + body io.Reader, + destination interface{}, +) { + blockGroup, err := groups.NewInternalBlockGroup(facade) + require.NoError(t, err) + + ws := startWebServer(blockGroup, "internal", getInternalBlockRoutesConfig()) + + req, _ := http.NewRequest(method, url, body) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, http.StatusOK, resp.Code) + + loadResponse(resp.Body, destination) +} + +func testInternalGroupErrorScenario(url string, body io.Reader, expectedErr string) func(t *testing.T) { + return func(t *testing.T) { + t.Parallel() + + testInternalGroup( + t, + &mock.FacadeStub{}, + url, + body, + http.StatusBadRequest, + expectedErr, + ) + } +} + func testInternalGroup( t *testing.T, facade shared.FacadeHandler, From bf6baec602118b516604c1039ef6f9d89d2c0acb Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Wed, 26 Apr 2023 13:20:02 +0300 Subject: [PATCH 323/335] fixes after review --- api/groups/networkGroup_test.go | 101 +++++------ api/groups/nodeGroup_test.go | 4 - api/groups/proofGroup.go | 163 +++--------------- api/groups/transactionGroup_test.go | 252 +++++++++++++--------------- 4 files changed, 198 insertions(+), 322 deletions(-) diff --git a/api/groups/networkGroup_test.go b/api/groups/networkGroup_test.go index d8b8d2a9d7c..dccf923e1b9 100644 --- a/api/groups/networkGroup_test.go +++ b/api/groups/networkGroup_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "io/ioutil" "math/big" "net/http" @@ -735,7 +736,6 @@ func TestGetGenesisNodes(t *testing.T) { t.Run("facade error, should fail", func(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected err") facade := mock.FacadeStub{ GetGenesisNodesPubKeysCalled: func() (map[uint32][]string, map[uint32][]string, error) { return nil, nil, expectedErr @@ -773,26 +773,21 @@ func TestGetGenesisNodes(t *testing.T) { Waiting: waiting, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetGenesisNodesPubKeysCalled: func() (map[uint32][]string, map[uint32][]string, error) { return eligible, waiting, nil }, } - networkGroup, err := groups.NewNetworkGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(networkGroup, "network", getNetworkRoutesConfig()) - - req, _ := http.NewRequest("GET", "/network/genesis-nodes", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - assert.Equal(t, resp.Code, http.StatusOK) - - response := genesisNodesConfigResponse{} - loadResponse(resp.Body, &response) - + response := &genesisNodesConfigResponse{} + loadNetworkGroupResponse( + t, + facade, + "/network/genesis-nodes", + "GET", + nil, + response, + ) assert.Equal(t, expectedOutput, response.Data.Nodes) }) } @@ -803,7 +798,6 @@ func TestGetGenesisBalances(t *testing.T) { t.Run("facade error, should fail", func(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected err") facade := mock.FacadeStub{ GetGenesisBalancesCalled: func() ([]*common.InitialAccountAPI, error) { return nil, expectedErr @@ -840,26 +834,21 @@ func TestGetGenesisBalances(t *testing.T) { }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetGenesisBalancesCalled: func() ([]*common.InitialAccountAPI, error) { return initialAccounts, nil }, } - networkGroup, err := groups.NewNetworkGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(networkGroup, "network", getNetworkRoutesConfig()) - - req, _ := http.NewRequest("GET", "/network/genesis-balances", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - assert.Equal(t, resp.Code, http.StatusOK) - - response := genesisBalancesResponse{} - loadResponse(resp.Body, &response) - + response := &genesisBalancesResponse{} + loadNetworkGroupResponse( + t, + facade, + "/network/genesis-balances", + "GET", + nil, + response, + ) assert.Equal(t, initialAccounts, response.Data.Balances) }) } @@ -870,7 +859,6 @@ func TestGetGasConfigs(t *testing.T) { t.Run("facade error, should fail", func(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected err") facade := mock.FacadeStub{ GetGasConfigsCalled: func() (map[string]map[string]uint64, error) { return nil, expectedErr @@ -907,26 +895,21 @@ func TestGetGasConfigs(t *testing.T) { common.MetaChainSystemSCsCost: metaChainSystemSCsCost, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetGasConfigsCalled: func() (map[string]map[string]uint64, error) { return expectedMap, nil }, } - networkGroup, err := groups.NewNetworkGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(networkGroup, "network", getNetworkRoutesConfig()) - - req, _ := http.NewRequest("GET", "/network/gas-configs", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - assert.Equal(t, resp.Code, http.StatusOK) - - response := gasConfigsResponse{} - loadResponse(resp.Body, &response) - + response := &gasConfigsResponse{} + loadNetworkGroupResponse( + t, + facade, + "/network/gas-configs", + "GET", + nil, + response, + ) assert.Equal(t, builtInCost, response.Data.Configs.BuiltInCost) assert.Equal(t, metaChainSystemSCsCost, response.Data.Configs.MetaChainSystemSCsCost) }) @@ -1010,6 +993,28 @@ func TestNetworkGroup_IsInterfaceNil(t *testing.T) { require.False(t, networkGroup.IsInterfaceNil()) } +func loadNetworkGroupResponse( + t *testing.T, + facade shared.FacadeHandler, + url string, + method string, + body io.Reader, + destination interface{}, +) { + networkGroup, err := groups.NewNetworkGroup(facade) + require.NoError(t, err) + + ws := startWebServer(networkGroup, "network", getNetworkRoutesConfig()) + + req, _ := http.NewRequest(method, url, body) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, http.StatusOK, resp.Code) + + loadResponse(resp.Body, destination) +} + func getNetworkRoutesConfig() config.ApiRoutesConfig { return config.ApiRoutesConfig{ APIPackages: map[string]config.APIPackageConfig{ diff --git a/api/groups/nodeGroup_test.go b/api/groups/nodeGroup_test.go index 06976ebb108..eb21fe40bd1 100644 --- a/api/groups/nodeGroup_test.go +++ b/api/groups/nodeGroup_test.go @@ -377,7 +377,6 @@ func TestQueryDebug_ShouldBindJSONErrorsShouldErr(t *testing.T) { func TestQueryDebug_GetQueryErrorsShouldErr(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected error") facade := mock.FacadeStub{ GetQueryHandlerCalled: func(name string) (handler debug.QueryHandler, err error) { return nil, expectedErr @@ -447,7 +446,6 @@ func TestQueryDebug_GetQueryShouldWork(t *testing.T) { func TestPeerInfo_PeerInfoErrorsShouldErr(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected error") facade := mock.FacadeStub{ GetPeerInfoCalled: func(pid string) ([]core.QueryP2PPeerInfo, error) { return nil, expectedErr @@ -539,7 +537,6 @@ func TestEpochStartData_InvalidEpochShouldErr(t *testing.T) { func TestEpochStartData_FacadeErrorsShouldErr(t *testing.T) { t.Parallel() - expectedErr := errors.New("expected error") facade := mock.FacadeStub{ GetEpochStartDataAPICalled: func(epoch uint32) (*common.EpochStartDataAPI, error) { return nil, expectedErr @@ -703,7 +700,6 @@ func TestNodeGroup_UpdateFacade(t *testing.T) { keyAndValueFoundInResponse := strings.Contains(respStr, key) && strings.Contains(respStr, fmt.Sprintf("%d", value)) assert.True(t, keyAndValueFoundInResponse) - expectedErr := errors.New("expected error") newFacade := mock.FacadeStub{ StatusMetricsHandler: func() external.StatusMetricsHandler { return &testscommon.StatusMetricsStub{ diff --git a/api/groups/proofGroup.go b/api/groups/proofGroup.go index 6f6a4b17bb9..6257762c028 100644 --- a/api/groups/proofGroup.go +++ b/api/groups/proofGroup.go @@ -115,56 +115,25 @@ type VerifyProofRequest struct { func (pg *proofGroup) getProof(c *gin.Context) { rootHash := c.Param("roothash") if rootHash == "" { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), errors.ErrValidationEmptyRootHash.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, errors.ErrValidationEmptyRootHash) return } address := c.Param("address") if address == "" { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), errors.ErrValidationEmptyAddress.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, errors.ErrValidationEmptyAddress) return } response, err := pg.getFacade().GetProof(rootHash, address) if err != nil { - c.JSON( - http.StatusInternalServerError, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrGetProof.Error(), err.Error()), - Code: shared.ReturnCodeInternalError, - }, - ) + shared.RespondWithInternalError(c, errors.ErrGetProof, err) return } hexProof := bytesToHex(response.Proof) - c.JSON( - http.StatusOK, - shared.GenericAPIResponse{ - Data: gin.H{ - "proof": hexProof, - "value": hex.EncodeToString(response.Value), - }, - Error: "", - Code: shared.ReturnCodeSuccess, - }, - ) + shared.RespondWithSuccess(c, gin.H{"proof": hexProof, "value": hex.EncodeToString(response.Value)}) } // getProofDataTrie will receive a rootHash, a key and an address from the client, and it will return the Merkle proofs @@ -172,53 +141,25 @@ func (pg *proofGroup) getProof(c *gin.Context) { func (pg *proofGroup) getProofDataTrie(c *gin.Context) { rootHash := c.Param("roothash") if rootHash == "" { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), errors.ErrValidationEmptyRootHash.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, errors.ErrValidationEmptyRootHash) return } address := c.Param("address") if address == "" { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), errors.ErrValidationEmptyAddress.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, errors.ErrValidationEmptyAddress) return } key := c.Param("key") if key == "" { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), errors.ErrValidationEmptyKey.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, errors.ErrValidationEmptyKey) return } mainTrieResponse, dataTrieResponse, err := pg.getFacade().GetProofDataTrie(rootHash, address, key) if err != nil { - c.JSON( - http.StatusInternalServerError, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrGetProof.Error(), err.Error()), - Code: shared.ReturnCodeInternalError, - }, - ) + shared.RespondWithInternalError(c, errors.ErrGetProof, err) return } @@ -226,18 +167,11 @@ func (pg *proofGroup) getProofDataTrie(c *gin.Context) { proofs["mainProof"] = bytesToHex(mainTrieResponse.Proof) proofs["dataTrieProof"] = bytesToHex(dataTrieResponse.Proof) - c.JSON( - http.StatusOK, - shared.GenericAPIResponse{ - Data: gin.H{ - "proofs": proofs, - "value": hex.EncodeToString(dataTrieResponse.Value), - "dataTrieRootHash": dataTrieResponse.RootHash, - }, - Error: "", - Code: shared.ReturnCodeSuccess, - }, - ) + shared.RespondWithSuccess(c, gin.H{ + "proofs": proofs, + "value": hex.EncodeToString(dataTrieResponse.Value), + "dataTrieRootHash": dataTrieResponse.RootHash, + }) } func bytesToHex(bytesValue [][]byte) []string { @@ -254,44 +188,23 @@ func bytesToHex(bytesValue [][]byte) []string { func (pg *proofGroup) getProofCurrentRootHash(c *gin.Context) { address := c.Param("address") if address == "" { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), errors.ErrValidationEmptyAddress.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, errors.ErrValidationEmptyAddress) return } response, err := pg.getFacade().GetProofCurrentRootHash(address) if err != nil { - c.JSON( - http.StatusInternalServerError, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrGetProof.Error(), err.Error()), - Code: shared.ReturnCodeInternalError, - }, - ) + shared.RespondWithInternalError(c, errors.ErrGetProof, err) return } hexProof := bytesToHex(response.Proof) - c.JSON( - http.StatusOK, - shared.GenericAPIResponse{ - Data: gin.H{ - "proof": hexProof, - "value": hex.EncodeToString(response.Value), - "rootHash": response.RootHash, - }, - Error: "", - Code: shared.ReturnCodeSuccess, - }, - ) + shared.RespondWithSuccess(c, gin.H{ + "proof": hexProof, + "value": hex.EncodeToString(response.Value), + "rootHash": response.RootHash, + }) } // verifyProof will receive a rootHash, an address and a Merkle proof from the client, @@ -300,14 +213,7 @@ func (pg *proofGroup) verifyProof(c *gin.Context) { var verifyProofParams = &VerifyProofRequest{} err := c.ShouldBindJSON(&verifyProofParams) if err != nil { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), err.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, err) return } @@ -315,14 +221,7 @@ func (pg *proofGroup) verifyProof(c *gin.Context) { for _, hexProof := range verifyProofParams.Proof { bytesProof, err := hex.DecodeString(hexProof) if err != nil { - c.JSON( - http.StatusBadRequest, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrValidation.Error(), err.Error()), - Code: shared.ReturnCodeRequestError, - }, - ) + shared.RespondWithValidationError(c, errors.ErrValidation, err) return } @@ -332,25 +231,11 @@ func (pg *proofGroup) verifyProof(c *gin.Context) { var proofOk bool proofOk, err = pg.getFacade().VerifyProof(verifyProofParams.RootHash, verifyProofParams.Address, proof) if err != nil { - c.JSON( - http.StatusInternalServerError, - shared.GenericAPIResponse{ - Data: nil, - Error: fmt.Sprintf("%s: %s", errors.ErrVerifyProof.Error(), err.Error()), - Code: shared.ReturnCodeInternalError, - }, - ) + shared.RespondWithInternalError(c, errors.ErrVerifyProof, err) return } - c.JSON( - http.StatusOK, - shared.GenericAPIResponse{ - Data: gin.H{"ok": proofOk}, - Error: "", - Code: shared.ReturnCodeSuccess, - }, - ) + shared.RespondWithSuccess(c, gin.H{"ok": proofOk}) } func (pg *proofGroup) getFacade() proofFacadeHandler { diff --git a/api/groups/transactionGroup_test.go b/api/groups/transactionGroup_test.go index 5331f85bbbc..82d67abf1aa 100644 --- a/api/groups/transactionGroup_test.go +++ b/api/groups/transactionGroup_test.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "io" "net/http" "net/http/httptest" "strings" @@ -205,7 +206,7 @@ func TestTransactionsGroup_getTransaction(t *testing.T) { t.Run("should work", func(t *testing.T) { t.Parallel() - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetTransactionHandler: func(hash string, withEvents bool) (i *dataTx.ApiTransactionResult, e error) { return &dataTx.ApiTransactionResult{ Sender: sender, @@ -217,20 +218,16 @@ func TestTransactionsGroup_getTransaction(t *testing.T) { }, } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - req, _ := http.NewRequest("GET", "/transaction/"+hash, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := transactionResponse{} - loadResponse(resp.Body, &response) - + response := &transactionResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/"+hash, + "GET", + nil, + response, + ) txResp := response.Data.TxResp - assert.Equal(t, http.StatusOK, resp.Code) assert.Equal(t, sender, txResp.Sender) assert.Equal(t, receiver, txResp.Receiver) assert.Equal(t, value, txResp.Value) @@ -330,19 +327,16 @@ func TestTransactionGroup_sendTransaction(t *testing.T) { return nil }, } - transactionGroup, err := groups.NewTransactionGroup(facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - req, _ := http.NewRequest("POST", "/transaction/send", bytes.NewBuffer([]byte(jsonTxStr))) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - response := sendSingleTxResponse{} - loadResponse(resp.Body, &response) - assert.Equal(t, http.StatusOK, resp.Code) + response := &sendSingleTxResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/send", + "POST", + bytes.NewBuffer([]byte(jsonTxStr)), + response, + ) assert.Empty(t, response.Error) assert.Equal(t, hexTxHash, response.Data.TxHash) }) @@ -449,11 +443,6 @@ func TestTransactionGroup_sendMultipleTransactions(t *testing.T) { }, } - transactionGroup, err := groups.NewTransactionGroup(facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - tx0 := groups.SendTxRequest{ Sender: "sender1", Receiver: "receiver1", @@ -470,15 +459,15 @@ func TestTransactionGroup_sendMultipleTransactions(t *testing.T) { jsonBytes, _ := json.Marshal(txs) - req, _ := http.NewRequest("POST", "/transaction/send-multiple", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txCostResp := sendMultipleTxsResponse{} - loadResponse(resp.Body, &txCostResp) - - assert.Equal(t, http.StatusOK, resp.Code) + response := &sendMultipleTxsResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/send-multiple", + "POST", + bytes.NewBuffer(jsonBytes), + response, + ) assert.True(t, createTxWasCalled) assert.True(t, sendBulkTxsWasCalled) }) @@ -536,7 +525,7 @@ func TestTransactionGroup_computeTransactionGasLimit(t *testing.T) { expectedGasLimit := uint64(37) - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ CreateTransactionHandler: func(txArgs *external.ArgsCreateTransaction) (*dataTx.Transaction, []byte, error) { return &dataTx.Transaction{}, nil, nil }, @@ -548,11 +537,6 @@ func TestTransactionGroup_computeTransactionGasLimit(t *testing.T) { }, } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - tx0 := groups.SendTxRequest{ Sender: "sender1", Receiver: "receiver1", @@ -566,16 +550,16 @@ func TestTransactionGroup_computeTransactionGasLimit(t *testing.T) { jsonBytes, _ := json.Marshal(tx0) - req, _ := http.NewRequest("POST", "/transaction/cost", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txCostResp := transactionCostResponse{} - loadResponse(resp.Body, &txCostResp) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.Equal(t, expectedGasLimit, txCostResp.Data.Cost) + response := &transactionCostResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/cost", + "POST", + bytes.NewBuffer(jsonBytes), + response, + ) + assert.Equal(t, expectedGasLimit, response.Data.Cost) }) } @@ -661,7 +645,7 @@ func TestTransactionGroup_simulateTransaction(t *testing.T) { processTxWasCalled := false - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ SimulateTransactionExecutionHandler: func(tx *dataTx.Transaction) (*txSimData.SimulationResults, error) { processTxWasCalled = true return &txSimData.SimulationResults{ @@ -680,11 +664,6 @@ func TestTransactionGroup_simulateTransaction(t *testing.T) { }, } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - tx := groups.SendTxRequest{ Sender: "sender1", Receiver: "receiver1", @@ -697,17 +676,17 @@ func TestTransactionGroup_simulateTransaction(t *testing.T) { } jsonBytes, _ := json.Marshal(tx) - req, _ := http.NewRequest("POST", "/transaction/simulate", bytes.NewBuffer(jsonBytes)) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - simulateResponse := simulateTxResponse{} - loadResponse(resp.Body, &simulateResponse) - - assert.Equal(t, http.StatusOK, resp.Code) + response := &simulateTxResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/simulate", + "POST", + bytes.NewBuffer(jsonBytes), + response, + ) assert.True(t, processTxWasCalled) - assert.Equal(t, string(shared.ReturnCodeSuccess), simulateResponse.Code) + assert.Equal(t, string(shared.ReturnCodeSuccess), response.Code) }) } @@ -813,25 +792,23 @@ func TestTransactionGroup_getTransactionsPool(t *testing.T) { }, }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetTransactionsPoolCalled: func(fields string) (*common.TransactionsPoolAPIResponse, error) { return expectedTxPool, nil }, } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - req, _ := http.NewRequest("GET", "/transaction/pool", nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txsPoolResp := txsPoolResponse{} - loadResponse(resp.Body, &txsPoolResp) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, txsPoolResp.Error) - assert.Equal(t, *expectedTxPool, txsPoolResp.Data.TxPool) + response := &txsPoolResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/pool", + "GET", + nil, + response, + ) + assert.Empty(t, response.Error) + assert.Equal(t, *expectedTxPool, response.Data.TxPool) }) t.Run("should work for sender", func(t *testing.T) { t.Parallel() @@ -857,25 +834,23 @@ func TestTransactionGroup_getTransactionsPool(t *testing.T) { }, }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetTransactionsPoolForSenderCalled: func(sender, fields string) (*common.TransactionsPoolForSenderApiResponse, error) { return expectedResp, nil }, } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - txsForSenderResp := poolForSenderResponse{} - loadResponse(resp.Body, &txsForSenderResp) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, txsForSenderResp.Error) - assert.Equal(t, *expectedResp, txsForSenderResp.Data.TxPool) + response := &poolForSenderResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/pool"+query, + "GET", + nil, + response, + ) + assert.Empty(t, response.Error) + assert.Equal(t, *expectedResp, response.Data.TxPool) }) t.Run("should work for last pool nonce", func(t *testing.T) { t.Parallel() @@ -883,25 +858,23 @@ func TestTransactionGroup_getTransactionsPool(t *testing.T) { expectedSender := "sender" query := "?by-sender=" + expectedSender + "&last-nonce=true" expectedNonce := uint64(33) - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetLastPoolNonceForSenderCalled: func(sender string) (uint64, error) { return expectedNonce, nil }, } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - lastPoolNonceResp := lastPoolNonceForSenderResponse{} - loadResponse(resp.Body, &lastPoolNonceResp) - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, lastPoolNonceResp.Error) - assert.Equal(t, expectedNonce, lastPoolNonceResp.Data.Nonce) + response := &lastPoolNonceForSenderResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/pool"+query, + "GET", + nil, + response, + ) + assert.Empty(t, response.Error) + assert.Equal(t, expectedNonce, response.Data.Nonce) }) t.Run("should work for nonce gaps", func(t *testing.T) { t.Parallel() @@ -917,28 +890,23 @@ func TestTransactionGroup_getTransactionsPool(t *testing.T) { }, }, } - facade := mock.FacadeStub{ + facade := &mock.FacadeStub{ GetTransactionsPoolNonceGapsForSenderCalled: func(sender string) (*common.TransactionsPoolNonceGapsForSenderApiResponse, error) { return expectedNonceGaps, nil }, } - transactionGroup, err := groups.NewTransactionGroup(&facade) - require.NoError(t, err) - - ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) - - req, _ := http.NewRequest("GET", "/transaction/pool"+query, nil) - - resp := httptest.NewRecorder() - ws.ServeHTTP(resp, req) - - nonceGapsResp := txPoolNonceGapsForSenderResponse{} - loadResponse(resp.Body, &nonceGapsResp) - - assert.Equal(t, http.StatusOK, resp.Code) - assert.Empty(t, nonceGapsResp.Error) - assert.Equal(t, *expectedNonceGaps, nonceGapsResp.Data.NonceGaps) + response := &txPoolNonceGapsForSenderResponse{} + loadTransactionGroupResponse( + t, + facade, + "/transaction/pool"+query, + "GET", + nil, + response, + ) + assert.Empty(t, response.Error) + assert.Equal(t, *expectedNonceGaps, response.Data.NonceGaps) }) } @@ -1048,6 +1016,28 @@ func TestTransactionsGroup_IsInterfaceNil(t *testing.T) { require.False(t, transactionGroup.IsInterfaceNil()) } +func loadTransactionGroupResponse( + t *testing.T, + facade shared.FacadeHandler, + url string, + method string, + body io.Reader, + destination interface{}, +) { + transactionGroup, err := groups.NewTransactionGroup(facade) + require.NoError(t, err) + + ws := startWebServer(transactionGroup, "transaction", getTransactionRoutesConfig()) + + req, _ := http.NewRequest(method, url, body) + resp := httptest.NewRecorder() + ws.ServeHTTP(resp, req) + + assert.Equal(t, http.StatusOK, resp.Code) + + loadResponse(resp.Body, destination) +} + func testTransactionGroupErrorScenario( url string, method string, From 68f742115069113a2a167919f99eba15de8c28ab Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 27 Apr 2023 15:57:45 +0300 Subject: [PATCH 324/335] - fixed seldom failing tests, added new unit test + minor code refactoring --- heartbeat/processor/export_test.go | 6 +++ .../peerAuthenticationRequestsProcessor.go | 25 +++++++----- ...eerAuthenticationRequestsProcessor_test.go | 40 +++++++++++++++++-- 3 files changed, 59 insertions(+), 12 deletions(-) create mode 100644 heartbeat/processor/export_test.go diff --git a/heartbeat/processor/export_test.go b/heartbeat/processor/export_test.go new file mode 100644 index 00000000000..8f0b1230151 --- /dev/null +++ b/heartbeat/processor/export_test.go @@ -0,0 +1,6 @@ +package processor + +// NewPeerAuthenticationRequestsProcessorWithoutGoRoutine - +func NewPeerAuthenticationRequestsProcessorWithoutGoRoutine(args ArgPeerAuthenticationRequestsProcessor) (*peerAuthenticationRequestsProcessor, error) { + return newPeerAuthenticationRequestsProcessor(args) +} diff --git a/heartbeat/processor/peerAuthenticationRequestsProcessor.go b/heartbeat/processor/peerAuthenticationRequestsProcessor.go index 640f5d96493..6daa24edf02 100644 --- a/heartbeat/processor/peerAuthenticationRequestsProcessor.go +++ b/heartbeat/processor/peerAuthenticationRequestsProcessor.go @@ -55,12 +55,26 @@ type peerAuthenticationRequestsProcessor struct { // NewPeerAuthenticationRequestsProcessor creates a new instance of peerAuthenticationRequestsProcessor func NewPeerAuthenticationRequestsProcessor(args ArgPeerAuthenticationRequestsProcessor) (*peerAuthenticationRequestsProcessor, error) { + processor, err := newPeerAuthenticationRequestsProcessor(args) + if err != nil { + return nil, err + } + + var ctx context.Context + ctx, processor.cancel = context.WithTimeout(context.Background(), args.MaxTimeoutForRequests) + + go processor.startRequestingMessages(ctx) + + return processor, nil +} + +func newPeerAuthenticationRequestsProcessor(args ArgPeerAuthenticationRequestsProcessor) (*peerAuthenticationRequestsProcessor, error) { err := checkArgs(args) if err != nil { return nil, err } - processor := &peerAuthenticationRequestsProcessor{ + return &peerAuthenticationRequestsProcessor{ requestHandler: args.RequestHandler, nodesCoordinator: args.NodesCoordinator, peerAuthenticationPool: args.PeerAuthenticationPool, @@ -70,14 +84,7 @@ func NewPeerAuthenticationRequestsProcessor(args ArgPeerAuthenticationRequestsPr delayBetweenRequests: args.DelayBetweenRequests, maxMissingKeysInRequest: args.MaxMissingKeysInRequest, randomizer: args.Randomizer, - } - - var ctx context.Context - ctx, processor.cancel = context.WithTimeout(context.Background(), args.MaxTimeoutForRequests) - - go processor.startRequestingMessages(ctx) - - return processor, nil + }, nil } func checkArgs(args ArgPeerAuthenticationRequestsProcessor) error { diff --git a/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go b/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go index 6f407a2a2e0..73c9e33ed00 100644 --- a/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go +++ b/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go @@ -10,6 +10,7 @@ import ( "testing" "time" + mxAtomic "github.com/multiversx/mx-chain-core-go/core/atomic" "github.com/multiversx/mx-chain-core-go/core/check" "github.com/multiversx/mx-chain-core-go/core/random" "github.com/multiversx/mx-chain-go/heartbeat" @@ -252,7 +253,7 @@ func TestPeerAuthenticationRequestsProcessor_isThresholdReached(t *testing.T) { }, } - processor, err := NewPeerAuthenticationRequestsProcessor(args) + processor, err := NewPeerAuthenticationRequestsProcessorWithoutGoRoutine(args) assert.Nil(t, err) assert.False(t, check.IfNil(processor)) @@ -276,7 +277,7 @@ func TestPeerAuthenticationRequestsProcessor_requestMissingKeys(t *testing.T) { }, } - processor, err := NewPeerAuthenticationRequestsProcessor(args) + processor, err := NewPeerAuthenticationRequestsProcessorWithoutGoRoutine(args) assert.Nil(t, err) assert.False(t, check.IfNil(processor)) @@ -293,7 +294,7 @@ func TestPeerAuthenticationRequestsProcessor_getRandMaxMissingKeys(t *testing.T) args := createMockArgPeerAuthenticationRequestsProcessor() args.MaxMissingKeysInRequest = 3 - processor, err := NewPeerAuthenticationRequestsProcessor(args) + processor, err := NewPeerAuthenticationRequestsProcessorWithoutGoRoutine(args) assert.Nil(t, err) assert.False(t, check.IfNil(processor)) @@ -307,3 +308,36 @@ func TestPeerAuthenticationRequestsProcessor_getRandMaxMissingKeys(t *testing.T) } } } + +func TestPeerAuthenticationRequestsProcessor_goRoutineIsWorkingAndCloseShouldStopIt(t *testing.T) { + t.Parallel() + + args := createMockArgPeerAuthenticationRequestsProcessor() + args.NodesCoordinator = &shardingMocks.NodesCoordinatorStub{ + GetAllEligibleValidatorsPublicKeysCalled: func(epoch uint32) (map[uint32][][]byte, error) { + return map[uint32][][]byte{ + 0: {[]byte("pk0")}, + }, nil + }, + } + keysCalled := &mxAtomic.Flag{} + args.PeerAuthenticationPool = &testscommon.CacherStub{ + KeysCalled: func() [][]byte { + keysCalled.SetValue(true) + return make([][]byte, 0) + }, + } + + processor, _ := NewPeerAuthenticationRequestsProcessor(args) + time.Sleep(args.DelayBetweenRequests*2 + time.Millisecond*300) // wait for the go routine to start and execute at least once + assert.True(t, keysCalled.IsSet()) + + err := processor.Close() + assert.Nil(t, err) + + time.Sleep(time.Second) // wait for the go routine to stop + keysCalled.SetValue(false) + + time.Sleep(args.DelayBetweenRequests*2 + time.Millisecond*300) // if the go routine did not stop it will set again the flag + assert.False(t, keysCalled.IsSet()) +} From d043ee2c7e91c634760a3bbdf2003a708ff1fc59 Mon Sep 17 00:00:00 2001 From: jules01 Date: Thu, 27 Apr 2023 16:01:25 +0300 Subject: [PATCH 325/335] - added new unit test --- ...eerAuthenticationRequestsProcessor_test.go | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go b/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go index 73c9e33ed00..39e21d9eb80 100644 --- a/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go +++ b/heartbeat/processor/peerAuthenticationRequestsProcessor_test.go @@ -3,6 +3,7 @@ package processor import ( "bytes" "errors" + "fmt" "sort" "strings" "sync" @@ -17,6 +18,7 @@ import ( "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func createMockArgPeerAuthenticationRequestsProcessor() ArgPeerAuthenticationRequestsProcessor { @@ -341,3 +343,25 @@ func TestPeerAuthenticationRequestsProcessor_goRoutineIsWorkingAndCloseShouldSto time.Sleep(args.DelayBetweenRequests*2 + time.Millisecond*300) // if the go routine did not stop it will set again the flag assert.False(t, keysCalled.IsSet()) } + +func TestPeerAuthenticationRequestsProcessor_CloseCalledTwiceShouldNotPanicNorError(t *testing.T) { + t.Parallel() + + defer func() { + r := recover() + if r != nil { + require.Fail(t, fmt.Sprintf("should have not panicked: %v", r)) + } + }() + + args := createMockArgPeerAuthenticationRequestsProcessor() + processor, _ := NewPeerAuthenticationRequestsProcessor(args) + + time.Sleep(args.DelayBetweenRequests*2 + time.Millisecond*300) // wait for the go routine to start and execute at least once + + err := processor.Close() + assert.Nil(t, err) + + err = processor.Close() + assert.Nil(t, err) +} From ada98d42a6bdab4bf042765afd999324fcf11aaa Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Apr 2023 16:03:32 +0300 Subject: [PATCH 326/335] extra tests and fixes --- factory/processing/processComponents.go | 21 +- factory/processing/processComponents_test.go | 324 ++++++++++++------- testscommon/stateComponentsMock.go | 13 + 3 files changed, 219 insertions(+), 139 deletions(-) diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 3c543396258..13840946633 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -1395,9 +1395,10 @@ func (pcf *processComponentsFactory) newRequestersContainerFactory( return pcf.newStorageRequesters() } + shardC := pcf.bootstrapComponents.ShardCoordinator() requestersContainerFactoryArgs := requesterscontainer.FactoryArgs{ RequesterConfig: pcf.config.Requesters, - ShardCoordinator: pcf.bootstrapComponents.ShardCoordinator(), + ShardCoordinator: shardC, Messenger: pcf.network.NetworkMessenger(), Marshaller: pcf.coreData.InternalMarshalizer(), Uint64ByteSliceConverter: pcf.coreData.Uint64ByteSliceConverter(), @@ -1408,10 +1409,10 @@ func (pcf *processComponentsFactory) newRequestersContainerFactory( SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() < pcf.bootstrapComponents.ShardCoordinator().NumberOfShards() { + if shardC.SelfId() < shardC.NumberOfShards() { return requesterscontainer.NewShardRequestersContainerFactory(requestersContainerFactoryArgs) } - if pcf.bootstrapComponents.ShardCoordinator().SelfId() == core.MetachainShardId { + if shardC.SelfId() == core.MetachainShardId { return requesterscontainer.NewMetaRequestersContainerFactory(requestersContainerFactoryArgs) } @@ -1541,12 +1542,7 @@ func (pcf *processComponentsFactory) createStorageRequestersForMeta( ChanGracefullyClose: pcf.coreData.ChanStopNodeProcess(), SnapshotsEnabled: pcf.snapshotsEnabled, } - requestersContainerFactory, err := storagerequesterscontainer.NewMetaRequestersContainerFactory(requestersContainerFactoryArgs) - if err != nil { - return nil, err - } - - return requestersContainerFactory, nil + return storagerequesterscontainer.NewMetaRequestersContainerFactory(requestersContainerFactoryArgs) } func (pcf *processComponentsFactory) createStorageRequestersForShard( @@ -1574,12 +1570,7 @@ func (pcf *processComponentsFactory) createStorageRequestersForShard( ChanGracefullyClose: pcf.coreData.ChanStopNodeProcess(), SnapshotsEnabled: pcf.snapshotsEnabled, } - requestersContainerFactory, err := storagerequesterscontainer.NewShardRequestersContainerFactory(requestersContainerFactoryArgs) - if err != nil { - return nil, err - } - - return requestersContainerFactory, nil + return storagerequesterscontainer.NewShardRequestersContainerFactory(requestersContainerFactoryArgs) } func (pcf *processComponentsFactory) newShardInterceptorContainerFactory( diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index c7769c5494f..56fcd2dbc52 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -2,7 +2,6 @@ package processing_test import ( "bytes" - "context" "errors" "math/big" "strings" @@ -15,6 +14,8 @@ import ( dataBlock "github.com/multiversx/mx-chain-core-go/data/block" "github.com/multiversx/mx-chain-core-go/data/endProcess" outportCore "github.com/multiversx/mx-chain-core-go/data/outport" + "github.com/multiversx/mx-chain-core-go/hashing/blake2b" + "github.com/multiversx/mx-chain-core-go/hashing/keccak" "github.com/multiversx/mx-chain-core-go/marshal" "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/common/factory" @@ -33,7 +34,7 @@ import ( "github.com/multiversx/mx-chain-go/storage" "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/bootstrapMocks" - componentsMock "github.com/multiversx/mx-chain-go/testscommon/components" + "github.com/multiversx/mx-chain-go/testscommon/components" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/dblookupext" @@ -50,8 +51,6 @@ import ( "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" - "github.com/multiversx/mx-chain-go/testscommon/trie" - trieFactory "github.com/multiversx/mx-chain-go/trie/factory" updateMocks "github.com/multiversx/mx-chain-go/update/mock" "github.com/stretchr/testify/require" ) @@ -62,20 +61,24 @@ const ( testingProtocolSustainabilityAddress = "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp" ) -func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFactoryArgs { - gasSchedule, _ := common.LoadGasScheduleConfig("../../cmd/node/config/gasSchedules/gasScheduleV1.toml") - addrPubKeyConv, _ := factory.NewPubkeyConverter(config.PubkeyConfig{ +var ( + gasSchedule, _ = common.LoadGasScheduleConfig("../../cmd/node/config/gasSchedules/gasScheduleV1.toml") + addrPubKeyConv, _ = factory.NewPubkeyConverter(config.PubkeyConfig{ Length: 32, Type: "bech32", SignatureLength: 0, Hrp: "erd", }) - valPubKeyConv, _ := factory.NewPubkeyConverter(config.PubkeyConfig{ + valPubKeyConv, _ = factory.NewPubkeyConverter(config.PubkeyConfig{ Length: 96, Type: "hex", SignatureLength: 48, }) - return processComp.ProcessComponentsFactoryArgs{ +) + +func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFactoryArgs { + + args := processComp.ProcessComponentsFactoryArgs{ Config: testscommon.GetGeneralConfig(), EpochConfig: config.EpochConfig{}, PrefConfigs: config.PreferencesConfig{}, @@ -114,11 +117,11 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto }, Active: config.GovernanceSystemSCConfigActive{ ProposalCost: "500", - MinQuorum: "50", - MinPassThreshold: "50", - MinVetoThreshold: "50", + MinQuorum: 0.5, + MinPassThreshold: 0.5, + MinVetoThreshold: 0.5, }, - FirstWhitelistedAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", + ChangeConfigAddress: "erd1vxy22x0fj4zv6hktmydg8vpfh6euv02cz4yg0aaws6rrad5a5awqgqky80", }, StakingSystemSCConfig: config.StakingSystemSCConfig{ GenesisNodePrice: "2500000000000000000000", @@ -160,8 +163,8 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto Store: genericMocks.NewChainStorerMock(0), }, CoreData: &mock.CoreComponentsMock{ - IntMarsh: &testscommon.MarshalizerStub{}, - TxMarsh: &testscommon.MarshalizerStub{}, + IntMarsh: &marshal.GogoProtoMarshalizer{}, + TxMarsh: &marshal.JsonMarshalizer{}, UInt64ByteSliceConv: &testsMocks.Uint64ByteSliceConverterMock{}, AddrPubKeyConv: addrPubKeyConv, ValPubKeyConv: valPubKeyConv, @@ -179,19 +182,21 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto return testingProtocolSustainabilityAddress }, }, - Hash: &testscommon.HasherStub{}, - TxVersionCheckHandler: &testscommon.TxVersionCheckerStub{}, - RatingHandler: &testscommon.RaterMock{}, - EnableEpochsHandlerField: &testscommon.EnableEpochsHandlerStub{}, - EnableRoundsHandlerField: &testscommon.EnableRoundsHandlerStub{}, - EpochNotifierWithConfirm: &updateMocks.EpochStartNotifierStub{}, - RoundHandlerField: &testscommon.RoundHandlerMock{}, - ChanStopProcess: make(chan endProcess.ArgEndProcess, 1), - TxSignHasherField: &testscommon.HasherStub{}, - HardforkTriggerPubKeyField: []byte("hardfork pub key"), - WasmVMChangeLockerInternal: &sync.RWMutex{}, - NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, - RatingsConfig: &testscommon.RatingsInfoMock{}, + Hash: blake2b.NewBlake2b(), + TxVersionCheckHandler: &testscommon.TxVersionCheckerStub{}, + RatingHandler: &testscommon.RaterMock{}, + EnableEpochsHandlerField: &testscommon.EnableEpochsHandlerStub{}, + EnableRoundsHandlerField: &testscommon.EnableRoundsHandlerStub{}, + EpochNotifierWithConfirm: &updateMocks.EpochStartNotifierStub{}, + RoundHandlerField: &testscommon.RoundHandlerMock{}, + ChanStopProcess: make(chan endProcess.ArgEndProcess, 1), + TxSignHasherField: keccak.NewKeccak(), + HardforkTriggerPubKeyField: []byte("hardfork pub key"), + WasmVMChangeLockerInternal: &sync.RWMutex{}, + NodeTypeProviderField: &nodeTypeProviderMock.NodeTypeProviderStub{}, + RatingsConfig: &testscommon.RatingsInfoMock{}, + PathHdl: &testscommon.PathManagerStub{}, + ProcessStatusHandlerInternal: &testscommon.ProcessStatusHandlerStub{}, }, Crypto: &testsMocks.CryptoComponentsStub{ BlKeyGen: &cryptoMocks.KeyGenStub{}, @@ -209,34 +214,6 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto MsgSigVerifier: &testscommon.MessageSignVerifierMock{}, ManagedPeersHolderField: &testscommon.ManagedPeersHolderStub{}, }, - State: &testscommon.StateComponentsMock{ - Accounts: &state.AccountsStub{ - CommitCalled: func() ([]byte, error) { - return []byte(""), nil - }, - RootHashCalled: func() ([]byte, error) { - return []byte("root hash"), nil - }, - }, - PeersAcc: &state.AccountsStub{ - CommitCalled: func() ([]byte, error) { - return []byte("hash"), nil - }, - RootHashCalled: func() ([]byte, error) { - return []byte("root hash"), nil - }, - }, - Tries: &trie.TriesHolderStub{ - GetCalled: func(bytes []byte) common.Trie { - return &trie.TrieStub{} - }, - }, - AccountsAPI: &state.AccountsStub{}, - StorageManagers: map[string]common.StorageManager{ - trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, - trieFactory.PeerAccountTrie: &testscommon.StorageManagerStub{}, - }, - }, Network: &testsMocks.NetworkComponentsStub{ Messenger: &p2pmocks.MessengerStub{}, InputAntiFlood: &testsMocks.P2PAntifloodHandlerStub{}, @@ -258,6 +235,10 @@ func createMockProcessComponentsFactoryArgs() processComp.ProcessComponentsFacto AppStatusHandlerField: &statusHandler.AppStatusHandlerStub{}, }, } + + args.State = components.GetStateComponents(args.CoreData) + + return args } func TestNewProcessComponentsFactory(t *testing.T) { @@ -623,7 +604,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, expectedErr.Error()) }) - t.Run("newStorageResolver fails due to NewStorageServiceFactory failure should error", func(t *testing.T) { + t.Run("newStorageRequester fails due to NewStorageServiceFactory failure should error", func(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() @@ -631,21 +612,50 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.StoragePruning.NumActivePersisters = 0 testCreateWithArgs(t, args, "active persisters") }) - t.Run("newStorageResolver fails due to CreateForMeta failure should error", func(t *testing.T) { + t.Run("newStorageRequester fails due to NewSimpleDataPacker failure on createStorageRequestersForMeta should error", func(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() args.ImportDBConfig.IsImportDBMode = true - args.Config.ShardHdrNonceHashStorage.Cache.Type = "invalid" - updateShardCoordinatorForMetaAtStep(t, args, 0) - testCreateWithArgs(t, args, "ShardHdrNonceHashStorage") + + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + step := 0 + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + step++ + if step > 3 { + return nil + } + return &testscommon.MarshalizerStub{} + } + args.CoreData = coreCompStub + updateShardCoordinatorForMetaAtStep(t, args, 3) + testCreateWithArgs(t, args, "marshalizer") + }) + t.Run("newStorageRequester fails due to NewSimpleDataPacker failure on createStorageRequestersForShard should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.ImportDBConfig.IsImportDBMode = true + + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + step := 0 + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + step++ + if step > 3 { + return nil + } + return &testscommon.MarshalizerStub{} + } + args.CoreData = coreCompStub + testCreateWithArgs(t, args, "marshalizer") }) - t.Run("newStorageResolver fails due to CreateForMeta failure should error", func(t *testing.T) { + t.Run("newStorageRequester fails due to CreateForMeta failure should error", func(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() args.ImportDBConfig.IsImportDBMode = true args.Config.ShardHdrNonceHashStorage.Cache.Type = "invalid" + updateShardCoordinatorForMetaAtStep(t, args, 0) testCreateWithArgs(t, args, "ShardHdrNonceHashStorage") }) t.Run("newResolverContainerFactory fails due to NewPeerAuthenticationPayloadValidator failure should error", func(t *testing.T) { @@ -657,6 +667,8 @@ func TestProcessComponentsFactory_Create(t *testing.T) { }) t.Run("newResolverContainerFactory fails due to invalid shard should error", testWithInvalidShard(0, "could not create interceptor and resolver container factory")) + t.Run("newRequesterContainerFactory fails due to invalid shard should error", + testWithInvalidShard(5, "could not create requester container factory")) t.Run("newMetaResolverContainerFactory fails due to NewSimpleDataPacker failure should error", func(t *testing.T) { t.Parallel() @@ -676,7 +688,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { }) t.Run("newShardResolverContainerFactory fails due to NewSimpleDataPacker failure should error", testWithNilMarshaller(3, "marshalizer", unreachableStep)) - t.Run("NewResolversFinder fails should error", func(t *testing.T) { + t.Run("NewRequestersFinder fails should error", func(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() @@ -697,7 +709,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, "shard coordinator") }) t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(0, retriever.TxLogsUnit, unreachableStep)) - t.Run("NewResolversFinder fails should error", testWithNilMarshaller(5, "Marshalizer", unreachableStep)) + t.Run("NewRequestersFinder fails should error", testWithNilMarshaller(5, "Marshalizer", unreachableStep)) t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to invalid GenesisNodePrice should error", func(t *testing.T) { t.Parallel() @@ -708,7 +720,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, "invalid genesis node price") }) t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to NewGenesisBlockCreator failure should error", - testWithNilMarshaller(6, "Marshalizer", unreachableStep)) + testWithNilMarshaller(7, "Marshalizer", unreachableStep)) t.Run("setGenesisHeader fails due to invalid shard should error", testWithInvalidShard(8, "genesis block does not exist")) t.Run("newValidatorStatisticsProcessor fails due to nil genesis header should error", func(t *testing.T) { @@ -726,7 +738,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, errorsMx.ErrGenesisBlockNotInitialized.Error()) }) t.Run("indexGenesisBlocks fails due to CalculateHash failure should error", - testWithNilMarshaller(41, "marshalizer", unreachableStep)) + testWithNilMarshaller(42, "marshalizer", unreachableStep)) t.Run("indexGenesisBlocks fails due to GenerateInitialTransactions failure should error", func(t *testing.T) { t.Parallel() @@ -743,7 +755,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Run("newEpochStartTrigger fails due to invalid shard should error", testWithInvalidShard(16, "error creating new start of epoch trigger because of invalid shard id")) t.Run("newEpochStartTrigger fails due to NewHeaderValidator failure should error", - testWithNilMarshaller(46, "Marshalizer", unreachableStep)) + testWithNilMarshaller(47, "Marshalizer", unreachableStep)) t.Run("newEpochStartTrigger fails due to NewPeerMiniBlockSyncer failure should error", func(t *testing.T) { t.Parallel() @@ -789,7 +801,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, errorsMx.ErrGenesisBlockNotInitialized.Error()) }) t.Run("newEpochStartTrigger fails due to invalid shard should error", - testWithInvalidShard(17, "genesis block does not exist")) + testWithInvalidShard(17, "error creating new start of epoch trigger because of invalid shard id")) t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(48, "marshalizer", unreachableStep)) t.Run("prepareGenesisBlock fails due to CalculateHash failure should error", func(t *testing.T) { t.Parallel() @@ -830,10 +842,10 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, expectedErr.Error()) }) t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(2, retriever.BootstrapUnit, unreachableStep)) - t.Run("NewBootstrapStorer fails should error", testWithNilMarshaller(50, "Marshalizer", unreachableStep)) - t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(51, "Marshalizer", unreachableStep)) + t.Run("NewBootstrapStorer fails should error", testWithNilMarshaller(51, "Marshalizer", unreachableStep)) + t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(52, "Marshalizer", unreachableStep)) t.Run("newBlockTracker fails due to invalid shard should error", - testWithInvalidShard(19, "could not create block tracker")) + testWithInvalidShard(20, "could not create block tracker")) t.Run("NewMiniBlocksPoolsCleaner fails should error", func(t *testing.T) { t.Parallel() @@ -857,10 +869,10 @@ func TestProcessComponentsFactory_Create(t *testing.T) { cnt := 0 bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { cnt++ - if cnt > 22 { + if cnt > 25 { return nil } - return testscommon.NewMultiShardsCoordinatorMock(2) + return mock.NewMultiShardsCoordinatorMock(2) } testCreateWithArgs(t, args, "shard coordinator") }) @@ -872,7 +884,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { testCreateWithArgs(t, args, "PublicKeyToListenFrom") }) t.Run("newInterceptorContainerFactory fails due to invalid shard should error", - testWithInvalidShard(23, "could not create interceptor container factory")) + testWithInvalidShard(24, "could not create interceptor container factory")) t.Run("createExportFactoryHandler fails", func(t *testing.T) { t.Parallel() @@ -882,15 +894,15 @@ func TestProcessComponentsFactory_Create(t *testing.T) { cnt := 0 bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { cnt++ - if cnt > 25 { + if cnt > 28 { return nil } - return testscommon.NewMultiShardsCoordinatorMock(2) + return mock.NewMultiShardsCoordinatorMock(2) } testCreateWithArgs(t, args, "shard coordinator") }) t.Run("newForkDetector fails due to invalid shard should error", - testWithInvalidShard(27, "could not create fork detector")) + testWithInvalidShard(28, "could not create fork detector")) t.Run("NewCache fails for vmOutput should error", func(t *testing.T) { t.Parallel() @@ -903,11 +915,11 @@ func TestProcessComponentsFactory_Create(t *testing.T) { t.Run("NewScheduledTxsExecution fails should error", testWithNilMarshaller(104, "Marshalizer", unreachableStep)) t.Run("NewESDTDataStorage fails should error", - testWithNilMarshaller(105, "Marshalizer", unreachableStep)) + testWithNilMarshaller(106, "Marshalizer", unreachableStep)) t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(107, "marshalizer", unreachableStep)) t.Run("newBlockProcessor fails due to invalid shard should error", - testWithInvalidShard(31, "could not create block processor")) + testWithInvalidShard(32, "could not create block processor")) // newShardBlockProcessor t.Run("newShardBlockProcessor: NewESDTTransferParser fails should error", @@ -1042,7 +1054,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { cnt := 0 netwCompStub.MessengerCalled = func() p2p.Messenger { cnt++ - if cnt > 7 { + if cnt > 8 { return nil } return &p2pmocks.MessengerStub{} @@ -1062,13 +1074,17 @@ func TestProcessComponentsFactory_Create(t *testing.T) { return true }, } - stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) - require.True(t, ok) - accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) - require.True(t, ok) - accountsStub.RootHashCalled = func() ([]byte, error) { - return nil, expectedErr + stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + realAccounts := stateCompMock.AccountsAdapter() + stateCompMock.Accounts = &state.AccountsStub{ + GetAllLeavesCalled: realAccounts.GetAllLeaves, + RootHashCalled: func() ([]byte, error) { + return nil, expectedErr + }, + CommitCalled: realAccounts.Commit, } + args.State = stateCompMock + pcf, _ := processComp.NewProcessComponentsFactory(args) require.NotNil(t, pcf) @@ -1087,15 +1103,18 @@ func TestProcessComponentsFactory_Create(t *testing.T) { return true }, } - stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) - require.True(t, ok) - accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) - require.True(t, ok) - accountsStub.GetAllLeavesCalled = func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { - close(leavesChannels.LeavesChan) - leavesChannels.ErrChan.Close() - return expectedErr + stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + realAccounts := stateCompMock.AccountsAdapter() + stateCompMock.Accounts = &state.AccountsStub{ + GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { + close(leavesChannels.LeavesChan) + leavesChannels.ErrChan.Close() + return expectedErr + }, + RootHashCalled: realAccounts.RootHash, + CommitCalled: realAccounts.Commit, } + args.State = stateCompMock pcf, _ := processComp.NewProcessComponentsFactory(args) require.NotNil(t, pcf) @@ -1115,17 +1134,23 @@ func TestProcessComponentsFactory_Create(t *testing.T) { return true }, } - stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) - require.True(t, ok) - accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) - require.True(t, ok) - accountsStub.GetAllLeavesCalled = func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { - leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("key_ok"), []byte("value")) // coverage - leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("key_invalid"), []byte("value")) - close(leavesChannels.LeavesChan) - leavesChannels.ErrChan.Close() - return nil + stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + realAccounts := stateCompMock.AccountsAdapter() + stateCompMock.Accounts = &state.AccountsStub{ + GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { + addrOk, _ := addrPubKeyConv.Decode("erd17c4fs6mz2aa2hcvva2jfxdsrdknu4220496jmswer9njznt22eds0rxlr4") + addrNOK, _ := addrPubKeyConv.Decode("erd1ulhw20j7jvgfgak5p05kv667k5k9f320sgef5ayxkt9784ql0zssrzyhjp") + leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage(addrOk, []byte("value")) // coverage + leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage(addrNOK, []byte("value")) + close(leavesChannels.LeavesChan) + leavesChannels.ErrChan.Close() + return nil + }, + RootHashCalled: realAccounts.RootHash, + CommitCalled: realAccounts.Commit, } + args.State = stateCompMock + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) cnt := 0 coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { @@ -1158,16 +1183,24 @@ func TestProcessComponentsFactory_Create(t *testing.T) { return true }, } - stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) - require.True(t, ok) - accountsStub, ok := stateCompStub.Accounts.(*state.AccountsStub) - require.True(t, ok) - accountsStub.GetAllLeavesCalled = func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { - close(leavesChannels.LeavesChan) - leavesChannels.ErrChan.WriteInChanNonBlocking(expectedErr) - leavesChannels.ErrChan.Close() - return nil + realStateComp := args.State + args.State = &testscommon.StateComponentsMock{ + Accounts: &state.AccountsStub{ + GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { + close(leavesChannels.LeavesChan) + leavesChannels.ErrChan.WriteInChanNonBlocking(expectedErr) + leavesChannels.ErrChan.Close() + return nil + }, + CommitCalled: realStateComp.AccountsAdapter().Commit, + RootHashCalled: realStateComp.AccountsAdapter().RootHash, + }, + PeersAcc: realStateComp.PeerAccounts(), + Tries: realStateComp.TriesContainer(), + AccountsAPI: realStateComp.AccountsAdapterAPI(), + StorageManagers: realStateComp.TrieStorageManagers(), } + pcf, _ := processComp.NewProcessComponentsFactory(args) require.NotNil(t, pcf) @@ -1175,11 +1208,54 @@ func TestProcessComponentsFactory_Create(t *testing.T) { require.Nil(t, err) require.NotNil(t, instance) }) - t.Run("should work - shard", func(t *testing.T) { + t.Run("should work with indexAndReturnGenesisAccounts failing due to error on Encode", func(t *testing.T) { t.Parallel() + args := createMockProcessComponentsFactoryArgs() + statusCompStub, ok := args.StatusComponents.(*testsMocks.StatusComponentsStub) + require.True(t, ok) + statusCompStub.Outport = &outport.OutportStub{ + HasDriversCalled: func() bool { + return true + }, + } + realStateComp := args.State + args.State = &testscommon.StateComponentsMock{ + Accounts: &state.AccountsStub{ + GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { + leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("invalid addr"), []byte("value")) + close(leavesChannels.LeavesChan) + leavesChannels.ErrChan.Close() + return nil + }, + CommitCalled: realStateComp.AccountsAdapter().Commit, + RootHashCalled: realStateComp.AccountsAdapter().RootHash, + }, + PeersAcc: realStateComp.PeerAccounts(), + Tries: realStateComp.TriesContainer(), + AccountsAPI: realStateComp.AccountsAdapterAPI(), + StorageManagers: realStateComp.TrieStorageManagers(), + } + coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) + coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { + return &testscommon.MarshalizerStub{ + UnmarshalCalled: func(obj interface{}, buff []byte) error { + return nil + }, + } + } + args.CoreData = coreCompStub + + pcf, _ := processComp.NewProcessComponentsFactory(args) + require.NotNil(t, pcf) + + instance, err := pcf.Create() + require.Nil(t, err) + require.NotNil(t, instance) + }) + t.Run("should work - shard", func(t *testing.T) { shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) - processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) + processArgs := components.GetProcessComponentsFactoryArgs(shardCoordinator) pcf, _ := processComp.NewProcessComponentsFactory(processArgs) require.NotNil(t, pcf) @@ -1191,11 +1267,9 @@ func TestProcessComponentsFactory_Create(t *testing.T) { require.NoError(t, err) }) t.Run("should work - meta", func(t *testing.T) { - t.Parallel() - shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) shardCoordinator.CurrentShard = common.MetachainShardId - processArgs := componentsMock.GetProcessComponentsFactoryArgs(shardCoordinator) + processArgs := components.GetProcessComponentsFactoryArgs(shardCoordinator) shardCoordinator.ComputeIdCalled = func(address []byte) uint32 { protocolSustainabilityAddr, err := processArgs.CoreData.AddressPubKeyConverter().Decode(testingProtocolSustainabilityAddress) @@ -1326,17 +1400,17 @@ func testWithNilAccountsAdapterAPI(nilStep int, expectedErrSubstr string, metaSt t.Parallel() args := createMockProcessComponentsFactoryArgs() - stateCompStub, ok := args.State.(*testscommon.StateComponentsMock) - require.True(t, ok) - accountsAdapterAPI := stateCompStub.AccountsAdapterAPI() + stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + accountsAdapterAPI := stateCompMock.AccountsAdapterAPI() step := 0 - stateCompStub.AccountsAdapterAPICalled = func() mxState.AccountsAdapter { + stateCompMock.AccountsAdapterAPICalled = func() mxState.AccountsAdapter { step++ if step > nilStep { return nil } return accountsAdapterAPI } + args.State = stateCompMock updateShardCoordinatorForMetaAtStep(t, args, metaStep) testCreateWithArgs(t, args, expectedErrSubstr) } @@ -1374,7 +1448,7 @@ func updateShardCoordinatorForMetaAtStep(t *testing.T, args processComp.ProcessC step := 0 bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { step++ - shardC := testscommon.NewMultiShardsCoordinatorMock(2) + shardC := mock.NewMultiShardsCoordinatorMock(2) if step > metaStep { shardC.CurrentShard = common.MetachainShardId } @@ -1389,6 +1463,8 @@ func testWithInvalidShard(failingStep int, expectedErrSubstr string) func(t *tes args := createMockProcessComponentsFactoryArgs() bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) require.True(t, ok) + + x := bootstrapCompStub.ShardCoordinator() cnt := 0 bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { cnt++ @@ -1398,7 +1474,7 @@ func testWithInvalidShard(failingStep int, expectedErrSubstr string) func(t *tes CurrentShard: 3, } } - return testscommon.NewMultiShardsCoordinatorMock(2) + return x } testCreateWithArgs(t, args, expectedErrSubstr) } diff --git a/testscommon/stateComponentsMock.go b/testscommon/stateComponentsMock.go index 9a08cb328df..28cc5d19531 100644 --- a/testscommon/stateComponentsMock.go +++ b/testscommon/stateComponentsMock.go @@ -2,6 +2,7 @@ package testscommon import ( "github.com/multiversx/mx-chain-go/common" + "github.com/multiversx/mx-chain-go/factory" "github.com/multiversx/mx-chain-go/state" ) @@ -16,6 +17,18 @@ type StateComponentsMock struct { StorageManagers map[string]common.StorageManager } +// NewStateComponentsMockFromRealComponent - +func NewStateComponentsMockFromRealComponent(stateComponents factory.StateComponentsHolder) *StateComponentsMock { + return &StateComponentsMock{ + PeersAcc: stateComponents.PeerAccounts(), + Accounts: stateComponents.AccountsAdapter(), + AccountsAPI: stateComponents.AccountsAdapterAPI(), + AccountsRepo: stateComponents.AccountsRepository(), + Tries: stateComponents.TriesContainer(), + StorageManagers: stateComponents.TrieStorageManagers(), + } +} + // Create - func (scm *StateComponentsMock) Create() error { return nil From 4e14bdff6640ddcdd6261cf19598ff622771ba00 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Apr 2023 16:49:24 +0300 Subject: [PATCH 327/335] fix linter --- cmd/keygenerator/converter/pidPubkeyConverter.go | 3 --- factory/consensus/consensusComponents_test.go | 8 ++++---- factory/processing/processComponents_test.go | 15 ++++++++------- integrationTests/testProcessorNode.go | 4 ++-- node/nodeTesting_test.go | 7 ++++--- testscommon/components/default.go | 5 +++-- testscommon/{ => factory}/stateComponentsMock.go | 2 +- 7 files changed, 22 insertions(+), 22 deletions(-) rename testscommon/{ => factory}/stateComponentsMock.go (99%) diff --git a/cmd/keygenerator/converter/pidPubkeyConverter.go b/cmd/keygenerator/converter/pidPubkeyConverter.go index 1cff0dfa0d7..41eeea15fa1 100644 --- a/cmd/keygenerator/converter/pidPubkeyConverter.go +++ b/cmd/keygenerator/converter/pidPubkeyConverter.go @@ -6,11 +6,8 @@ import ( "github.com/multiversx/mx-chain-crypto-go/signing/secp256k1" "github.com/multiversx/mx-chain-go/p2p" "github.com/multiversx/mx-chain-go/p2p/factory" - logger "github.com/multiversx/mx-chain-logger-go" ) -var log = logger.GetOrCreate("cmd/keygenerator/converter") - type pidPubkeyConverter struct { keyGen crypto.KeyGenerator p2PKeyConverter p2p.P2PKeyConverter diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index d0512e51fdf..4002e886e99 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -136,7 +136,7 @@ func createMockConsensusComponentsFactoryArgs() consensusComp.ConsensusComponent HeaderIntegrVerif: &mock.HeaderIntegrityVerifierStub{}, FallbackHdrValidator: &testscommon.FallBackHeaderValidatorStub{}, }, - StateComponents: &testscommon.StateComponentsMock{ + StateComponents: &factoryMocks.StateComponentsMock{ StorageManagers: map[string]common.StorageManager{ trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, trieFactory.PeerAccountTrie: &testscommon.StorageManagerStub{}, @@ -553,7 +553,7 @@ func TestConsensusComponentsFactory_Create(t *testing.T) { t.Parallel() args := createMockConsensusComponentsFactoryArgs() - stateCompStub, ok := args.StateComponents.(*testscommon.StateComponentsMock) + stateCompStub, ok := args.StateComponents.(*factoryMocks.StateComponentsMock) require.True(t, ok) stateCompStub.StorageManagers = make(map[string]common.StorageManager) // missing UserAccountTrie ccf, _ := consensusComp.NewConsensusComponentsFactory(args) @@ -604,7 +604,7 @@ func TestConsensusComponentsFactory_Create(t *testing.T) { t.Parallel() args := createMockConsensusComponentsFactoryArgs() - stateCompStub, ok := args.StateComponents.(*testscommon.StateComponentsMock) + stateCompStub, ok := args.StateComponents.(*factoryMocks.StateComponentsMock) require.True(t, ok) stateCompStub.StorageManagers = make(map[string]common.StorageManager) // missing UserAccountTrie processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) @@ -625,7 +625,7 @@ func TestConsensusComponentsFactory_Create(t *testing.T) { t.Parallel() args := createMockConsensusComponentsFactoryArgs() - stateCompStub, ok := args.StateComponents.(*testscommon.StateComponentsMock) + stateCompStub, ok := args.StateComponents.(*factoryMocks.StateComponentsMock) require.True(t, ok) stateCompStub.StorageManagers = map[string]common.StorageManager{ trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index 56fcd2dbc52..ebe27a8962f 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -2,6 +2,7 @@ package processing_test import ( "bytes" + "context" "errors" "math/big" "strings" @@ -436,7 +437,7 @@ func TestNewProcessComponentsFactory(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() - args.State = &testscommon.StateComponentsMock{ + args.State = &factoryMocks.StateComponentsMock{ Accounts: nil, } pcf, err := processComp.NewProcessComponentsFactory(args) @@ -1074,7 +1075,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { return true }, } - stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + stateCompMock := factoryMocks.NewStateComponentsMockFromRealComponent(args.State) realAccounts := stateCompMock.AccountsAdapter() stateCompMock.Accounts = &state.AccountsStub{ GetAllLeavesCalled: realAccounts.GetAllLeaves, @@ -1103,7 +1104,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { return true }, } - stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + stateCompMock := factoryMocks.NewStateComponentsMockFromRealComponent(args.State) realAccounts := stateCompMock.AccountsAdapter() stateCompMock.Accounts = &state.AccountsStub{ GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { @@ -1134,7 +1135,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { return true }, } - stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + stateCompMock := factoryMocks.NewStateComponentsMockFromRealComponent(args.State) realAccounts := stateCompMock.AccountsAdapter() stateCompMock.Accounts = &state.AccountsStub{ GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { @@ -1184,7 +1185,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { }, } realStateComp := args.State - args.State = &testscommon.StateComponentsMock{ + args.State = &factoryMocks.StateComponentsMock{ Accounts: &state.AccountsStub{ GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { close(leavesChannels.LeavesChan) @@ -1220,7 +1221,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { }, } realStateComp := args.State - args.State = &testscommon.StateComponentsMock{ + args.State = &factoryMocks.StateComponentsMock{ Accounts: &state.AccountsStub{ GetAllLeavesCalled: func(leavesChannels *common.TrieIteratorChannels, ctx context.Context, rootHash []byte) error { leavesChannels.LeavesChan <- keyValStorage.NewKeyValStorage([]byte("invalid addr"), []byte("value")) @@ -1400,7 +1401,7 @@ func testWithNilAccountsAdapterAPI(nilStep int, expectedErrSubstr string, metaSt t.Parallel() args := createMockProcessComponentsFactoryArgs() - stateCompMock := testscommon.NewStateComponentsMockFromRealComponent(args.State) + stateCompMock := factoryMocks.NewStateComponentsMockFromRealComponent(args.State) accountsAdapterAPI := stateCompMock.AccountsAdapterAPI() step := 0 stateCompMock.AccountsAdapterAPICalled = func() mxState.AccountsAdapter { diff --git a/integrationTests/testProcessorNode.go b/integrationTests/testProcessorNode.go index fb55a30cb98..e7bf0a3fc84 100644 --- a/integrationTests/testProcessorNode.go +++ b/integrationTests/testProcessorNode.go @@ -3205,8 +3205,8 @@ func GetDefaultCryptoComponents() *mock.CryptoComponentsStub { } // GetDefaultStateComponents - -func GetDefaultStateComponents() *testscommon.StateComponentsMock { - return &testscommon.StateComponentsMock{ +func GetDefaultStateComponents() *testFactory.StateComponentsMock { + return &testFactory.StateComponentsMock{ PeersAcc: &stateMock.AccountsStub{}, Accounts: &stateMock.AccountsStub{}, AccountsRepo: &stateMock.AccountsRepositoryStub{}, diff --git a/node/nodeTesting_test.go b/node/nodeTesting_test.go index e18d26ba218..5c36fc47774 100644 --- a/node/nodeTesting_test.go +++ b/node/nodeTesting_test.go @@ -21,6 +21,7 @@ import ( "github.com/multiversx/mx-chain-go/testscommon" "github.com/multiversx/mx-chain-go/testscommon/cryptoMocks" dataRetrieverMock "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" + factoryMocks "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" stateMock "github.com/multiversx/mx-chain-go/testscommon/state" trieMock "github.com/multiversx/mx-chain-go/testscommon/trie" @@ -396,7 +397,7 @@ func getDefaultCryptoComponents() *factoryMock.CryptoComponentsMock { PubKeyBytes: []byte("pubKey"), BlockSig: &mock.SingleSignerMock{}, TxSig: &mock.SingleSignerMock{}, - MultiSigContainer: cryptoMocks.NewMultiSignerContainerMock( cryptoMocks.NewMultiSigner()), + MultiSigContainer: cryptoMocks.NewMultiSignerContainerMock(cryptoMocks.NewMultiSigner()), PeerSignHandler: &mock.PeerSignatureHandler{}, BlKeyGen: &mock.KeyGenMock{}, TxKeyGen: &mock.KeyGenMock{}, @@ -407,8 +408,8 @@ func getDefaultCryptoComponents() *factoryMock.CryptoComponentsMock { } } -func getDefaultStateComponents() *testscommon.StateComponentsMock { - return &testscommon.StateComponentsMock{ +func getDefaultStateComponents() *factoryMocks.StateComponentsMock { + return &factoryMocks.StateComponentsMock{ PeersAcc: &stateMock.AccountsStub{}, Accounts: &stateMock.AccountsStub{}, AccountsAPI: &stateMock.AccountsStub{}, diff --git a/testscommon/components/default.go b/testscommon/components/default.go index 6cb28f54616..04fa94f1e3d 100644 --- a/testscommon/components/default.go +++ b/testscommon/components/default.go @@ -13,6 +13,7 @@ import ( dataRetrieverTests "github.com/multiversx/mx-chain-go/testscommon/dataRetriever" "github.com/multiversx/mx-chain-go/testscommon/economicsmocks" epochNotifierMock "github.com/multiversx/mx-chain-go/testscommon/epochNotifier" + "github.com/multiversx/mx-chain-go/testscommon/factory" "github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock" "github.com/multiversx/mx-chain-go/testscommon/p2pmocks" "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" @@ -86,8 +87,8 @@ func GetDefaultNetworkComponents() *mock.NetworkComponentsMock { } // GetDefaultStateComponents - -func GetDefaultStateComponents() *testscommon.StateComponentsMock { - return &testscommon.StateComponentsMock{ +func GetDefaultStateComponents() *factory.StateComponentsMock { + return &factory.StateComponentsMock{ PeersAcc: &stateMock.AccountsStub{}, Accounts: &stateMock.AccountsStub{}, Tries: &trieMock.TriesHolderStub{}, diff --git a/testscommon/stateComponentsMock.go b/testscommon/factory/stateComponentsMock.go similarity index 99% rename from testscommon/stateComponentsMock.go rename to testscommon/factory/stateComponentsMock.go index 28cc5d19531..f4e5e241222 100644 --- a/testscommon/stateComponentsMock.go +++ b/testscommon/factory/stateComponentsMock.go @@ -1,4 +1,4 @@ -package testscommon +package factory import ( "github.com/multiversx/mx-chain-go/common" From 934b03fa1527843a5c081acad5d403a545a0ff58 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Apr 2023 16:53:26 +0300 Subject: [PATCH 328/335] removed duplicated error after merge --- api/groups/addressGroup_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/api/groups/addressGroup_test.go b/api/groups/addressGroup_test.go index a8b3cf91cb1..ac4fd92def2 100644 --- a/api/groups/addressGroup_test.go +++ b/api/groups/addressGroup_test.go @@ -155,8 +155,6 @@ type codeHashResponse struct { Code string `json:"code"` } -var expectedErr = errors.New("expected err") - func TestNewAddressGroup(t *testing.T) { t.Parallel() From f9a898dbc70b7776cca4e5774f341c34ed5ed9a1 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Apr 2023 16:57:59 +0300 Subject: [PATCH 329/335] removed duplicated error after merge --- api/groups/blockGroup_test.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/api/groups/blockGroup_test.go b/api/groups/blockGroup_test.go index 1f6d7b50f1a..6bc58267f3e 100644 --- a/api/groups/blockGroup_test.go +++ b/api/groups/blockGroup_test.go @@ -55,8 +55,6 @@ type blockResponse struct { Code string `json:"code"` } -var expectedErr = errors.New("expected error") - func TestBlockGroup_getBlockByNonce(t *testing.T) { t.Parallel() @@ -513,10 +511,6 @@ func testBlockGroup( assert.True(t, strings.Contains(response.Error, expectedRespError)) } -func formatExpectedErr(err, innerErr error) string { - return fmt.Sprintf("%s: %s", err.Error(), innerErr.Error()) -} - func getBlockRoutesConfig() config.ApiRoutesConfig { return config.ApiRoutesConfig{ APIPackages: map[string]config.APIPackageConfig{ From 959a913c995c8ff946678ffd1988c04dd25fce79 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 28 Apr 2023 18:17:46 +0300 Subject: [PATCH 330/335] more processing tests fixes --- factory/interface.go | 1 + factory/mock/stateComponentsHolderStub.go | 5 ++ factory/processing/processComponents_test.go | 62 +++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/factory/interface.go b/factory/interface.go index ecec87cabf6..2def7d7204b 100644 --- a/factory/interface.go +++ b/factory/interface.go @@ -325,6 +325,7 @@ type StateComponentsHolder interface { AccountsRepository() state.AccountsRepository TriesContainer() common.TriesHolder TrieStorageManagers() map[string]common.StorageManager + Close() error IsInterfaceNil() bool } diff --git a/factory/mock/stateComponentsHolderStub.go b/factory/mock/stateComponentsHolderStub.go index 65cf2efdb0d..075d48ea041 100644 --- a/factory/mock/stateComponentsHolderStub.go +++ b/factory/mock/stateComponentsHolderStub.go @@ -69,6 +69,11 @@ func (s *StateComponentsHolderStub) TrieStorageManagers() map[string]common.Stor return nil } +// Close - +func (s *StateComponentsHolderStub) Close() error { + return nil +} + // IsInterfaceNil - func (s *StateComponentsHolderStub) IsInterfaceNil() bool { return s == nil diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index ebe27a8962f..701828e7ddb 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -29,6 +29,7 @@ import ( genesisMocks "github.com/multiversx/mx-chain-go/genesis/mock" testsMocks "github.com/multiversx/mx-chain-go/integrationTests/mock" "github.com/multiversx/mx-chain-go/p2p" + "github.com/multiversx/mx-chain-go/process" "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" mxState "github.com/multiversx/mx-chain-go/state" @@ -272,7 +273,18 @@ func TestNewProcessComponentsFactory(t *testing.T) { require.True(t, errors.Is(err, errorsMx.ErrNilDataComponentsHolder)) require.Nil(t, pcf) }) - t.Run("nil Blockchain should error", func(t *testing.T) { + t.Run("nil BlockChain should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Data = &testsMocks.DataComponentsStub{ + BlockChain: nil, + } + pcf, err := processComp.NewProcessComponentsFactory(args) + require.True(t, errors.Is(err, errorsMx.ErrNilBlockChainHandler)) + require.Nil(t, pcf) + }) + t.Run("nil DataPool should error", func(t *testing.T) { t.Parallel() args := createMockProcessComponentsFactoryArgs() @@ -592,6 +604,13 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.PublicKeyShardId.Type = "invalid" testCreateWithArgs(t, args, "cache type") }) + t.Run("createNetworkShardingCollector fails due to invalid PeerIdShardId config should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + args.Config.PeerIdShardId.Type = "invalid" + testCreateWithArgs(t, args, "cache type") + }) t.Run("prepareNetworkShardingCollector fails due to SetPeerShardResolver failure should error", func(t *testing.T) { t.Parallel() @@ -605,6 +624,19 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, expectedErr.Error()) }) + t.Run("prepareNetworkShardingCollector fails due to SetPeerValidatorMapper failure should error", func(t *testing.T) { + t.Parallel() + + args := createMockProcessComponentsFactoryArgs() + netwCompStub, ok := args.Network.(*testsMocks.NetworkComponentsStub) + require.True(t, ok) + netwCompStub.InputAntiFlood = &testsMocks.P2PAntifloodHandlerStub{ + SetPeerValidatorMapperCalled: func(validatorMapper process.PeerValidatorMapper) error { + return expectedErr + }, + } + testCreateWithArgs(t, args, expectedErr.Error()) + }) t.Run("newStorageRequester fails due to NewStorageServiceFactory failure should error", func(t *testing.T) { t.Parallel() @@ -778,7 +810,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } return dataPool.ValidatorsInfo() }, - CloseCalled: nil, + CloseCalled: dataPool.Close, } testCreateWithArgs(t, args, "validators info pool") }) @@ -895,7 +927,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { cnt := 0 bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { cnt++ - if cnt > 28 { + if cnt > 26 { return nil } return mock.NewMultiShardsCoordinatorMock(2) @@ -1092,6 +1124,10 @@ func TestProcessComponentsFactory_Create(t *testing.T) { instance, err := pcf.Create() require.Nil(t, err) require.NotNil(t, instance) + + err = instance.Close() + require.NoError(t, err) + _ = args.State.Close() }) t.Run("should work with indexAndReturnGenesisAccounts failing due to GetAllLeaves failure", func(t *testing.T) { t.Parallel() @@ -1123,6 +1159,10 @@ func TestProcessComponentsFactory_Create(t *testing.T) { instance, err := pcf.Create() require.Nil(t, err) require.NotNil(t, instance) + + err = instance.Close() + require.NoError(t, err) + _ = args.State.Close() }) t.Run("should work with indexAndReturnGenesisAccounts failing due to Unmarshal failure", func(t *testing.T) { t.Parallel() @@ -1172,6 +1212,10 @@ func TestProcessComponentsFactory_Create(t *testing.T) { instance, err := pcf.Create() require.Nil(t, err) require.NotNil(t, instance) + + err = instance.Close() + require.NoError(t, err) + _ = args.State.Close() }) t.Run("should work with indexAndReturnGenesisAccounts failing due to error on GetAllLeaves", func(t *testing.T) { t.Parallel() @@ -1208,6 +1252,10 @@ func TestProcessComponentsFactory_Create(t *testing.T) { instance, err := pcf.Create() require.Nil(t, err) require.NotNil(t, instance) + + err = instance.Close() + require.NoError(t, err) + _ = args.State.Close() }) t.Run("should work with indexAndReturnGenesisAccounts failing due to error on Encode", func(t *testing.T) { t.Parallel() @@ -1253,6 +1301,10 @@ func TestProcessComponentsFactory_Create(t *testing.T) { instance, err := pcf.Create() require.Nil(t, err) require.NotNil(t, instance) + + err = instance.Close() + require.NoError(t, err) + _ = args.State.Close() }) t.Run("should work - shard", func(t *testing.T) { shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -1266,6 +1318,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { err = instance.Close() require.NoError(t, err) + _ = processArgs.State.Close() }) t.Run("should work - meta", func(t *testing.T) { shardCoordinator := mock.NewMultiShardsCoordinatorMock(2) @@ -1291,6 +1344,7 @@ func TestProcessComponentsFactory_Create(t *testing.T) { err = instance.Close() require.NoError(t, err) + _ = processArgs.State.Close() }) } @@ -1489,4 +1543,6 @@ func testCreateWithArgs(t *testing.T, args processComp.ProcessComponentsFactoryA require.Error(t, err) require.True(t, strings.Contains(err.Error(), expectedErrSubstr)) require.Nil(t, instance) + + _ = args.State.Close() } From 2e88b2df706812b97361911e79fabccf74e12e5e Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Thu, 4 May 2023 13:10:04 +0300 Subject: [PATCH 331/335] termui: display if the node is full archive --- cmd/termui/view/termuic/termuiRenders/widgetsRender.go | 4 ++++ factory/processing/processComponents.go | 3 +++ 2 files changed, 7 insertions(+) diff --git a/cmd/termui/view/termuic/termuiRenders/widgetsRender.go b/cmd/termui/view/termuic/termuiRenders/widgetsRender.go index c7fcebec7d5..12d21a9aca6 100644 --- a/cmd/termui/view/termuic/termuiRenders/widgetsRender.go +++ b/cmd/termui/view/termuic/termuiRenders/widgetsRender.go @@ -124,12 +124,16 @@ func (wr *WidgetsRender) prepareInstanceInfo() { shardId := wr.presenter.GetShardId() instanceType := wr.presenter.GetNodeType() peerType := wr.presenter.GetPeerType() + peerSubType := wr.presenter.GetPeerSubType() chainID := wr.presenter.GetChainID() nodeTypeAndListDisplay := instanceType if peerType != string(common.ObserverList) && !strings.Contains(peerType, invalidKey) { nodeTypeAndListDisplay += fmt.Sprintf(" - %s", peerType) } + if peerSubType == core.FullHistoryObserver.String() { + nodeTypeAndListDisplay += " - full archive" + } shardIdStr := fmt.Sprintf("%d", shardId) if shardId == uint64(core.MetachainShardId) { shardIdStr = "meta" diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 205e528c1f1..ff4a814ae03 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -242,6 +242,9 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { return nil, err } + if pcf.prefConfigs.FullArchive { + pcf.statusCoreComponents.AppStatusHandler().SetStringValue(common.MetricPeerSubType, core.FullHistoryObserver.String()) + } pcf.epochNotifier.RegisterNotifyHandler(currentEpochProvider) fallbackHeaderValidator, err := fallback.NewFallbackHeaderValidator( From 6056fec474a44026ce8adaf0b430302ef41d0539 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Thu, 4 May 2023 13:16:27 +0300 Subject: [PATCH 332/335] set observer peer type if full archive --- factory/processing/processComponents.go | 1 + 1 file changed, 1 insertion(+) diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index ff4a814ae03..1103980233b 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -243,6 +243,7 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { } if pcf.prefConfigs.FullArchive { + pcf.statusCoreComponents.AppStatusHandler().SetStringValue(common.MetricPeerType, core.ObserverPeer.String()) pcf.statusCoreComponents.AppStatusHandler().SetStringValue(common.MetricPeerSubType, core.FullHistoryObserver.String()) } pcf.epochNotifier.RegisterNotifyHandler(currentEpochProvider) From bba49e18cf85058f589aa34428d12510744fe445 Mon Sep 17 00:00:00 2001 From: Bogdan Rosianu Date: Thu, 4 May 2023 13:34:04 +0300 Subject: [PATCH 333/335] moved the metrics init --- factory/processing/processComponents.go | 4 ---- node/nodeRunner.go | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 1103980233b..205e528c1f1 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -242,10 +242,6 @@ func (pcf *processComponentsFactory) Create() (*processComponents, error) { return nil, err } - if pcf.prefConfigs.FullArchive { - pcf.statusCoreComponents.AppStatusHandler().SetStringValue(common.MetricPeerType, core.ObserverPeer.String()) - pcf.statusCoreComponents.AppStatusHandler().SetStringValue(common.MetricPeerSubType, core.FullHistoryObserver.String()) - } pcf.epochNotifier.RegisterNotifyHandler(currentEpochProvider) fallbackHeaderValidator, err := fallback.NewFallbackHeaderValidator( diff --git a/node/nodeRunner.go b/node/nodeRunner.go index edb50e460f7..acad2c629ad 100644 --- a/node/nodeRunner.go +++ b/node/nodeRunner.go @@ -816,6 +816,11 @@ func (nr *nodeRunner) createMetrics( metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricTopUpFactor, fmt.Sprintf("%g", coreComponents.EconomicsData().RewardsTopUpFactor())) metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricGasPriceModifier, fmt.Sprintf("%g", coreComponents.EconomicsData().GasPriceModifier())) metrics.SaveUint64Metric(statusCoreComponents.AppStatusHandler(), common.MetricMaxGasPerTransaction, coreComponents.EconomicsData().MaxGasLimitPerTx()) + if nr.configs.PreferencesConfig.Preferences.FullArchive { + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricPeerType, core.ObserverPeer.String()) + metrics.SaveStringMetric(statusCoreComponents.AppStatusHandler(), common.MetricPeerSubType, core.FullHistoryObserver.String()) + } + return nil } From 0d49956d531cffe4a8da3366d5f0b77c9250f8a0 Mon Sep 17 00:00:00 2001 From: Sorin Stanculeanu Date: Fri, 5 May 2023 10:42:34 +0300 Subject: [PATCH 334/335] fixes after review --- factory/processing/processComponents.go | 12 +- factory/processing/processComponents_test.go | 525 ------------------- genesis/errors.go | 2 +- 3 files changed, 9 insertions(+), 530 deletions(-) diff --git a/factory/processing/processComponents.go b/factory/processing/processComponents.go index 13840946633..be35bf32a99 100644 --- a/factory/processing/processComponents.go +++ b/factory/processing/processComponents.go @@ -827,6 +827,7 @@ func (pcf *processComponentsFactory) newEpochStartTrigger(requestHandler epochSt AppStatusHandler: pcf.statusCoreComponents.AppStatusHandler(), DataPool: pcf.data.Datapool(), } + return metachain.NewEpochStartTrigger(argEpochStart) } @@ -1383,6 +1384,7 @@ func (pcf *processComponentsFactory) newMetaResolverContainerFactory( PreferredPeersHolder: pcf.network.PreferredPeersHolderHandler(), PayloadValidator: payloadValidator, } + return resolverscontainer.NewMetaResolversContainerFactory(resolversContainerFactoryArgs) } @@ -1395,10 +1397,10 @@ func (pcf *processComponentsFactory) newRequestersContainerFactory( return pcf.newStorageRequesters() } - shardC := pcf.bootstrapComponents.ShardCoordinator() + shardCoordinator := pcf.bootstrapComponents.ShardCoordinator() requestersContainerFactoryArgs := requesterscontainer.FactoryArgs{ RequesterConfig: pcf.config.Requesters, - ShardCoordinator: shardC, + ShardCoordinator: shardCoordinator, Messenger: pcf.network.NetworkMessenger(), Marshaller: pcf.coreData.InternalMarshalizer(), Uint64ByteSliceConverter: pcf.coreData.Uint64ByteSliceConverter(), @@ -1409,10 +1411,10 @@ func (pcf *processComponentsFactory) newRequestersContainerFactory( SizeCheckDelta: pcf.config.Marshalizer.SizeCheckDelta, } - if shardC.SelfId() < shardC.NumberOfShards() { + if shardCoordinator.SelfId() < shardCoordinator.NumberOfShards() { return requesterscontainer.NewShardRequestersContainerFactory(requestersContainerFactoryArgs) } - if shardC.SelfId() == core.MetachainShardId { + if shardCoordinator.SelfId() == core.MetachainShardId { return requesterscontainer.NewMetaRequestersContainerFactory(requestersContainerFactoryArgs) } @@ -1542,6 +1544,7 @@ func (pcf *processComponentsFactory) createStorageRequestersForMeta( ChanGracefullyClose: pcf.coreData.ChanStopNodeProcess(), SnapshotsEnabled: pcf.snapshotsEnabled, } + return storagerequesterscontainer.NewMetaRequestersContainerFactory(requestersContainerFactoryArgs) } @@ -1570,6 +1573,7 @@ func (pcf *processComponentsFactory) createStorageRequestersForShard( ChanGracefullyClose: pcf.coreData.ChanStopNodeProcess(), SnapshotsEnabled: pcf.snapshotsEnabled, } + return storagerequesterscontainer.NewShardRequestersContainerFactory(requestersContainerFactoryArgs) } diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index 701828e7ddb..92642f808e0 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -9,7 +9,6 @@ import ( "sync" "testing" - "github.com/multiversx/mx-chain-core-go/core" "github.com/multiversx/mx-chain-core-go/core/keyValStorage" coreData "github.com/multiversx/mx-chain-core-go/data" dataBlock "github.com/multiversx/mx-chain-core-go/data/block" @@ -21,7 +20,6 @@ import ( "github.com/multiversx/mx-chain-go/common" "github.com/multiversx/mx-chain-go/common/factory" "github.com/multiversx/mx-chain-go/config" - retriever "github.com/multiversx/mx-chain-go/dataRetriever" errorsMx "github.com/multiversx/mx-chain-go/errors" "github.com/multiversx/mx-chain-go/factory/mock" processComp "github.com/multiversx/mx-chain-go/factory/processing" @@ -33,7 +31,6 @@ import ( "github.com/multiversx/mx-chain-go/sharding" "github.com/multiversx/mx-chain-go/sharding/nodesCoordinator" mxState "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/bootstrapMocks" "github.com/multiversx/mx-chain-go/testscommon/components" @@ -52,14 +49,11 @@ import ( "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" - storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage" updateMocks "github.com/multiversx/mx-chain-go/update/mock" "github.com/stretchr/testify/require" ) const ( - unreachableStep = 10000 - blockProcessorOnMetaStep = 31 testingProtocolSustainabilityAddress = "erd1932eft30w753xyvme8d49qejgkjc09n5e49w4mwdjtm0neld797su0dlxp" ) @@ -588,8 +582,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.PrefConfigs.FullArchive = true testCreateWithArgs(t, args, "rounds per epoch") }) - t.Run("NewFallbackHeaderValidator fails should error", testWithNilMarshaller(1, "Marshalizer", unreachableStep)) - t.Run("NewHeaderSigVerifier fails should error", testWithNilMarshaller(2, "Marshalizer", unreachableStep)) t.Run("createNetworkShardingCollector fails due to invalid PublicKeyPeerId config should error", func(t *testing.T) { t.Parallel() @@ -645,52 +637,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.StoragePruning.NumActivePersisters = 0 testCreateWithArgs(t, args, "active persisters") }) - t.Run("newStorageRequester fails due to NewSimpleDataPacker failure on createStorageRequestersForMeta should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - args.ImportDBConfig.IsImportDBMode = true - - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - step := 0 - coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { - step++ - if step > 3 { - return nil - } - return &testscommon.MarshalizerStub{} - } - args.CoreData = coreCompStub - updateShardCoordinatorForMetaAtStep(t, args, 3) - testCreateWithArgs(t, args, "marshalizer") - }) - t.Run("newStorageRequester fails due to NewSimpleDataPacker failure on createStorageRequestersForShard should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - args.ImportDBConfig.IsImportDBMode = true - - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - step := 0 - coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { - step++ - if step > 3 { - return nil - } - return &testscommon.MarshalizerStub{} - } - args.CoreData = coreCompStub - testCreateWithArgs(t, args, "marshalizer") - }) - t.Run("newStorageRequester fails due to CreateForMeta failure should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - args.ImportDBConfig.IsImportDBMode = true - args.Config.ShardHdrNonceHashStorage.Cache.Type = "invalid" - updateShardCoordinatorForMetaAtStep(t, args, 0) - testCreateWithArgs(t, args, "ShardHdrNonceHashStorage") - }) t.Run("newResolverContainerFactory fails due to NewPeerAuthenticationPayloadValidator failure should error", func(t *testing.T) { t.Parallel() @@ -698,51 +644,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.HeartbeatV2.HeartbeatExpiryTimespanInSec = 0 testCreateWithArgs(t, args, "expiry timespan") }) - t.Run("newResolverContainerFactory fails due to invalid shard should error", - testWithInvalidShard(0, "could not create interceptor and resolver container factory")) - t.Run("newRequesterContainerFactory fails due to invalid shard should error", - testWithInvalidShard(5, "could not create requester container factory")) - t.Run("newMetaResolverContainerFactory fails due to NewSimpleDataPacker failure should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - updateShardCoordinatorForMetaAtStep(t, args, 0) - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - cnt := 0 - coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { - cnt++ - if cnt > 3 { - return nil - } - return &testscommon.MarshalizerStub{} - } - args.CoreData = coreCompStub - testCreateWithArgs(t, args, "marshalizer") - }) - t.Run("newShardResolverContainerFactory fails due to NewSimpleDataPacker failure should error", - testWithNilMarshaller(3, "marshalizer", unreachableStep)) - t.Run("NewRequestersFinder fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - args.ImportDBConfig.IsImportDBMode = true // coverage - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - cnt := 0 - bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { - cnt++ - if cnt > 5 { - return nil - } - return &testscommon.ShardsCoordinatorMock{ - NoShards: 2, - CurrentShard: common.MetachainShardId, // coverage - } - } - testCreateWithArgs(t, args, "shard coordinator") - }) - t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(0, retriever.TxLogsUnit, unreachableStep)) - t.Run("NewRequestersFinder fails should error", testWithNilMarshaller(5, "Marshalizer", unreachableStep)) t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to invalid GenesisNodePrice should error", func(t *testing.T) { t.Parallel() @@ -752,10 +653,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.SystemSCConfig.StakingSystemSCConfig.GenesisNodePrice = "invalid" testCreateWithArgs(t, args, "invalid genesis node price") }) - t.Run("generateGenesisHeadersAndApplyInitialBalances fails due to NewGenesisBlockCreator failure should error", - testWithNilMarshaller(7, "Marshalizer", unreachableStep)) - t.Run("setGenesisHeader fails due to invalid shard should error", - testWithInvalidShard(8, "genesis block does not exist")) t.Run("newValidatorStatisticsProcessor fails due to nil genesis header should error", func(t *testing.T) { t.Parallel() @@ -770,8 +667,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, errorsMx.ErrGenesisBlockNotInitialized.Error()) }) - t.Run("indexGenesisBlocks fails due to CalculateHash failure should error", - testWithNilMarshaller(42, "marshalizer", unreachableStep)) t.Run("indexGenesisBlocks fails due to GenerateInitialTransactions failure should error", func(t *testing.T) { t.Parallel() @@ -783,102 +678,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { } testCreateWithArgs(t, args, expectedErr.Error()) }) - t.Run("NewValidatorsProvider fails should error", - testWithNilPubKeyConv(2, "pubkey converter", unreachableStep)) - t.Run("newEpochStartTrigger fails due to invalid shard should error", - testWithInvalidShard(16, "error creating new start of epoch trigger because of invalid shard id")) - t.Run("newEpochStartTrigger fails due to NewHeaderValidator failure should error", - testWithNilMarshaller(47, "Marshalizer", unreachableStep)) - t.Run("newEpochStartTrigger fails due to NewPeerMiniBlockSyncer failure should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) - require.True(t, ok) - dataPool := dataCompStub.DataPool - cnt := 0 - dataCompStub.DataPool = &dataRetriever.PoolsHolderStub{ - HeadersCalled: dataPool.Headers, - TransactionsCalled: dataPool.Transactions, - MiniBlocksCalled: dataPool.MiniBlocks, - CurrBlockTxsCalled: dataPool.CurrentBlockTxs, - TrieNodesCalled: dataPool.TrieNodes, - ValidatorsInfoCalled: func() retriever.ShardedDataCacherNotifier { - cnt++ - if cnt > 3 { - return nil - } - return dataPool.ValidatorsInfo() - }, - CloseCalled: dataPool.Close, - } - testCreateWithArgs(t, args, "validators info pool") - }) - t.Run("newEpochStartTrigger fails due to NewPeerMiniBlockSyncer failure should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - updateShardCoordinatorForMetaAtStep(t, args, 16) - dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) - require.True(t, ok) - blockChainStub, ok := dataCompStub.BlockChain.(*testscommon.ChainHandlerStub) - require.True(t, ok) - cnt := 0 - blockChainStub.GetGenesisHeaderCalled = func() coreData.HeaderHandler { - cnt++ - if cnt > 1 { - return nil - } - return &testscommon.HeaderHandlerStub{} - } - testCreateWithArgs(t, args, errorsMx.ErrGenesisBlockNotInitialized.Error()) - }) - t.Run("newEpochStartTrigger fails due to invalid shard should error", - testWithInvalidShard(17, "error creating new start of epoch trigger because of invalid shard id")) - t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(48, "marshalizer", unreachableStep)) - t.Run("prepareGenesisBlock fails due to CalculateHash failure should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) - require.True(t, ok) - blockChainStub, ok := dataCompStub.BlockChain.(*testscommon.ChainHandlerStub) - require.True(t, ok) - cnt := 0 - blockChainStub.SetGenesisHeaderCalled = func(handler coreData.HeaderHandler) error { - cnt++ - if cnt > 1 { - return expectedErr - } - return nil - } - testCreateWithArgs(t, args, expectedErr.Error()) - }) - t.Run("saveGenesisHeaderToStorage fails due to Marshal failure should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - cnt := 0 - coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { - return &testscommon.MarshalizerStub{ - MarshalCalled: func(obj interface{}) ([]byte, error) { - cnt++ - if cnt > 38 { - return nil, expectedErr - } - return []byte(""), nil - }, - } - } - args.CoreData = coreCompStub - testCreateWithArgs(t, args, expectedErr.Error()) - }) - t.Run("GetStorer TxLogsUnit fails should error", testWithMissingStorer(2, retriever.BootstrapUnit, unreachableStep)) - t.Run("NewBootstrapStorer fails should error", testWithNilMarshaller(51, "Marshalizer", unreachableStep)) - t.Run("NewHeaderValidator fails should error", testWithNilMarshaller(52, "Marshalizer", unreachableStep)) - t.Run("newBlockTracker fails due to invalid shard should error", - testWithInvalidShard(20, "could not create block tracker")) t.Run("NewMiniBlocksPoolsCleaner fails should error", func(t *testing.T) { t.Parallel() @@ -893,22 +692,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.PoolsCleanersConfig.MaxRoundsToKeepUnprocessedTransactions = 0 testCreateWithArgs(t, args, "MaxRoundsToKeepUnprocessedData") }) - t.Run("NewMiniBlockTrack fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - cnt := 0 - bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { - cnt++ - if cnt > 25 { - return nil - } - return mock.NewMultiShardsCoordinatorMock(2) - } - testCreateWithArgs(t, args, "shard coordinator") - }) t.Run("createHardforkTrigger fails due to Decode failure should error", func(t *testing.T) { t.Parallel() @@ -916,26 +699,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.Hardfork.PublicKeyToListenFrom = "invalid key" testCreateWithArgs(t, args, "PublicKeyToListenFrom") }) - t.Run("newInterceptorContainerFactory fails due to invalid shard should error", - testWithInvalidShard(24, "could not create interceptor container factory")) - t.Run("createExportFactoryHandler fails", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - cnt := 0 - bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { - cnt++ - if cnt > 26 { - return nil - } - return mock.NewMultiShardsCoordinatorMock(2) - } - testCreateWithArgs(t, args, "shard coordinator") - }) - t.Run("newForkDetector fails due to invalid shard should error", - testWithInvalidShard(28, "could not create fork detector")) t.Run("NewCache fails for vmOutput should error", func(t *testing.T) { t.Parallel() @@ -943,50 +706,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.VMOutputCacher.Type = "invalid" testCreateWithArgs(t, args, "cache type") }) - t.Run("GetStorer TxLogsUnit fails should error", - testWithMissingStorer(0, retriever.ScheduledSCRsUnit, unreachableStep)) - t.Run("NewScheduledTxsExecution fails should error", - testWithNilMarshaller(104, "Marshalizer", unreachableStep)) - t.Run("NewESDTDataStorage fails should error", - testWithNilMarshaller(106, "Marshalizer", unreachableStep)) - t.Run("NewReceiptsRepository fails should error", - testWithNilMarshaller(107, "marshalizer", unreachableStep)) - t.Run("newBlockProcessor fails due to invalid shard should error", - testWithInvalidShard(32, "could not create block processor")) - - // newShardBlockProcessor - t.Run("newShardBlockProcessor: NewESDTTransferParser fails should error", - testWithNilMarshaller(108, "marshaller", unreachableStep)) - t.Run("newShardBlockProcessor: createBuiltInFunctionContainer fails should error", - testWithNilAddressPubKeyConv(46, "public key converter", unreachableStep)) - t.Run("newShardBlockProcessor: createVMFactoryShard fails due to NewBlockChainHookImpl failure should error", - testWithNilAddressPubKeyConv(47, "pubkey converter", unreachableStep)) - t.Run("newShardBlockProcessor: NewIntermediateProcessorsContainerFactory fails should error", - testWithNilMarshaller(111, "Marshalizer", unreachableStep)) - t.Run("newShardBlockProcessor: NewTxTypeHandler fails should error", - testWithNilAddressPubKeyConv(49, "pubkey converter", unreachableStep)) - t.Run("newShardBlockProcessor: NewGasComputation fails should error", - testWithNilEnableEpochsHandler(13, "enable epochs handler", unreachableStep)) - t.Run("newShardBlockProcessor: NewSmartContractProcessor fails should error", - testWithNilAddressPubKeyConv(50, "pubkey converter", unreachableStep)) - t.Run("newShardBlockProcessor: NewRewardTxProcessor fails should error", - testWithNilAddressPubKeyConv(51, "pubkey converter", unreachableStep)) - t.Run("newShardBlockProcessor: NewTxProcessor fails should error", - testWithNilAddressPubKeyConv(52, "pubkey converter", unreachableStep)) - t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to NewReadOnlyAccountsDB failure should error", - testWithNilAccountsAdapterAPI(1, "accounts adapter", unreachableStep)) - t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to NewIntermediateProcessorsContainerFactory failure should error", - testWithNilAddressPubKeyConv(53, "pubkey converter", unreachableStep)) - t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to createBuiltInFunctionContainer failure should error", - testWithNilAddressPubKeyConv(54, "public key converter", unreachableStep)) - t.Run("newShardBlockProcessor: createShardTxSimulatorProcessor fails due to createVMFactoryShard failure should error", - testWithNilAddressPubKeyConv(55, "pubkey converter", unreachableStep)) - t.Run("newShardBlockProcessor: createOutportDataProvider fails due to missing TransactionUnit should error", - testWithMissingStorer(3, retriever.TransactionUnit, unreachableStep)) - t.Run("newShardBlockProcessor: createOutportDataProvider fails due to missing MiniBlockUnit should error", - testWithMissingStorer(4, retriever.MiniBlockUnit, unreachableStep)) - t.Run("newShardBlockProcessor: NewShardProcessor fails should error", - testWithNilEnableEpochsHandler(23, "enable epochs handler", unreachableStep)) t.Run("newShardBlockProcessor: attachProcessDebugger fails should error", func(t *testing.T) { t.Parallel() @@ -995,64 +714,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.Config.Debug.Process.PollingTimeInSeconds = 0 testCreateWithArgs(t, args, "PollingTimeInSeconds") }) - t.Run("newShardBlockProcessor: NewBlockSizeComputation fails should error", - testWithNilMarshaller(117, "Marshalizer", unreachableStep)) - t.Run("newShardBlockProcessor: NewPreProcessorsContainerFactory fails should error", - testWithNilMarshaller(118, "Marshalizer", unreachableStep)) - t.Run("newShardBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", - testWithNilMarshaller(119, "Marshalizer", unreachableStep)) - t.Run("newShardBlockProcessor: NewTransactionCoordinator fails should error", - testWithNilMarshaller(120, "Marshalizer", unreachableStep)) - - // newMetaBlockProcessor, step for meta is 31 inside newBlockProcessor - t.Run("newMetaBlockProcessor: createBuiltInFunctionContainer fails should error", - testWithNilAddressPubKeyConv(46, "public key converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: createVMFactoryMeta fails due to NewBlockChainHookImpl failure should error", - testWithNilAddressPubKeyConv(47, "pubkey converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewIntermediateProcessorsContainerFactory fails should error", - testWithNilMarshaller(111, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewESDTTransferParser fails should error", - testWithNilMarshaller(112, "marshaller", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewTxTypeHandler fails should error", - testWithNilAddressPubKeyConv(49, "pubkey converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewGasComputation fails should error", - testWithNilEnableEpochsHandler(13, "enable epochs handler", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewSmartContractProcessor fails should error", - testWithNilAddressPubKeyConv(50, "pubkey converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewMetaTxProcessor fails should error", - testWithNilAddressPubKeyConv(51, "pubkey converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to NewIntermediateProcessorsContainerFactory failure should error", - testWithNilAddressPubKeyConv(52, "pubkey converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to NewReadOnlyAccountsDB failure should error", - testWithNilAccountsAdapterAPI(1, "accounts adapter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to createBuiltInFunctionContainer failure should error", - testWithNilAddressPubKeyConv(53, "public key converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to createVMFactoryMeta failure should error", - testWithNilAddressPubKeyConv(54, "pubkey converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: createMetaTxSimulatorProcessor fails due to NewMetaTxProcessor failure second time should error", - testWithNilAddressPubKeyConv(55, "pubkey converter", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewBlockSizeComputation fails should error", - testWithNilMarshaller(120, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewPreProcessorsContainerFactory fails should error", - testWithNilMarshaller(121, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewPrintDoubleTransactionsDetector fails should error", - testWithNilMarshaller(122, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewTransactionCoordinator fails should error", - testWithNilMarshaller(123, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewStakingToPeer fails should error", - testWithNilMarshaller(124, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewEpochStartData fails should error", - testWithNilMarshaller(125, "Marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewEndOfEpochEconomicsDataCreator fails should error", - testWithNilMarshaller(126, "marshalizer", blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: GetStorer RewardTransactionUnit fails should error", - testWithMissingStorer(1, retriever.RewardTransactionUnit, blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: GetStorer MiniBlockUnit fails should error", - testWithMissingStorer(4, retriever.MiniBlockUnit, blockProcessorOnMetaStep)) - t.Run("newMetaBlockProcessor: NewRewardsCreatorProxy fails should error", - testWithNilMarshaller(127, "marshalizer", blockProcessorOnMetaStep)) - - t.Run("NewNodesSetupChecker fails should error", testWithNilPubKeyConv(5, "pubkey converter", unreachableStep)) t.Run("nodesSetupChecker.Check fails should error", func(t *testing.T) { t.Parallel() @@ -1078,24 +739,6 @@ func TestProcessComponentsFactory_Create(t *testing.T) { args.CoreData = coreCompStub testCreateWithArgs(t, args, "no one staked") }) - t.Run("NewNodeRedundancy fails should error", func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - netwCompStub, ok := args.Network.(*testsMocks.NetworkComponentsStub) - require.True(t, ok) - cnt := 0 - netwCompStub.MessengerCalled = func() p2p.Messenger { - cnt++ - if cnt > 8 { - return nil - } - return &p2pmocks.MessengerStub{} - } - testCreateWithArgs(t, args, "messenger") - }) - t.Run("NewReceiptsRepository fails should error", testWithNilMarshaller(124, "marshalizer", unreachableStep)) - t.Run("NewTxsSenderWithAccumulator fails should error", testWithNilMarshaller(125, "Marshalizer", unreachableStep)) t.Run("should work with indexAndReturnGenesisAccounts failing due to RootHash failure", func(t *testing.T) { t.Parallel() @@ -1367,174 +1010,6 @@ func fundGenesisWallets(t *testing.T, args processComp.ProcessComponentsFactoryA } } -func testWithNilMarshaller(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - step := 0 - coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { - step++ - if step > nilStep { - return nil - } - return &testscommon.MarshalizerStub{} - } - args.CoreData = coreCompStub - updateShardCoordinatorForMetaAtStep(t, args, metaStep) - testCreateWithArgs(t, args, expectedErrSubstr) - } -} - -func testWithNilPubKeyConv(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - pubKeyConv := args.CoreData.ValidatorPubKeyConverter() - step := 0 - coreCompStub.ValidatorPubKeyConverterCalled = func() core.PubkeyConverter { - step++ - if step > nilStep { - return nil - } - return pubKeyConv - } - args.CoreData = coreCompStub - updateShardCoordinatorForMetaAtStep(t, args, metaStep) - testCreateWithArgs(t, args, expectedErrSubstr) - } -} - -func testWithNilAddressPubKeyConv(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - pubKeyConv := args.CoreData.AddressPubKeyConverter() - step := 0 - coreCompStub.AddressPubKeyConverterCalled = func() core.PubkeyConverter { - step++ - if step > nilStep { - return nil - } - return pubKeyConv - } - args.CoreData = coreCompStub - updateShardCoordinatorForMetaAtStep(t, args, metaStep) - testCreateWithArgs(t, args, expectedErrSubstr) - } -} - -func testWithNilEnableEpochsHandler(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) - enableEpochsHandler := coreCompStub.EnableEpochsHandler() - step := 0 - coreCompStub.EnableEpochsHandlerCalled = func() common.EnableEpochsHandler { - step++ - if step > nilStep { - return nil - } - return enableEpochsHandler - } - args.CoreData = coreCompStub - updateShardCoordinatorForMetaAtStep(t, args, metaStep) - testCreateWithArgs(t, args, expectedErrSubstr) - } -} - -func testWithNilAccountsAdapterAPI(nilStep int, expectedErrSubstr string, metaStep int) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - stateCompMock := factoryMocks.NewStateComponentsMockFromRealComponent(args.State) - accountsAdapterAPI := stateCompMock.AccountsAdapterAPI() - step := 0 - stateCompMock.AccountsAdapterAPICalled = func() mxState.AccountsAdapter { - step++ - if step > nilStep { - return nil - } - return accountsAdapterAPI - } - args.State = stateCompMock - updateShardCoordinatorForMetaAtStep(t, args, metaStep) - testCreateWithArgs(t, args, expectedErrSubstr) - } -} - -func testWithMissingStorer(failStep int, missingUnitType retriever.UnitType, metaStep int) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - expectedErr := errors.New("expected error") - args := createMockProcessComponentsFactoryArgs() - dataCompStub, ok := args.Data.(*testsMocks.DataComponentsStub) - require.True(t, ok) - store := args.Data.StorageService() - cnt := 0 - dataCompStub.Store = &storageStubs.ChainStorerStub{ - GetStorerCalled: func(unitType retriever.UnitType) (storage.Storer, error) { - if unitType == missingUnitType { - cnt++ - if cnt > failStep { - return nil, expectedErr - } - } - return store.GetStorer(unitType) - }, - } - updateShardCoordinatorForMetaAtStep(t, args, metaStep) - testCreateWithArgs(t, args, expectedErr.Error()) - } -} - -func updateShardCoordinatorForMetaAtStep(t *testing.T, args processComp.ProcessComponentsFactoryArgs, metaStep int) { - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - step := 0 - bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { - step++ - shardC := mock.NewMultiShardsCoordinatorMock(2) - if step > metaStep { - shardC.CurrentShard = common.MetachainShardId - } - return shardC - } -} - -func testWithInvalidShard(failingStep int, expectedErrSubstr string) func(t *testing.T) { - return func(t *testing.T) { - t.Parallel() - - args := createMockProcessComponentsFactoryArgs() - bootstrapCompStub, ok := args.BootstrapComponents.(*mainFactoryMocks.BootstrapComponentsStub) - require.True(t, ok) - - x := bootstrapCompStub.ShardCoordinator() - cnt := 0 - bootstrapCompStub.ShardCoordinatorCalled = func() sharding.Coordinator { - cnt++ - if cnt > failingStep { - return &testscommon.ShardsCoordinatorMock{ - NoShards: 2, - CurrentShard: 3, - } - } - return x - } - testCreateWithArgs(t, args, expectedErrSubstr) - } -} - func testCreateWithArgs(t *testing.T, args processComp.ProcessComponentsFactoryArgs, expectedErrSubstr string) { pcf, _ := processComp.NewProcessComponentsFactory(args) require.NotNil(t, pcf) diff --git a/genesis/errors.go b/genesis/errors.go index 77fee48171b..1c0330e4cad 100644 --- a/genesis/errors.go +++ b/genesis/errors.go @@ -171,4 +171,4 @@ var ErrMissingDeployedSC = errors.New("missing deployed SC") var ErrNilEpochConfig = errors.New("nil epoch config") // ErrNilGasSchedule signals that an operation has been attempted with a nil gas schedule -var ErrNilGasSchedule = errors.New("nil GasSchedule") +var ErrNilGasSchedule = errors.New("nil gas schedule") From 5ce0b7459ab81d976840a1cda7b3b2eef44b37f8 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Fri, 12 May 2023 16:46:17 +0300 Subject: [PATCH 335/335] fix after merge --- factory/consensus/consensusComponents_test.go | 13 +-- factory/processing/processComponents_test.go | 18 ++-- go.mod | 6 +- go.sum | 10 +- integrationTests/mock/storageManagerStub.go | 91 ------------------- testscommon/factory/stateComponentsMock.go | 15 +-- trie/node.go | 10 +- trie/node_test.go | 2 +- 8 files changed, 45 insertions(+), 120 deletions(-) delete mode 100644 integrationTests/mock/storageManagerStub.go diff --git a/factory/consensus/consensusComponents_test.go b/factory/consensus/consensusComponents_test.go index 4002e886e99..184cb8d3d11 100644 --- a/factory/consensus/consensusComponents_test.go +++ b/factory/consensus/consensusComponents_test.go @@ -33,7 +33,7 @@ import ( "github.com/multiversx/mx-chain-go/testscommon/shardingMocks" stateMocks "github.com/multiversx/mx-chain-go/testscommon/state" "github.com/multiversx/mx-chain-go/testscommon/statusHandler" - trieFactory "github.com/multiversx/mx-chain-go/trie/factory" + "github.com/multiversx/mx-chain-go/testscommon/storageManager" "github.com/multiversx/mx-chain-go/update" "github.com/stretchr/testify/require" ) @@ -138,11 +138,12 @@ func createMockConsensusComponentsFactoryArgs() consensusComp.ConsensusComponent }, StateComponents: &factoryMocks.StateComponentsMock{ StorageManagers: map[string]common.StorageManager{ - trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, - trieFactory.PeerAccountTrie: &testscommon.StorageManagerStub{}, + retriever.UserAccountsUnit.String(): &storageManager.StorageManagerStub{}, + retriever.PeerAccountsUnit.String(): &storageManager.StorageManagerStub{}, }, - Accounts: &stateMocks.AccountsStub{}, - PeersAcc: &stateMocks.AccountsStub{}, + Accounts: &stateMocks.AccountsStub{}, + PeersAcc: &stateMocks.AccountsStub{}, + MissingNodesNotifier: &testscommon.MissingTrieNodesNotifierStub{}, }, StatusComponents: &testsMocks.StatusComponentsStub{ Outport: &outportMocks.OutportStub{}, @@ -628,7 +629,7 @@ func TestConsensusComponentsFactory_Create(t *testing.T) { stateCompStub, ok := args.StateComponents.(*factoryMocks.StateComponentsMock) require.True(t, ok) stateCompStub.StorageManagers = map[string]common.StorageManager{ - trieFactory.UserAccountTrie: &testscommon.StorageManagerStub{}, + retriever.UserAccountsUnit.String(): &storageManager.StorageManagerStub{}, } // missing PeerAccountTrie processCompStub, ok := args.ProcessComponents.(*testsMocks.ProcessComponentsStub) require.True(t, ok) diff --git a/factory/processing/processComponents_test.go b/factory/processing/processComponents_test.go index 92642f808e0..391e164712c 100644 --- a/factory/processing/processComponents_test.go +++ b/factory/processing/processComponents_test.go @@ -883,10 +883,11 @@ func TestProcessComponentsFactory_Create(t *testing.T) { CommitCalled: realStateComp.AccountsAdapter().Commit, RootHashCalled: realStateComp.AccountsAdapter().RootHash, }, - PeersAcc: realStateComp.PeerAccounts(), - Tries: realStateComp.TriesContainer(), - AccountsAPI: realStateComp.AccountsAdapterAPI(), - StorageManagers: realStateComp.TrieStorageManagers(), + PeersAcc: realStateComp.PeerAccounts(), + Tries: realStateComp.TriesContainer(), + AccountsAPI: realStateComp.AccountsAdapterAPI(), + StorageManagers: realStateComp.TrieStorageManagers(), + MissingNodesNotifier: realStateComp.MissingTrieNodesNotifier(), } pcf, _ := processComp.NewProcessComponentsFactory(args) @@ -923,10 +924,11 @@ func TestProcessComponentsFactory_Create(t *testing.T) { CommitCalled: realStateComp.AccountsAdapter().Commit, RootHashCalled: realStateComp.AccountsAdapter().RootHash, }, - PeersAcc: realStateComp.PeerAccounts(), - Tries: realStateComp.TriesContainer(), - AccountsAPI: realStateComp.AccountsAdapterAPI(), - StorageManagers: realStateComp.TrieStorageManagers(), + PeersAcc: realStateComp.PeerAccounts(), + Tries: realStateComp.TriesContainer(), + AccountsAPI: realStateComp.AccountsAdapterAPI(), + StorageManagers: realStateComp.TrieStorageManagers(), + MissingNodesNotifier: realStateComp.MissingTrieNodesNotifier(), } coreCompStub := factoryMocks.NewCoreComponentsHolderStubFromRealComponent(args.CoreData) coreCompStub.InternalMarshalizerCalled = func() marshal.Marshalizer { diff --git a/go.mod b/go.mod index bba09a4e3c7..57dd47bbefc 100644 --- a/go.mod +++ b/go.mod @@ -13,13 +13,13 @@ 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.20230512130104-2a2e00c016b2 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-storage-go v1.0.8 - github.com/multiversx/mx-chain-vm-common-go v1.4.1 + github.com/multiversx/mx-chain-storage-go v1.0.9-0.20230512130346-04e711f3d064 + github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230512130259-7b26a55bcd8a github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53 github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54 github.com/multiversx/mx-chain-vm-v1_4-go v1.4.80 diff --git a/go.sum b/go.sum index 3b5e4647240..e7e38c73066 100644 --- a/go.sum +++ b/go.sum @@ -617,8 +617,10 @@ 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-0.20230403113932-916b16d18978/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.20230512130104-2a2e00c016b2 h1:j0kxDUOtqUPey78uWW39ScDT8S0V7G/L6kcl+JpGmq4= +github.com/multiversx/mx-chain-core-go v1.2.3-0.20230512130104-2a2e00c016b2/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= @@ -627,10 +629,12 @@ 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-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.4.1 h1:HHZF9zU4WsMbfLrCarx3ESM95caWUrPBleGHKdsbzgc= +github.com/multiversx/mx-chain-storage-go v1.0.9-0.20230512130346-04e711f3d064 h1:by2niUwKPvCONvTLUrhONwo+yl3Lin770A7uJAfEsaU= +github.com/multiversx/mx-chain-storage-go v1.0.9-0.20230512130346-04e711f3d064/go.mod h1:FGhaeTNIcLZOPqsJZQ1TdcMaPVLhj642OzRNmt6+RQs= 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.20230512130259-7b26a55bcd8a h1:m0cQrhe2zet657jWjrE2nvba6DqM5I5bNSqbJcpwfEM= +github.com/multiversx/mx-chain-vm-common-go v1.4.2-0.20230512130259-7b26a55bcd8a/go.mod h1:eBUoLYceIutumF+MZYrHhI+Fq/piUueuaR3vH8Pia8A= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53 h1:HGbatzgIhVPJASN3ADnygH4MrKypAidOVtZkHkY/jKw= github.com/multiversx/mx-chain-vm-v1_2-go v1.2.53/go.mod h1:STVJW9m/TUJ9Q64W/T4P/KuhP5fPb+cCb6Q4gSehWJg= github.com/multiversx/mx-chain-vm-v1_3-go v1.3.54 h1:bl2essObOEDwVWci71hJ2QO5AYTsKk6IlzRK0i8y63w= diff --git a/integrationTests/mock/storageManagerStub.go b/integrationTests/mock/storageManagerStub.go deleted file mode 100644 index 83b88c88abb..00000000000 --- a/integrationTests/mock/storageManagerStub.go +++ /dev/null @@ -1,91 +0,0 @@ -package mock - -import ( - "github.com/multiversx/mx-chain-go/common" -) - -// StorageManagerStub - -type StorageManagerStub struct { - DatabaseCalled func() common.DBWriteCacher - TakeSnapshotCalled func([]byte) - SetCheckpointCalled func([]byte) - GetDbThatContainsHashCalled func([]byte) common.DBWriteCacher - GetSnapshotThatContainsHashCalled func(rootHash []byte) common.SnapshotDbHandler - IsPruningEnabledCalled func() bool - IsPruningBlockedCalled func() bool - EnterPruningBufferingModeCalled func() - ExitPruningBufferingModeCalled func() - IsInterfaceNilCalled func() bool -} - -// Database - -func (sms *StorageManagerStub) Database() common.DBWriteCacher { - if sms.DatabaseCalled != nil { - return sms.DatabaseCalled() - } - return nil -} - -// TakeSnapshot - -func (sms *StorageManagerStub) TakeSnapshot([]byte) { - -} - -// SetCheckpoint - -func (sms *StorageManagerStub) SetCheckpoint([]byte) { - -} - -// GetSnapshotThatContainsHash - -func (sms *StorageManagerStub) GetSnapshotThatContainsHash(d []byte) common.SnapshotDbHandler { - if sms.GetSnapshotThatContainsHashCalled != nil { - return sms.GetSnapshotThatContainsHashCalled(d) - } - - return nil -} - -// IsPruningEnabled - -func (sms *StorageManagerStub) IsPruningEnabled() bool { - if sms.IsPruningEnabledCalled != nil { - return sms.IsPruningEnabledCalled() - } - return false -} - -// IsPruningBlocked - -func (sms *StorageManagerStub) IsPruningBlocked() bool { - if sms.IsPruningBlockedCalled != nil { - return sms.IsPruningBlockedCalled() - } - return false -} - -// GetSnapshotDbBatchDelay - -func (sms *StorageManagerStub) GetSnapshotDbBatchDelay() int { - return 0 -} - -// Close - -func (sms *StorageManagerStub) Close() error { - return nil -} - -// EnterPruningBufferingMode - -func (sms *StorageManagerStub) EnterPruningBufferingMode() { - if sms.EnterPruningBufferingModeCalled != nil { - sms.EnterPruningBufferingModeCalled() - } -} - -// ExitPruningBufferingMode - -func (sms *StorageManagerStub) ExitPruningBufferingMode() { - if sms.ExitPruningBufferingModeCalled != nil { - sms.ExitPruningBufferingModeCalled() - } -} - -// IsInterfaceNil - -func (sms *StorageManagerStub) IsInterfaceNil() bool { - return sms == nil -} diff --git a/testscommon/factory/stateComponentsMock.go b/testscommon/factory/stateComponentsMock.go index 711181c003f..5aa541dffa0 100644 --- a/testscommon/factory/stateComponentsMock.go +++ b/testscommon/factory/stateComponentsMock.go @@ -15,18 +15,19 @@ type StateComponentsMock struct { AccountsRepo state.AccountsRepository Tries common.TriesHolder StorageManagers map[string]common.StorageManager - MissingNodesNotifier common.MissingTrieNodesNotifier + MissingNodesNotifier common.MissingTrieNodesNotifier } // NewStateComponentsMockFromRealComponent - func NewStateComponentsMockFromRealComponent(stateComponents factory.StateComponentsHolder) *StateComponentsMock { return &StateComponentsMock{ - PeersAcc: stateComponents.PeerAccounts(), - Accounts: stateComponents.AccountsAdapter(), - AccountsAPI: stateComponents.AccountsAdapterAPI(), - AccountsRepo: stateComponents.AccountsRepository(), - Tries: stateComponents.TriesContainer(), - StorageManagers: stateComponents.TrieStorageManagers(), + PeersAcc: stateComponents.PeerAccounts(), + Accounts: stateComponents.AccountsAdapter(), + AccountsAPI: stateComponents.AccountsAdapterAPI(), + AccountsRepo: stateComponents.AccountsRepository(), + Tries: stateComponents.TriesContainer(), + StorageManagers: stateComponents.TrieStorageManagers(), + MissingNodesNotifier: stateComponents.MissingTrieNodesNotifier(), } } diff --git a/trie/node.go b/trie/node.go index 98305fb47df..67c7f95d8c3 100644 --- a/trie/node.go +++ b/trie/node.go @@ -120,7 +120,7 @@ func computeAndSetNodeHash(n node) ([]byte, error) { func getNodeFromDBAndDecode(n []byte, db common.DBWriteCacher, marshalizer marshal.Marshalizer, hasher hashing.Hasher) (node, error) { encChild, err := db.Get(n) if err != nil { - log.Trace(core.GetNodeFromDBErrorString, "error", err, "key", n, "stack trace", string(debug.Stack())) + treatLogError(log, err, n) dbWithID, ok := db.(dbWriteCacherWithIdentifier) if !ok { @@ -134,6 +134,14 @@ func getNodeFromDBAndDecode(n []byte, db common.DBWriteCacher, marshalizer marsh return decodeNode(encChild, marshalizer, hasher) } +func treatLogError(logInstance logger.Logger, err error, key []byte) { + if logInstance.GetLevel() != logger.LogTrace { + return + } + + logInstance.Trace(core.GetNodeFromDBErrorString, "error", err, "key", key, "stack trace", string(debug.Stack())) +} + func resolveIfCollapsed(n node, pos byte, db common.DBWriteCacher) error { err := n.isEmptyOrNil() if err != nil { diff --git a/trie/node_test.go b/trie/node_test.go index f6bfcf165ce..0b6e850ee63 100644 --- a/trie/node_test.go +++ b/trie/node_test.go @@ -667,7 +667,7 @@ func TestTreatLogError(t *testing.T) { }, TraceCalled: func(message string, args ...interface{}) { wasCalled = true - require.Equal(t, common.GetNodeFromDBErrorString, message) + require.Equal(t, core.GetNodeFromDBErrorString, message) require.Equal(t, 6, len(args)) expectedFirst5Args := []interface{}{"error", err, "key", key, "stack trace"} require.Equal(t, expectedFirst5Args, args[:5])