Bitcoin Core  24.99.0
P2P Digital Currency
sign.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2021 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/standard.h>
16 
17 class CKey;
18 class CKeyID;
19 class CScript;
20 class CTransaction;
21 class SigningProvider;
22 
23 struct bilingual_str;
24 struct CMutableTransaction;
25 
28 public:
29  virtual ~BaseSignatureCreator() {}
30  virtual const BaseSignatureChecker& Checker() const =0;
31 
33  virtual bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const =0;
34  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;
35 };
36 
39 {
41  unsigned int nIn;
42  int nHashType;
46 
47 public:
48  MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, int hash_type);
49  MutableTransactionSignatureCreator(const CMutableTransaction& tx LIFETIMEBOUND, unsigned int input_idx, const CAmount& amount, const PrecomputedTransactionData* txdata, int hash_type);
50  const BaseSignatureChecker& Checker() const override { return checker; }
51  bool CreateSig(const SigningProvider& provider, std::vector<unsigned char>& vchSig, const CKeyID& keyid, const CScript& scriptCode, SigVersion sigversion) const override;
52  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;
53 };
54 
61 
62 typedef std::pair<CPubKey, std::vector<unsigned char>> SigPair;
63 
64 // This struct contains information from a transaction input and also contains signatures for that input.
65 // The information contained here can be used to create a signature and is also filled by ProduceSignature
66 // in order to construct final scriptSigs and scriptWitnesses.
67 struct SignatureData {
68  bool complete = false;
69  bool witness = false;
75  std::optional<TaprootBuilder> tr_builder;
76  std::map<CKeyID, SigPair> signatures;
77  std::map<CKeyID, std::pair<CPubKey, KeyOriginInfo>> misc_pubkeys;
78  std::vector<unsigned char> taproot_key_path_sig;
79  std::map<std::pair<XOnlyPubKey, uint256>, std::vector<unsigned char>> taproot_script_sigs;
80  std::map<XOnlyPubKey, std::pair<std::set<uint256>, KeyOriginInfo>> taproot_misc_pubkeys;
81  std::vector<CKeyID> missing_pubkeys;
82  std::vector<CKeyID> missing_sigs;
85 
87  explicit SignatureData(const CScript& script) : scriptSig(script) {}
88  void MergeSignatureData(SignatureData sigdata);
89 };
90 
92 bool ProduceSignature(const SigningProvider& provider, const BaseSignatureCreator& creator, const CScript& scriptPubKey, SignatureData& sigdata);
93 
95 bool SignSignature(const SigningProvider &provider, const CScript& fromPubKey, CMutableTransaction& txTo, unsigned int nIn, const CAmount& amount, int nHashType);
96 bool SignSignature(const SigningProvider &provider, const CTransaction& txFrom, CMutableTransaction& txTo, unsigned int nIn, int nHashType);
97 
99 SignatureData DataFromTransaction(const CMutableTransaction& tx, unsigned int nIn, const CTxOut& txout);
100 void UpdateInput(CTxIn& input, const SignatureData& data);
101 
103 bool IsSegWitOutput(const SigningProvider& provider, const CScript& script);
104 
106 bool SignTransaction(CMutableTransaction& mtx, const SigningProvider* provider, const std::map<COutPoint, Coin>& coins, int sighash, std::map<int, bilingual_str>& input_errors);
107 
108 #endif // BITCOIN_SCRIPT_SIGN_H
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
#define LIFETIMEBOUND
Definition: attributes.h:16
Interface for signature creators.
Definition: sign.h:27
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
virtual const BaseSignatureChecker & Checker() const =0
virtual bool CreateSig(const SigningProvider &provider, std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const =0
Create a singular (non-script) signature.
virtual ~BaseSignatureCreator()
Definition: sign.h:29
An encapsulated private key.
Definition: key.h:27
A reference to a CKey: the Hash160 of its serialized public key.
Definition: pubkey.h:24
Serialized script, used inside transaction inputs and outputs.
Definition: script.h:411
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:288
An input of a transaction.
Definition: transaction.h:74
An output of a transaction.
Definition: transaction.h:157
A signature creator for transactions.
Definition: sign.h:39
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
Definition: sign.cpp:60
const BaseSignatureChecker & Checker() const override
Definition: sign.h:50
MutableTransactionSignatureCreator(const CMutableTransaction &tx LIFETIMEBOUND, unsigned int input_idx, const CAmount &amount, int hash_type)
MutableTransactionSignatureCreator(const CMutableTransaction &tx LIFETIMEBOUND, unsigned int input_idx, const CAmount &amount, const PrecomputedTransactionData *txdata, int hash_type)
const CMutableTransaction & m_txto
Definition: sign.h:40
bool CreateSig(const SigningProvider &provider, std::vector< unsigned char > &vchSig, const CKeyID &keyid, const CScript &scriptCode, SigVersion sigversion) const override
Create a singular (non-script) signature.
Definition: sign.cpp:35
const PrecomputedTransactionData * m_txdata
Definition: sign.h:45
const MutableTransactionSignatureChecker checker
Definition: sign.h:44
An interface to be implemented by keystores that support signing.
160-bit opaque blob.
Definition: uint256.h:108
256-bit opaque blob.
Definition: uint256.h:119
SigVersion
Definition: interpreter.h:189
void UpdateInput(CTxIn &input, const SignatureData &data)
Definition: sign.cpp:546
bool IsSegWitOutput(const SigningProvider &provider, const CScript &script)
Check whether a scriptPubKey is known to be segwit.
Definition: sign.cpp:638
std::pair< CPubKey, std::vector< unsigned char > > SigPair
Definition: sign.h:62
bool SignSignature(const SigningProvider &provider, const CScript &fromPubKey, CMutableTransaction &txTo, unsigned int nIn, const CAmount &amount, int nHashType)
Produce a script signature for a transaction.
Definition: sign.cpp:568
const BaseSignatureCreator & DUMMY_MAXIMUM_SIGNATURE_CREATOR
A signature creator that just produces 72-byte empty signatures.
Definition: sign.cpp:636
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
Definition: sign.cpp:481
const BaseSignatureChecker & DUMMY_CHECKER
A signature checker that accepts all signatures.
Definition: sign.cpp:601
const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR
A signature creator that just produces 71-byte empty signatures.
Definition: sign.cpp:635
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &scriptPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
Definition: sign.cpp:385
bool SignTransaction(CMutableTransaction &mtx, const SigningProvider *provider, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, bilingual_str > &input_errors)
Sign the CMutableTransaction.
Definition: sign.cpp:657
A mutable version of CTransaction.
Definition: transaction.h:373
uint160 missing_redeem_script
ScriptID of the missing redeemScript (if any)
Definition: sign.h:83
std::vector< CKeyID > missing_sigs
KeyIDs of pubkeys for signatures which could not be found.
Definition: sign.h:82
void MergeSignatureData(SignatureData sigdata)
Definition: sign.cpp:552
std::map< CKeyID, SigPair > signatures
BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a ...
Definition: sign.h:76
TaprootSpendData tr_spenddata
Taproot spending data.
Definition: sign.h:74
SignatureData()
Definition: sign.h:86
bool witness
Stores whether the input this SigData corresponds to is a witness input.
Definition: sign.h:69
std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > misc_pubkeys
Definition: sign.h:77
std::optional< TaprootBuilder > tr_builder
Taproot tree used to build tr_spenddata.
Definition: sign.h:75
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format.
Definition: sign.h:70
std::vector< unsigned char > taproot_key_path_sig
Definition: sign.h:78
std::map< std::pair< XOnlyPubKey, uint256 >, std::vector< unsigned char > > taproot_script_sigs
Schnorr signature for key path spending.
Definition: sign.h:79
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 orig...
Definition: sign.h:80
CScript redeem_script
The redeemScript (if any) for the input.
Definition: sign.h:71
uint256 missing_witness_script
SHA256 of the missing witnessScript (if any)
Definition: sign.h:84
std::vector< CKeyID > missing_pubkeys
KeyIDs of pubkeys which could not be found.
Definition: sign.h:81
CScript witness_script
The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
Definition: sign.h:72
CScriptWitness scriptWitness
The scriptWitness of an input. Contains complete signatures or the traditional partial signatures for...
Definition: sign.h:73
SignatureData(const CScript &script)
Definition: sign.h:87
bool complete
Stores whether the scriptSig and scriptWitness are complete.
Definition: sign.h:68
Bilingual messages:
Definition: translation.h:18