From 53c9690bdce61050eaab052ce3896cf591e0f18d Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Tue, 29 Sep 2020 09:56:19 +0300 Subject: [PATCH] interop/runtime: allow calling script hash to pass CheckWitness See neo-project/neo#1924 and neo-project/neo#1925. --- pkg/core/blockchain_test.go | 2 ++ pkg/core/interop/runtime/witness.go | 4 ++++ pkg/core/native_neo_test.go | 3 +++ pkg/core/native_oracle_test.go | 4 +++- 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/core/blockchain_test.go b/pkg/core/blockchain_test.go index 101cc6c6b..365dd14e4 100644 --- a/pkg/core/blockchain_test.go +++ b/pkg/core/blockchain_test.go @@ -431,6 +431,8 @@ func TestVerifyTx(t *testing.T) { VerificationScript: testchain.CommitteeVerificationScript(), }} ic := bc.newInteropContext(trigger.All, bc.dao, nil, txSetOracle) + ic.SpawnVM() + ic.VM.LoadScript([]byte{byte(opcode.RET)}) require.NoError(t, bc.contracts.Oracle.SetOracleNodes(ic, oraclePubs)) bc.contracts.Oracle.OnPersistEnd(ic.DAO) _, err = ic.DAO.Persist() diff --git a/pkg/core/interop/runtime/witness.go b/pkg/core/interop/runtime/witness.go index d721990c5..7e6eeebb3 100644 --- a/pkg/core/interop/runtime/witness.go +++ b/pkg/core/interop/runtime/witness.go @@ -17,6 +17,10 @@ import ( // CheckHashedWitness checks given hash against current list of script hashes // for verifying in the interop context. func CheckHashedWitness(ic *interop.Context, hash util.Uint160) (bool, error) { + callingSH := ic.VM.GetCallingScriptHash() + if !callingSH.Equals(util.Uint160{}) && hash.Equals(callingSH) { + return true, nil + } if tx, ok := ic.Container.(*transaction.Transaction); ok { return checkScope(ic.DAO, tx, ic.VM, hash) } diff --git a/pkg/core/native_neo_test.go b/pkg/core/native_neo_test.go index 4c200c0fc..6a86ec5b3 100644 --- a/pkg/core/native_neo_test.go +++ b/pkg/core/native_neo_test.go @@ -127,6 +127,7 @@ func TestNEO_SetGasPerBlock(t *testing.T) { tx := transaction.New(netmode.UnitTestNet, []byte{}, 0) ic := bc.newInteropContext(trigger.System, bc.dao, nil, tx) ic.VM = vm.New() + ic.VM.LoadScript([]byte{byte(opcode.RET)}) h := neo.GetCommitteeAddress() t.Run("Default", func(t *testing.T) { @@ -177,6 +178,8 @@ func TestNEO_CalculateBonus(t *testing.T) { neo := bc.contracts.NEO tx := transaction.New(netmode.UnitTestNet, []byte{}, 0) ic := bc.newInteropContext(trigger.System, bc.dao, nil, tx) + ic.SpawnVM() + ic.VM.LoadScript([]byte{byte(opcode.RET)}) t.Run("Invalid", func(t *testing.T) { _, err := neo.CalculateBonus(ic, new(big.Int).SetInt64(-1), 0, 1) require.Error(t, err) diff --git a/pkg/core/native_oracle_test.go b/pkg/core/native_oracle_test.go index 7f2304e75..8e21e045b 100644 --- a/pkg/core/native_oracle_test.go +++ b/pkg/core/native_oracle_test.go @@ -139,6 +139,8 @@ func TestOracle_Request(t *testing.T) { tx := transaction.New(netmode.UnitTestNet, []byte{}, 0) setSigner(tx, testchain.CommitteeScriptHash()) ic := bc.newInteropContext(trigger.Application, bc.dao, nil, tx) + ic.SpawnVM() + ic.VM.LoadScript([]byte{byte(opcode.RET)}) err = orc.SetOracleNodes(ic, keys.PublicKeys{pub}) require.NoError(t, err) orc.OnPersistEnd(ic.DAO) @@ -164,7 +166,6 @@ func TestOracle_Request(t *testing.T) { // We need to ensure that callback is called thus, executing full script is necessary. resp.ID = 1 - ic.VM = ic.SpawnVM() ic.VM.LoadScriptWithFlags(tx.Script, smartcontract.All) require.NoError(t, ic.VM.Run()) @@ -223,6 +224,7 @@ func TestOracle_SetOracleNodes(t *testing.T) { tx := transaction.New(netmode.UnitTestNet, []byte{}, 0) ic := bc.newInteropContext(trigger.System, bc.dao, nil, tx) ic.VM = vm.New() + ic.VM.LoadScript([]byte{byte(opcode.RET)}) pubs := orc.GetOracleNodes() require.Equal(t, 0, len(pubs))