From e5cdecfa9f83c93eb22cecebdca096d1a22135fb Mon Sep 17 00:00:00 2001 From: Anna Shaleva Date: Wed, 17 Mar 2021 16:40:24 +0300 Subject: [PATCH] core: fix transaction hashes --- cli/testdata/chain50x2.acc | Bin 45322 -> 45322 bytes pkg/core/block/block_test.go | 38 +++++++++++---------- pkg/core/blockchain_test.go | 4 +-- pkg/core/helper_test.go | 17 ++++++++-- pkg/core/transaction/helper_test.go | 10 +++--- pkg/core/transaction/transaction.go | 40 +++++++++++++---------- pkg/core/transaction/transaction_test.go | 34 ++++++++----------- pkg/crypto/verifiable.go | 7 ++-- pkg/rpc/client/rpc_test.go | 34 +++++++++---------- pkg/rpc/client/wsclient_test.go | 3 +- pkg/rpc/server/server_test.go | 6 ++-- pkg/rpc/server/testdata/testblocks.acc | Bin 10913 -> 10913 bytes pkg/smartcontract/context/context.go | 7 ++-- 13 files changed, 110 insertions(+), 90 deletions(-) diff --git a/cli/testdata/chain50x2.acc b/cli/testdata/chain50x2.acc index e6f0997fe963a8f6ea669b0ae914533b09c2d679..8278f8411905156abb77a9cefbf639a3c991721e 100644 GIT binary patch literal 45322 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Ð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 W_qWPiK}n}GTK$DzeKGSO7WO~xNNPU- diff --git a/pkg/core/block/block_test.go b/pkg/core/block/block_test.go index 7c033e1e4..65a8f1ec7 100644 --- a/pkg/core/block/block_test.go +++ b/pkg/core/block/block_test.go @@ -105,15 +105,16 @@ func TestHashBlockEqualsHashHeader(t *testing.T) { } func TestBinBlockDecodeEncode(t *testing.T) { - // block taken from testnet: 256 - rawblock := "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" + // block with two transfer transactions taken from C# privnet + rawblock := "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBbkOUNHAsfre0rKA/F+Ox05/bQSXmcRZnzK3M6Z+/TxJUh0MNFeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxA4MAnF5HGhcOTBjqdXKZIAKcw019v0cSpZj3l04FmLXxAPIPbL1Em2QOE3qBslr1/C4jdLSSq82o3TBr01RqlZgxA6ejwZmZkcfQsbMLS4beqFmtlKuK5eXYj7C7al2XmXqTJcVEm2gnZRUwe4lkBvcil1keYXNLEnHr77lcMLFGHZQxA8JYcGaz9OxOXxECrbVTGAIi+3nXf3ltsqDBmXukPeYO8l0OvXnVR30G+tXwcNw4wqTA2eZbMadwYM14JScDEipMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUCAFjQuwvA2KcAAAAAACCqRAAAAAAA6AMAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCAOH1BQwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxAuFCM0+tRmD8dC3ZLKxegtoqGGoun28KY79wRgKosmoMYqJmBmUS3l2cg+uzuRSfOqV0RbUm1WLtmAxvk+SAiIAxA85v8JfgZx70F2h0Naxi7XVDHONcDeiOPJDzzOxdt4C/bFcRs4kCDES56U21h6582lPUstH15LyK3SctSgAZEkAxAwcLgblSvp7Gb59aALHD4+ndxSYlBivcYh6V/SKaf+Y0510QQMs8hnPCGTAVapeFkvJMBXuqIwP/QbxW+Xll5xJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUA2CS8GcDYpwAAAAAAIKpEAAAAAADoAwAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBfCwMAQNndiE0KAAwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjkBxgxA1p9A+89hC6qTfIIXDPz7XxcKOevwXxGrHx7kihAiTGMb1OO69mbUooYOfZRsUmcx7L8U8up7MrydtsnDYSDXSQxApetXIPd+zfx7oyrCzLtsCTEuwueG8yd6ttgs6pZb8N2KfNPVEoCg7Plvt0A+6yPkhbNDoSJ9IKKAlFOn/9d1owxA6/V3Xk+QhkzvAi9CYoM3E3LnLNBgXKh7PH06Dusz7rgn0u1oencsUgoo0+AOEvuwVHVt3bDu/NvJHtX4/KDcZpMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" rawblockBytes, _ := base64.StdEncoding.DecodeString(rawblock) - b := New(netmode.TestNet, false) + b := New(netmode.PrivNet, false) assert.NoError(t, testserdes.DecodeBinary(rawblockBytes, b)) expected := map[string]bool{ // 1 trans - "6fcc0c48c5d1b28bb5c2effa1e5b7bb054d22a8c30d409a6a7a3527845229056": false, + "5a30127b16a628de6aa6823418d76214b97a0fc6db865024d3d2c6e939ce3433": false, + "25426643feed564cd3e57f346d6c68692f5622b3063da11c5572d99ee1a5b49a": false, } var hashes []string @@ -142,17 +143,17 @@ func TestBinBlockDecodeEncode(t *testing.T) { assert.NoError(t, err) assert.Equal(t, rawblock, base64.StdEncoding.EncodeToString(data)) - testserdes.MarshalUnmarshalJSON(t, b, New(netmode.TestNet, false)) + testserdes.MarshalUnmarshalJSON(t, b, New(netmode.PrivNet, false)) } func TestBlockSizeCalculation(t *testing.T) { - // block taken from testnet at height 256: 51ee44e12cdc1d3041a50d352063127fa65d86670686f14cc08f01b3cee7de17 + // block taken from C# privnet: 02d7c7801742cd404eb178780c840477f1eef4a771ecc8cc9434640fe8f2bb09 // The Size in golang is given by counting the number of bytes of an object. (len(Bytes)) // its implementation is different from the corresponding C# and python implementations. But the result should // should be the same.In this test we provide more details then necessary because in case of failure we can easily debug the // root cause of the size calculation missmatch. - rawBlock := "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" + rawBlock := "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBbkOUNHAsfre0rKA/F+Ox05/bQSXmcRZnzK3M6Z+/TxJUh0MNFeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxA4MAnF5HGhcOTBjqdXKZIAKcw019v0cSpZj3l04FmLXxAPIPbL1Em2QOE3qBslr1/C4jdLSSq82o3TBr01RqlZgxA6ejwZmZkcfQsbMLS4beqFmtlKuK5eXYj7C7al2XmXqTJcVEm2gnZRUwe4lkBvcil1keYXNLEnHr77lcMLFGHZQxA8JYcGaz9OxOXxECrbVTGAIi+3nXf3ltsqDBmXukPeYO8l0OvXnVR30G+tXwcNw4wqTA2eZbMadwYM14JScDEipMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUCAFjQuwvA2KcAAAAAACCqRAAAAAAA6AMAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCAOH1BQwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxAuFCM0+tRmD8dC3ZLKxegtoqGGoun28KY79wRgKosmoMYqJmBmUS3l2cg+uzuRSfOqV0RbUm1WLtmAxvk+SAiIAxA85v8JfgZx70F2h0Naxi7XVDHONcDeiOPJDzzOxdt4C/bFcRs4kCDES56U21h6582lPUstH15LyK3SctSgAZEkAxAwcLgblSvp7Gb59aALHD4+ndxSYlBivcYh6V/SKaf+Y0510QQMs8hnPCGTAVapeFkvJMBXuqIwP/QbxW+Xll5xJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUA2CS8GcDYpwAAAAAAIKpEAAAAAADoAwAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBfCwMAQNndiE0KAAwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjkBxgxA1p9A+89hC6qTfIIXDPz7XxcKOevwXxGrHx7kihAiTGMb1OO69mbUooYOfZRsUmcx7L8U8up7MrydtsnDYSDXSQxApetXIPd+zfx7oyrCzLtsCTEuwueG8yd6ttgs6pZb8N2KfNPVEoCg7Plvt0A+6yPkhbNDoSJ9IKKAlFOn/9d1owxA6/V3Xk+QhkzvAi9CYoM3E3LnLNBgXKh7PH06Dusz7rgn0u1oencsUgoo0+AOEvuwVHVt3bDu/NvJHtX4/KDcZpMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" rawBlockBytes, _ := base64.StdEncoding.DecodeString(rawBlock) b := New(netmode.TestNet, false) @@ -165,8 +166,9 @@ func TestBlockSizeCalculation(t *testing.T) { SignersLen int AttributesLen int WitnessesLen int - }{ // 1 trans - {ID: "6fcc0c48c5d1b28bb5c2effa1e5b7bb054d22a8c30d409a6a7a3527845229056", Size: 864, Version: 0, SignersLen: 2, AttributesLen: 0, WitnessesLen: 2}, + }{ // 2 transactions + {ID: "5a30127b16a628de6aa6823418d76214b97a0fc6db865024d3d2c6e939ce3433", Size: 488, Version: 0, SignersLen: 1, AttributesLen: 0, WitnessesLen: 1}, + {ID: "25426643feed564cd3e57f346d6c68692f5622b3063da11c5572d99ee1a5b49a", Size: 492, Version: 0, SignersLen: 1, AttributesLen: 0, WitnessesLen: 1}, } for i, tx := range b.Transactions { @@ -184,22 +186,22 @@ func TestBlockSizeCalculation(t *testing.T) { // Block specific tests assert.Equal(t, 0, int(b.Version)) - assert.Equal(t, "fd2b68ac95461aa8ecd9ce7817bc0dea12985fc5ca52cfb5c39426e4071c1952", b.PrevHash.StringLE()) - assert.Equal(t, "0a4ce89ab8b057ff5f3b421f5c85d3a90db9e613c020b9916096fb5282f719a9", b.MerkleRoot.StringLE()) - assert.Equal(t, 1612366104874, int(b.Timestamp)) - assert.Equal(t, 256, int(b.Index)) + assert.Equal(t, "5b60644c6c6f58faca72c70689d7ed1f40c2e795772bd0de5a88e983ad55080c", b.PrevHash.StringLE()) + assert.Equal(t, "95c4d3ef673a732bf399459c7949d0f6e774ecf8c50f282bedad1f0b1c0de590", b.MerkleRoot.StringLE()) + assert.Equal(t, 1616078164001, int(b.Timestamp)) + assert.Equal(t, 1, int(b.Index)) nextConsensus := address.Uint160ToString(b.NextConsensus) - assert.Equal(t, "NgPkjjLTNcQad99iRYeXRUuowE4gxLAnDL", nextConsensus) + assert.Equal(t, "NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6", nextConsensus) - assert.Equal(t, "DEAZyIVwKWzpgvm8bSzWuVF1awS0QBguORR682YoVfkJ05KGG7pz9OsLBZ9/F1BHO7TCIcEcc8Sr9AcqbonrSRoCDEDhhZnqTUi8tXYbrTBrVj8i9Yxl8NraAMID4DJryWdD6u42OzAHr0of27qc5nojujhLffBfljuBSyQpyeQcUOpyDEAZr7sLz6n4TgNApkwATGXiP/DZ8AummAGDtznrW6Y8XWHngB7F0j3NKvUQ7lyRt11rT+zNjz5R5vIbBrs8C2ktDEDgNW0xGP/OB8CRHXX/l/+0tPO3drkyCddpG9PKCgyd4oEhQu8cwbSv4Q0V1Y0dZcJBoxUB5Qus/U+Xli7jb6OJDEADaXZxdEb56jlYhF4oM8I8KnthEzGw1Q7pfeI97fehTm78ZOJXWIxESThZzI3D2ndVz0Rcdr5MeA/espG6J2ao", base64.StdEncoding.EncodeToString(b.Script.InvocationScript)) - assert.Equal(t, "FQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==", base64.StdEncoding.EncodeToString(b.Script.VerificationScript)) - assert.Equal(t, "53b3d970ccb235bef785633817f2a947f63bac1f7fa23103f7d080a53f0361f4", b.Hash().StringLE()) + assert.Equal(t, "DEDgwCcXkcaFw5MGOp1cpkgApzDTX2/RxKlmPeXTgWYtfEA8g9svUSbZA4TeoGyWvX8LiN0tJKrzajdMGvTVGqVmDEDp6PBmZmRx9CxswtLht6oWa2Uq4rl5diPsLtqXZeZepMlxUSbaCdlFTB7iWQG9yKXWR5hc0sScevvuVwwsUYdlDEDwlhwZrP07E5fEQKttVMYAiL7edd/eW2yoMGZe6Q95g7yXQ69edVHfQb61fBw3DjCpMDZ5lsxp3BgzXglJwMSK", base64.StdEncoding.EncodeToString(b.Script.InvocationScript)) + assert.Equal(t, "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl", base64.StdEncoding.EncodeToString(b.Script.VerificationScript)) + assert.Equal(t, "02d7c7801742cd404eb178780c840477f1eef4a771ecc8cc9434640fe8f2bb09", b.Hash().StringLE()) benc, err := testserdes.EncodeBinary(b) assert.NoError(t, err) // test size of the block - assert.Equal(t, 1556, len(benc)) + assert.Equal(t, 1430, len(benc)) assert.Equal(t, rawBlock, base64.StdEncoding.EncodeToString(benc)) } diff --git a/pkg/core/blockchain_test.go b/pkg/core/blockchain_test.go index 207aaeac9..45119d6f8 100644 --- a/pkg/core/blockchain_test.go +++ b/pkg/core/blockchain_test.go @@ -585,7 +585,7 @@ func TestVerifyTx(t *testing.T) { checkErr(t, ErrInvalidAttribute, tx) }) - txSetOracle := transaction.New(netmode.UnitTestNet, []byte{}, 0) + txSetOracle := transaction.New(netmode.UnitTestNet, []byte{byte(opcode.RET)}, 0) // it's a hack, so we don't need a real script setSigner(txSetOracle, testchain.CommitteeScriptHash()) txSetOracle.Scripts = []transaction.Witness{{ InvocationScript: testchain.SignCommittee(txSetOracle.GetSignedPart()), @@ -796,7 +796,7 @@ func TestVerifyTx(t *testing.T) { t.Run("NotaryAssisted", func(t *testing.T) { notary, err := wallet.NewAccount() require.NoError(t, err) - txSetNotary := transaction.New(netmode.UnitTestNet, []byte{}, 0) + txSetNotary := transaction.New(netmode.UnitTestNet, []byte{byte(opcode.RET)}, 0) setSigner(txSetNotary, testchain.CommitteeScriptHash()) txSetNotary.Scripts = []transaction.Witness{{ InvocationScript: testchain.SignCommittee(txSetNotary.GetSignedPart()), diff --git a/pkg/core/helper_test.go b/pkg/core/helper_test.go index 661532dde..1ed189a8a 100644 --- a/pkg/core/helper_test.go +++ b/pkg/core/helper_test.go @@ -317,9 +317,22 @@ func initBasicChain(t *testing.T, bc *Blockchain) { bw := io.NewBufBinWriter() b.EncodeBinary(bw.BinWriter) require.NoError(t, bw.Err) - t.Logf("Block1 hex: %s", hex.EncodeToString(bw.Bytes())) + jsonB, err := b.MarshalJSON() + require.NoError(t, err) + t.Logf("Block1 base64: %s", base64.StdEncoding.EncodeToString(bw.Bytes())) + t.Logf("Block1 JSON: %s", string(jsonB)) + bw.Reset() + b.Header.EncodeBinary(bw.BinWriter) + require.NoError(t, bw.Err) + jsonH, err := b.Header.MarshalJSON() + require.NoError(t, err) + t.Logf("Header1 base64: %s", base64.StdEncoding.EncodeToString(bw.Bytes())) + t.Logf("Header1 JSON: %s", string(jsonH)) + jsonTxMoveNeo, err := txMoveNeo.MarshalJSON() + require.NoError(t, err) t.Logf("txMoveNeo hash: %s", txMoveNeo.Hash().StringLE()) - t.Logf("txMoveNeo hex: %s", hex.EncodeToString(txMoveNeo.Bytes())) + t.Logf("txMoveNeo JSON: %s", string(jsonTxMoveNeo)) + t.Logf("txMoveNeo base64: %s", base64.StdEncoding.EncodeToString(txMoveNeo.Bytes())) t.Logf("txMoveGas hash: %s", txMoveGas.Hash().StringLE()) require.True(t, bc.GetUtilityTokenBalance(priv0ScriptHash).Cmp(big.NewInt(1000*native.GASFactor)) >= 0) diff --git a/pkg/core/transaction/helper_test.go b/pkg/core/transaction/helper_test.go index b2bc21d1b..fddfa503d 100644 --- a/pkg/core/transaction/helper_test.go +++ b/pkg/core/transaction/helper_test.go @@ -1,7 +1,7 @@ package transaction import ( - "encoding/hex" + "encoding/base64" "testing" "github.com/nspcc-dev/neo-go/pkg/config/netmode" @@ -9,14 +9,14 @@ import ( ) var ( - // tx from testnet affad44bb6acacabc058db0bf1e12ab1239ae5e04007b4d4a2ea0cda868e284a - rawInvocationTX = "004883fd4bb494980000000000983c8500000000007f17000002574d3c03df4a9b2772af08e4b296721009b7a6fd00e0a3c55cad72028fb5901748b19a27be21f6540401005f0b0300e40b54020000000c14f6ed986d8f6478b647ddae2083069ca4cfdb23400c14e0a3c55cad72028fb5901748b19a27be21f6540414c01f0c087472616e736665720c1428b3adab7269f9c2181db3cb741ebf551930e27041627d5b523902420c4001a8eb709edc764591af846e7bfba10a908577ad57365b590593a4f81ea5a86ac046b9e1ac69ed39ec30cb97c2c7ef538f00fc105027758454b2bede94cd3bef290c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0b4195440d78fd4a010c40e254613ac2b3bd756d907932b15278e62b094a3eab90eff5aa2c56b598161852775cbd76076ac01fe48afdf897077845c415b3ca7884668e94396719b6db66e30c40a7427e3cd5238e3a5d4ab3b4361a37872af3dd8be336b9f1f19f0bd4972edb879b781d0c45dc684da7b220b8d399bea1948c1fe924daa5edbb8df117894130530c4099a1516792326083e50d99d4a97425b31c429136949688081619084403e0065c6ba576a0a4589d9115e3cf71c843c52e476b62ff4349c73838b2c2cb39f6c43d0c409ec13c315e485503ce8d1c821b0ed41ce3f39e914352973ec8ee1fefd024e106e709610bf9d500f56ec0e72c09e427cd8fd0a68bd9ef3b21176e8afd80aaef710c4022d33dc3217be4bb22144d98552ef35f23b1f10367924b4c6bea71d6c280cf2a2fff15f3c9f235cd5620bf310709aa53d6403e6d2fe6d07f13d83803a2c13a7ffdfd00150c2103009b7540e10f2562e5fd8fac9eaec25166a58b26e412348ff5a86927bfac22a20c21030205e9cefaea5a1dfc580af20c8d5aa2468bb0148f1a5e4605fc622c80e604ba0c210214baf0ceea3a66f17e7e1e839ea25fd8bed6cd82e6bb6e68250189065f44ff010c21023e9b32ea89b94d066e649b124fd50e396ee91369e8e2a6ae1b11c170d022256d0c2103408dcd416396f64783ac587ea1e1593c57d9fea880c8a6a1920e92a2594778060c2102a7834be9b32e2981d157cb5bbd3acb42cfd11ea5c3b10224d7a44e98c5910f1b0c2102ba2c70f5996f357a43198705859fae2cfea13e1172962800772b3d588a9d4abd170b41138defaf" + // tx from C# privnet 0x25426643feed564cd3e57f346d6c68692f5622b3063da11c5572d99ee1a5b49a + rawInvocationTX = "ANgkvBnA2KcAAAAAACCqRAAAAAAA6AMAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAXwsDAEDZ3YhNCgAMFIDOx7b1tW9QV49zfxYtOrFNRmUNDBTe7nnBifMAmLC6ai65CzqSWKbH/xTAHwwIdHJhbnNmZXIMFM924ovQBixKR47jVWEBExnzz6TSQWJ9W1I5AcYMQNafQPvPYQuqk3yCFwz8+18XCjnr8F8Rqx8e5IoQIkxjG9TjuvZm1KKGDn2UbFJnMey/FPLqezK8nbbJw2Eg10kMQKXrVyD3fs38e6Mqwsy7bAkxLsLnhvMnerbYLOqWW/DdinzT1RKAoOz5b7dAPusj5IWzQ6EifSCigJRTp//XdaMMQOv1d15PkIZM7wIvQmKDNxNy5yzQYFyoezx9Og7rM+64J9LtaHp3LFIKKNPgDhL7sFR1bd2w7vzbyR7V+Pyg3GaTEwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl" ) func decodeTransaction(rawTX string, t *testing.T) *Transaction { - b, err1 := hex.DecodeString(rawTX) + b, err1 := base64.StdEncoding.DecodeString(rawTX) assert.Nil(t, err1) - tx, err := NewTransactionFromBytes(netmode.TestNet, b) + tx, err := NewTransactionFromBytes(netmode.PrivNet, b) assert.NoError(t, err) return tx } diff --git a/pkg/core/transaction/transaction.go b/pkg/core/transaction/transaction.go index 81f2274d0..b2eb455e8 100644 --- a/pkg/core/transaction/transaction.go +++ b/pkg/core/transaction/transaction.go @@ -210,6 +210,16 @@ func (t *Transaction) encodeHashableFields(bw *io.BinWriter) { bw.WriteVarBytes(t.Script) } +// EncodeHashableFields returns serialized transaction's fields which are hashed. +func (t *Transaction) EncodeHashableFields() ([]byte, error) { + bw := io.NewBufBinWriter() + t.encodeHashableFields(bw.BinWriter) + if bw.Err != nil { + return nil, bw.Err + } + return bw.Bytes(), nil +} + // createHash creates the hash of the transaction. func (t *Transaction) createHash() error { buf := io.NewBufBinWriter() @@ -222,26 +232,18 @@ func (t *Transaction) createHash() error { buf.Reset() t.writeSignedPart(buf) t.verificationHash = hash.Sha256(buf.Bytes()) - - b := t.GetSignedPart() - if b == nil { - return errors.New("failed to serialize hashable data") - } - t.updateHashes(b) return nil } -// updateHashes updates Transaction's hashes based on the given buffer which should -// be a signable data slice. -func (t *Transaction) updateHashes(b []byte) { - t.verificationHash = hash.Sha256(b) - t.hash = hash.Sha256(t.verificationHash.BytesBE()) -} - // GetSignedPart returns a part of the transaction which must be signed. func (t *Transaction) GetSignedPart() []byte { + if t.hash.Equals(util.Uint256{}) { + if err := t.createHash(); err != nil { + panic(fmt.Errorf("failed to compute hash: %w", err)) + } + } buf := io.NewBufBinWriter() - t.encodeHashableFields(buf.BinWriter) + t.writeSignedPart(buf) if buf.Err != nil { return nil } @@ -253,8 +255,8 @@ func (t *Transaction) writeSignedPart(buf *io.BufBinWriter) { buf.WriteBytes(t.hash[:]) } -// DecodeSignedPart decodes a part of transaction from GetSignedPart data. -func (t *Transaction) DecodeSignedPart(buf []byte) error { +// DecodeHashableFields decodes a part of transaction which should be hashed. +func (t *Transaction) DecodeHashableFields(buf []byte) error { r := io.NewBinReaderFromBuf(buf) t.decodeHashableFields(r) if r.Err != nil { @@ -266,7 +268,11 @@ func (t *Transaction) DecodeSignedPart(buf []byte) error { return errors.New("additional data after the signed part") } t.Scripts = make([]Witness, 0) - t.updateHashes(buf) + + t.hash = hash.Sha256(buf) + b := io.NewBufBinWriter() + t.writeSignedPart(b) + t.verificationHash = hash.Sha256(b.Bytes()) return nil } diff --git a/pkg/core/transaction/transaction_test.go b/pkg/core/transaction/transaction_test.go index 91e1aa8f8..d00344be1 100644 --- a/pkg/core/transaction/transaction_test.go +++ b/pkg/core/transaction/transaction_test.go @@ -44,34 +44,28 @@ func TestWitnessEncodeDecode(t *testing.T) { func TestDecodeEncodeInvocationTX(t *testing.T) { tx := decodeTransaction(rawInvocationTX, t) - script := "CwMA5AtUAgAAAAwU9u2YbY9keLZH3a4ggwacpM/bI0AMFOCjxVytcgKPtZAXSLGaJ74h9lQEFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=" + script := "CwMAQNndiE0KAAwUgM7HtvW1b1BXj3N/Fi06sU1GZQ0MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjk=" assert.Equal(t, script, base64.StdEncoding.EncodeToString(tx.Script)) - assert.Equal(t, uint32(1274905416), tx.Nonce) - assert.Equal(t, int64(9999540), tx.SystemFee) - assert.Equal(t, int64(8731800), tx.NetworkFee) - assert.Equal(t, uint32(6015), tx.ValidUntilBlock) - assert.Equal(t, "6fcc0c48c5d1b28bb5c2effa1e5b7bb054d22a8c30d409a6a7a3527845229056", tx.Hash().StringLE()) + assert.Equal(t, uint32(431760600), tx.Nonce) + assert.Equal(t, int64(11000000), tx.SystemFee) + assert.Equal(t, int64(4500000), tx.NetworkFee) + assert.Equal(t, uint32(1000), tx.ValidUntilBlock) + assert.Equal(t, "25426643feed564cd3e57f346d6c68692f5622b3063da11c5572d99ee1a5b49a", tx.Hash().StringLE()) - assert.Equal(t, 2, len(tx.Signers)) - assert.Equal(t, None, tx.Signers[0].Scopes) - assert.Equal(t, "fda6b709107296b2e408af72279b4adf033c4d57", tx.Signers[0].Account.StringLE()) - assert.Equal(t, CalledByEntry, tx.Signers[1].Scopes) - assert.Equal(t, "0454f621be279ab1481790b58f0272ad5cc5a3e0", tx.Signers[1].Account.StringLE()) + assert.Equal(t, 1, len(tx.Signers)) + assert.Equal(t, CalledByEntry, tx.Signers[0].Scopes) + assert.Equal(t, "ffc7a658923a0bb92e6abab09800f389c179eede", tx.Signers[0].Account.StringLE()) assert.Equal(t, 0, len(tx.Attributes)) - invoc1 := "DEABqOtwntx2RZGvhG57+6EKkIV3rVc2W1kFk6T4HqWoasBGueGsae057DDLl8LH71OPAPwQUCd1hFSyvt6UzTvv" - verif1 := "DCECp4NL6bMuKYHRV8tbvTrLQs/RHqXDsQIk16ROmMWRDxsLQZVEDXg=" - invoc2 := "DEDiVGE6wrO9dW2QeTKxUnjmKwlKPquQ7/WqLFa1mBYYUndcvXYHasAf5Ir9+JcHeEXEFbPKeIRmjpQ5Zxm222bjDECnQn481SOOOl1Ks7Q2GjeHKvPdi+M2ufHxnwvUly7bh5t4HQxF3GhNp7IguNOZvqGUjB/pJNql7buN8ReJQTBTDECZoVFnkjJgg+UNmdSpdCWzHEKRNpSWiAgWGQhEA+AGXGuldqCkWJ2RFePPcchDxS5Ha2L/Q0nHODiywss59sQ9DECewTwxXkhVA86NHIIbDtQc4/OekUNSlz7I7h/v0CThBucJYQv51QD1bsDnLAnkJ82P0KaL2e87IRduiv2Aqu9xDEAi0z3DIXvkuyIUTZhVLvNfI7HxA2eSS0xr6nHWwoDPKi//FfPJ8jXNViC/MQcJqlPWQD5tL+bQfxPYOAOiwTp/" - verif2 := "FQwhAwCbdUDhDyVi5f2PrJ6uwlFmpYsm5BI0j/WoaSe/rCKiDCEDAgXpzvrqWh38WAryDI1aokaLsBSPGl5GBfxiLIDmBLoMIQIUuvDO6jpm8X5+HoOeol/YvtbNgua7bmglAYkGX0T/AQwhAj6bMuqJuU0GbmSbEk/VDjlu6RNp6OKmrhsRwXDQIiVtDCEDQI3NQWOW9keDrFh+oeFZPFfZ/qiAyKahkg6SollHeAYMIQKng0vpsy4pgdFXy1u9OstCz9EepcOxAiTXpE6YxZEPGwwhAroscPWZbzV6QxmHBYWfriz+oT4RcpYoAHcrPViKnUq9FwtBE43vrw==" - assert.Equal(t, 2, len(tx.Scripts)) + invoc1 := "DEDWn0D7z2ELqpN8ghcM/PtfFwo56/BfEasfHuSKECJMYxvU47r2ZtSihg59lGxSZzHsvxTy6nsyvJ22ycNhINdJDECl61cg937N/HujKsLMu2wJMS7C54bzJ3q22Czqllvw3Yp809USgKDs+W+3QD7rI+SFs0OhIn0gooCUU6f/13WjDEDr9XdeT5CGTO8CL0JigzcTcucs0GBcqHs8fToO6zPuuCfS7Wh6dyxSCijT4A4S+7BUdW3dsO7828ke1fj8oNxm" + verif1 := "EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl" + assert.Equal(t, 1, len(tx.Scripts)) assert.Equal(t, invoc1, base64.StdEncoding.EncodeToString(tx.Scripts[0].InvocationScript)) assert.Equal(t, verif1, base64.StdEncoding.EncodeToString(tx.Scripts[0].VerificationScript)) - assert.Equal(t, invoc2, base64.StdEncoding.EncodeToString(tx.Scripts[1].InvocationScript)) - assert.Equal(t, verif2, base64.StdEncoding.EncodeToString(tx.Scripts[1].VerificationScript)) data, err := testserdes.EncodeBinary(tx) assert.NoError(t, err) - assert.Equal(t, rawInvocationTX, hex.EncodeToString(data)) + assert.Equal(t, rawInvocationTX, base64.StdEncoding.EncodeToString(data)) } func TestNew(t *testing.T) { @@ -133,7 +127,7 @@ func TestDecodingTxWithInvalidWitnessesNumber(t *testing.T) { func TestUnmarshalNeoFSTX(t *testing.T) { txjson := []byte(` { - "hash": "0xb229ff232b2adf62ffdae21d892c3e8a71301530ec06037f98f1c6ba77989a09", + "hash": "0xc90c77d6c17fbb959b16df820370204a534ca13826cbd9fc027beb1b55d31e5a", "size": 232, "version": 0, "nonce": 737880259, diff --git a/pkg/crypto/verifiable.go b/pkg/crypto/verifiable.go index 8be328d83..10468f6f9 100644 --- a/pkg/crypto/verifiable.go +++ b/pkg/crypto/verifiable.go @@ -8,9 +8,10 @@ type Verifiable interface { GetSignedHash() util.Uint256 } -// VerifiableDecodable represents an object which can be both verified and -// decoded from given data. +// VerifiableDecodable represents an object which can be verified and +// those hashable part can be encoded/decoded. type VerifiableDecodable interface { Verifiable - DecodeSignedPart([]byte) error + EncodeHashableFields() ([]byte, error) + DecodeHashableFields([]byte) error } diff --git a/pkg/rpc/client/rpc_test.go b/pkg/rpc/client/rpc_test.go index 43eceec4d..68657bce4 100644 --- a/pkg/rpc/client/rpc_test.go +++ b/pkg/rpc/client/rpc_test.go @@ -46,17 +46,17 @@ type rpcClientTestCase struct { check func(t *testing.T, c *Client, result interface{}) } -const base64B1 = "AAAAAMU1lpLU9L9XS3U0WvRgGV9aU5WoX8f6MWgNjfz89nyeomtq7Iw0SoX9caDTvpAT4ulAxcy/vWK7q9GH0raCqQfxbcftdwEAAAEAAAAAXhK+qHrrlViE9vnOeEWMzLl8MJUBxgxAVLK3uK5qryZv+jBuH0dBn7VU+sYztObj1sj65/az1v2XCrlLlL2z2LeHccRnn7jAXUE0m80q7QAxEWyhzJPA/QxAOCcAytavTTPv0uQ+rhoBRXvyxaaEdSCZq0VDJCNtI4O9iFXq+Q++GJjzA04z4QZo7KCB8KD8aruBc69i6PoqwwxAR7dzN1DAk9G1RCuSZx7X7U/qqJfT7Wa4Us9kq/40AVpJgwr0RNUGWf1Xh8K53f+tzw1UtHZMoI5YZyJtMEiQY5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+vAgACAAAAwNinAAAAAAASfUMAAAAAALAEAAABXhK+qHrrlViE9vnOeEWMzLl8MJUBAFsLAhjd9QUMFKqKz4WdT+QCs05nPyFWgheWpIjrDBReEr6oeuuVWIT2+c54RYzMuXwwlRTAHwwIdHJhbnNmZXIMFIOrBnmtVcBQoTrUP1k26nP16x72QWJ9W1I5AcYMQIoQAeuRy5Lgj4MYiuF9tLhAeYhKf6PrczcbKGeWmz+KNWULI+mQbeDPFWG3mGwPkSBELVqVMrUNqigZLflJhNwMQBuqOk8xrVlAx5A5Va9FlMhu3io+wIrubPoWNr0sklBKh48H9w3WHPfTFBSAW8M9ePou/TVXM40X+U07fy+s+8MMQIlw1AKX/fk1rn1GqjZOqNmhVjQPm6Tk7Cb1fzeBa4baIEy5DmaaM8ayh0tm8N3Vc8JNSwnK91vIXPG/A9RKTKuUEwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrwADAAAAwNinAAAAAACyjEMAAAAAALAEAAABXhK+qHrrlViE9vnOeEWMzLl8MJUBAF8LAwDodkgXAAAADBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBQos62rcmn5whgds8t0Hr9VGTDicEFifVtSOQHGDEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyKlBMMIQIQOn990BZVhZf3lg0nxRakOU/ZaLnmUVXrSwE+QEBAbgwhAqe8Vf6GhOARl2jRBLoweVvcyGYZ6GSt0mFWcj7Rhc1iDCECs2Ir9AF73+MXxYrtX0x1PyBrfbiWBG+n13S7xL9/jcIMIQPZDAffY+aQzneRLhCrUazJRLZoYCN7YIxPj4MJ5x7mmRQLQRON768=" +const base64B1 = "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBb/YwjvRiYdH/LL9atXcWbYsXLHqkKEutiil4zsK7lKrFxU6tEeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxAUfn6Pu/yxlYcuGzwM7RzacB9z9YG7J77DR/j9NfrNR7leWUd0qTqnqiD1H9Vydj401smVWnTg/XAisjZTFpT+gxAAT3EbjC87Gb5UEe+Pvx3AP31lJeIuQL1gKcm6SfJBMaHon2g1dAah3xrKXrj3nGRypvWTKCVEXXDFzEL3ZndswxA/eGxm/DUde1jWbvi+avLdId0VH2roTyqJScLblo5xtRRHm0uKf6NObl6cNJLnSjcumrOQbMVgruDb7WIaOl0E5MTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUCAAIAAADA2KcAAAAAAAx5QwAAAAAAsAQAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCGN31BQwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxATIm2/0zMxdiM7XnPfK71cV4fd0elAZwc7YH+0St3IWmPKYSMYfidX9xgLc98wLi8Ikp9cEmp7PUTyqoHqYmrqAxAbxxWY+bt2me1JH8pTHNMIfcnSLr7ZVW92P+jjp/Bzd0QrO1Sy4J2k990Z9YFgci0AcwJXY6yZw38Q0hqn0po3wxAhDKcmR3uZX5Egc5T6D/Ywttnw0vu01LewZMemWX+Wg7tPSBa1sz4rcZL8+EqwMoAnSXczJAV2GT1GrZDvNvBTJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKUAAwAAAMDYpwAAAAAArIhDAAAAAACwBAAAAd7uecGJ8wCYsLpqLrkLOpJYpsf/AQBfCwMA6HZIFwAAAAwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjkBxgxA1E8pqjQrEDsUL7B2U+u2h95Jr6yvObCHbWif6tRx6cpNqy7VFJ/5A5T6W5NLLIZBD9os5ZQq+rRIgOliQOWRiwxAysxPLL6wVsETJZm2vcVQ3ZBH7IHa82wjQoyKGrhQH+rygFF/TmVH6E5oEOz/bsQwudk60CWJKcrFyXzfXlK5KAxAjH0w9It2Tlax1xv3T5xstaSl9le2fyYDa+smDwR+ytnmGRkSNn3oWsHdS8B7A1TzP76W3Dixn2NFFp9/j3D3cpMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" -const base64TxMoveNeo = "AAIAAADA2KcAAAAAABJ9QwAAAAAAsAQAAAFeEr6oeuuVWIT2+c54RYzMuXwwlQEAWwsCGN31BQwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUg6sGea1VwFChOtQ/WTbqc/XrHvZBYn1bUjkBxgxAihAB65HLkuCPgxiK4X20uEB5iEp/o+tzNxsoZ5abP4o1ZQsj6ZBt4M8VYbeYbA+RIEQtWpUytQ2qKBkt+UmE3AxAG6o6TzGtWUDHkDlVr0WUyG7eKj7Aiu5s+hY2vSySUEqHjwf3DdYc99MUFIBbwz14+i79NVczjRf5TTt/L6z7wwxAiXDUApf9+TWufUaqNk6o2aFWNA+bpOTsJvV/N4FrhtogTLkOZpozxrKHS2bw3dVzwk1LCcr3W8hc8b8D1EpMq5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+v" +const base64TxMoveNeo = "AAIAAADA2KcAAAAAAAx5QwAAAAAAsAQAAAHe7nnBifMAmLC6ai65CzqSWKbH/wEAWwsCGN31BQwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwU9WPqQLwoPU0OBcSOowWz8qBzQO9BYn1bUjkBxgxATIm2/0zMxdiM7XnPfK71cV4fd0elAZwc7YH+0St3IWmPKYSMYfidX9xgLc98wLi8Ikp9cEmp7PUTyqoHqYmrqAxAbxxWY+bt2me1JH8pTHNMIfcnSLr7ZVW92P+jjp/Bzd0QrO1Sy4J2k990Z9YFgci0AcwJXY6yZw38Q0hqn0po3wxAhDKcmR3uZX5Egc5T6D/Ywttnw0vu01LewZMemWX+Wg7tPSBa1sz4rcZL8+EqwMoAnSXczJAV2GT1GrZDvNvBTJMTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" -const b1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0xa10e7ff4103b5fbe57137012e7060760b7b7caffb4dfe70fb45d1cf8a5045b09","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0xcebbbdbd35faeb3d15e9c6e804efdf250fc23685e324bf31c1c142a1b78be5e7","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}}` +const b1Verbose = `{"size":1430,"nextblockhash":"0xe03cb7e00a1e04b75f9acd56f22af5f15877a18f4a1cf69991319c4fba0b2fee","confirmations":10,"hash":"0x81a439175d3bdd8961b6223a9b6f6d234f996824c5cfce6af17e6fc14cd84355","version":0,"previousblockhash":"0x5b60644c6c6f58faca72c70689d7ed1f40c2e795772bd0de5a88e983ad55080c","merkleroot":"0xb12ae5aeb0335e8a62eb120aa91ecbc5629bc55dadd62fcb7f749818bd238cfd","time":1616059782001,"index":1,"nextconsensus":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","primary":0,"witnesses":[{"invocation":"DEBR+fo+7/LGVhy4bPAztHNpwH3P1gbsnvsNH+P01+s1HuV5ZR3SpOqeqIPUf1XJ2PjTWyZVadOD9cCKyNlMWlP6DEABPcRuMLzsZvlQR74+/HcA/fWUl4i5AvWApybpJ8kExoeifaDV0BqHfGspeuPecZHKm9ZMoJURdcMXMQvdmd2zDED94bGb8NR17WNZu+L5q8t0h3RUfauhPKolJwtuWjnG1FEebS4p/o05uXpw0kudKNy6as5BsxWCu4NvtYho6XQT","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}],"tx":[{"hash":"0xf5fbd303799f24ba247529d7544d4276cca54ea79f4b98095f2b0557313c5275","size":488,"version":0,"nonce":2,"sender":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","sysfee":"11000000","netfee":"4421900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0xffc7a658923a0bb92e6abab09800f389c179eede","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBRVVC1T7Q9VRvrUTW6ZkShnAi/OXgwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQ==","witnesses":[{"invocation":"DEBMibb/TMzF2Iztec98rvVxXh93R6UBnBztgf7RK3chaY8phIxh+J1f3GAtz3zAuLwiSn1wSans9RPKqgepiauoDEBvHFZj5u3aZ7UkfylMc0wh9ydIuvtlVb3Y/6OOn8HN3RCs7VLLgnaT33Rn1gWByLQBzAldjrJnDfxDSGqfSmjfDECEMpyZHe5lfkSBzlPoP9jC22fDS+7TUt7Bkx6ZZf5aDu09IFrWzPitxkvz4SrAygCdJdzMkBXYZPUatkO828FM","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}]},{"hash":"0xfe60f7f4c720a7b0fde52f285ca173a3493bbb15eae9f5c44c1f71b493d5693c","size":492,"version":0,"nonce":3,"sender":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","sysfee":"11000000","netfee":"4425900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0xffc7a658923a0bb92e6abab09800f389c179eede","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUVVQtU+0PVUb61E1umZEoZwIvzl4MFN7uecGJ8wCYsLpqLrkLOpJYpsf/FMAfDAh0cmFuc2ZlcgwUz3bii9AGLEpHjuNVYQETGfPPpNJBYn1bUjk=","witnesses":[{"invocation":"DEDUTymqNCsQOxQvsHZT67aH3kmvrK85sIdtaJ/q1HHpyk2rLtUUn/kDlPpbk0sshkEP2izllCr6tEiA6WJA5ZGLDEDKzE8svrBWwRMlmba9xVDdkEfsgdrzbCNCjIoauFAf6vKAUX9OZUfoTmgQ7P9uxDC52TrQJYkpysXJfN9eUrkoDECMfTD0i3ZOVrHXG/dPnGy1pKX2V7Z/JgNr6yYPBH7K2eYZGRI2fehawd1LwHsDVPM/vpbcOLGfY0UWn3+PcPdy","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}]}]}` -const base64Header1 = "AAAAAMU1lpLU9L9XS3U0WvRgGV9aU5WoX8f6MWgNjfz89nyeomtq7Iw0SoX9caDTvpAT4ulAxcy/vWK7q9GH0raCqQfxbcftdwEAAAEAAAAAXhK+qHrrlViE9vnOeEWMzLl8MJUBxgxAVLK3uK5qryZv+jBuH0dBn7VU+sYztObj1sj65/az1v2XCrlLlL2z2LeHccRnn7jAXUE0m80q7QAxEWyhzJPA/QxAOCcAytavTTPv0uQ+rhoBRXvyxaaEdSCZq0VDJCNtI4O9iFXq+Q++GJjzA04z4QZo7KCB8KD8aruBc69i6PoqwwxAR7dzN1DAk9G1RCuSZx7X7U/qqJfT7Wa4Us9kq/40AVpJgwr0RNUGWf1Xh8K53f+tzw1UtHZMoI5YZyJtMEiQY5QTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUC0ETje+vAA==" +const base64Header1 = "AAAAAAwIVa2D6Yha3tArd5XnwkAf7deJBsdyyvpYb2xMZGBb/YwjvRiYdH/LL9atXcWbYsXLHqkKEutiil4zsK7lKrFxU6tEeAEAAAEAAAAA3u55wYnzAJiwumouuQs6klimx/8BxgxAUfn6Pu/yxlYcuGzwM7RzacB9z9YG7J77DR/j9NfrNR7leWUd0qTqnqiD1H9Vydj401smVWnTg/XAisjZTFpT+gxAAT3EbjC87Gb5UEe+Pvx3AP31lJeIuQL1gKcm6SfJBMaHon2g1dAah3xrKXrj3nGRypvWTKCVEXXDFzEL3ZndswxA/eGxm/DUde1jWbvi+avLdId0VH2roTyqJScLblo5xtRRHm0uKf6NObl6cNJLnSjcumrOQbMVgruDb7WIaOl0E5MTDCECEDp/fdAWVYWX95YNJ8UWpDlP2Wi55lFV60sBPkBAQG4MIQKnvFX+hoTgEZdo0QS6MHlb3MhmGehkrdJhVnI+0YXNYgwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CDCED2QwH32PmkM53kS4Qq1GsyUS2aGAje2CMT4+DCece5pkUQXvObKU=" -const header1Verbose = `{"id":5,"jsonrpc":"2.0","result":{"hash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","size":451,"version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"confirmations":6,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f"}}` +const header1Verbose = `{"hash":"0x81a439175d3bdd8961b6223a9b6f6d234f996824c5cfce6af17e6fc14cd84355","size":449,"version":0,"previousblockhash":"0x5b60644c6c6f58faca72c70689d7ed1f40c2e795772bd0de5a88e983ad55080c","merkleroot":"0xb12ae5aeb0335e8a62eb120aa91ecbc5629bc55dadd62fcb7f749818bd238cfd","time":1616059782001,"index":1,"nextconsensus":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","witnesses":[{"invocation":"DEBR+fo+7/LGVhy4bPAztHNpwH3P1gbsnvsNH+P01+s1HuV5ZR3SpOqeqIPUf1XJ2PjTWyZVadOD9cCKyNlMWlP6DEABPcRuMLzsZvlQR74+/HcA/fWUl4i5AvWApybpJ8kExoeifaDV0BqHfGspeuPecZHKm9ZMoJURdcMXMQvdmd2zDED94bGb8NR17WNZu+L5q8t0h3RUfauhPKolJwtuWjnG1FEebS4p/o05uXpw0kudKNy6as5BsxWCu4NvtYho6XQT","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}],"confirmations":10,"nextblockhash":"0xe03cb7e00a1e04b75f9acd56f22af5f15877a18f4a1cf69991319c4fba0b2fee"}` -const txMoveNeoVerbose = `{"id":5,"jsonrpc":"2.0","result":{"blockhash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","confirmations":6,"blocktime":1614602006001,"vmstate":"HALT","hash":"0xa10e7ff4103b5fbe57137012e7060760b7b7caffb4dfe70fb45d1cf8a5045b09","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}}` +const txMoveNeoVerbose = `{"blockhash":"0x81a439175d3bdd8961b6223a9b6f6d234f996824c5cfce6af17e6fc14cd84355","confirmations":10,"blocktime":1616059782001,"vmstate":"HALT","hash":"0xf5fbd303799f24ba247529d7544d4276cca54ea79f4b98095f2b0557313c5275","size":488,"version":0,"nonce":2,"sender":"NgEisvCqr2h8wpRxQb7bVPWUZdbVCY8Uo6","sysfee":"11000000","netfee":"4421900","validuntilblock":1200,"attributes":[],"signers":[{"account":"0xffc7a658923a0bb92e6abab09800f389c179eede","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBRVVC1T7Q9VRvrUTW6ZkShnAi/OXgwU3u55wYnzAJiwumouuQs6klimx/8UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQ==","witnesses":[{"invocation":"DEBMibb/TMzF2Iztec98rvVxXh93R6UBnBztgf7RK3chaY8phIxh+J1f3GAtz3zAuLwiSn1wSans9RPKqgepiauoDEBvHFZj5u3aZ7UkfylMc0wh9ydIuvtlVb3Y/6OOn8HN3RCs7VLLgnaT33Rn1gWByLQBzAldjrJnDfxDSGqfSmjfDECEMpyZHe5lfkSBzlPoP9jC22fDS+7TUt7Bkx6ZZf5aDu09IFrWzPitxkvz4SrAygCdJdzMkBXYZPUatkO828FM","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFEF7zmyl"}]}` // getResultBlock1 returns data for block number 1 which is used by several tests. func getResultBlock1() *result.Block { @@ -69,16 +69,16 @@ func getResultBlock1() *result.Block { if err != nil { panic(err) } - b2Hash, err := util.Uint256DecodeStringLE("85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f") + b2Hash, err := util.Uint256DecodeStringLE("e03cb7e00a1e04b75f9acd56f22af5f15877a18f4a1cf69991319c4fba0b2fee") if err != nil { panic(err) } return &result.Block{ Block: *b, BlockMetadata: result.BlockMetadata{ - Size: 1433, + Size: 1430, NextBlockHash: &b2Hash, - Confirmations: 6, + Confirmations: 10, }, } } @@ -168,7 +168,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ invoke: func(c *Client) (i interface{}, err error) { return c.GetBlockByIndexVerbose(1) }, - serverResponse: b1Verbose, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":` + b1Verbose + `}`, result: func(c *Client) interface{} { res := getResultBlock1() return res @@ -198,7 +198,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ } return c.GetBlockByHashVerbose(hash) }, - serverResponse: b1Verbose, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":` + b1Verbose + `}`, result: func(c *Client) interface{} { res := getResultBlock1() return res @@ -258,12 +258,12 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ } return c.GetBlockHeaderVerbose(hash) }, - serverResponse: header1Verbose, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":` + header1Verbose + `}`, result: func(c *Client) interface{} { b := getResultBlock1() return &result.Header{ Hash: b.Hash(), - Size: 451, + Size: 449, Version: b.Version, NextBlockHash: b.NextBlockHash, PrevBlockHash: b.PrevHash, @@ -272,7 +272,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ Index: b.Index, NextConsensus: address.Uint160ToString(b.NextConsensus), Witnesses: []transaction.Witness{b.Script}, - Confirmations: 6, + Confirmations: b.Confirmations, } }, }, @@ -612,7 +612,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "positive", invoke: func(c *Client) (i interface{}, err error) { - hash, err := util.Uint256DecodeStringLE("ca23bd5df3249836849309ca2afe972bfd288b0a7ae61302c8fd545daa8bffd6") + hash, err := util.Uint256DecodeStringLE("f5fbd303799f24ba247529d7544d4276cca54ea79f4b98095f2b0557313c5275") if err != nil { panic(err) } @@ -627,7 +627,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ { name: "verbose_positive", invoke: func(c *Client) (interface{}, error) { - hash, err := util.Uint256DecodeStringLE("7c10b90077bddfe9095b2db96bb4ac33994ed1ca99c805410f55c771eee0b77b") + hash, err := util.Uint256DecodeStringLE("f5fbd303799f24ba247529d7544d4276cca54ea79f4b98095f2b0557313c5275") if err != nil { panic(err) } @@ -638,7 +638,7 @@ var rpcClientTestCases = map[string][]rpcClientTestCase{ out.Transaction.FeePerByte() // set fee per byte return out, nil }, - serverResponse: txMoveNeoVerbose, + serverResponse: `{"id":1,"jsonrpc":"2.0","result":` + txMoveNeoVerbose + `}`, result: func(c *Client) interface{} { return getTxMoveNeo() }, diff --git a/pkg/rpc/client/wsclient_test.go b/pkg/rpc/client/wsclient_test.go index e8a6915a5..84ba6602a 100644 --- a/pkg/rpc/client/wsclient_test.go +++ b/pkg/rpc/client/wsclient_test.go @@ -2,6 +2,7 @@ package client import ( "context" + "fmt" "net/http" "net/http/httptest" "strings" @@ -118,7 +119,7 @@ func TestWSClientEvents(t *testing.T) { `{"jsonrpc":"2.0","method":"transaction_executed","params":[{"container":"0xe1cd5e57e721d2a2e05fb1f08721b12057b25ab1dd7fd0f33ee1639932fdfad7","trigger":"Application","vmstate":"HALT","gasconsumed":"22910000","stack":[],"notifications":[{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}]}},{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"transfer","state":{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}}]}]}`, `{"jsonrpc":"2.0","method":"notification_from_execution","params":[{"contract":"0x1b4357bff5a01bdf2a6581247cf9ed1e24629176","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"dpFiJB7t+XwkgWUq3xug9b9XQxs="},{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"Integer","value":"1000"}]}]}}]}`, `{"jsonrpc":"2.0","method":"transaction_executed","params":[{"container":"0xf97a72b7722c109f909a8bc16c22368c5023d85828b09b127b237aace33cf099","trigger":"Application","vmstate":"HALT","gasconsumed":"6042610","stack":[],"notifications":[{"contract":"0xe65ff7b3a02d207b584a5c27057d4e9862ef01da","eventname":"contract call","state":{"type":"Array","value":[{"type":"ByteString","value":"dHJhbnNmZXI="},{"type":"Array","value":[{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"ByteString","value":"IHKCdK+vw29DoHHTKM+j5inZy7A="},{"type":"Integer","value":"123"}]}]}},{"contract":"0xe65ff7b3a02d207b584a5c27057d4e9862ef01da","eventname":"transfer","state":{"type":"Array","value":[{"type":"ByteString","value":"MW6FEDkBnTnfwsN9bD/uGf1YCYc="},{"type":"ByteString","value":"IHKCdK+vw29DoHHTKM+j5inZy7A="},{"type":"Integer","value":"123"}]}}]}]}`, - `{"jsonrpc":"2.0","method":"block_added","params":[{"size":1433,"nextblockhash":"0x85ab779bc19247aa504c36879ce75cb7f662b4e8067fbc83e5d24ef0afd9a84f","confirmations":6,"hash":"0x5097754aca68e5db86070db369ae4c18bbd021a86dc88fafc5c809afe15e819e","version":0,"previousblockhash":"0x9e7cf6fcfc8d0d6831fac75fa895535a5f1960f45a34754b57bff4d4929635c5","merkleroot":"0x07a982b6d287d1abbb62bdbfccc540e9e21390bed3a071fd854a348cec6a6ba2","time":1614602006001,"index":1,"nextconsensus":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","primary":0,"witnesses":[{"invocation":"DEBUsre4rmqvJm/6MG4fR0GftVT6xjO05uPWyPrn9rPW/ZcKuUuUvbPYt4dxxGefuMBdQTSbzSrtADERbKHMk8D9DEA4JwDK1q9NM+/S5D6uGgFFe/LFpoR1IJmrRUMkI20jg72IVer5D74YmPMDTjPhBmjsoIHwoPxqu4Fzr2Lo+irDDEBHt3M3UMCT0bVEK5JnHtftT+qol9PtZrhSz2Sr/jQBWkmDCvRE1QZZ/VeHwrnd/63PDVS0dkygjlhnIm0wSJBj","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}],"tx":[{"hash":"0xa10e7ff4103b5fbe57137012e7060760b7b7caffb4dfe70fb45d1cf8a5045b09","size":489,"version":0,"nonce":2,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4422930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwIY3fUFDBSqis+FnU/kArNOZz8hVoIXlqSI6wwUXhK+qHrrlViE9vnOeEWMzLl8MJUUwB8MCHRyYW5zZmVyDBSDqwZ5rVXAUKE61D9ZNupz9ese9kFifVtSOQ==","witnesses":[{"invocation":"DECKEAHrkcuS4I+DGIrhfbS4QHmISn+j63M3Gyhnlps/ijVlCyPpkG3gzxVht5hsD5EgRC1alTK1DaooGS35SYTcDEAbqjpPMa1ZQMeQOVWvRZTIbt4qPsCK7mz6Fja9LJJQSoePB/cN1hz30xQUgFvDPXj6Lv01VzONF/lNO38vrPvDDECJcNQCl/35Na59Rqo2TqjZoVY0D5uk5Owm9X83gWuG2iBMuQ5mmjPGsodLZvDd1XPCTUsJyvdbyFzxvwPUSkyr","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]},{"hash":"0xcebbbdbd35faeb3d15e9c6e804efdf250fc23685e324bf31c1c142a1b78be5e7","size":493,"version":0,"nonce":3,"sender":"NUVPACMnKFhpuHjsRjhUvXz1XhqfGZYVtY","sysfee":"11000000","netfee":"4426930","validuntilblock":1200,"attributes":[],"signers":[{"account":"0x95307cb9cc8c4578cef9f6845895eb7aa8be125e","scopes":"CalledByEntry"}],"script":"CwMA6HZIFwAAAAwUqorPhZ1P5AKzTmc/IVaCF5akiOsMFF4Svqh665VYhPb5znhFjMy5fDCVFMAfDAh0cmFuc2ZlcgwUKLOtq3Jp+cIYHbPLdB6/VRkw4nBBYn1bUjk=","witnesses":[{"invocation":"DEA7aJyGTIq0pV20LzVWOCreh6XIxLUCWHVgUFsCTxPOPdqtZBHKnejng3d2BRm/lecTyPLeq7KpRCD9awRvadFWDEBjVZRvSGtGcOEjtUxl4AH5XelYlIUG5k+x3QyYKZtWQc96lUX1hohrNkCmWeWNwC2l8eJGpUxicM+WZGODCVp8DEDbQxvmqRTQ+flc6JetmaqHyw8rfoeQNtmEFpw2cNhyAo5L5Ilp2wbVtJNOJPfw72J7E6FhTK8slIKRqXzpdnyK","verification":"EwwhAhA6f33QFlWFl/eWDSfFFqQ5T9loueZRVetLAT5AQEBuDCECp7xV/oaE4BGXaNEEujB5W9zIZhnoZK3SYVZyPtGFzWIMIQKzYiv0AXvf4xfFiu1fTHU/IGt9uJYEb6fXdLvEv3+NwgwhA9kMB99j5pDOd5EuEKtRrMlEtmhgI3tgjE+PgwnnHuaZFAtBE43vrw=="}]}]}]}`, + fmt.Sprintf(`{"jsonrpc":"2.0","method":"block_added","params":[%s]}`, b1Verbose), `{"jsonrpc":"2.0","method":"event_missed","params":[]}`, } srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index e1c039647..762511946 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -61,7 +61,7 @@ type rpcTestCase struct { } const testContractHash = "1e1c3024bd955ff3baf7cb92e3b7608c7bb3712b" -const deploymentTxHash = "298092d1619585b2fcd3045c8e5a749ddbe14a6fe41569a69b50f47b812112d9" +const deploymentTxHash = "9218bba2a6e145aab5dc21c4bb16a650efdf0b9b16b0d69bd754278363a1d1c2" const genesisBlockHash = "5b60644c6c6f58faca72c70689d7ed1f40c2e795772bd0de5a88e983ad55080c" const verifyContractHash = "5bb4bac40e961e334ba7bd36d2496010f67e246e" @@ -918,12 +918,12 @@ var rpcTestCases = map[string][]rpcTestCase{ "sendrawtransaction": { { name: "positive", - params: `["ADQSAADA2KcAAAAAABDiEgAAAAAAgBYAAAFVVC1T7Q9VRvrUTW6ZkShnAi/OXgEAYBDAAwDodkgXAAAADBRdSe/t0S4+BgGLRljbEKiXX8gLTgwUVVQtU+0PVUb61E1umZEoZwIvzl4UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQFCDEAOJpFi9vI44kaLJcBvEyqSO9Q76XluNyozh0lBueRwXMijYJa1Zlp5jLkqCsmNsEaF1kCpIQ+2wtpDT+HHZGI4KAwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CQXR0dqo="]`, + params: `["ADQSAADA2KcAAAAAABDiEgAAAAAAgBYAAAFVVC1T7Q9VRvrUTW6ZkShnAi/OXgEAYBDAAwDodkgXAAAADBRdSe/t0S4+BgGLRljbEKiXX8gLTgwUVVQtU+0PVUb61E1umZEoZwIvzl4UwB8MCHRyYW5zZmVyDBT1Y+pAvCg9TQ4FxI6jBbPyoHNA70FifVtSOQFCDEA0sZMiszaJ/YkG3ZzyFKbE+qujQif0RrlplXpBc5IMzxyM4sPBwvpfGTtDtY9NI8gzR1lVL/O6nzPJG9m8XKjxKAwhArNiK/QBe9/jF8WK7V9MdT8ga324lgRvp9d0u8S/f43CQXR0dqo="]`, result: func(e *executor) interface{} { return &result.RelayResult{} }, check: func(t *testing.T, e *executor, inv interface{}) { res, ok := inv.(*result.RelayResult) require.True(t, ok) - expectedHash := util.Uint256{0x6c, 0x8d, 0x40, 0xba, 0x91, 0xde, 0xe8, 0x74, 0xf0, 0x24, 0xc3, 0xbc, 0xb6, 0x8e, 0x7e, 0xf4, 0xf5, 0x77, 0xd7, 0x6c, 0x9f, 0x10, 0x66, 0xb7, 0xc3, 0xab, 0x71, 0xd, 0x19, 0x1a, 0xeb, 0xac} + expectedHash := util.Uint256{0xaf, 0x80, 0x44, 0x52, 0x49, 0xac, 0xa7, 0xa9, 0x47, 0x11, 0x8, 0xac, 0xdb, 0x59, 0x29, 0xb, 0x3d, 0xac, 0xf2, 0xe9, 0xf7, 0xde, 0x45, 0x79, 0x73, 0x66, 0xe9, 0xb0, 0xd4, 0xc5, 0x6b, 0x97} assert.Equal(t, expectedHash, res.Hash) }, }, diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index e787ddaee364c587316e02b86bb20f7687bf9893..298b5ed6f5b4f0b8a63b54ad45b7269fbaef3f8c 100644 GIT binary patch delta 4399 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 P!}mHb1VCW_jm`f6ztn9l delta 4399 zcmc(ihdb5%|HqH*aI9lzQ}_C^KY~nSJbi9Gj4x5eg-ak;uxH zz4wT3x4S>#cU`~tfAD-f$Mt$+3@`?9LfkgHK5izCi!^RA%AehX935t`c-|Whb8SIxIuW zSH2|_DsWUkFI%%{E4;CA)Z)Le)nE36pylma%3)AUYnLc83!&c_0|5fe^|6AqwtbYg z|K#7lAevXICal@Ztl`eA&E7D$Ohd9X<6PV+Y~Vy(O=Q`f)=Ym6=brwmW*?x!ClW+4Yew zX?d@UXAVa9E~DP&=;TX93RSq>P8C~%0JSvDz1a=aCfftZiWJK*^Sch9Un0GXZaM47 z5av}gsq@rEdR>R7Lj|WSUGW_p0i7YMFWakXflWs4B54G>mmbkJO9y)4 zYc27(tH`Ejpd_+N{aKbF^phB%bJ+Mn~-s=r|gwaHn9%JDe*nwpyHhPNkoA| z@9}#zjbXiTDiRaMAoE7i133sFV76F}&yIsS%>H1YuI(V;%l&p&OZ2N{0x9^F!Tw{a zSQ!(}3otylUGewl#N4(Iq{K=h^_WzETm?o zS@|QUWoIC5Zs78PO{1(?C)z5b`K^nJTBvW>lsx`EmgL#vJ=l6X%#TmK#_sf5O*Rp! zIw2L_($&4!b@@_H@-0#tj)gW&nP%^aFb_o_MKdl@jpI;Qknh2Rj6!?*#itr`lUeS@ zF{XsW7u6w2mO}}F{CR&8>x~Bj;iIY9Sp#++E{G7*l?yXu5&Fo#z#nH*I$tYd{jmx@ z$ZcUnXEO>(omc0{(X9m?)WB#zsV_TbPOPDgi>Lz47X%Y2?8Ur);`;!-K4G3R~Q*pK|fCK+u*Qi*;89z{dJ-spBxU9=;q0osx*4jl+4N7IpNq1pL; zYn;d*;saV|ym)N&G^UkOUge?!X33J6n@+=*EO4d0Sp^FYQ6l%RI7xfuH+nIfGXvQw zE#Sl32Fi`v?9C+8VKOaiB=qRVwEQ}m_@L`o`&k_e`lrRH%Ui4D3k{#1W5&#l^|ZC$ zCns$$y>ds>N1|ov(40-vpqF&4Sn}2NeTkNq-ji6H>0p9MWbgNB>|ZwsuH8_mZ2U*h zd*GeMD}nkAqmQ`Y5@Neo75f&_OUxJ{QPFv~D7(*4=CyGy)(bsB39isW(^XF0tkQPb z_8#n3#li>#$m={U|J3bVoD6t8bbUAD27VdEvhC8oNAGsHM3z1pOqa%XLdUiA(ZKZK z*tw_pKXN(imr9G6t6&JFY9zv;Q2LJ>Ppp6z!781r()`}_L#Qalgk_0#PSi|+?5|Gq ztd9<83Y^p1*}xhv+rk_A5r+DaDXE|I1!)_rJ*_~n3Rc2vH}Yu)DfrjJkb$<&hs2K)u*y5$4&FHWh90wcwNc1HF1H zn%AJ4{(=ta4%vL!7_7g|JLN+aT#Hl|clNl#y*=>|-5@z+G5f(kT}QO#YJ4g-T%WFJ zPpOH-K|3uVf|qbA?wlXcWL*AV(1h2ZiH-^~n@Q(~opCKSIQ|=PS(A@*uIQqqgv0z5 zjlhDTBR0EIWTk!2gd+S6=r+rKTNodBmqXdnbzINqy!qZoL4fXQ3vSnGv*S7?si&@G zYwiI-zW6T}qx|Z2Kl%&L%p~(l8PaXoQzda}O28!o>Az&#J&w98aleS($v zCD@_4-G^I7FZv}#=B08n8SNOasB-7d(sEiToKF6LzOC+k_YQFMZt9?Upj{?oeEpv= z)uM!P=eD@KM_)REu10`cmo}0kev63?CYaFMM+Wa69}HD7f=annc(xy==V6ix{sJbt z2D}S8g@lX28tlarj-D96H(AzrbLaUUgsky4g~lsZ-|cku9Q$@xWiQd?ZKEAaF@mJU zng``vcg5%i0L(`>79oJ=JX^5ov&yGF2Zx#^`=Cbo-6YhNKq+%w>Q0Ehi36JY`SQ;T z+()tGJ!yIlL4jO5IqsH*6^a)bxQVI(Lim6e{tH z_%mVi%Mt9etuwM_sogA03|X(KwyTG1H{)2gJn9Xj<;vaV_Xjj}=KI&1t4(hVEWAjJ z7`8r>fi8A*f6<-^enCQlq{LI=5)slHtqeLj#Z8c|-d$1ZV|=luzG8(0do?BLb$b=G zb0Wff#l52k1F^W4Hta7-~Ta_+{Cxt|N2$%F|{MZdImXPx@# zi4yQ`TA)iEuDc;BH~pX<{h*Yi zA^SWBuM`Eaji<;%+{`_Dtj((A>=0NP5eN{w&`M-qfDXmDX3-61A2O*pQwT6gs6o=i zwx!T4<$DN=I6j}qWbS;{=cuLrt+IYUwYcfp#+O{m!lb?aWnZtWFvt`QfRf;2#TnLf z4HKq_xW1-^xkH%aONrX4#Ec;d&6;sSeMN%bep7Mdu51CXt0<3GDa)lc%a!dGVa(m1 z=r4+xt~ck9;JA6+kA^cOVAHR#ov`R_Ju!}3B&g+>qyhwfB09->ki zdokikeM+61@u39QY{zKhga-}89YxjM?wYRH6#tAAdH`@u=HTBQdV}>m9Ed6G= zM-hs-#}I(4t7xDwH-_Px8;=yCX2$HXQzug&=DS+39c91;pPOSXmhzR+fXHHDL@W=N z(_C!Xg5f+%*!e6sL@Jiv^JC&#zDdbPk2EWTA83SihdsOG8Kcdy$ZLCBb zpN^m96#t=&CTE8Qw50K<;XaggJJ(ac{yDz^?e`6y>Kbf~ngZSaNIZC``<1%OkhT2< zmA$?;e$e|1lw?cvV2W~@Bu0cjS3=+-6#^jUq;e!#<>Gd%XLEks>{Lq2uR-#hI%#eA znh#b=H=U*FcVq-yEEeTbf?i?Y8Dm*4a_oKj_O%xsrx<}xKI1M4hB`Kiuyh2VHD&{9YPfhv@a1VTtvHhuf{3y@d96vaj zxn_r55f7Lg(uYz9`s?LZg!QYwA#Y7f^}EmcbIvA3UTc97f4>VeC}Uz0Zlv65IAq37 zXVS4MGdL$=qH24D9&&nCQa*bf<6NTuV%+TJWL4C@F_TvK<=vaPLX_l*J@+rA-|omo zaTgNW_qi-}+NliBXhI@OSfStjOc{n;pL`^u=UL)21Tk+0-#Liq`|n}|U&mOr@%KO zo`0dHw-5rHBy_6%!g)lE)tyd0)2<2B%%gYd#m#duJT$-*dJ>=AlHI9(&?c;};ABP+ zwz3AtfE|Alz)XApof1UXif}RC;DO*w8$ITEIFI_QR@U#tf{ZAOW`e zUEe8Ic{@JiCgJjg?|B4#R!E_StgRLJpvvHWX80rWTll{*CKL$j%SNL(GXvTRl3aW+ z(BERshB+aA1J9NG(|MO>Y<~n?Rm$Ai_bJLccat=3rOjF%&}u0!+pRRWW}EpgnEC{c zcfTw*Ky45LJWTr5kT^>I;LUS?P^pY;x5Zl9Q?*Be!Nac&t%Pk*Uj`%tb_nX-R=Gf7 zcFpC`j$o zqX0OSA+pWQ4n>+tb?gcMHBN^fB6dU%@OY?4C&J(C`@UYI^9`T=8Lrd@ogP``nPF0} zdT*M8@=u+0DeJLMd3DAm^)ySlXkR(Cc4dNDuR)%cD0{u(N?P9|;co@Vt}8J2h4e#j zeCy@$S<7nP-!!Cb5l=rfbW4c+8JL)vhs)EGtsWacA45uVIV}3r@Z1WE*zWwRZ-hG*`vk!jO z96gGb2Kn|}@l&+a>l-nVKY!zm0E4O^K!N;fX4tlF`boJ;wf>BryL9K69i2-wX$OU2 z#1`G-L1kX&8okxRlld2^FiDgkj*9%D$0Su-5#2hG1tslf%Jq^H@JZnVh+NcxxbM6n zOQ2CqmQgKC0UNHO`@A4)((;qGc_c0i-W*=is>