Coverage Report

Created: 2026-05-30 09:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/script/sign.h
Line
Count
Source
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present The Bitcoin Core developers
3
// Distributed under the MIT software license, see the accompanying
4
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6
#ifndef BITCOIN_SCRIPT_SIGN_H
7
#define BITCOIN_SCRIPT_SIGN_H
8
9
#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>
17
18
#include <cstdint>
19
#include <map>
20
#include <optional>
21
#include <set>
22
#include <utility>
23
#include <vector>
24
25
class COutPoint;
26
class CTxIn;
27
class CTxOut;
28
class Coin;
29
30
struct bilingual_str;
31
struct CMutableTransaction;
32
struct SignatureData;
33
34
struct SignOptions {
35
    int sighash_type{SIGHASH_DEFAULT};
36
};
37
38
/** Interface for signature creators. */
39
class BaseSignatureCreator {
40
public:
41
72.9k
    virtual ~BaseSignatureCreator() = default;
42
    virtual const BaseSignatureChecker& Checker() const =0;
43
44
    /** Create a singular (non-script) signature. */
45
    virtual bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;
46
    virtual 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;
47
    virtual 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;
48
    virtual 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;
49
    virtual 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
};
51
52
/** A signature creator for transactions. */
53
class MutableTransactionSignatureCreator : public BaseSignatureCreator
54
{
55
    const CMutableTransaction& m_txto;
56
    unsigned int nIn;
57
    SignOptions m_options;
58
    CAmount amount;
59
    const MutableTransactionSignatureChecker checker;
60
    const PrecomputedTransactionData* m_txdata;
61
62
    std::optional<uint256> ComputeSchnorrSignatureHash(const uint256* leaf_hash, SigVersion sigversion) const;
63
64
public:
65
    MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, const SignOptions& options);
66
    MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, const PrecomputedTransactionData* txdata, const SignOptions& options);
67
17.9k
    const BaseSignatureChecker& Checker() const override { return checker; }
68
    bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const override;
69
    bool CreateSchnorrSig(const SigningProvider& provider, std::vector<unsigned char>& sig, const XOnlyPubKey& pubkey, const uint256* leaf_hash, const uint256* merkle_root, SigVersion sigversion) const override;
70
    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 override;
71
    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 override;
72
    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 override;
73
};
74
75
/** A signature checker that accepts all signatures */
76
extern const BaseSignatureChecker& DUMMY_CHECKER;
77
/** A signature creator that just produces 71-byte empty signatures. */
78
extern const BaseSignatureCreator& DUMMY_SIGNATURE_CREATOR;
79
/** A signature creator that just produces 72-byte empty signatures. */
80
extern const BaseSignatureCreator& DUMMY_MAXIMUM_SIGNATURE_CREATOR;
81
82
typedef std::pair<CPubKey, std::vector<unsigned char>> SigPair;
83
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 ProduceSignature
86
// in order to construct final scriptSigs and scriptWitnesses.
87
struct SignatureData {
88
    bool complete = false; ///< Stores whether the scriptSig and scriptWitness are complete
89
    bool witness = false; ///< Stores whether the input this SigData corresponds to is a witness input
90
    CScript scriptSig; ///< The scriptSig of an input. Contains complete signatures or the traditional partial signatures format
91
    CScript redeem_script; ///< The redeemScript (if any) for the input
92
    CScript witness_script; ///< The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
93
    CScriptWitness 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.
94
    TaprootSpendData tr_spenddata; ///< Taproot spending data.
95
    std::optional<TaprootBuilder> tr_builder; ///< Taproot tree used to build tr_spenddata.
96
    std::map<CKeyID, SigPair> signatures; ///< BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a final scriptSig or scriptWitness.
97
    std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> misc_pubkeys;
98
    std::vector<unsigned char> taproot_key_path_sig; /// Schnorr signature for key path spending
99
    std::map<std::pair<XOnlyPubKey, uint256>, std::vector<unsigned char>> taproot_script_sigs; ///< (Partial) schnorr signatures, indexed by XOnlyPubKey and leaf_hash.
100
    std::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).
101
    std::map<CKeyID, XOnlyPubKey> tap_pubkeys; ///< Misc Taproot pubkeys involved in this input, by hash. (Equivalent of misc_pubkeys but for Taproot.)
102
    std::vector<CKeyID> missing_pubkeys; ///< KeyIDs of pubkeys which could not be found
103
    std::vector<CKeyID> missing_sigs; ///< KeyIDs of pubkeys for signatures which could not be found
104
    uint160 missing_redeem_script; ///< ScriptID of the missing redeemScript (if any)
105
    uint256 missing_witness_script; ///< SHA256 of the missing witnessScript (if any)
106
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> sha256_preimages; ///< Mapping from a SHA256 hash to its preimage provided to solve a Script
107
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash256_preimages; ///< Mapping from a HASH256 hash to its preimage provided to solve a Script
108
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> ripemd160_preimages; ///< Mapping from a RIPEMD160 hash to its preimage provided to solve a Script
109
    std::map<std::vector<uint8_t>, std::vector<uint8_t>> hash160_preimages; ///< Mapping from a HASH160 hash to its preimage provided to solve a Script
110
    //! Map MuSig2 aggregate pubkeys to its participants
111
    std::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 nonce
113
    std::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 signature
115
    std::map<std::pair<CPubKey, uint256>, std::map<CPubKey, uint256>> musig2_partial_sigs;
116
117
620k
    SignatureData() = default;
118
0
    explicit SignatureData(const CScript& script) : scriptSig(script) {}
119
    void MergeSignatureData(SignatureData sigdata);
120
};
121
122
/** Produce a script signature using a generic signature creator. */
123
bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata);
124
125
/** Extract signature data from a transaction input, and insert it. */
126
SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
127
void UpdateInput(CTxIn& input, const SignatureData& data);
128
129
/** Check whether a scriptPubKey is known to be segwit. */
130
bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);
131
132
/** Sign the CMutableTransaction */
133
bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* provider, const std::map<COutPoint, Coin>& coins, const SignOptions& options, std::map<int, bilingual_str>& input_errors);
134
135
#endif // BITCOIN_SCRIPT_SIGN_H