From 941410a840d2b1c507a3e03b6de5700bd781f7b8 Mon Sep 17 00:00:00 2001 From: Evgenii Stratonikov Date: Tue, 14 Apr 2020 17:24:21 +0300 Subject: [PATCH] core: change verification scripts to new format Verification scripts now invoke Neo.Crypto.* interops instead of CHECKSIG/VERIFY opcodes. --- .docker/wallets/wallet1.json | 57 +++- .docker/wallets/wallet1_solo.json | 75 +++++- .docker/wallets/wallet2.json | 57 +++- .docker/wallets/wallet3.json | 57 +++- .docker/wallets/wallet4.json | 57 +++- pkg/consensus/consensus_test.go | 21 +- pkg/consensus/payload.go | 7 +- pkg/consensus/testdata/wallet1.json | 57 +++- pkg/consensus/testdata/wallet2.json | 57 +++- pkg/consensus/testdata/wallet3.json | 57 +++- pkg/consensus/testdata/wallet4.json | 57 +++- pkg/core/blockchain.go | 9 +- pkg/core/helper_test.go | 2 +- pkg/core/interop/crypto/interop.go | 34 +++ pkg/core/util_test.go | 6 +- pkg/crypto/keys/publickey.go | 10 +- pkg/crypto/keys/publickey_test.go | 2 +- pkg/internal/keytestcases/testcases.go | 14 +- pkg/rpc/server/server_test.go | 48 ++-- pkg/rpc/server/testdata/testblocks.acc | Bin 112274 -> 114197 bytes pkg/smartcontract/context/context_test.go | 20 +- pkg/smartcontract/contract.go | 6 +- pkg/smartcontract/contract_test.go | 6 +- pkg/vm/contract_checks.go | 31 ++- pkg/vm/contract_checks_test.go | 307 +++++++--------------- pkg/wallet/account_test.go | 6 +- pkg/wallet/testdata/wallet1.json | 57 +++- pkg/wallet/testdata/wallet2.json | 75 +++++- pkg/wallet/wallet_test.go | 4 +- 29 files changed, 901 insertions(+), 295 deletions(-) create mode 100644 pkg/core/interop/crypto/interop.go diff --git a/.docker/wallets/wallet1.json b/.docker/wallets/wallet1.json index d03726fd9..584fc1f5f 100644 --- a/.docker/wallets/wallet1.json +++ b/.docker/wallets/wallet1.json @@ -1 +1,56 @@ -{"name":"wallet1","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet1", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "4c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc250680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/.docker/wallets/wallet1_solo.json b/.docker/wallets/wallet1_solo.json index ebdae79ce..4ab972c2d 100644 --- a/.docker/wallets/wallet1_solo.json +++ b/.docker/wallets/wallet1_solo.json @@ -1 +1,74 @@ -{"name":"wallet1","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null},{"address":"AbU69m8WUZJSWanfr1Cy66cpEcsmMcX7BR","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"512102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc251ae","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} +{ + "name": "wallet1", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y", + "contract": { + "script": "2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y", + "contract": { + "script": "532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AKJbsdaKKhF8f922EpwKiZNbo8F2mocqHo", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y", + "contract": { + "script": "514c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995150683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} diff --git a/.docker/wallets/wallet2.json b/.docker/wallets/wallet2.json index ee6136680..b4570a41b 100644 --- a/.docker/wallets/wallet2.json +++ b/.docker/wallets/wallet2.json @@ -1 +1,56 @@ -{"name":"wallet2","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AWLYWXB8C9Lt1nHdDZJnC5cpYJjgRDLk17","label":null,"isDefault":false,"lock":false,"key":"6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L","contract":{"script":"2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406eac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet2", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AdB6ayKfBRJZasiXX4JL5N2YtmxftNp1b3", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg", + "contract": { + "script": "4c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e50680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/.docker/wallets/wallet3.json b/.docker/wallets/wallet3.json index 3c72d1751..87cfaaea9 100644 --- a/.docker/wallets/wallet3.json +++ b/.docker/wallets/wallet3.json @@ -1 +1,56 @@ -{"name":"wallet3","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AR3uEnLUdfm1tPMJmiJQurAXGL7h3EXQ2F","label":null,"isDefault":false,"lock":false,"key":"6PYX86vYiHfUbpD95hfN1xgnvcSxy5skxfWYKu3ztjecxk6ikYs2kcWbeh","contract":{"script":"2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYX86vYiHfUbpD95hfN1xgnvcSxy5skxfWYKu3ztjecxk6ikYs2kcWbeh","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet3", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AbJTkhSMjJnm2CHZbCUe5j8w2xzjDbeWM8", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYRHjZrvxYqrHLpXz1aP6dBnrFkkxQMCdYsJi7YDPoQnQddvRuTzKGxME", + "contract": { + "script": "4c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69950680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYRHjZrvxYqrHLpXz1aP6dBnrFkkxQMCdYsJi7YDPoQnQddvRuTzKGxME", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/.docker/wallets/wallet4.json b/.docker/wallets/wallet4.json index d73ab4f7d..77beaa507 100644 --- a/.docker/wallets/wallet4.json +++ b/.docker/wallets/wallet4.json @@ -1 +1,56 @@ -{"name":"wallet4","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AJmjUqf1jDenxYpuNS4i2NxD9FQYieDpBF","label":null,"isDefault":false,"lock":false,"key":"6PYRXVwHSqFSukL3CuXxdQ75VmsKpjeLgQLEjt83FrtHf1gCVphHzdD4nc","contract":{"script":"2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd62ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYRXVwHSqFSukL3CuXxdQ75VmsKpjeLgQLEjt83FrtHf1gCVphHzdD4nc","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet4", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AT7C1Jno1CtJTYzA6MH8HpfYYso1RiES8q", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYWscJHQ76uctwuM7GRcAp6xfGjdYDKnbMtMnT6hcXxcNn7CywbQmvfSy", + "contract": { + "script": "4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd6250680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYWscJHQ76uctwuM7GRcAp6xfGjdYDKnbMtMnT6hcXxcNn7CywbQmvfSy", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/pkg/consensus/consensus_test.go b/pkg/consensus/consensus_test.go index d2aa98b32..4b92287d1 100644 --- a/pkg/consensus/consensus_test.go +++ b/pkg/consensus/consensus_test.go @@ -1,6 +1,8 @@ package consensus import ( + "encoding/hex" + "fmt" "testing" "github.com/nspcc-dev/dbft/block" @@ -9,7 +11,10 @@ import ( "github.com/nspcc-dev/neo-go/pkg/core" "github.com/nspcc-dev/neo-go/pkg/core/storage" "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/encoding/address" + "github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/wallet" "github.com/stretchr/testify/require" @@ -195,25 +200,33 @@ func newTestService(t *testing.T) *service { return srv.(*service) } +func TestExport(t *testing.T) { + _, pub := getTestValidator(3) + s, _ := smartcontract.CreateMultiSigRedeemScript(1, keys.PublicKeys{pub.PublicKey}) + fmt.Println(hex.EncodeToString(s)) + u := hash.Hash160(s) + fmt.Println(address.Uint160ToString(u)) +} + func getTestValidator(i int) (*privateKey, *publicKey) { var wif, password string // Sorted by public key. switch i { case 0: - wif = "6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L" + wif = "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg" password = "two" case 1: - wif = "6PYRXVwHSqFSukL3CuXxdQ75VmsKpjeLgQLEjt83FrtHf1gCVphHzdD4nc" + wif = "6PYWscJHQ76uctwuM7GRcAp6xfGjdYDKnbMtMnT6hcXxcNn7CywbQmvfSy" password = "four" case 2: - wif = "6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y" + wif = "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN" password = "one" case 3: - wif = "6PYX86vYiHfUbpD95hfN1xgnvcSxy5skxfWYKu3ztjecxk6ikYs2kcWbeh" + wif = "6PYRHjZrvxYqrHLpXz1aP6dBnrFkkxQMCdYsJi7YDPoQnQddvRuTzKGxME" password = "three" default: diff --git a/pkg/consensus/payload.go b/pkg/consensus/payload.go index c9f78a0eb..4db64e298 100644 --- a/pkg/consensus/payload.go +++ b/pkg/consensus/payload.go @@ -1,11 +1,12 @@ package consensus import ( - "crypto/sha256" "fmt" "github.com/nspcc-dev/dbft/payload" "github.com/nspcc-dev/neo-go/pkg/core" + "github.com/nspcc-dev/neo-go/pkg/core/interop" + "github.com/nspcc-dev/neo-go/pkg/core/interop/crypto" "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/io" @@ -210,9 +211,7 @@ func (p *Payload) Verify(scriptHash util.Uint160) bool { } v := vm.New() - h := sha256.Sum256(p.GetSignedPart()) - - v.SetCheckedHash(h[:]) + v.RegisterInteropGetter(crypto.GetInterop(&interop.Context{Container: p})) v.LoadScript(verification) v.LoadScript(p.Witness.InvocationScript) diff --git a/pkg/consensus/testdata/wallet1.json b/pkg/consensus/testdata/wallet1.json index d03726fd9..584fc1f5f 100644 --- a/pkg/consensus/testdata/wallet1.json +++ b/pkg/consensus/testdata/wallet1.json @@ -1 +1,56 @@ -{"name":"wallet1","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet1", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "4c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc250680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/pkg/consensus/testdata/wallet2.json b/pkg/consensus/testdata/wallet2.json index ee6136680..b4570a41b 100644 --- a/pkg/consensus/testdata/wallet2.json +++ b/pkg/consensus/testdata/wallet2.json @@ -1 +1,56 @@ -{"name":"wallet2","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AWLYWXB8C9Lt1nHdDZJnC5cpYJjgRDLk17","label":null,"isDefault":false,"lock":false,"key":"6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L","contract":{"script":"2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406eac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet2", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AdB6ayKfBRJZasiXX4JL5N2YtmxftNp1b3", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg", + "contract": { + "script": "4c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e50680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/pkg/consensus/testdata/wallet3.json b/pkg/consensus/testdata/wallet3.json index 3c72d1751..87cfaaea9 100644 --- a/pkg/consensus/testdata/wallet3.json +++ b/pkg/consensus/testdata/wallet3.json @@ -1 +1,56 @@ -{"name":"wallet3","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AR3uEnLUdfm1tPMJmiJQurAXGL7h3EXQ2F","label":null,"isDefault":false,"lock":false,"key":"6PYX86vYiHfUbpD95hfN1xgnvcSxy5skxfWYKu3ztjecxk6ikYs2kcWbeh","contract":{"script":"2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee699ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYX86vYiHfUbpD95hfN1xgnvcSxy5skxfWYKu3ztjecxk6ikYs2kcWbeh","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet3", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AbJTkhSMjJnm2CHZbCUe5j8w2xzjDbeWM8", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYRHjZrvxYqrHLpXz1aP6dBnrFkkxQMCdYsJi7YDPoQnQddvRuTzKGxME", + "contract": { + "script": "4c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69950680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYRHjZrvxYqrHLpXz1aP6dBnrFkkxQMCdYsJi7YDPoQnQddvRuTzKGxME", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/pkg/consensus/testdata/wallet4.json b/pkg/consensus/testdata/wallet4.json index d73ab4f7d..77beaa507 100644 --- a/pkg/consensus/testdata/wallet4.json +++ b/pkg/consensus/testdata/wallet4.json @@ -1 +1,56 @@ -{"name":"wallet4","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AJmjUqf1jDenxYpuNS4i2NxD9FQYieDpBF","label":null,"isDefault":false,"lock":false,"key":"6PYRXVwHSqFSukL3CuXxdQ75VmsKpjeLgQLEjt83FrtHf1gCVphHzdD4nc","contract":{"script":"2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd62ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYRXVwHSqFSukL3CuXxdQ75VmsKpjeLgQLEjt83FrtHf1gCVphHzdD4nc","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet4", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AT7C1Jno1CtJTYzA6MH8HpfYYso1RiES8q", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYWscJHQ76uctwuM7GRcAp6xfGjdYDKnbMtMnT6hcXxcNn7CywbQmvfSy", + "contract": { + "script": "4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd6250680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYWscJHQ76uctwuM7GRcAp6xfGjdYDKnbMtMnT6hcXxcNn7CywbQmvfSy", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 3ddb1796e..361c09759 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -668,7 +668,6 @@ func (bc *Blockchain) storeBlock(block *block.Block) error { case *transaction.InvocationTX: systemInterop := bc.newInteropContext(trigger.Application, cache, block, tx) v := SpawnVM(systemInterop) - v.SetCheckedHash(tx.VerificationHash().BytesBE()) v.LoadScript(t.Script) v.SetPriceGetter(getPrice) if bc.config.FreeGasLimit > 0 { @@ -1956,14 +1955,13 @@ func ScriptFromWitness(hash util.Uint160, witness *transaction.Witness) ([]byte, } // verifyHashAgainstScript verifies given hash against the given witness. -func (bc *Blockchain) verifyHashAgainstScript(hash util.Uint160, witness *transaction.Witness, checkedHash util.Uint256, interopCtx *interop.Context, useKeys bool) error { +func (bc *Blockchain) verifyHashAgainstScript(hash util.Uint160, witness *transaction.Witness, interopCtx *interop.Context, useKeys bool) error { verification, err := ScriptFromWitness(hash, witness) if err != nil { return err } vm := SpawnVM(interopCtx) - vm.SetCheckedHash(checkedHash.BytesBE()) vm.LoadScript(verification) vm.LoadScript(witness.InvocationScript) if useKeys { @@ -2023,7 +2021,7 @@ func (bc *Blockchain) verifyTxWitnesses(t *transaction.Transaction, block *block sort.Slice(witnesses, func(i, j int) bool { return witnesses[i].ScriptHash().Less(witnesses[j].ScriptHash()) }) interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, block, t) for i := 0; i < len(hashes); i++ { - err := bc.verifyHashAgainstScript(hashes[i], &witnesses[i], t.VerificationHash(), interopCtx, false) + err := bc.verifyHashAgainstScript(hashes[i], &witnesses[i], interopCtx, false) if err != nil { numStr := fmt.Sprintf("witness #%d", i) return errors.Wrap(err, numStr) @@ -2042,7 +2040,8 @@ func (bc *Blockchain) verifyHeaderWitnesses(currHeader, prevHeader *block.Header hash = prevHeader.NextConsensus } interopCtx := bc.newInteropContext(trigger.Verification, bc.dao, nil, nil) - return bc.verifyHashAgainstScript(hash, &currHeader.Script, currHeader.VerificationHash(), interopCtx, true) + interopCtx.Container = currHeader + return bc.verifyHashAgainstScript(hash, &currHeader.Script, interopCtx, true) } func hashAndIndexToBytes(h util.Uint256, index uint32) []byte { diff --git a/pkg/core/helper_test.go b/pkg/core/helper_test.go index 198145cf2..9a4981e35 100644 --- a/pkg/core/helper_test.go +++ b/pkg/core/helper_test.go @@ -208,7 +208,7 @@ func TestCreateBasicChain(t *testing.T) { }) // multisig address which possess all NEO - scriptHash, err := util.Uint160DecodeStringBE("be48d3a3f5d10013ab9ffee489706078714f1ea2") + scriptHash, err := util.Uint160DecodeStringBE("d60ac443bb800fb08261e75fa5925d747d485861") require.NoError(t, err) priv0, err := keys.NewPrivateKeyFromWIF(privNetKeys[0]) require.NoError(t, err) diff --git a/pkg/core/interop/crypto/interop.go b/pkg/core/interop/crypto/interop.go new file mode 100644 index 000000000..e565b51f5 --- /dev/null +++ b/pkg/core/interop/crypto/interop.go @@ -0,0 +1,34 @@ +package crypto + +import ( + "github.com/nspcc-dev/neo-go/pkg/core/interop" + "github.com/nspcc-dev/neo-go/pkg/vm" + "github.com/nspcc-dev/neo-go/pkg/vm/emit" +) + +var ( + ecdsaVerifyID = emit.InteropNameToID([]byte("Neo.Crypto.ECDsaVerify")) + ecdsaCheckMultisigID = emit.InteropNameToID([]byte("Neo.Crypto.ECDsaCheckMultiSig")) +) + +// GetInterop returns interop getter for crypto-related stuff. +func GetInterop(ic *interop.Context) func(uint32) *vm.InteropFuncPrice { + return func(id uint32) *vm.InteropFuncPrice { + switch id { + case ecdsaVerifyID: + return &vm.InteropFuncPrice{ + Func: func(v *vm.VM) error { + return ECDSAVerify(ic, v) + }, + } + case ecdsaCheckMultisigID: + return &vm.InteropFuncPrice{ + Func: func(v *vm.VM) error { + return ECDSACheckMultisig(ic, v) + }, + } + default: + return nil + } + } +} diff --git a/pkg/core/util_test.go b/pkg/core/util_test.go index 22ba5d085..611a86301 100644 --- a/pkg/core/util_test.go +++ b/pkg/core/util_test.go @@ -20,14 +20,14 @@ func TestGenesisBlockMainNet(t *testing.T) { // have been changed. Consequently, hash of the genesis block has been changed. // Update expected genesis block hash for better times. // Old hash is "d42561e3d30e15be6400b6df2f328e02d2bf6354c41dce433bc57687c82144bf" - expect := "cf98b48f81ce3162cdd0883bb0c4cbf3abc105623ba7a61133a776c1e33a2466" + expect := "75b6219158953816fbfe1884160f3fe0a4a4d0f7a2b7948bc89787d616f84983" assert.Equal(t, expect, block.Hash().StringLE()) } func TestGetConsensusAddressMainNet(t *testing.T) { var ( - consensusAddr = "APyEx5f4Zm4oCHwFWiSTaph1fPBxZacYVR" - consensusScript = "59e75d652b5d3827bf04c165bbe9ef95cca4bf55" + consensusAddr = "ASwdHjdAGfmSDuZbr641W1eYFVugjByJAS" + consensusScript = "7a818ecc4582f8526e7c4271a690c04bd3b9e017" ) cfg, err := config.Load("../../config", config.ModeMainNet) diff --git a/pkg/crypto/keys/publickey.go b/pkg/crypto/keys/publickey.go index 358433837..739d86330 100644 --- a/pkg/crypto/keys/publickey.go +++ b/pkg/crypto/keys/publickey.go @@ -14,6 +14,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/util" + "github.com/nspcc-dev/neo-go/pkg/vm/emit" "github.com/nspcc-dev/neo-go/pkg/vm/opcode" "github.com/pkg/errors" ) @@ -230,10 +231,13 @@ func (p *PublicKey) EncodeBinary(w *io.BinWriter) { // public key. func (p *PublicKey) GetVerificationScript() []byte { b := p.Bytes() - b = append([]byte{byte(opcode.PUSHBYTES33)}, b...) - b = append(b, byte(opcode.CHECKSIG)) + buf := io.NewBufBinWriter() + emit.Instruction(buf.BinWriter, opcode.PUSHDATA1, []byte{33}) + buf.BinWriter.WriteBytes(b) + emit.Opcode(buf.BinWriter, opcode.PUSHNULL) + emit.Syscall(buf.BinWriter, "Neo.Crypto.ECDsaVerify") - return b + return buf.Bytes() } // GetScriptHash returns a Hash160 of verification script for the key. diff --git a/pkg/crypto/keys/publickey_test.go b/pkg/crypto/keys/publickey_test.go index 1415197a0..78f8ec787 100644 --- a/pkg/crypto/keys/publickey_test.go +++ b/pkg/crypto/keys/publickey_test.go @@ -89,7 +89,7 @@ func TestPubkeyToAddress(t *testing.T) { pubKey, err := NewPublicKeyFromString("031ee4e73a17d8f76dc02532e2620bcb12425b33c0c9f9694cc2caa8226b68cad4") require.NoError(t, err) actual := pubKey.Address() - expected := "AUpGsNCHzSimeMRVPQfhwrVdiUp8Q2N2Qx" + expected := "Ads7RRw2vS2jfRypVbMUGt22pxaDaojJHs" require.Equal(t, expected, actual) } diff --git a/pkg/internal/keytestcases/testcases.go b/pkg/internal/keytestcases/testcases.go index 059a82744..6a6754cd1 100644 --- a/pkg/internal/keytestcases/testcases.go +++ b/pkg/internal/keytestcases/testcases.go @@ -14,28 +14,28 @@ type Ktype struct { // Arr contains a set of known keys in Ktype format. var Arr = []Ktype{ { - Address: "ALq7AWrhAueN6mJNqk6FHJjnsEoPRytLdW", + Address: "Ac5bo2k5rKFvYzCZaTqUG6xFe6iXuW9xQs", PrivateKey: "7d128a6d096f0c14c3a25a2b0c41cf79661bfcb4a8cc95aaaea28bde4d732344", PublicKey: "02028a99826edc0c97d18e22b6932373d908d323aa7f92656a77ec26e8861699ef", Wif: "L1QqQJnpBwbsPGAuutuzPTac8piqvbR1HRjrY5qHup48TBCBFe4g", Passphrase: "city of zion", - EncryptedWif: "6PYLHmDf6AjF4AsVtosmxHuPYeuyJL3SLuw7J1U8i7HxKAnYNsp61HYRfF", + EncryptedWif: "6PYKSxMYzHGuiT3iK7kkeGqn3Q6hJnHUc3U3Hro2kb1rPC7G15Eg2GnqL7", }, { - Address: "ALfnhLg7rUyL6Jr98bzzoxz5J7m64fbR4s", + Address: "ATKoxGh7rytJRr96XWkvs3shMM5uiiHjhg", PrivateKey: "9ab7e154840daca3a2efadaf0df93cd3a5b51768c632f5433f86909d9b994a69", PublicKey: "031d8e1630ce640966967bc6d95223d21f44304133003140c3b52004dc981349c9", Wif: "L2QTooFoDFyRFTxmtiVHt5CfsXfVnexdbENGDkkrrgTTryiLsPMG", Passphrase: "我的密码", - EncryptedWif: "6PYWVp3xfgvnuNKP7ZavSViYvvim2zuzx9Q33vuWZr8aURiKeJ6Zm7BfPQ", + EncryptedWif: "6PYQYBtL2kifXe3Dv96pMoPNJ2fZz8cPv2YqpHGKdfM2g5swEBUdwJqKsu", }, { - Address: "AVf4UGKevVrMR1j3UkPsuoYKSC4ocoAkKx", + Address: "AbjLAUABpmvLAJv4brQ7pt4QG87qy8K75T", PrivateKey: "3edee7036b8fd9cef91de47386b191dd76db2888a553e7736bb02808932a915b", PublicKey: "02232ce8d2e2063dce0451131851d47421bfc4fc1da4db116fca5302c0756462fa", Wif: "KyKvWLZsNwBJx5j9nurHYRwhYfdQUu9tTEDsLCUHDbYBL8cHxMiG", Passphrase: "MyL33tP@33w0rd", - EncryptedWif: "6PYNoc1EG5J38MTqGN9Anphfdd6UwbS4cpFCzHhrkSKBBbV1qkbJJZQnkn", + EncryptedWif: "6PYMbnB7h7SjueFXUMUiGptmvMXZKLALSsCnuaotBEAnmv5fXiYh7vReBA", }, { Address: "xdf4UGKevVrMR1j3UkPsuoYKSC4ocoAkKx", @@ -43,7 +43,7 @@ var Arr = []Ktype{ PublicKey: "zz232ce8d2e2063dce0451131851d47421bfc4fc1da4db116fca5302c0756462fa", Wif: "zzKvWLZsNwBJx5j9nurHYRwhYfdQUu9tTEDsLCUHDbYBL8cHxMiG", Passphrase: "zzL33tP@33w0rd", - EncryptedWif: "6PYNoc1EG5J38MTqGN9Anphfdd6UwbS4cpFCzHhrkSKBBbV1qkbJJZQnkn", + EncryptedWif: "6PYMbnB7h7SjueFXUMUiGptmvMXZKLALSsCnuaotBEAnmv5fXiYh7vReBA", Invalid: true, }, } diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 1d18829d6..847177d3e 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -49,14 +49,14 @@ var rpcTestCases = map[string][]rpcTestCase{ "getapplicationlog": { { name: "positive", - params: `["d98e4b58783aa9665efcc5be19ee432772a94462efc8a5e4165776e6dd8c4e92"]`, + params: `["a62dccca145b9df9793ddbe80fd96fd6360403c52926909b9e6fd9a4ac5549aa"]`, result: func(e *executor) interface{} { return &result.ApplicationLog{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.ApplicationLog) require.True(t, ok) - expectedTxHash, err := util.Uint256DecodeStringLE("d98e4b58783aa9665efcc5be19ee432772a94462efc8a5e4165776e6dd8c4e92") + expectedTxHash, err := util.Uint256DecodeStringLE("a62dccca145b9df9793ddbe80fd96fd6360403c52926909b9e6fd9a4ac5549aa") require.NoError(t, err) assert.Equal(t, expectedTxHash, res.TxHash) assert.Equal(t, 1, len(res.Executions)) @@ -88,7 +88,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "getaccountstate": { { name: "positive", - params: `["AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU"]`, + params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, result: func(e *executor) interface{} { return &result.AccountState{} }, check: func(t *testing.T, e *executor, acc interface{}) { res, ok := acc.(*result.AccountState) @@ -162,12 +162,12 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "positive", - params: `["a90f00d94349a320376b7cb86c884b53ad76aa2b"]`, + params: `["c4bba7ed4e624d038b844d6b6ff24518e7db0165"]`, 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, "AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs", res.Address) + require.Equal(t, "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", 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()) @@ -188,12 +188,12 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "positive", - params: `["AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs"]`, + params: `["AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY"]`, 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, "AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs", res.Address) + require.Equal(t, "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", res.Address) assetHash, err := util.Uint160DecodeStringLE(testContractHash) require.NoError(t, err) @@ -206,7 +206,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, "AWLYWXB8C9Lt1nHdDZJnC5cpYJjgRDLk17", res.Sent[0].Address) + require.Equal(t, "AdB6ayKfBRJZasiXX4JL5N2YtmxftNp1b3", res.Sent[0].Address) }, }, }, @@ -405,25 +405,25 @@ var rpcTestCases = map[string][]rpcTestCase{ "getblockheader": { { name: "positive, no verbose", - params: `["60c00bfa7f283d1821e1bc8c1c83aa534f325968944d73fa25cf7235af17d608"]`, + params: `["26d52a2541614f8639bc030493c4f2be2003094bbba2219aee3e097beb730a8d"]`, result: func(e *executor) interface{} { - expected := "000000009456b8c7f89bdfe012a30a2be9af5218e048ae7372115ce3e39cc847c01e9e7f9cffa26c112eb147a995520e47afbc45a192d9bf1a8e9b8f80497e5d92c4e9f2011e975e010000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd0401404be65e52d50121ce243eb27f7a1c16637e753e847e9c027f255bc5e2bae45f1c99d8c1014e5abe829b9a229904540b7010ae6fb2bb57f88d70179ec617dea35440c9d51c5980e016f5cb51734554341764572b0644010952761878b1966d2b013ceaf18958891060dde3a33d23118f27ef21e991f913a8740c716c14aa19483ea0409a44efd5607f7b8f09dd4f242882713b40866c2aeab9aaa5f92b92dbaf84ed0c039fb1790888ab36d77c8b6520b2bb58ab43b219be3272145cf0f6fd091e33e540ec1e52377a56bb6e0f82329ac1a70ab06cb7e23c149bcc194fa483a316de33468191b16ab1fafb2f1a1af79a0cd6e7e275d3a3ed56f8b0ecbcd6e26f93a3957b8b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00" + expected := "000000002f1f4e815a5951622f4c3863d5a27da7819259517971118de2f979d70850c15d4c8edb530dbd32f20674901fea73dd41c6b1af2ab9520b92447460351727be2c28a3995e010000005704000000000000d60ac443bb800fb08261e75fa5925d747d48586101fd040140e87e9ea015e46febb3ef938d7a458b2f70d84eb0584b2b22b0f85ecfe292d98742569d27ef2f4eafca967a9bbbb1e90efe4046d550f821f70fe39cb07aa70b87409d894b16bc8ab1b1edb0e921e0171ea7e8bf713854896eddd9d1bbc8e2ec80df616e30c0518dd3053a8d53464bb5615bd2cc83aca8fb9a8c37a259a30ba9a571405cfbfee1b86d4819c25f6a97374cef09733fc006e73ee18e5ada58d348983e1b753fad166c7220154fe21ca482feccaf1ff1598660ab7bef087ca16325db4ed9403baed63512e0bec4d5afb8c27525951a8855e579530c9ebf5aae4430492a426abb2eac309828c83e1d132bf9334b31d538fde4a2cfdb9e50da16b29db787152c94534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb00" return &expected }, }, { name: "positive, verbose 0", - params: `["60c00bfa7f283d1821e1bc8c1c83aa534f325968944d73fa25cf7235af17d608", 0]`, + params: `["26d52a2541614f8639bc030493c4f2be2003094bbba2219aee3e097beb730a8d", 0]`, result: func(e *executor) interface{} { - expected := "000000009456b8c7f89bdfe012a30a2be9af5218e048ae7372115ce3e39cc847c01e9e7f9cffa26c112eb147a995520e47afbc45a192d9bf1a8e9b8f80497e5d92c4e9f2011e975e010000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd0401404be65e52d50121ce243eb27f7a1c16637e753e847e9c027f255bc5e2bae45f1c99d8c1014e5abe829b9a229904540b7010ae6fb2bb57f88d70179ec617dea35440c9d51c5980e016f5cb51734554341764572b0644010952761878b1966d2b013ceaf18958891060dde3a33d23118f27ef21e991f913a8740c716c14aa19483ea0409a44efd5607f7b8f09dd4f242882713b40866c2aeab9aaa5f92b92dbaf84ed0c039fb1790888ab36d77c8b6520b2bb58ab43b219be3272145cf0f6fd091e33e540ec1e52377a56bb6e0f82329ac1a70ab06cb7e23c149bcc194fa483a316de33468191b16ab1fafb2f1a1af79a0cd6e7e275d3a3ed56f8b0ecbcd6e26f93a3957b8b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00" + expected := "000000002f1f4e815a5951622f4c3863d5a27da7819259517971118de2f979d70850c15d4c8edb530dbd32f20674901fea73dd41c6b1af2ab9520b92447460351727be2c28a3995e010000005704000000000000d60ac443bb800fb08261e75fa5925d747d48586101fd040140e87e9ea015e46febb3ef938d7a458b2f70d84eb0584b2b22b0f85ecfe292d98742569d27ef2f4eafca967a9bbbb1e90efe4046d550f821f70fe39cb07aa70b87409d894b16bc8ab1b1edb0e921e0171ea7e8bf713854896eddd9d1bbc8e2ec80df616e30c0518dd3053a8d53464bb5615bd2cc83aca8fb9a8c37a259a30ba9a571405cfbfee1b86d4819c25f6a97374cef09733fc006e73ee18e5ada58d348983e1b753fad166c7220154fe21ca482feccaf1ff1598660ab7bef087ca16325db4ed9403baed63512e0bec4d5afb8c27525951a8855e579530c9ebf5aae4430492a426abb2eac309828c83e1d132bf9334b31d538fde4a2cfdb9e50da16b29db787152c94534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb00" return &expected }, }, { name: "positive, verbose !=0", - params: `["60c00bfa7f283d1821e1bc8c1c83aa534f325968944d73fa25cf7235af17d608", 2]`, + params: `["26d52a2541614f8639bc030493c4f2be2003094bbba2219aee3e097beb730a8d", 2]`, result: func(e *executor) interface{} { - hash, err := util.Uint256DecodeStringLE("60c00bfa7f283d1821e1bc8c1c83aa534f325968944d73fa25cf7235af17d608") + hash, err := util.Uint256DecodeStringLE("26d52a2541614f8639bc030493c4f2be2003094bbba2219aee3e097beb730a8d") if err != nil { panic("can not decode hash parameter") } @@ -517,10 +517,10 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "normal address", - params: `["AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU"]`, + params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, result: func(*executor) interface{} { // hash of the issueTx - h, _ := util.Uint256DecodeStringBE("7b5710faf4ea62e3cd7f526d3dad39e85e1823c62340c88b80e36fd99342457a") + h, _ := util.Uint256DecodeStringBE("e9a7882fa874508dff8a3f21d32da2afb9f9d303753953a524c75b81e295c914") amount := util.Fixed8FromInt64(1 * 8) // (endHeight - startHeight) * genAmount[0] return &result.ClaimableInfo{ Spents: []result.Claimable{ @@ -532,7 +532,7 @@ var rpcTestCases = map[string][]rpcTestCase{ Unclaimed: amount, }, }, - Address: "AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU", + Address: "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", Unclaimed: amount, } }, @@ -579,7 +579,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "gettransactionheight": { { name: "poositive", - params: `["2f0ed00979cb5feae842946be2afb96deec9c13236605fda63737db223089a00"]`, + params: `["4b0be2562c7f49a496f08eb6983b46904c99dfb7c65d3a32d7b09cbc503a7889"]`, result: func(e *executor) interface{} { h := 1 return &h @@ -614,7 +614,7 @@ var rpcTestCases = map[string][]rpcTestCase{ }, { name: "positive", - params: `["AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU"]`, + params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, result: func(*executor) interface{} { return &result.Unclaimed{} }, @@ -630,7 +630,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "getunspents": { { name: "positive", - params: `["AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU"]`, + params: `["AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6"]`, result: func(e *executor) interface{} { return &result.Unspents{} }, check: func(t *testing.T, e *executor, unsp interface{}) { res, ok := unsp.(*result.Unspents) @@ -791,7 +791,7 @@ var rpcTestCases = map[string][]rpcTestCase{ "sendrawtransaction": { { name: "positive", - params: `["800013000000b004000000010655773cea2a4f8cc66f83989605a58e87e885b6aaf58d450db3b83f81a2c950010001a9bf999e43ccfe9d40c3450fc75ca4b02db9b1691a7e1989b331f621456289050030d3dec38623002baa76ad534b886cb87c6b3720a34943d9000fa9014140faa7f2c3f700838aa48be950aff762c050f1cf04f1185fb3893820f63a98ccbfed05e8c5931f67ade59054c853be1d37ff9e75ed65b0543255ff28a3f8667670232102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac"]`, + params: `["800013000000b004000000013bc3087e4af3b30310500396aa972d7a8ac87a7046dff9dc030e03c2bbc09be9010001a9bf999e43ccfe9d40c3450fc75ca4b02db9b1691a7e1989b331f621456289050030d3dec38623006501dbe71845f26f6b4d848b034d624eeda7bbc40141401026a8d3bd5839d1ead869dcba75dd19c112671d5a86e3443e4fd8c456e8c3fae1ed108065bfe47d62127e33a2419ee1d2140a66712c6ae4b5d2ad0758c5b5dd294c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc250680a906ad4"]`, result: func(e *executor) interface{} { v := true return &v @@ -822,7 +822,7 @@ var rpcTestCases = map[string][]rpcTestCase{ { // If you are planning to modify test chain from `testblocks.acc`, please, update param value (first block) name: "empty block", - params: `["00000000547e0fa207c116e25fd69a04b99e446e409ca23c7863bafbd585abeb468314c00000000000000000000000000000000000000000000000000000000000000000d21e975ed10000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd0401404fb770b14c4e7bd2461dbf238ca197844a724388d15cfeb96a07cb8cb52733f3f7adcc5bbd33c8dc19103116f1fe6c3151a14e3db40585823cc3ce153a0426ec40fd880f3d029e95dcb4612b40f31d5111a961345bc2090689a7462c12c85006ed281216331e1169d41cc0a8780b0befc22b9d3ba147e331acfb858675ebaaf8de4055922389015e0a96e07c9ad987eda4a642f0436843966821e620b89bf84e8ec22a33c308ad7e9815b1d0bebd93289db1828bec516d3b2ccfcaf080d2b7ea385f408005e2ff7387c50393407b125a09f42970b4b8033737e0b5ee04c1dfc9e6ad15da879cd46b3177b302ee1c109acbce4af689bb7e89978e4709e97d2db76c7ada8b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae00"]`, + params: `["00000000f0fae05006c8c784404415faf69023f9e607f04a1fcfde2a4bd93a8c3fdfd1980000000000000000000000000000000000000000000000000000000000000000f8a3995ed10000005704000000000000d60ac443bb800fb08261e75fa5925d747d48586101fd040140a3f627a07ae219f3dce5525f1b01b913c7dbe9ba6a725bdf49733290e5f3e50f2ba8f434d564ebfaeae40433a4b8746dccb2d4ab36712a87d3600e07548f398140b2e23d220f965736277f509e659f76c8bc376b1b28c3d4c817fbd96ec82eb4e11a5c4fe67b7df6ff8f6efe2a71c3582a7c0403494f84f90c4efc7a314b2c6c8d404f5dcd7ac82e541e7fda965460df0a8563f0ca71c7211263f9dc783a77a6b968bc1f7bf57f34fe48f8978aa94d6c21bcde59bc6dae16eee0d37ec5d8bb0447d240dc6dd5692f1a49862805e18f2a77016ee94e3529cb2856571b9146e53f572fed1c6e31e655b8f94e55a665c25001d3477375db31d6924e88d32ded33a6d6f6cb94534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb00"]`, fail: true, }, { @@ -848,7 +848,7 @@ var rpcTestCases = map[string][]rpcTestCase{ { name: "positive", // If you are planning to modify test chain from `testblocks.acc`, please, update param value (second block) - params: `["00000000547e0fa207c116e25fd69a04b99e446e409ca23c7863bafbd585abeb468314c0980135e10c52e5444c962659b388a5b226114a45d3912a88700ac6b05aaaf961d21e975ed10000005704000000000000be48d3a3f5d10013ab9ffee489706078714f1ea201fd040140dc1690f42fd67440defaf6385ad5d77b3a2ffba6270c22aa20373eab011cc5eb46e1aeb0f5f9d3f78ebd29d7fb3bb47777e2a0793e4594761e74dc6867834f6a405ebde4af3a4fedefc33c7debf58a159dcd4a66e396c007bf9cc185f422ff449849efcbbb8d772df213b3b412b7ca4188ec3a4ac841c3374ae4cac3277e16d39640ee9e51540a5c37100e0964f279938561096df6693429e692ce39553f63db53ce4f4d4d777e00299c594f7c8095410b03b5ca253f6946e081069180890a443e8e40981c77a1d7a9e9d71e54ba3edd8d740b24b723efefd7eca87ba9e5c2abb2a07dea5ab83e643cabc20af3d2e90990e668973850bd7be723097f34a47ac60fddc28b532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae01000014000000b004000000000000"]`, + params: `["00000000f0fae05006c8c784404415faf69023f9e607f04a1fcfde2a4bd93a8c3fdfd198980135e10c52e5444c962659b388a5b226114a45d3912a88700ac6b05aaaf961f8a3995ed10000005704000000000000d60ac443bb800fb08261e75fa5925d747d48586101fd0401406413cf294f0506e81b73a8b6f9ecc8d1ac73afc55852ca65ff2dc08ee217425030d8b16ec36d7f7b1111198337185f71ac2b24b9e4ca8806bc2c3ba5f63bf31540f48633e1541acdbdb4509e522b49e4df48b55bc884f5fd5abae014292f74ca7066232967176826fbb0b6919e14b3c9e91b916cb7003c019b8afb42e37cf97e9140d8f44efe93ab380bab8b6fc29e5d8ba1502feda12eb35c9472906e5c46ffdfff56047f383aa87b9724c219eca43d165c31fb246528e410fbcb4a9a04816c77aa40187874fb7193ce5613382e0059f0ff421fc252c31c83e299dfd097a453afb8a65fd95c7711d4d247ad82179e98146338b58864caf8601a6bb7b62300fa9af9e594534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb01000014000000b004000000000000"]`, result: func(e *executor) interface{} { v := true return &v @@ -975,7 +975,7 @@ func TestRPC(t *testing.T) { assert.Equal(t, 0, txOut.N) assert.Equal(t, "0xa9bf999e43ccfe9d40c3450fc75ca4b02db9b1691a7e1989b331f62145628905", txOut.Asset) assert.Equal(t, util.Fixed8FromInt64(100000000), txOut.Value) - assert.Equal(t, "AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU", txOut.Address) + assert.Equal(t, "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", txOut.Address) }) t.Run("getrawmempool", func(t *testing.T) { diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index 0cfa498641ced80e1307a410e0d8deb817a01855..1ac1d865d5fead64f50f73c185be094cff4e0322 100644 GIT binary patch literal 114197 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 diff --git a/pkg/smartcontract/context/context_test.go b/pkg/smartcontract/context/context_test.go index 1d6f01a37..6b9dc8ab5 100644 --- a/pkg/smartcontract/context/context_test.go +++ b/pkg/smartcontract/context/context_test.go @@ -4,6 +4,8 @@ import ( "encoding/hex" "testing" + "github.com/nspcc-dev/neo-go/pkg/core/interop" + "github.com/nspcc-dev/neo-go/pkg/core/interop/crypto" "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/internal/testserdes" @@ -55,10 +57,7 @@ func TestParameterContext_AddSignatureSimpleContract(t *testing.T) { t.Run("GetWitness", func(t *testing.T) { w, err := c.GetWitness(ctr) require.NoError(t, err) - v := vm.New() - v.SetCheckedHash(tx.VerificationHash().BytesBE()) - v.LoadScript(w.VerificationScript) - v.LoadScript(w.InvocationScript) + v := newTestVM(w, tx) require.NoError(t, v.Run()) require.Equal(t, 1, v.Estack().Len()) require.Equal(t, true, v.Estack().Pop().Value()) @@ -102,16 +101,21 @@ func TestParameterContext_AddSignatureMultisig(t *testing.T) { t.Run("GetWitness", func(t *testing.T) { w, err := c.GetWitness(ctr) require.NoError(t, err) - v := vm.New() - v.SetCheckedHash(tx.VerificationHash().BytesBE()) - v.LoadScript(w.VerificationScript) - v.LoadScript(w.InvocationScript) + v := newTestVM(w, tx) require.NoError(t, v.Run()) require.Equal(t, 1, v.Estack().Len()) require.Equal(t, true, v.Estack().Pop().Value()) }) } +func newTestVM(w *transaction.Witness, tx *transaction.Transaction) *vm.VM { + v := vm.New() + v.RegisterInteropGetter(crypto.GetInterop(&interop.Context{Container: tx})) + v.LoadScript(w.VerificationScript) + v.LoadScript(w.InvocationScript) + return v +} + func TestParameterContext_MarshalJSON(t *testing.T) { priv, err := keys.NewPrivateKey() require.NoError(t, err) diff --git a/pkg/smartcontract/contract.go b/pkg/smartcontract/contract.go index d021637e5..274a9e80b 100644 --- a/pkg/smartcontract/contract.go +++ b/pkg/smartcontract/contract.go @@ -26,10 +26,12 @@ func CreateMultiSigRedeemScript(m int, publicKeys keys.PublicKeys) ([]byte, erro emit.Int(buf.BinWriter, int64(m)) sort.Sort(publicKeys) for _, pubKey := range publicKeys { - emit.Bytes(buf.BinWriter, pubKey.Bytes()) + emit.Instruction(buf.BinWriter, opcode.PUSHDATA1, []byte{33}) + buf.BinWriter.WriteBytes(pubKey.Bytes()) } emit.Int(buf.BinWriter, int64(len(publicKeys))) - emit.Opcode(buf.BinWriter, opcode.CHECKMULTISIG) + emit.Opcode(buf.BinWriter, opcode.PUSHNULL) + emit.Syscall(buf.BinWriter, "Neo.Crypto.ECDsaCheckMultiSig") return buf.Bytes(), nil } diff --git a/pkg/smartcontract/contract_test.go b/pkg/smartcontract/contract_test.go index f07683fe5..4ea1dae87 100644 --- a/pkg/smartcontract/contract_test.go +++ b/pkg/smartcontract/contract_test.go @@ -5,6 +5,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/crypto/keys" "github.com/nspcc-dev/neo-go/pkg/io" + "github.com/nspcc-dev/neo-go/pkg/vm/emit" "github.com/nspcc-dev/neo-go/pkg/vm/opcode" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -24,11 +25,14 @@ func TestCreateMultiSigRedeemScript(t *testing.T) { assert.Equal(t, opcode.PUSH3, opcode.Opcode(br.ReadB())) for i := 0; i < len(validators); i++ { + assert.EqualValues(t, opcode.PUSHDATA1, br.ReadB()) bb := br.ReadVarBytes() require.NoError(t, br.Err) assert.Equal(t, validators[i].Bytes(), bb) } assert.Equal(t, opcode.PUSH3, opcode.Opcode(br.ReadB())) - assert.Equal(t, opcode.CHECKMULTISIG, opcode.Opcode(br.ReadB())) + assert.Equal(t, opcode.PUSHNULL, opcode.Opcode(br.ReadB())) + assert.Equal(t, opcode.SYSCALL, opcode.Opcode(br.ReadB())) + assert.Equal(t, emit.InteropNameToID([]byte("Neo.Crypto.ECDsaCheckMultiSig")), br.ReadU32LE()) } diff --git a/pkg/vm/contract_checks.go b/pkg/vm/contract_checks.go index ac23b6c66..b5f3c5c91 100644 --- a/pkg/vm/contract_checks.go +++ b/pkg/vm/contract_checks.go @@ -3,9 +3,15 @@ package vm import ( "encoding/binary" + "github.com/nspcc-dev/neo-go/pkg/vm/emit" "github.com/nspcc-dev/neo-go/pkg/vm/opcode" ) +var ( + verifyInteropID = emit.InteropNameToID([]byte("Neo.Crypto.ECDsaVerify")) + multisigInteropID = emit.InteropNameToID([]byte("Neo.Crypto.ECDsaCheckMultiSig")) +) + func getNumOfThingsFromInstr(instr opcode.Opcode, param []byte) (int, bool) { var nthings int @@ -55,9 +61,12 @@ func ParseMultiSigContract(script []byte) ([][]byte, bool) { if err != nil { return nil, false } - if instr != opcode.PUSHBYTES33 { + if instr != opcode.PUSHDATA1 { break } + if len(param) < 33 { + return nil, false + } pubs = append(pubs, param) nkeys++ if nkeys > MaxArraySize { @@ -75,7 +84,11 @@ func ParseMultiSigContract(script []byte) ([][]byte, bool) { return nil, false } instr, _, err = ctx.Next() - if err != nil || instr != opcode.CHECKMULTISIG { + if err != nil || instr != opcode.PUSHNULL { + return nil, false + } + instr, param, err = ctx.Next() + if err != nil || instr != opcode.SYSCALL || binary.LittleEndian.Uint32(param) != multisigInteropID { return nil, false } instr, _, err = ctx.Next() @@ -88,17 +101,21 @@ func ParseMultiSigContract(script []byte) ([][]byte, bool) { // IsSignatureContract checks whether the passed script is a signature check // contract. func IsSignatureContract(script []byte) bool { + if len(script) != 41 { + return false + } + ctx := NewContext(script) - instr, _, err := ctx.Next() - if err != nil || instr != opcode.PUSHBYTES33 { + instr, param, err := ctx.Next() + if err != nil || instr != opcode.PUSHDATA1 || len(param) != 33 { return false } instr, _, err = ctx.Next() - if err != nil || instr != opcode.CHECKSIG { + if err != nil || instr != opcode.PUSHNULL { return false } - instr, _, err = ctx.Next() - if err != nil || instr != opcode.RET || ctx.ip != len(script) { + instr, param, err = ctx.Next() + if err != nil || instr != opcode.SYSCALL || binary.LittleEndian.Uint32(param) != verifyInteropID { return false } return true diff --git a/pkg/vm/contract_checks_test.go b/pkg/vm/contract_checks_test.go index fc2dcae85..4f5f83530 100644 --- a/pkg/vm/contract_checks_test.go +++ b/pkg/vm/contract_checks_test.go @@ -1,228 +1,117 @@ package vm import ( + "encoding/binary" "testing" + "github.com/nspcc-dev/neo-go/pkg/crypto/keys" + "github.com/nspcc-dev/neo-go/pkg/smartcontract" "github.com/nspcc-dev/neo-go/pkg/vm/opcode" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -func TestIsSignatureContractGood(t *testing.T) { - prog := make([]byte, 35) - prog[0] = byte(opcode.PUSHBYTES33) - prog[34] = byte(opcode.CHECKSIG) - assert.Equal(t, true, IsSignatureContract(prog)) - assert.Equal(t, true, IsStandardContract(prog)) +func testSignatureContract() []byte { + prog := make([]byte, 41) + prog[0] = byte(opcode.PUSHDATA1) + prog[1] = 33 + prog[35] = byte(opcode.PUSHNULL) + prog[36] = byte(opcode.SYSCALL) + binary.LittleEndian.PutUint32(prog[37:], verifyInteropID) + return prog } -func TestIsSignatureContractBadNoCheckSig(t *testing.T) { - prog := make([]byte, 34) - prog[0] = byte(opcode.PUSHBYTES33) - assert.Equal(t, false, IsSignatureContract(prog)) - assert.Equal(t, false, IsStandardContract(prog)) +func TestIsSignatureContract(t *testing.T) { + t.Run("valid contract", func(t *testing.T) { + prog := testSignatureContract() + assert.True(t, IsSignatureContract(prog)) + assert.True(t, IsStandardContract(prog)) + }) + + t.Run("invalid interop ID", func(t *testing.T) { + prog := testSignatureContract() + binary.LittleEndian.PutUint32(prog[37:], ^verifyInteropID) + assert.False(t, IsSignatureContract(prog)) + assert.False(t, IsStandardContract(prog)) + }) + + t.Run("invalid pubkey size", func(t *testing.T) { + prog := testSignatureContract() + prog[1] = 32 + assert.False(t, IsSignatureContract(prog)) + assert.False(t, IsStandardContract(prog)) + }) + + t.Run("no PUSHNULL", func(t *testing.T) { + prog := testSignatureContract() + prog[35] = byte(opcode.PUSH1) + assert.False(t, IsSignatureContract(prog)) + assert.False(t, IsStandardContract(prog)) + }) + + t.Run("invalid length", func(t *testing.T) { + prog := testSignatureContract() + prog = append(prog, 0) + assert.False(t, IsSignatureContract(prog)) + assert.False(t, IsStandardContract(prog)) + }) } -func TestIsSignatureContractBadNoCheckSig2(t *testing.T) { - prog := make([]byte, 35) - prog[0] = byte(opcode.PUSHBYTES33) - prog[34] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsSignatureContract(prog)) -} - -func TestIsSignatureContractBadWrongPush(t *testing.T) { - prog := make([]byte, 35) - prog[0] = byte(opcode.PUSHBYTES32) - prog[33] = byte(opcode.NOP) - prog[34] = byte(opcode.CHECKSIG) - assert.Equal(t, false, IsSignatureContract(prog)) -} - -func TestIsSignatureContractBadWrongInstr(t *testing.T) { - prog := make([]byte, 30) - prog[0] = byte(opcode.PUSHBYTES33) - assert.Equal(t, false, IsSignatureContract(prog)) -} - -func TestIsSignatureContractBadExcessiveInstr(t *testing.T) { - prog := make([]byte, 36) - prog[0] = byte(opcode.PUSHBYTES33) - prog[34] = byte(opcode.CHECKSIG) - prog[35] = byte(opcode.RET) - assert.Equal(t, false, IsSignatureContract(prog)) -} - -func TestIsMultiSigContractGood(t *testing.T) { - prog := make([]byte, 71) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, true, IsMultiSigContract(prog)) - assert.Equal(t, true, IsStandardContract(prog)) -} - -func TestIsMultiSigContractGoodPushBytes1(t *testing.T) { - prog := make([]byte, 73) - prog[0] = byte(opcode.PUSHBYTES1) - prog[1] = 2 - prog[2] = byte(opcode.PUSHBYTES33) - prog[36] = byte(opcode.PUSHBYTES33) - prog[70] = byte(opcode.PUSHBYTES1) - prog[71] = 2 - prog[72] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, true, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractGoodPushBytes2(t *testing.T) { - prog := make([]byte, 75) - prog[0] = byte(opcode.PUSHBYTES2) - prog[1] = 2 - prog[3] = byte(opcode.PUSHBYTES33) - prog[37] = byte(opcode.PUSHBYTES33) - prog[71] = byte(opcode.PUSHBYTES2) - prog[72] = 2 - prog[74] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, true, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadNSigs1(t *testing.T) { - prog := make([]byte, 71) - prog[0] = byte(opcode.PUSH0) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) - assert.Equal(t, false, IsStandardContract(prog)) -} - -func TestIsMultiSigContractBadNSigs2(t *testing.T) { - prog := make([]byte, 73) - prog[0] = byte(opcode.PUSHBYTES2) - prog[1] = 0xff - prog[2] = 0xff - prog[3] = byte(opcode.PUSHBYTES33) - prog[37] = byte(opcode.PUSHBYTES33) - prog[71] = byte(opcode.PUSH2) - prog[72] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadNSigs3(t *testing.T) { - prog := make([]byte, 71) - prog[0] = byte(opcode.PUSH5) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadExcessiveNOP1(t *testing.T) { - prog := make([]byte, 72) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.NOP) - prog[2] = byte(opcode.PUSHBYTES33) - prog[36] = byte(opcode.PUSHBYTES33) - prog[70] = byte(opcode.PUSH2) - prog[71] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadExcessiveNOP2(t *testing.T) { - prog := make([]byte, 72) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.NOP) - prog[36] = byte(opcode.PUSHBYTES33) - prog[70] = byte(opcode.PUSH2) - prog[71] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadExcessiveNOP3(t *testing.T) { - prog := make([]byte, 72) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.NOP) - prog[70] = byte(opcode.PUSH2) - prog[71] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadExcessiveNOP4(t *testing.T) { - prog := make([]byte, 72) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.NOP) - prog[71] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadExcessiveNOP5(t *testing.T) { - prog := make([]byte, 72) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.CHECKMULTISIG) - prog[71] = byte(opcode.NOP) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadNKeys1(t *testing.T) { - prog := make([]byte, 71) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH3) - prog[70] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} - -func TestIsMultiSigContractBadNKeys2(t *testing.T) { - prog := make([]byte, 1) - prog[0] = byte(opcode.PUSH10) - key := make([]byte, 33) - var asize = uint16(MaxArraySize + 1) - for i := 0; i < int(asize); i++ { - prog = append(prog, byte(opcode.PUSHBYTES33)) - prog = append(prog, key...) +func testMultisigContract(t *testing.T, n, m int) []byte { + pubs := make(keys.PublicKeys, n) + for i := 0; i < n; i++ { + priv, err := keys.NewPrivateKey() + require.NoError(t, err) + pubs[i] = priv.PublicKey() } - prog = append(prog, byte(opcode.PUSHBYTES2), byte(asize&0xff), byte((asize<<8)&0xff), byte(opcode.CHECKMULTISIG)) - assert.Equal(t, false, IsMultiSigContract(prog)) + + prog, err := smartcontract.CreateMultiSigRedeemScript(m, pubs) + require.NoError(t, err) + return prog } -func TestIsMultiSigContractBadRead1(t *testing.T) { - prog := make([]byte, 71) - prog[0] = byte(opcode.PUSHBYTES75) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} +func TestIsMultiSigContract(t *testing.T) { + t.Run("valid contract", func(t *testing.T) { + prog := testMultisigContract(t, 2, 2) + assert.True(t, IsMultiSigContract(prog)) + assert.True(t, IsStandardContract(prog)) + }) -func TestIsMultiSigContractBadRead2(t *testing.T) { - prog := make([]byte, 71) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES75) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.CHECKMULTISIG) - assert.Equal(t, false, IsMultiSigContract(prog)) -} + t.Run("0-length", func(t *testing.T) { + assert.False(t, IsMultiSigContract([]byte{})) + }) -func TestIsMultiSigContractBadRead3(t *testing.T) { - prog := make([]byte, 71) - prog[0] = byte(opcode.PUSH2) - prog[1] = byte(opcode.PUSHBYTES33) - prog[35] = byte(opcode.PUSHBYTES33) - prog[69] = byte(opcode.PUSH2) - prog[70] = byte(opcode.PUSHBYTES1) - assert.Equal(t, false, IsMultiSigContract(prog)) + t.Run("invalid param", func(t *testing.T) { + prog := []byte{byte(opcode.PUSHDATA1), 10} + assert.False(t, IsMultiSigContract(prog)) + }) + + t.Run("too many keys", func(t *testing.T) { + prog := testMultisigContract(t, 1025, 1) + assert.False(t, IsMultiSigContract(prog)) + }) + + t.Run("invalid interop ID", func(t *testing.T) { + prog := testMultisigContract(t, 2, 2) + prog[len(prog)-4] ^= 0xFF + assert.False(t, IsMultiSigContract(prog)) + }) + + t.Run("no PUSHNULL", func(t *testing.T) { + prog := testMultisigContract(t, 2, 2) + prog[len(prog)-6] ^= 0xFF + assert.False(t, IsMultiSigContract(prog)) + }) + + t.Run("invalid keys number", func(t *testing.T) { + prog := testMultisigContract(t, 2, 2) + prog[len(prog)-7] = byte(opcode.PUSH3) + assert.False(t, IsMultiSigContract(prog)) + }) + + t.Run("invalid length", func(t *testing.T) { + prog := testMultisigContract(t, 2, 2) + prog = append(prog, 0) + assert.False(t, IsMultiSigContract(prog)) + }) } diff --git a/pkg/wallet/account_test.go b/pkg/wallet/account_test.go index 365c28f8d..c50fad32d 100644 --- a/pkg/wallet/account_test.go +++ b/pkg/wallet/account_test.go @@ -90,7 +90,7 @@ func TestContract_ScriptHash(t *testing.T) { func TestAccount_ConvertMultisig(t *testing.T) { // test is based on a wallet1_solo.json accounts from neo-local - a, err := NewAccountFromEncryptedWIF("6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y", "one") + a, err := NewAccountFromEncryptedWIF("6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", "one") require.NoError(t, err) hexs := []string{ @@ -113,13 +113,13 @@ func TestAccount_ConvertMultisig(t *testing.T) { t.Run("1/1 multisig", func(t *testing.T) { pubs := convertPubs(t, hexs[:1]) require.NoError(t, a.ConvertMultisig(1, pubs)) - require.Equal(t, "AbU69m8WUZJSWanfr1Cy66cpEcsmMcX7BR", a.Address) + require.Equal(t, "Ab3TJfgpa94yDr1WPeXpYQiChTRohBJ6T5", a.Address) }) t.Run("3/4 multisig", func(t *testing.T) { pubs := convertPubs(t, hexs) require.NoError(t, a.ConvertMultisig(3, pubs)) - require.Equal(t, "AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU", a.Address) + require.Equal(t, "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", a.Address) }) } diff --git a/pkg/wallet/testdata/wallet1.json b/pkg/wallet/testdata/wallet1.json index d03726fd9..584fc1f5f 100644 --- a/pkg/wallet/testdata/wallet1.json +++ b/pkg/wallet/testdata/wallet1.json @@ -1 +1,56 @@ -{"name":"wallet1","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} \ No newline at end of file +{ + "name": "wallet1", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "4c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc250680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} \ No newline at end of file diff --git a/pkg/wallet/testdata/wallet2.json b/pkg/wallet/testdata/wallet2.json index 926d0d688..e36b40d14 100644 --- a/pkg/wallet/testdata/wallet2.json +++ b/pkg/wallet/testdata/wallet2.json @@ -1 +1,74 @@ -{"name":"wallet2","version":"1.0","scrypt":{"n":16384,"r":8,"p":8},"accounts":[{"address":"AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs","label":null,"isDefault":false,"lock":false,"key":"6PYLmjBYJ4wQTCEfqvnznGJwZeW9pfUcV5m5oreHxqryUgqKpTRAFt9L8Y","contract":{"script":"2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc2ac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null},{"address":"AZ81H31DMWzbSnFDLFkzh9vHwaDLayV7fU","label":null,"isDefault":false,"lock":false,"key":"6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L","contract":{"script":"532102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd622102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc22103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee69954ae","parameters":[{"name":"parameter0","type":"Signature"},{"name":"parameter1","type":"Signature"},{"name":"parameter2","type":"Signature"}],"deployed":false},"extra":null},{"address":"AWLYWXB8C9Lt1nHdDZJnC5cpYJjgRDLk17","label":null,"isDefault":true,"lock":false,"key":"6PYXHjPaNvW8YknSXaKsTWjf9FRxo1s4naV2jdmSQEgzaqKGX368rndN3L","contract":{"script":"2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406eac","parameters":[{"name":"parameter0","type":"Signature"}],"deployed":false},"extra":null}],"extra":null} +{ + "name": "wallet2", + "version": "1.0", + "scrypt": { + "n": 16384, + "r": 8, + "p": 8 + }, + "accounts": [ + { + "address": "AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "4c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc250680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AbHd9dXYUryuCvMgXRUfdR6zC2CJixS6Q6", + "label": null, + "isDefault": false, + "lock": false, + "key": "6PYKYQKRs758NBX4q5k6fSmduZDfEfQyoXMovQU5myKm2h5ArXuYpuMEaN", + "contract": { + "script": "534c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e4c2102a7bc55fe8684e0119768d104ba30795bdcc86619e864add26156723ed185cd624c2102b3622bf4017bdfe317c58aed5f4c753f206b7db896046fa7d774bbc4bf7f8dc24c2103d90c07df63e690ce77912e10ab51acc944b66860237b608c4f8f8309e71ee6995450683073b3bb", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + }, + { + "name": "parameter1", + "type": "Signature" + }, + { + "name": "parameter2", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + }, + { + "address": "AdB6ayKfBRJZasiXX4JL5N2YtmxftNp1b3", + "label": null, + "isDefault": true, + "lock": false, + "key": "6PYXPEFeBxeDjqMiwRrSe81LnpL1cpw1WSwENJY1p4NtgSbfZPaUFy8Kkg", + "contract": { + "script": "4c2102103a7f7dd016558597f7960d27c516a4394fd968b9e65155eb4b013e4040406e50680a906ad4", + "parameters": [ + { + "name": "parameter0", + "type": "Signature" + } + ], + "deployed": false + }, + "extra": null + } + ], + "extra": null +} diff --git a/pkg/wallet/wallet_test.go b/pkg/wallet/wallet_test.go index 70eef7534..ac2951162 100644 --- a/pkg/wallet/wallet_test.go +++ b/pkg/wallet/wallet_test.go @@ -181,14 +181,14 @@ func TestWalletGetChangeAddress(t *testing.T) { require.NoError(t, err) sh := w1.GetChangeAddress() // No default address, the first one is used. - expected, err := address.StringToUint160("AKkkumHbBipZ46UMZJoFynJMXzSRnBvKcs") + expected, err := address.StringToUint160("AQyx83BYr1PkyYhZhUAogaHdhkLVHn6htY") require.NoError(t, err) require.Equal(t, expected, sh) w2, err := NewWalletFromFile("testdata/wallet2.json") require.NoError(t, err) sh = w2.GetChangeAddress() // Default address. - expected, err = address.StringToUint160("AWLYWXB8C9Lt1nHdDZJnC5cpYJjgRDLk17") + expected, err = address.StringToUint160("AdB6ayKfBRJZasiXX4JL5N2YtmxftNp1b3") require.NoError(t, err) require.Equal(t, expected, sh) }