コード例 #1
0
ファイル: OpData.cs プロジェクト: supaFool/Denovo
        /// <inheritdoc/>
        public bool Verify(Signature sig, PublicKey pubKey, ReadOnlySpan<byte> sigBa)
        {
            byte[] spendScr, dataToSign;
            if (IsSegWit)
            {
                spendScr = scriptSer.ConvertWitness(ExecutingScript);
                dataToSign = Tx.SerializeForSigningSegWit(spendScr, TxInIndex, AmountBeingSpent, sig.SigHash);
            }
            else
            {
                spendScr = scriptSer.Convert(ExecutingScript, sigBa);
                dataToSign = Tx.SerializeForSigning(spendScr, TxInIndex, sig.SigHash);
            }

            return calc.Verify(dataToSign, sig, pubKey, ForceLowS);
        }
コード例 #2
0
        private bool VerifyP2pkh(ITransaction tx, int index, PushDataOp sigPush, PushDataOp pubPush,
                                 ReadOnlySpan <byte> pubScrData, out string error)
        {
            var actualHash = hash160.ComputeHash(pubPush.data);

            if (!pubScrData.Slice(3, 20).SequenceEqual(actualHash))
            {
                error = "Invalid hash.";
                return(false);
            }

            Signature sig;

            if (consensus.IsStrictDerSig(BlockHeight))
            {
                if (!Signature.TryReadStrict(sigPush.data, out sig, out error))
                {
                    return(false);
                }
            }
            else
            {
                if (!Signature.TryReadLoose(sigPush.data, out sig, out error))
                {
                    return(false);
                }
            }

            if (!PublicKey.TryRead(pubPush.data, out PublicKey pubK))
            {
                error = "Invalid public key";
                return(false);
            }

            byte[] toSign = tx.SerializeForSigning(pubScrData.ToArray(), index, sig.SigHash);
            if (calc.Verify(toSign, sig, pubK, ForceLowS))
            {
                error = null;
                return(true);
            }
            else
            {
                error = "Invalid signature";
                return(false);
            }
        }