From 6b9b37f170e19db4fa9d422da8fe0c3ca94bbc3c Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 22 Jan 2021 11:28:13 +0300 Subject: [PATCH 1/2] native: don't call CreateNativeContractHash() in oracle contract Move oracleScript from global context to Oracle itself. We have the hash already computed by NewContractMD, there is no need to repeat this calculation. --- pkg/core/blockchain.go | 2 +- pkg/core/blockchain_test.go | 2 +- pkg/core/native/oracle.go | 40 +++++++++++++++------------------- pkg/core/native_oracle_test.go | 4 ++-- 4 files changed, 22 insertions(+), 26 deletions(-) diff --git a/pkg/core/blockchain.go b/pkg/core/blockchain.go index 3af24d84b..f143259e8 100644 --- a/pkg/core/blockchain.go +++ b/pkg/core/blockchain.go @@ -1395,7 +1395,7 @@ func (bc *Blockchain) verifyTxAttributes(tx *transaction.Transaction, isPartialT if !hasOracle { return fmt.Errorf("%w: oracle tx is not signed by oracle nodes", ErrInvalidAttribute) } - if !bytes.Equal(tx.Script, native.GetOracleResponseScript()) { + if !bytes.Equal(tx.Script, bc.contracts.Oracle.GetOracleResponseScript()) { return fmt.Errorf("%w: oracle tx has invalid script", ErrInvalidAttribute) } resp := tx.Attributes[i].Value.(*transaction.OracleResponse) diff --git a/pkg/core/blockchain_test.go b/pkg/core/blockchain_test.go index b7548d6d2..af8bfa062 100644 --- a/pkg/core/blockchain_test.go +++ b/pkg/core/blockchain_test.go @@ -500,7 +500,7 @@ func TestVerifyTx(t *testing.T) { // We need to create new transaction, // because hashes are cached after signing. getOracleTx := func(t *testing.T) *transaction.Transaction { - tx := bc.newTestTx(h, native.GetOracleResponseScript()) + tx := bc.newTestTx(h, orc.GetOracleResponseScript()) resp := &transaction.OracleResponse{ ID: 1, Code: transaction.Success, diff --git a/pkg/core/native/oracle.go b/pkg/core/native/oracle.go index 88e9360cd..9c84570b5 100644 --- a/pkg/core/native/oracle.go +++ b/pkg/core/native/oracle.go @@ -34,7 +34,8 @@ type Oracle struct { GAS *GAS NEO *NEO - Desig *Designate + Desig *Designate + oracleScript []byte } const ( @@ -49,20 +50,6 @@ const ( oracleRequestPrice = 5000_0000 ) -var oracleScript []byte - -func init() { - _, h := state.CreateNativeContractHash(oracleContractID) - w := io.NewBufBinWriter() - emit.Int(w.BinWriter, 0) - emit.Opcodes(w.BinWriter, opcode.NEWARRAY) - emit.Int(w.BinWriter, int64(callflag.All)) - emit.String(w.BinWriter, "finish") - emit.Bytes(w.BinWriter, h.BytesBE()) - emit.Syscall(w.BinWriter, interopnames.SystemContractCall) - oracleScript = w.Bytes() -} - var ( prefixIDList = []byte{6} prefixRequest = []byte{7} @@ -78,16 +65,18 @@ var ( ErrResponseNotFound = errors.New("oracle response not found") ) -// GetOracleResponseScript returns script for transaction with oracle response. -func GetOracleResponseScript() []byte { - b := make([]byte, len(oracleScript)) - copy(b, oracleScript) - return b -} - func newOracle() *Oracle { o := &Oracle{ContractMD: *interop.NewContractMD(nativenames.Oracle, oracleContractID)} + w := io.NewBufBinWriter() + emit.Int(w.BinWriter, 0) + emit.Opcodes(w.BinWriter, opcode.NEWARRAY) + emit.Int(w.BinWriter, int64(callflag.All)) + emit.String(w.BinWriter, "finish") + emit.Bytes(w.BinWriter, o.Hash.BytesBE()) + emit.Syscall(w.BinWriter, interopnames.SystemContractCall) + o.oracleScript = w.Bytes() + desc := newDescriptor("request", smartcontract.VoidType, manifest.NewParameter("url", smartcontract.StringType), manifest.NewParameter("filter", smartcontract.StringType), @@ -115,6 +104,13 @@ func newOracle() *Oracle { return o } +// GetOracleResponseScript returns script for transaction with oracle response. +func (o *Oracle) GetOracleResponseScript() []byte { + b := make([]byte, len(o.oracleScript)) + copy(b, o.oracleScript) + return b +} + // OnPersist implements Contract interface. func (o *Oracle) OnPersist(ic *interop.Context) error { return nil diff --git a/pkg/core/native_oracle_test.go b/pkg/core/native_oracle_test.go index b316bc3e5..b6ac58d64 100644 --- a/pkg/core/native_oracle_test.go +++ b/pkg/core/native_oracle_test.go @@ -153,7 +153,7 @@ func TestOracle_Request(t *testing.T) { err = bc.contracts.Designate.DesignateAsRole(ic, native.RoleOracle, keys.PublicKeys{pub}) require.NoError(t, err) - tx = transaction.New(netmode.UnitTestNet, native.GetOracleResponseScript(), 0) + tx = transaction.New(netmode.UnitTestNet, orc.GetOracleResponseScript(), 0) ic.Tx = tx ic.Block = bc.newBlock(tx) @@ -203,7 +203,7 @@ func TestOracle_Request(t *testing.T) { _, err := orc.GetRequestInternal(bc.dao, reqID) // ensure ID is 2 require.NoError(t, err) - tx = transaction.New(netmode.UnitTestNet, native.GetOracleResponseScript(), 0) + tx = transaction.New(netmode.UnitTestNet, orc.GetOracleResponseScript(), 0) tx.Attributes = []transaction.Attribute{{ Type: transaction.OracleResponseT, Value: &transaction.OracleResponse{ From 054ca27e9cab7556d90771b6fb8c964fb9561c74 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Fri, 22 Jan 2021 12:22:48 +0300 Subject: [PATCH 2/2] state: use checksums and names to calculate contract hashes It allows to deploy the same NEF using one sender and get different contract hashes. See neo-project/neo#2240. --- cli/contract_test.go | 25 ++++++++++++++++++------- cli/smartcontract/smart_contract.go | 21 +++++++++++++++++++-- cli/testdata/chain50x2.acc | Bin 45874 -> 45879 bytes internal/testchain/transaction.go | 2 +- pkg/core/blockchain_test.go | 4 ++-- pkg/core/interop/context.go | 3 ++- pkg/core/native/compatibility_test.go | 12 ++++++------ pkg/core/native/management.go | 2 +- pkg/core/native/management_test.go | 6 +++--- pkg/core/native_management_test.go | 8 ++++---- pkg/core/state/contract.go | 12 ++++++------ pkg/core/state/contract_test.go | 14 +++++++++++--- pkg/rpc/server/server_test.go | 6 +++--- pkg/rpc/server/testdata/testblocks.acc | Bin 7675 -> 7675 bytes 14 files changed, 76 insertions(+), 39 deletions(-) diff --git a/cli/contract_test.go b/cli/contract_test.go index f8886d33c..556dd5cc7 100644 --- a/cli/contract_test.go +++ b/cli/contract_test.go @@ -17,6 +17,7 @@ import ( "github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/encoding/fixedn" "github.com/nspcc-dev/neo-go/pkg/rpc/response/result" + "github.com/nspcc-dev/neo-go/pkg/smartcontract/manifest" "github.com/nspcc-dev/neo-go/pkg/smartcontract/nef" "github.com/nspcc-dev/neo-go/pkg/util" "github.com/nspcc-dev/neo-go/pkg/vm" @@ -33,28 +34,37 @@ func TestCalcHash(t *testing.T) { require.NoError(t, err) nefF, err := nef.FileFromBytes(src) require.NoError(t, err) + manifestPath := "./testdata/verify.manifest.json" + manifestBytes, err := ioutil.ReadFile(manifestPath) + require.NoError(t, err) + manif := &manifest.Manifest{} + err = json.Unmarshal(manifestBytes, manif) + require.NoError(t, err) sender := random.Uint160() cmd := []string{"neo-go", "contract", "calc-hash"} t.Run("no sender", func(t *testing.T) { - e.RunWithError(t, append(cmd, "--in", nefPath)...) + e.RunWithError(t, append(cmd, "--in", nefPath, "--manifest", manifestPath)...) }) t.Run("no nef file", func(t *testing.T) { - e.RunWithError(t, append(cmd, "--sender", sender.StringLE())...) + e.RunWithError(t, append(cmd, "--sender", sender.StringLE(), "--manifest", manifestPath)...) + }) + t.Run("no manifest file", func(t *testing.T) { + e.RunWithError(t, append(cmd, "--sender", sender.StringLE(), "--in", nefPath)...) }) t.Run("invalid path", func(t *testing.T) { e.RunWithError(t, append(cmd, "--sender", sender.StringLE(), - "--in", "./testdata/verify.nef123")...) + "--in", "./testdata/verify.nef123", "--manifest", manifestPath)...) }) t.Run("invalid file", func(t *testing.T) { p := path.Join(os.TempDir(), "neogo.calchash.verify.nef") defer os.Remove(p) require.NoError(t, ioutil.WriteFile(p, src[:4], os.ModePerm)) - e.RunWithError(t, append(cmd, "--sender", sender.StringLE(), "--in", p)...) + e.RunWithError(t, append(cmd, "--sender", sender.StringLE(), "--in", p, "--manifest", manifestPath)...) }) - cmd = append(cmd, "--in", nefPath) - expected := state.CreateContractHash(sender, nefF.Script) + cmd = append(cmd, "--in", nefPath, "--manifest", manifestPath) + expected := state.CreateContractHash(sender, nefF.Checksum, manif.Name) t.Run("valid, uint160", func(t *testing.T) { e.Run(t, append(cmd, "--sender", sender.StringLE())...) e.checkNextLine(t, expected.StringLE()) @@ -193,7 +203,8 @@ func TestComlileAndInvokeFunction(t *testing.T) { t.Run("check calc hash", func(t *testing.T) { e.Run(t, "neo-go", "contract", "calc-hash", - "--sender", validatorAddr, "--in", nefName) + "--sender", validatorAddr, "--in", nefName, + "--manifest", manifestName) e.checkNextLine(t, h.StringLE()) }) diff --git a/cli/smartcontract/smart_contract.go b/cli/smartcontract/smart_contract.go index 681949158..a8d87a1d7 100644 --- a/cli/smartcontract/smart_contract.go +++ b/cli/smartcontract/smart_contract.go @@ -351,6 +351,10 @@ func NewCommands() []cli.Command { Name: "in", Usage: "path to NEF file", }, + cli.StringFlag{ + Name: "manifest, m", + Usage: "path to manifest file", + }, }, }, }, @@ -473,6 +477,10 @@ func calcHash(ctx *cli.Context) error { if p == "" { return cli.NewExitError(errors.New("no .nef file was provided"), 1) } + mpath := ctx.String("manifest") + if mpath == "" { + return cli.NewExitError(errors.New("no manifest file provided"), 1) + } f, err := ioutil.ReadFile(p) if err != nil { return cli.NewExitError(fmt.Errorf("can't read .nef file: %w", err), 1) @@ -481,7 +489,16 @@ func calcHash(ctx *cli.Context) error { if err != nil { return cli.NewExitError(fmt.Errorf("can't unmarshal .nef file: %w", err), 1) } - fmt.Fprintln(ctx.App.Writer, "Contract hash:", state.CreateContractHash(u, nefFile.Script).StringLE()) + manifestBytes, err := ioutil.ReadFile(mpath) + if err != nil { + return cli.NewExitError(fmt.Errorf("failed to read manifest file: %w", err), 1) + } + m := &manifest.Manifest{} + err = json.Unmarshal(manifestBytes, m) + if err != nil { + return cli.NewExitError(fmt.Errorf("failed to restore manifest file: %w", err), 1) + } + fmt.Fprintln(ctx.App.Writer, "Contract hash:", state.CreateContractHash(u, nefFile.Checksum, m.Name).StringLE()) return nil } @@ -842,7 +859,7 @@ func contractDeploy(ctx *cli.Context) error { if err != nil { return cli.NewExitError(fmt.Errorf("failed to push invocation tx: %w", err), 1) } - hash := state.CreateContractHash(sender, nefFile.Script) + hash := state.CreateContractHash(sender, nefFile.Checksum, m.Name) fmt.Fprintf(ctx.App.Writer, "Contract: %s\n", hash.StringLE()) fmt.Fprintln(ctx.App.Writer, txHash.StringLE()) return nil diff --git a/cli/testdata/chain50x2.acc b/cli/testdata/chain50x2.acc index e78bd4eb9f2a77580ade70d3c638ea1002eb22e4..830712741f6f880cf18643a26377b1530982d758 100644 GIT binary patch literal 45879 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

fi}j)HGBZSmR{A?I5}92RjcsC_Dx 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 L!8lw1=*s>F&T7bW literal 45874 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

j)X1=6CNmV-7i4QSfx(Bqg_%ie?zflw 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 YaQYY-)`e%s=N#K(MlR$Y@b~Ng0Lzk+l>h($ diff --git a/internal/testchain/transaction.go b/internal/testchain/transaction.go index 2efcb70ad..8f8a4aa11 100644 --- a/internal/testchain/transaction.go +++ b/internal/testchain/transaction.go @@ -84,7 +84,7 @@ func NewDeployTx(bc blockchainer.Blockchainer, name string, sender util.Uint160, tx := transaction.New(Network(), buf.Bytes(), 100*native.GASFactor) tx.Signers = []transaction.Signer{{Account: sender}} - h := state.CreateContractHash(tx.Sender(), avm) + h := state.CreateContractHash(tx.Sender(), ne.Checksum, name) return tx, h, nil } diff --git a/pkg/core/blockchain_test.go b/pkg/core/blockchain_test.go index af8bfa062..83f83a971 100644 --- a/pkg/core/blockchain_test.go +++ b/pkg/core/blockchain_test.go @@ -556,11 +556,11 @@ func TestVerifyTx(t *testing.T) { }) tx.Scripts = append(tx.Scripts, transaction.Witness{}) t.Run("NonZeroVerification", func(t *testing.T) { - script, _ := state.CreateNativeContractHash(-6) //oracleContractID w := io.NewBufBinWriter() emit.Opcodes(w.BinWriter, opcode.ABORT) emit.Bytes(w.BinWriter, util.Uint160{}.BytesBE()) - emit.Bytes(w.BinWriter, script) + emit.Int(w.BinWriter, int64(orc.NEF.Checksum)) + emit.String(w.BinWriter, orc.Manifest.Name) tx.Scripts[len(tx.Scripts)-1].VerificationScript = w.Bytes() err := bc.VerifyTx(tx) require.True(t, errors.Is(err, ErrNativeContractWitness), "got: %v", err) diff --git a/pkg/core/interop/context.go b/pkg/core/interop/context.go index 02ac19bfb..c649d6984 100644 --- a/pkg/core/interop/context.go +++ b/pkg/core/interop/context.go @@ -119,8 +119,9 @@ func NewContractMD(name string, id int32) *ContractMD { // Therefore values are taken from C# node. c.NEF.Header.Compiler = "neo-core-v3.0" c.NEF.Header.Magic = nef.Magic - c.NEF.Script, c.Hash = state.CreateNativeContractHash(id) + c.NEF.Script = state.CreateNativeContractScript(id) c.NEF.Checksum = c.NEF.CalculateChecksum() + c.Hash = state.CreateContractHash(util.Uint160{}, c.NEF.Checksum, name) c.Manifest = *manifest.DefaultManifest(name) return c diff --git a/pkg/core/native/compatibility_test.go b/pkg/core/native/compatibility_test.go index d027377f8..de96eb982 100644 --- a/pkg/core/native/compatibility_test.go +++ b/pkg/core/native/compatibility_test.go @@ -8,12 +8,12 @@ import ( // Compatibility test. hashes are taken directly from C# node. func TestNativeHashes(t *testing.T) { - require.Equal(t, "bee421fdbb3e791265d2104cb34934f53fcc0e45", newManagement().Hash.StringLE()) - require.Equal(t, "4961bf0ab79370b23dc45cde29f568d0e0fa6e93", newNEO().Hash.StringLE()) - require.Equal(t, "9ac04cf223f646de5f7faccafe34e30e5d4382a2", newGAS().Hash.StringLE()) - require.Equal(t, "c939a4af1c762e5edca36d4b61c06ba82c4c6ff5", newPolicy().Hash.StringLE()) - require.Equal(t, "f4bbd95569e8dda2cb84eb609a1488ddd0d9fa91", newDesignate(false).Hash.StringLE()) - require.Equal(t, "8cd3889136056b3304ec59f6d424b8767710ed79", newOracle().Hash.StringLE()) + require.Equal(t, "a501d7d7d10983673b61b7a2d3a813b36f9f0e43", newManagement().Hash.StringLE()) + require.Equal(t, "f617baca689d1abddedda7c3b80675c4ac21e932", newNEO().Hash.StringLE()) + require.Equal(t, "75844530eb44f4715a42950bb59b4d7ace0b2f3d", newGAS().Hash.StringLE()) + require.Equal(t, "e21a28cfc1e662e152f668c86198141cc17b6c37", newPolicy().Hash.StringLE()) + require.Equal(t, "69b1909aaa14143b0624ba0d61d5cd3b8b67529d", newDesignate(false).Hash.StringLE()) + require.Equal(t, "b82bbf650f963dbf71577d10ea4077e711a13e7b", newOracle().Hash.StringLE()) // Not yet a part of NEO. //require.Equal(t, "", newNotary().Hash.StringLE()()) } diff --git a/pkg/core/native/management.go b/pkg/core/native/management.go index 1face8fc9..f25843c81 100644 --- a/pkg/core/native/management.go +++ b/pkg/core/native/management.go @@ -239,7 +239,7 @@ func (m *Management) markUpdated(h util.Uint160) { // Deploy creates contract's hash/ID and saves new contract into the given DAO. // It doesn't run _deploy method and doesn't emit notification. func (m *Management) Deploy(d dao.DAO, sender util.Uint160, neff *nef.File, manif *manifest.Manifest) (*state.Contract, error) { - h := state.CreateContractHash(sender, neff.Script) + h := state.CreateContractHash(sender, neff.Checksum, manif.Name) key := makeContractKey(h) si := d.GetStorageItem(m.ContractID, key) if si != nil { diff --git a/pkg/core/native/management_test.go b/pkg/core/native/management_test.go index 8d1571baa..fa654e985 100644 --- a/pkg/core/native/management_test.go +++ b/pkg/core/native/management_test.go @@ -18,13 +18,13 @@ func TestDeployGetUpdateDestroyContract(t *testing.T) { d := dao.NewSimple(storage.NewMemoryStore(), netmode.UnitTestNet, false) script := []byte{1} sender := util.Uint160{1, 2, 3} - h := state.CreateContractHash(sender, script) - ne, err := nef.NewFile(script) require.NoError(t, err) manif := manifest.NewManifest("Test") require.NoError(t, err) + h := state.CreateContractHash(sender, ne.Checksum, manif.Name) + contract, err := mgmt.Deploy(d, sender, ne, manif) require.NoError(t, err) require.Equal(t, int32(1), contract.ID) @@ -43,7 +43,7 @@ func TestDeployGetUpdateDestroyContract(t *testing.T) { require.NoError(t, err) require.Equal(t, int32(2), contract2.ID) require.Equal(t, uint16(0), contract2.UpdateCounter) - require.Equal(t, state.CreateContractHash(sender2, script), contract2.Hash) + require.Equal(t, state.CreateContractHash(sender2, ne.Checksum, manif.Name), contract2.Hash) require.Equal(t, ne, &contract2.NEF) require.Equal(t, *manif, contract2.Manifest) diff --git a/pkg/core/native_management_test.go b/pkg/core/native_management_test.go index 687998e1f..eb94d5bf9 100644 --- a/pkg/core/native_management_test.go +++ b/pkg/core/native_management_test.go @@ -36,7 +36,7 @@ func TestRestoreAfterDeploy(t *testing.T) { mgmtHash := bc.ManagementContractHash() cs1, _ := getTestContractState(bc) cs1.ID = 1 - cs1.Hash = state.CreateContractHash(testchain.MultisigScriptHash(), cs1.NEF.Script) + cs1.Hash = state.CreateContractHash(testchain.MultisigScriptHash(), cs1.NEF.Checksum, cs1.Manifest.Name) manif1, err := json.Marshal(cs1.Manifest) require.NoError(t, err) nef1, err := nef.NewFile(cs1.NEF.Script) @@ -80,7 +80,7 @@ func TestContractDeploy(t *testing.T) { mgmtHash := bc.ManagementContractHash() cs1, _ := getTestContractState(bc) cs1.ID = 1 - cs1.Hash = state.CreateContractHash(testchain.MultisigScriptHash(), cs1.NEF.Script) + cs1.Hash = state.CreateContractHash(testchain.MultisigScriptHash(), cs1.NEF.Checksum, cs1.Manifest.Name) manif1, err := json.Marshal(cs1.Manifest) require.NoError(t, err) nef1b, err := cs1.NEF.Bytes() @@ -214,7 +214,7 @@ func TestContractDeploy(t *testing.T) { checkFAULTState(t, res) t.Run("get after failed deploy", func(t *testing.T) { - h := state.CreateContractHash(neoOwner, deployScript) + h := state.CreateContractHash(neoOwner, nefD.Checksum, m.Name) checkContractState(t, bc, h, nil) }) }) @@ -243,7 +243,7 @@ func TestContractDeploy(t *testing.T) { checkFAULTState(t, res) t.Run("get after bad _deploy", func(t *testing.T) { - h := state.CreateContractHash(neoOwner, deployScript) + h := state.CreateContractHash(neoOwner, nefD.Checksum, m.Name) checkContractState(t, bc, h, nil) }) }) diff --git a/pkg/core/state/contract.go b/pkg/core/state/contract.go index ab5e028ab..a3cf8cf03 100644 --- a/pkg/core/state/contract.go +++ b/pkg/core/state/contract.go @@ -112,25 +112,25 @@ func (c *Contract) FromStackItem(item stackitem.Item) error { // CreateContractHash creates deployed contract hash from transaction sender // and contract script. -func CreateContractHash(sender util.Uint160, script []byte) util.Uint160 { +func CreateContractHash(sender util.Uint160, checksum uint32, name string) util.Uint160 { w := io.NewBufBinWriter() emit.Opcodes(w.BinWriter, opcode.ABORT) emit.Bytes(w.BinWriter, sender.BytesBE()) - emit.Bytes(w.BinWriter, script) + emit.Int(w.BinWriter, int64(checksum)) + emit.String(w.BinWriter, name) if w.Err != nil { panic(w.Err) } return hash.Hash160(w.Bytes()) } -// CreateNativeContractHash returns script and hash for the native contract. -func CreateNativeContractHash(id int32) ([]byte, util.Uint160) { +// CreateNativeContractScript returns script for the native contract. +func CreateNativeContractScript(id int32) []byte { w := io.NewBufBinWriter() emit.Int(w.BinWriter, int64(id)) emit.Syscall(w.BinWriter, interopnames.SystemContractCallNative) if w.Err != nil { panic(w.Err) } - script := w.Bytes() - return script, CreateContractHash(util.Uint160{}, script) + return w.Bytes() } diff --git a/pkg/core/state/contract_test.go b/pkg/core/state/contract_test.go index 5d4c224f1..6f102a9e5 100644 --- a/pkg/core/state/contract_test.go +++ b/pkg/core/state/contract_test.go @@ -62,14 +62,22 @@ func TestEncodeDecodeContractState(t *testing.T) { } func TestCreateContractHash(t *testing.T) { - var script = []byte{1, 2, 3} + var neff = nef.File{ + Header: nef.Header{ + Compiler: "test", + Magic: nef.Magic, + }, + Tokens: []nef.MethodToken{}, + Script: []byte{1, 2, 3}, + } var sender util.Uint160 var err error - require.Equal(t, "b8e95ff7b11c427c29355e3398722d97bd2ca069", CreateContractHash(sender, script).StringLE()) + neff.Checksum = neff.CalculateChecksum() + require.Equal(t, "9b9628e4f1611af90e761eea8cc21372380c74b6", CreateContractHash(sender, neff.Checksum, "").StringLE()) sender, err = util.Uint160DecodeStringLE("a400ff00ff00ff00ff00ff00ff00ff00ff00ff01") require.NoError(t, err) - require.Equal(t, "435c467b8e15cb9b1474ad7ee817ffdcfededef9", CreateContractHash(sender, script).StringLE()) + require.Equal(t, "66eec404d86b918d084e62a29ac9990e3b6f4286", CreateContractHash(sender, neff.Checksum, "").StringLE()) } func TestContractFromStackItem(t *testing.T) { diff --git a/pkg/rpc/server/server_test.go b/pkg/rpc/server/server_test.go index 259321b3f..f88d5a985 100644 --- a/pkg/rpc/server/server_test.go +++ b/pkg/rpc/server/server_test.go @@ -56,11 +56,11 @@ type rpcTestCase struct { check func(t *testing.T, e *executor, result interface{}) } -const testContractHash = "0b3bc97e94ed99e32dda46c9ecd2d3626979af06" -const deploymentTxHash = "e3a67acac29014dc8c24773752ac4535a0f020486749ec5c907234fc9328246c" +const testContractHash = "c6436aab21ebd15279b85af8d7b5808d38455b0a" +const deploymentTxHash = "e6ffce4533231c4efdea9a65c7abc0e7073d96a4ebc66f402db3a84b6f8939ef" const genesisBlockHash = "0542f4350c6e236d0509bcd98188b0034bfbecc1a0c7fcdb8e4295310d468b70" -const verifyContractHash = "d2da8ee8c0bf6c5bf3dda1ef671dbf5fef7226e9" +const verifyContractHash = "03ffc0897543b9b709e0f8cab4a7682dae0ba943" const verifyContractAVM = "570300412d51083021700c14aa8acf859d4fe402b34e673f2156821796a488ebdb30716813cedb2869db289740" const testVerifyContractAVM = "VwcADBQBDAMOBQYMDQIODw0DDgcJAAAAANswcGgRVUH4J+yMIaonBwAAABFADBQNDwMCCQACAQMHAwQFAgEADgYMCdswcWkRVUH4J+yMIaonBwAAABJAE0A=" diff --git a/pkg/rpc/server/testdata/testblocks.acc b/pkg/rpc/server/testdata/testblocks.acc index f3e5350c932bd6f549901eebe9f55a93e9601a99..ac9b113acf0b840db78298304731f972261b4444 100644 GIT binary patch delta 3307 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 delta 3279 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