From 6886991ca67f2c2148429ba87bf7d782f8cb12c8 Mon Sep 17 00:00:00 2001 From: Erik Zhang Date: Mon, 12 Oct 2020 11:01:22 +0800 Subject: [PATCH] Fix VerifyWitnesses() of native contracts (#1998) --- src/neo/SmartContract/Helper.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/neo/SmartContract/Helper.cs b/src/neo/SmartContract/Helper.cs index 0cecf54f8f..d3f841b84d 100644 --- a/src/neo/SmartContract/Helper.cs +++ b/src/neo/SmartContract/Helper.cs @@ -4,6 +4,7 @@ using Neo.Network.P2P.Payloads; using Neo.Persistence; using Neo.SmartContract.Manifest; +using Neo.SmartContract.Native; using Neo.VM; using System; using System.Buffers.Binary; @@ -169,6 +170,7 @@ internal static bool VerifyWitnesses(this IVerifiable verifiable, StoreView snap } else { + if (NativeContract.IsNative(hashes[i])) return false; if (hashes[i] != verifiable.Witnesses[i].ScriptHash) return false; offset = 0; } @@ -176,7 +178,17 @@ internal static bool VerifyWitnesses(this IVerifiable verifiable, StoreView snap { CallFlags callFlags = verifiable.Witnesses[i].StateDependent ? CallFlags.AllowStates : CallFlags.None; ExecutionContext context = engine.LoadScript(verification, callFlags, offset); - if (init != null) engine.LoadContext(context.Clone(init.Offset), false); + if (NativeContract.IsNative(hashes[i])) + { + using ScriptBuilder sb = new ScriptBuilder(); + sb.Emit(OpCode.DEPTH, OpCode.PACK); + sb.EmitPush("verify"); + engine.LoadScript(sb.ToArray(), CallFlags.None); + } + else if (init != null) + { + engine.LoadContext(context.Clone(init.Offset), false); + } engine.LoadScript(verifiable.Witnesses[i].InvocationScript, CallFlags.None); if (engine.Execute() == VMState.FAULT) return false; if (engine.ResultStack.Count != 1 || !engine.ResultStack.Pop().GetBoolean()) return false;