Exemplo n.º 1
0
            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);
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
 private static bool Blockchain_GetHeight(ApplicationEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(engine.Snapshot.Height);
     return(true);
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
 private static bool CheckWitness(ApplicationEngine engine, ECPoint pubkey)
 {
     return(CheckWitness(engine, Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash()));
 }
Exemplo n.º 6
0
 private static bool Runtime_Notify(ApplicationEngine engine)
 {
     engine.SendNotification(engine.CurrentScriptHash, engine.CurrentContext.EvaluationStack.Pop());
     return(true);
 }
Exemplo n.º 7
0
 private static bool Runtime_GetTrigger(ApplicationEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push((int)engine.Trigger);
     return(true);
 }
Exemplo n.º 8
0
 internal static bool CheckWitness(ApplicationEngine engine, UInt160 hash)
 {
     return(hash.Equals(engine.ScriptContainer.GetScriptHashForVerification(engine.Snapshot)));
 }
Exemplo n.º 9
0
 private static bool Runtime_Platform(ApplicationEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(Encoding.ASCII.GetBytes("NEO"));
     return(true);
 }
Exemplo n.º 10
0
 private static bool ExecutionEngine_GetEntryScriptHash(ApplicationEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(engine.EntryScriptHash.ToArray());
     return(true);
 }
Exemplo n.º 11
0
 private static bool ExecutionEngine_GetCallingScriptHash(ApplicationEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(engine.CallingScriptHash?.ToArray() ?? new byte[0]);
     return(true);
 }
Exemplo n.º 12
0
 private static bool ExecutionEngine_GetScriptContainer(ApplicationEngine engine)
 {
     engine.CurrentContext.EvaluationStack.Push(StackItem.FromInterface(engine.ScriptContainer));
     return(true);
 }
Exemplo n.º 13
0
 internal static bool CheckWitness(ApplicationEngine engine, UInt160 hash)
 {
     UInt160[] _hashes_for_verifying = engine.ScriptContainer.GetScriptHashesForVerifying(engine.Snapshot);
     return(_hashes_for_verifying.Contains(hash));
 }