MCPcopy Create free account
hub / github.com/bitcoin/bitcoin / CheckSchnorrSignature

Method CheckSchnorrSignature

src/script/interpreter.cpp:1727–1752  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1725
1726template <class T>
1727bool GenericTransactionSignatureChecker<T>::CheckSchnorrSignature(std::span<const unsigned char> sig, std::span<const unsigned char> pubkey_in, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* serror) const
1728{
1729 assert(sigversion == SigVersion::TAPROOT || sigversion == SigVersion::TAPSCRIPT);
1730 // Schnorr signatures have 32-byte public keys. The caller is responsible for enforcing this.
1731 assert(pubkey_in.size() == 32);
1732 // Note that in Tapscript evaluation, empty signatures are treated specially (invalid signature that does not
1733 // abort script execution). This is implemented in EvalChecksigTapscript, which won't invoke
1734 // CheckSchnorrSignature in that case. In other contexts, they are invalid like every other signature with
1735 // size different from 64 or 65.
1736 if (sig.size() != 64 && sig.size() != 65) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_SIZE);
1737
1738 XOnlyPubKey pubkey{pubkey_in};
1739
1740 uint8_t hashtype = SIGHASH_DEFAULT;
1741 if (sig.size() == 65) {
1742 hashtype = SpanPopBack(sig);
1743 if (hashtype == SIGHASH_DEFAULT) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE);
1744 }
1745 uint256 sighash;
1746 if (!this->txdata) return HandleMissingData(m_mdb);
1747 if (!SignatureHashSchnorr(sighash, execdata, *txTo, nIn, hashtype, sigversion, *this->txdata, m_mdb)) {
1748 return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE);
1749 }
1750 if (!VerifySchnorrSignature(sig, pubkey, sighash)) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG);
1751 return true;
1752}
1753
1754template <class T>
1755bool GenericTransactionSignatureChecker<T>::CheckLockTime(const CScriptNum& nLockTime) const

Callers 2

EvalChecksigTapscriptFunction · 0.45
VerifyWitnessProgramFunction · 0.45

Calls 4

set_errorFunction · 0.85
HandleMissingDataFunction · 0.85
SignatureHashSchnorrFunction · 0.85
sizeMethod · 0.45

Tested by

no test coverage detected