Inside Bitcoin
Opening the selected file…
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2009-2010 Satoshi Nakamoto2// Copyright (c) 2009-present The Bitcoin Core developers3// Distributed under the MIT software license, see the accompanying4// file COPYING or http://www.opensource.org/licenses/mit-license.php.6#ifndef BITCOIN_SCRIPT_SIGN_H7#define BITCOIN_SCRIPT_SIGN_H9#include <attributes.h>10#include <consensus/amount.h>11#include <pubkey.h>12#include <script/interpreter.h>13#include <script/keyorigin.h>14#include <script/script.h>15#include <script/signingprovider.h>16#include <uint256.h>18#include <cstdint>19#include <map>20#include <optional>21#include <set>22#include <utility>23#include <vector>25class COutPoint;26class CTxIn;27class CTxOut;28class Coin;30struct bilingual_str;31struct CMutableTransaction;32struct SignatureData;34struct SignOptions {35int sighash_type{SIGHASH_DEFAULT};36};38/** Interface for signature creators. */39class BaseSignatureCreator {40public:41virtual ~BaseSignatureCreator() = default;42virtual const BaseSignatureChecker& Checker() const =0;44/** Create a singular (non-script) signature. */45virtual bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;46virtual bool CreateSchnorrSig(const SigningProvider& provider, std::vector<unsigned char>& sig, const XOnlyPubKey& pubkey, const uint256* leaf_hash, const uint256* merkle_root, SigVersion sigversion) const =0;47virtual std::vector<uint8_t> CreateMuSig2Nonce(const SigningProvider& provider, const CPubKey& aggregate_pubkey, const CPubKey& script_pubkey, const CPubKey& part_pubkey, const uint256* leaf_hash, const uint256* merkle_root, SigVersion sigversion, const SignatureData& sigdata) const =0;48virtual bool CreateMuSig2PartialSig(const SigningProvider& provider, uint256& partial_sig, const CPubKey& aggregate_pubkey, const CPubKey& script_pubkey, const CPubKey& part_pubkey, const uint256* leaf_hash, const std::vector<std::pair<uint256, bool>>& tweaks, SigVersion sigversion, const SignatureData& sigdata) const =0;49virtual bool CreateMuSig2AggregateSig(const std::vector<CPubKey>& participants, std::vector<uint8_t>& sig, const CPubKey& aggregate_pubkey, const CPubKey& script_pubkey, const uint256* leaf_hash, const std::vector<std::pair<uint256, bool>>& tweaks, SigVersion sigversion, const SignatureData& sigdata) const =0;50};52/** A signature creator for transactions. */53class MutableTransactionSignatureCreator : public BaseSignatureCreator54{55const CMutableTransaction& m_txto;56unsigned int nIn;57SignOptions m_options;58CAmount amount;59const MutableTransactionSignatureChecker checker;60const PrecomputedTransactionData* m_txdata;62std::optional<uint256> ComputeSchnorrSignatureHash(const uint256* leaf_hash, SigVersion sigversion) const;64public:65MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, const SignOptions& options);66MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, const PrecomputedTransactionData* txdata, const SignOptions& options);67const BaseSignatureChecker& Checker() const override { return checker; }68bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const override;69bool CreateSchnorrSig(const SigningProvider& provider, std::vector<unsigned char>& sig, const XOnlyPubKey& pubkey, const uint256* leaf_hash, const uint256* merkle_root, SigVersion sigversion) const override;70std::vector<uint8_t> CreateMuSig2Nonce(const SigningProvider& provider, const CPubKey& aggregate_pubkey, const CPubKey& script_pubkey, const CPubKey& part_pubkey, const uint256* leaf_hash, const uint256* merkle_root, SigVersion sigversion, const SignatureData& sigdata) const override;71bool CreateMuSig2PartialSig(const SigningProvider& provider, uint256& partial_sig, const CPubKey& aggregate_pubkey, const CPubKey& script_pubkey, const CPubKey& part_pubkey, const uint256* leaf_hash, const std::vector<std::pair<uint256, bool>>& tweaks, SigVersion sigversion, const SignatureData& sigdata) const override;72bool CreateMuSig2AggregateSig(const std::vector<CPubKey>& participants, std::vector<uint8_t>& sig, const CPubKey& aggregate_pubkey, const CPubKey& script_pubkey, const uint256* leaf_hash, const std::vector<std::pair<uint256, bool>>& tweaks, SigVersion sigversion, const SignatureData& sigdata) const override;73};75/** A signature checker that accepts all signatures */76extern const BaseSignatureChecker& DUMMY_CHECKER;77/** A signature creator that just produces 71-byte empty signatures. */78extern const BaseSignatureCreator& DUMMY_SIGNATURE_CREATOR;79/** A signature creator that just produces 72-byte empty signatures. */80extern const BaseSignatureCreator& DUMMY_MAXIMUM_SIGNATURE_CREATOR;82typedef std::pair<CPubKey, std::vector<unsigned char>> SigPair;84// This struct contains information from a transaction input and also contains signatures for that input.85// The information contained here can be used to create a signature and is also filled by ProduceSignature86// in order to construct final scriptSigs and scriptWitnesses.87struct SignatureData {88bool complete = false; ///< Stores whether the scriptSig and scriptWitness are complete89bool witness = false; ///< Stores whether the input this SigData corresponds to is a witness input90CScript scriptSig; ///< The scriptSig of an input. Contains complete signatures or the traditional partial signatures format91CScript redeem_script; ///< The redeemScript (if any) for the input92CScript witness_script; ///< The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.93CScriptWitness scriptWitness; ///< The scriptWitness of an input. Contains complete signatures or the traditional partial signatures format. scriptWitness is part of a transaction input per BIP 144.94TaprootSpendData tr_spenddata; ///< Taproot spending data.95std::optional<TaprootBuilder> tr_builder; ///< Taproot tree used to build tr_spenddata.96std::map<CKeyID, SigPair> signatures; ///< BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a final scriptSig or scriptWitness.97std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> misc_pubkeys;98std::vector<unsigned char> taproot_key_path_sig; /// Schnorr signature for key path spending99std::map<std::pair<XOnlyPubKey, uint256>, std::vector<unsigned char>> taproot_script_sigs; ///< (Partial) schnorr signatures, indexed by XOnlyPubKey and leaf_hash.100std::map<XOnlyPubKey, std::pair<std::set<uint256>, KeyOriginInfo>> taproot_misc_pubkeys; ///< Miscellaneous Taproot pubkeys involved in this input along with their leaf script hashes and key origin data. Also includes the Taproot internal and output keys (may have no leaf script hashes).101std::map<CKeyID, XOnlyPubKey> tap_pubkeys; ///< Misc Taproot pubkeys involved in this input, by hash. (Equivalent of misc_pubkeys but for Taproot.)102std::vector<CKeyID> missing_pubkeys; ///< KeyIDs of pubkeys which could not be found103std::vector<CKeyID> missing_sigs; ///< KeyIDs of pubkeys for signatures which could not be found104uint160 missing_redeem_script; ///< ScriptID of the missing redeemScript (if any)105uint256 missing_witness_script; ///< SHA256 of the missing witnessScript (if any)106std::map<std::vector<uint8_t>, std::vector<uint8_t>> sha256_preimages; ///< Mapping from a SHA256 hash to its preimage provided to solve a Script107std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash256_preimages; ///< Mapping from a HASH256 hash to its preimage provided to solve a Script108std::map<std::vector<uint8_t>, std::vector<uint8_t>> ripemd160_preimages; ///< Mapping from a RIPEMD160 hash to its preimage provided to solve a Script109std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash160_preimages; ///< Mapping from a HASH160 hash to its preimage provided to solve a Script110//! Map MuSig2 aggregate pubkeys to its participants111std::map<CPubKey, std::vector<CPubKey>> musig2_pubkeys;112//! Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys to MuSig2 public nonce113std::map<std::pair<CPubKey, uint256>, std::map<CPubKey, std::vector<uint8_t>>> musig2_pubnonces;114//! Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys to MuSig2 partial signature115std::map<std::pair<CPubKey, uint256>, std::map<CPubKey, uint256>> musig2_partial_sigs;117SignatureData() = default;118explicit SignatureData(const CScript& script) : scriptSig(script) {}119void MergeSignatureData(SignatureData sigdata);120};122/** Produce a script signature using a generic signature creator. */123bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata);125/** Extract signature data from a transaction input, and insert it. */126SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);127void UpdateInput(CTxIn& input, const SignatureData& data);129/** Check whether a scriptPubKey is known to be segwit. */130bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);132/** Sign the CMutableTransaction */133bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* provider, const std::map<COutPoint, Coin>& coins, const SignOptions& options, std::map<int, bilingual_str>& input_errors);135#endif // BITCOIN_SCRIPT_SIGN_H
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.