Branch data Line data Source code
1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto
2 : : // Copyright (c) 2009-2022 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 <coins.h>
11 : : #include <hash.h>
12 : : #include <pubkey.h>
13 : : #include <script/interpreter.h>
14 : : #include <script/keyorigin.h>
15 : : #include <script/signingprovider.h>
16 : : #include <uint256.h>
17 : :
18 : : class CKey;
19 : : class CKeyID;
20 : : class CScript;
21 : : class CTransaction;
22 : : class SigningProvider;
23 : :
24 : : struct bilingual_str;
25 : : struct CMutableTransaction;
26 : :
27 : : /** Interface for signature creators. */
28 : : class BaseSignatureCreator {
29 : : public:
30 : 4 : virtual ~BaseSignatureCreator() {}
31 : : virtual const BaseSignatureChecker& Checker() const =0;
32 : :
33 : : /** Create a singular (non-script) signature. */
34 : : virtual bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;
35 : : 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;
36 : : };
37 : :
38 : : /** A signature creator for transactions. */
39 : : class MutableTransactionSignatureCreator : public BaseSignatureCreator
40 : : {
41 : : const CMutableTransaction& m_txto;
42 : : unsigned int nIn;
43 : : int nHashType;
44 : : CAmount amount;
45 : : const MutableTransactionSignatureChecker checker;
46 : : const PrecomputedTransactionData* m_txdata;
47 : :
48 : : public:
49 : : MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, int hash_type);
50 : : MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, const PrecomputedTransactionData* txdata, int hash_type);
51 : 0 : const BaseSignatureChecker& Checker() const override { return checker; }
52 : : bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const override;
53 : : 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;
54 : : };
55 : :
56 : : /** A signature checker that accepts all signatures */
57 : : extern const BaseSignatureChecker& DUMMY_CHECKER;
58 : : /** A signature creator that just produces 71-byte empty signatures. */
59 : : extern const BaseSignatureCreator& DUMMY_SIGNATURE_CREATOR;
60 : : /** A signature creator that just produces 72-byte empty signatures. */
61 : : extern const BaseSignatureCreator& DUMMY_MAXIMUM_SIGNATURE_CREATOR;
62 : :
63 : : typedef std::pair<CPubKey, std::vector<unsigned char>> SigPair;
64 : :
65 : : // This struct contains information from a transaction input and also contains signatures for that input.
66 : : // The information contained here can be used to create a signature and is also filled by ProduceSignature
67 : : // in order to construct final scriptSigs and scriptWitnesses.
68 [ # # # # : 0 : struct SignatureData {
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
69 : 0 : bool complete = false; ///< Stores whether the scriptSig and scriptWitness are complete
70 : 0 : bool witness = false; ///< Stores whether the input this SigData corresponds to is a witness input
71 : : CScript scriptSig; ///< The scriptSig of an input. Contains complete signatures or the traditional partial signatures format
72 : : CScript redeem_script; ///< The redeemScript (if any) for the input
73 : : CScript witness_script; ///< The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
74 : : 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.
75 : : TaprootSpendData tr_spenddata; ///< Taproot spending data.
76 : : std::optional<TaprootBuilder> tr_builder; ///< Taproot tree used to build tr_spenddata.
77 : : 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.
78 : : std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> misc_pubkeys;
79 : : std::vector<unsigned char> taproot_key_path_sig; /// Schnorr signature for key path spending
80 : : std::map<std::pair<XOnlyPubKey, uint256>, std::vector<unsigned char>> taproot_script_sigs; ///< (Partial) schnorr signatures, indexed by XOnlyPubKey and leaf_hash.
81 : : 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 key (may have no leaf script hashes).
82 : : std::vector<CKeyID> missing_pubkeys; ///< KeyIDs of pubkeys which could not be found
83 : : std::vector<CKeyID> missing_sigs; ///< KeyIDs of pubkeys for signatures which could not be found
84 : : uint160 missing_redeem_script; ///< ScriptID of the missing redeemScript (if any)
85 : : uint256 missing_witness_script; ///< SHA256 of the missing witnessScript (if any)
86 : : 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
87 : : 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
88 : : 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
89 : : 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
90 : :
91 [ # # # # : 0 : SignatureData() {}
# # # # #
# # # #
# ]
92 [ # # # # : 0 : explicit SignatureData(const CScript& script) : scriptSig(script) {}
# # # # #
# # # #
# ]
93 : : void MergeSignatureData(SignatureData sigdata);
94 : : };
95 : :
96 : : /** Produce a script signature using a generic signature creator. */
97 : : bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata);
98 : :
99 : : /**
100 : : * Produce a satisfying script (scriptSig or witness).
101 : : *
102 : : * @param provider Utility containing the information necessary to solve a script.
103 : : * @param fromPubKey The script to produce a satisfaction for.
104 : : * @param txTo The spending transaction.
105 : : * @param nIn The index of the input in `txTo` referring the output being spent.
106 : : * @param amount The value of the output being spent.
107 : : * @param nHashType Signature hash type.
108 : : * @param sig_data Additional data provided to solve a script. Filled with the resulting satisfying
109 : : * script and whether the satisfaction is complete.
110 : : *
111 : : * @return True if the produced script is entirely satisfying `fromPubKey`.
112 : : **/
113 : : bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo,
114 : : unsigned int nIn, const CAmount& amount, int nHashType, SignatureData& sig_data);
115 : : bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo,
116 : : unsigned int nIn, int nHashType, SignatureData& sig_data);
117 : :
118 : : /** Extract signature data from a transaction input, and insert it. */
119 : : SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
120 : : void UpdateInput(CTxIn& input, const SignatureData& data);
121 : :
122 : : /** Check whether a scriptPubKey is known to be segwit. */
123 : : bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);
124 : :
125 : : /** Sign the CMutableTransaction */
126 : : bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* provider, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors);
127 : :
128 : : #endif // BITCOIN_SCRIPT_SIGN_H
|