/// <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); }
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); } }