From 1e50016a9171b36f4f5a3bf17207e3a2d5677416 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Wed, 22 Apr 2020 13:15:31 +0300 Subject: [PATCH] core,test: move helper functions for testchain to the internal package Our test chain is used in core,rpc and (in future) interop packages. It is better to have all related declarations in one place to avoid code duplication. --- pkg/consensus/consensus_test.go | 34 ++----------- pkg/core/helper_test.go | 30 ++++-------- pkg/internal/testchain/address.go | 80 +++++++++++++++++++++++++++++++ pkg/rpc/server/server_test.go | 23 ++++----- 4 files changed, 103 insertions(+), 64 deletions(-) create mode 100644 pkg/internal/testchain/address.go diff --git a/pkg/consensus/consensus_test.go b/pkg/consensus/consensus_test.go index 008f047d4..f8da39be3 100644 --- a/pkg/consensus/consensus_test.go +++ b/pkg/consensus/consensus_test.go @@ -14,6 +14,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/crypto/hash" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/encoding/address" + "github.com/nspcc-dev/neo-go/pkg/internal/testchain" "github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm/opcode" @@ -216,35 +217,7 @@ func TestExport(t *testing.T) { } func getTestValidator(i int) (*privateKey, *publicKey) { - var wif, password string - - // Sorted by public key. - switch i { - case 0: - wif = "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg" - password = "two" - - case 1: - wif = "6PYWscJHQ76uctwuM7GRcAp6xfGjdYDKnbMtMnT6hcXxcNn7CywbQmvfSy" - password = "four" - - case 2: - wif = "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN" - password = "one" - - case 3: - wif = "6PYRHjZrvxYqrHLpXz1aP6dBnrFkkxQMCdYsJi7YDPoQnQddvRuTzKGxME" - password = "three" - - default: - return nil, nil - } - - key, err := keys.NEP2Decrypt(wif, password) - if err != nil { - return nil, nil - } - + key := testchain.PrivateKey(i) return &privateKey{PrivateKey: key}, &publicKey{PublicKey: key.PublicKey()} } @@ -269,8 +242,7 @@ func (fs *feer) SystemFee(*transaction.Transaction) util.Fixed8 { return util.F func addSender(t *testing.T, txs ...*transaction.Transaction) { // multisig address which possess all NEO - scriptHash, err := util.Uint160DecodeStringBE("d60ac443bb800fb08261e75fa5925d747d485861") - require.NoError(t, err) + scriptHash := testchain.MultisigScriptHash() for _, tx := range txs { tx.Sender = scriptHash } diff --git a/pkg/core/helper_test.go b/pkg/core/helper_test.go index b98457318..68fc1ec8e 100644 --- a/pkg/core/helper_test.go +++ b/pkg/core/helper_test.go @@ -15,6 +15,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/crypto/hash" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" + "github.com/nspcc-dev/neo-go/pkg/internal/testchain" "github.com/nspcc-dev/neo-go/pkg/internal/testserdes" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/smartcontract" @@ -27,15 +28,8 @@ import ( "go.uber.org/zap/zaptest" ) -var privNetKeys = []string{ - "KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY", - "KzfPUYDC9n2yf4fK5ro4C8KMcdeXtFuEnStycbZgX3GomiUsvX6W", - "KzgWE3u3EDp13XPXXuTKZxeJ3Gi8Bsm8f9ijY3ZsCKKRvZUo1Cdn", - "L2oEXKRAAMiPEZukwR5ho2S6SMeQLhcK9mF71ZnF7GvT8dU4Kkgz", -} - // multisig address which possess all NEO -var neoOwner = "d60ac443bb800fb08261e75fa5925d747d485861" +var neoOwner = testchain.MultisigScriptHash().StringBE() // newTestChain should be called before newBlock invocation to properly setup // global state. @@ -78,11 +72,8 @@ func newBlock(cfg config.ProtocolConfiguration, index uint32, prev util.Uint256, _ = b.RebuildMerkleRoot() invScript := make([]byte, 0) - for _, wif := range privNetKeys { - pKey, err := keys.NewPrivateKeyFromWIF(wif) - if err != nil { - panic(err) - } + for i := 0; i < testchain.Size(); i++ { + pKey := testchain.PrivateKey(i) b := b.GetSignedPart() sig := pKey.Sign(b) if len(sig) != 64 { @@ -224,8 +215,7 @@ func TestCreateBasicChain(t *testing.T) { require.NoError(t, err) txMoveNeo.Sender = scriptHash - priv0, err := keys.NewPrivateKeyFromWIF(privNetKeys[0]) - require.NoError(t, err) + priv0 := testchain.PrivateKeyByID(0) priv0ScriptHash := priv0.GetScriptHash() txMoveNeo.AddOutput(&transaction.Output{ AssetID: GoverningTokenID(), @@ -375,8 +365,7 @@ func TestCreateBasicChain(t *testing.T) { require.NoError(t, bc.AddBlock(b)) t.Logf("txInv: %s", txInv.Hash().StringLE()) - priv1, err := keys.NewPrivateKeyFromWIF(privNetKeys[1]) - require.NoError(t, err) + priv1 := testchain.PrivateKeyByID(1) txNeo0to1 := transaction.NewContractTX() txNeo0to1.Nonce = getNextNonce() txNeo0to1.ValidUntilBlock = validUntilBlock @@ -526,11 +515,8 @@ func signTx(bc *Blockchain, txs ...*transaction.Transaction) error { data := tx.GetSignedPart() var invoc []byte - for i := range privNetKeys { - priv, err := keys.NewPrivateKeyFromWIF(privNetKeys[i]) - if err != nil { - return err - } + for i := 0; i < testchain.Size(); i++ { + priv := testchain.PrivateKey(i) invoc = append(invoc, getInvocationScript(data, priv)...) } diff --git a/pkg/internal/testchain/address.go b/pkg/internal/testchain/address.go new file mode 100644 index 000000000..274c4c1e9 --- /dev/null +++ b/pkg/internal/testchain/address.go @@ -0,0 +1,80 @@ +package testchain + +import ( + "github.com/nspcc-dev/neo-go/pkg/crypto/hash" + "github.com/nspcc-dev/neo-go/pkg/crypto/keys" + "github.com/nspcc-dev/neo-go/pkg/encoding/address" + "github.com/nspcc-dev/neo-go/pkg/smartcontract" + "github.com/nspcc-dev/neo-go/pkg/util" +) + +// privNetKeys is a list of unencrypted WIFs sorted by public key. +var privNetKeys = []string{ + "KzfPUYDC9n2yf4fK5ro4C8KMcdeXtFuEnStycbZgX3GomiUsvX6W", + "KzgWE3u3EDp13XPXXuTKZxeJ3Gi8Bsm8f9ijY3ZsCKKRvZUo1Cdn", + "KxyjQ8eUa4FHt3Gvioyt1Wz29cTUrE4eTqX3yFSk1YFCsPL8uNsY", + "L2oEXKRAAMiPEZukwR5ho2S6SMeQLhcK9mF71ZnF7GvT8dU4Kkgz", +} + +var ( + // ids maps validators order by public key sorting to validators ID. + // which is an order of the validator in the StandByValidators list. + ids = []int{1, 3, 0, 2} + // orders maps to validators id to it's order by public key sorting. + orders = []int{2, 0, 3, 1} +) + +// Size returns testchain initial validators amount. +func Size() int { + return len(privNetKeys) +} + +// IDToOrder returns node's order in privnet. +func IDToOrder(id int) int { + return orders[id] +} + +// WIF returns unencrypted wif of the specified validator. +func WIF(i int) string { + return privNetKeys[i] +} + +// PrivateKey returns private key of node #i. +func PrivateKey(i int) *keys.PrivateKey { + wif := WIF(i) + priv, err := keys.NewPrivateKeyFromWIF(wif) + if err != nil { + panic(err) + } + return priv +} + +// PrivateKeyByID returns private keys of a node with the specified id. +func PrivateKeyByID(id int) *keys.PrivateKey { + return PrivateKey(IDToOrder(id)) +} + +// MultisigVerificationScript returns script hash of the consensus multisig address. +func MultisigVerificationScript() []byte { + var pubs keys.PublicKeys + for i := range privNetKeys { + priv := PrivateKey(ids[i]) + pubs = append(pubs, priv.PublicKey()) + } + + script, err := smartcontract.CreateMultiSigRedeemScript(3, pubs) + if err != nil { + panic(err) + } + return script +} + +// MultisigScriptHash returns consensus address as Uint160. +func MultisigScriptHash() util.Uint160 { + return hash.Hash160(MultisigVerificationScript()) +} + +// MultisigAddress return consensus address as string. +func MultisigAddress() string { + return address.Uint160ToString(MultisigScriptHash()) +} diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 5400e5b3a..bd7fc82b8 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -17,6 +17,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core/transaction" "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/encoding/address" + "github.com/nspcc-dev/neo-go/pkg/internal/testchain" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/rpc/response" "github.com/nspcc-dev/neo-go/pkg/rpc/response/result" @@ -86,7 +87,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "getaccountstate": { { name: "positive", - params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, + params: `["` + testchain.MultisigAddress() + `"]`, result: func(e *executor) interface{} { return &result.AccountState{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.AccountState) @@ -160,12 +161,12 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "positive", - params: `["c4bba7ed4e624d038b844d6b6ff24518e7db0165"]`, + params: `["` + testchain.PrivateKeyByID(0).GetScriptHash().StringLE() + `"]`, result: func(e *executor) interface{} { return &result.NEP5Balances{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.NEP5Balances) require.True(t, ok) - require.Equal(t, "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", res.Address) + require.Equal(t, testchain.PrivateKeyByID(0).Address(), res.Address) require.Equal(t, 1, len(res.Balances)) require.Equal(t, "8.77", res.Balances[0].Amount) require.Equal(t, testContractHash, res.Balances[0].Asset.StringLE()) @@ -186,12 +187,12 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "positive", - params: `["AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY"]`, + params: `["` + testchain.PrivateKeyByID(0).Address() + `"]`, result: func(e *executor) interface{} { return &result.NEP5Transfers{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.NEP5Transfers) require.True(t, ok) - require.Equal(t, "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", res.Address) + require.Equal(t, testchain.PrivateKeyByID(0).Address(), res.Address) assetHash, err := util.Uint160DecodeStringLE(testContractHash) require.NoError(t, err) @@ -204,7 +205,7 @@ var rpcTestCases = map[string][]rpcTestCase{ require.Equal(t, 1, len(res.Sent)) require.Equal(t, "1.23", res.Sent[0].Amount) require.Equal(t, assetHash, res.Sent[0].Asset) - require.Equal(t, "AdB6ayKfBRJZasiXX4JL5N2YtmxftNp1b3", res.Sent[0].Address) + require.Equal(t, testchain.PrivateKeyByID(1).Address(), res.Sent[0].Address) }, }, }, @@ -515,7 +516,7 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "normal address", - params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, + params: `["` + testchain.MultisigAddress() + `"]`, result: func(*executor) interface{} { // hash of the issueTx h, _ := util.Uint256DecodeStringBE("4cccf8f1a4cfa9ebd9344c312f8220199ee9000f14cb951f677601d208aa5af0") @@ -530,7 +531,7 @@ var rpcTestCases = map[string][]rpcTestCase{ Unclaimed: amount, }, }, - Address: "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + Address: testchain.MultisigAddress(), Unclaimed: amount, } }, @@ -612,7 +613,7 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "positive", - params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, + params: `["` + testchain.MultisigAddress() + `"]`, result: func(*executor) interface{} { return &result.Unclaimed{} }, @@ -628,7 +629,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "getunspents": { { name: "positive", - params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, + params: `["` + testchain.MultisigAddress() + `"]`, result: func(e *executor) interface{} { return &result.Unspents{} }, check: func(t *testing.T, e *executor, unsp interface{}) { res, ok := unsp.(*result.Unspents) @@ -973,7 +974,7 @@ func TestRPC(t *testing.T) { assert.Equal(t, 0, txOut.N) assert.Equal(t, "0xf5bc5a9ac7b85a47be381260a06b5a1e7a667ce8f7d7c8baa5cfc6465571377a", txOut.Asset) assert.Equal(t, util.Fixed8FromInt64(100000000), txOut.Value) - assert.Equal(t, "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", txOut.Address) + assert.Equal(t, testchain.MultisigAddress(), txOut.Address) }) t.Run("getrawmempool", func(t *testing.T) {