private static bool Crypto_ECDsaCheckMultiSig(ApplicationEngine engine) { StackItem item0 = engine.CurrentContext.EvaluationStack.Pop(); ReadOnlySpan <byte> message = item0 switch { InteropInterface _interface => _interface.GetInterface <IVerifiable>().GetHashData(), Null _ => engine.ScriptContainer.GetHashData(), _ => item0.GetSpan() }; int n; byte[][] pubkeys; StackItem item = engine.CurrentContext.EvaluationStack.Pop(); if (item is Array array1) { pubkeys = array1.Select(p => p.GetSpan().ToArray()).ToArray(); n = pubkeys.Length; if (n == 0) { return(false); } } else { n = (int)item.GetBigInteger(); if (n < 1 || n > engine.CurrentContext.EvaluationStack.Count) { return(false); } pubkeys = new byte[n][]; for (int i = 0; i < n; i++) { pubkeys[i] = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); } } int m; byte[][] signatures; item = engine.CurrentContext.EvaluationStack.Pop(); if (item is Array array2) { signatures = array2.Select(p => p.GetSpan().ToArray()).ToArray(); m = signatures.Length; if (m == 0 || m > n) { return(false); } } else { m = (int)item.GetBigInteger(); if (m < 1 || m > n || m > engine.CurrentContext.EvaluationStack.Count) { return(false); } signatures = new byte[m][]; for (int i = 0; i < m; i++) { signatures[i] = engine.CurrentContext.EvaluationStack.Pop().GetSpan().ToArray(); } } bool fSuccess = true; try { for (int i = 0, j = 0; fSuccess && i < m && j < n;) { if (Cryptography.Crypto.VerifySignature(message, signatures[i], pubkeys[j])) { i++; } j++; if (m - i > n - j) { fSuccess = false; } } } catch (ArgumentException) { fSuccess = false; } engine.CurrentContext.EvaluationStack.Push(fSuccess); return(true); } }
internal static bool VerifyWitnesses(this IVerifiable verifiable, StoreView snapshot, long gas) { if (gas < 0) { return(false); } if (gas > MaxVerificationGas) { gas = MaxVerificationGas; } UInt160[] hashes; try { hashes = verifiable.GetScriptHashesForVerifying(snapshot); } catch (InvalidOperationException) { return(false); } if (hashes.Length != verifiable.Witnesses.Length) { return(false); } for (int i = 0; i < hashes.Length; i++) { int offset; ContractMethodDescriptor init = null; byte[] verification = verifiable.Witnesses[i].VerificationScript; if (verification.Length == 0) { ContractState cs = snapshot.Contracts.TryGet(hashes[i]); if (cs is null) { return(false); } ContractMethodDescriptor md = cs.Manifest.Abi.GetMethod("verify"); if (md is null) { return(false); } verification = cs.Script; offset = md.Offset; init = cs.Manifest.Abi.GetMethod("_initialize"); } else { if (hashes[i] != verifiable.Witnesses[i].ScriptHash) { return(false); } offset = 0; } using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, verifiable, snapshot.Clone(), gas)) { engine.LoadScript(verification, CallFlags.None).InstructionPointer = offset; if (init != null) { engine.LoadClonedContext(init.Offset); } 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); } gas -= engine.GasConsumed; } } return(true); }
private static bool Blockchain_GetHeight(ApplicationEngine engine) { engine.CurrentContext.EvaluationStack.Push(engine.Snapshot.Height); return(true); }
internal static bool VerifyWitness(this IVerifiable verifiable, DataCache snapshot, UInt160 hash, Witness witness, long gas, out long fee) { fee = 0; Script invocationScript; try { invocationScript = new Script(witness.InvocationScript, true); } catch (BadScriptException) { return(false); } using (ApplicationEngine engine = ApplicationEngine.Create(TriggerType.Verification, verifiable, snapshot?.CreateSnapshot(), null, gas)) { if (witness.VerificationScript.Length == 0) { ContractState cs = NativeContract.ContractManagement.GetContract(snapshot, hash); if (cs is null) { return(false); } ContractMethodDescriptor md = cs.Manifest.Abi.GetMethod("verify", -1); if (md?.ReturnType != ContractParameterType.Boolean) { return(false); } engine.LoadContract(cs, md, CallFlags.ReadOnly); } else { if (NativeContract.IsNative(hash)) { return(false); } if (hash != witness.ScriptHash) { return(false); } Script verificationScript; try { verificationScript = new Script(witness.VerificationScript, true); } catch (BadScriptException) { return(false); } engine.LoadScript(verificationScript, initialPosition: 0, configureState: p => { p.CallFlags = CallFlags.ReadOnly; p.ScriptHash = hash; }); } engine.LoadScript(invocationScript, configureState: p => p.CallFlags = CallFlags.None); if (engine.Execute() == VMState.FAULT) { return(false); } if (!engine.ResultStack.Peek().GetBoolean()) { return(false); } fee = engine.GasConsumed; } return(true); }
private static bool CheckWitness(ApplicationEngine engine, ECPoint pubkey) { return(CheckWitness(engine, Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash())); }
private static bool Runtime_Notify(ApplicationEngine engine) { engine.SendNotification(engine.CurrentScriptHash, engine.CurrentContext.EvaluationStack.Pop()); return(true); }
private static bool Runtime_GetTrigger(ApplicationEngine engine) { engine.CurrentContext.EvaluationStack.Push((int)engine.Trigger); return(true); }
internal static bool CheckWitness(ApplicationEngine engine, UInt160 hash) { return(hash.Equals(engine.ScriptContainer.GetScriptHashForVerification(engine.Snapshot))); }
private static bool Runtime_Platform(ApplicationEngine engine) { engine.CurrentContext.EvaluationStack.Push(Encoding.ASCII.GetBytes("NEO")); return(true); }
private static bool ExecutionEngine_GetEntryScriptHash(ApplicationEngine engine) { engine.CurrentContext.EvaluationStack.Push(engine.EntryScriptHash.ToArray()); return(true); }
private static bool ExecutionEngine_GetCallingScriptHash(ApplicationEngine engine) { engine.CurrentContext.EvaluationStack.Push(engine.CallingScriptHash?.ToArray() ?? new byte[0]); return(true); }
private static bool ExecutionEngine_GetScriptContainer(ApplicationEngine engine) { engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(engine.ScriptContainer)); return(true); }
internal static bool CheckWitness(ApplicationEngine engine, UInt160 hash) { UInt160[] _hashes_for_verifying = engine.ScriptContainer.GetScriptHashesForVerifying(engine.Snapshot); return(_hashes_for_verifying.Contains(hash)); }