6#ifndef BITCOIN_SCRIPT_SIGN_H
7#define BITCOIN_SCRIPT_SIGN_H
60typedef std::pair<CPubKey, std::vector<unsigned char>>
SigPair;
89template<
typename Stream,
typename...
X>
97template<
typename Stream,
typename...
X>
101 size_t remaining_before = s.size();
103 size_t remaining_after = s.size();
104 if (remaining_after + expected_size != remaining_before) {
105 throw std::ios_base::failure(
"Size of value was not the stated size");
110template<
typename Stream>
111void DeserializeHDKeypaths(Stream& s,
const std::vector<unsigned char>& key, std::map<CPubKey, KeyOriginInfo>& hd_keypaths)
115 throw std::ios_base::failure(
"Size of key was not the expected size for the type BIP32 keypath");
118 CPubKey pubkey(key.begin() + 1, key.end());
120 throw std::ios_base::failure(
"Invalid pubkey");
122 if (hd_keypaths.count(pubkey) > 0) {
123 throw std::ios_base::failure(
"Duplicate Key, pubkey derivation path already provided");
128 if (value_len % 4 || value_len == 0) {
129 throw std::ios_base::failure(
"Invalid length for HD key path");
134 for (
unsigned int i = 4; i < value_len; i +=
sizeof(uint32_t)) {
137 keypath.
path.push_back(index);
141 hd_keypaths.emplace(pubkey, std::move(keypath));
145template<
typename Stream>
148 for (
auto keypath_pair : hd_keypaths) {
149 if (!keypath_pair.first.IsValid()) {
150 throw std::ios_base::failure(
"Invalid CPubKey being serialized");
153 WriteCompactSize(s, (keypath_pair.second.path.size() + 1) *
sizeof(uint32_t));
154 s << keypath_pair.second.fingerprint;
155 for (
const auto& path : keypath_pair.second.path) {
int64_t CAmount
Amount in satoshis (Can be negative)
Interface for signature creators.
virtual const BaseSignatureChecker & Checker() const =0
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 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()
An encapsulated private key.
A reference to a CKey: the Hash160 of its serialized public key.
An encapsulated public key.
static constexpr unsigned int COMPRESSED_SIZE
static constexpr unsigned int SIZE
secp256k1:
bool IsFullyValid() const
fully validate whether this is a valid public key (more expensive than IsValid())
Serialized script, used inside transaction inputs and outputs.
The basic transaction that is broadcasted on the network and contained in blocks.
An input of a transaction.
An output of a transaction.
A signature creator for transactions.
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
const BaseSignatureChecker & Checker() const override
MutableTransactionSignatureCreator(const CMutableTransaction *txToIn, unsigned int nInIn, const CAmount &amountIn, int nHashTypeIn)
const CMutableTransaction * txTo
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.
const PrecomputedTransactionData * m_txdata
const MutableTransactionSignatureChecker checker
An interface to be implemented by keystores that support signing.
static unsigned const char sighash[]
void SerializeMany(Stream &s)
uint64_t ReadCompactSize(Stream &is, bool range_check=true)
Decode a CompactSize-encoded variable-length integer.
void UnserializeMany(Stream &s)
size_t GetSerializeSizeMany(int nVersion, const T &... t)
void WriteCompactSize(CSizeComputer &os, uint64_t nSize)
void SerializeToVector(Stream &s, const X &... args)
void UpdateInput(CTxIn &input, const SignatureData &data)
bool IsSegWitOutput(const SigningProvider &provider, const CScript &script)
Check whether a scriptPubKey is known to be segwit.
std::pair< CPubKey, std::vector< unsigned char > > SigPair
bool IsSolvable(const SigningProvider &provider, const CScript &script)
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.
const BaseSignatureCreator & DUMMY_MAXIMUM_SIGNATURE_CREATOR
A signature creator that just produces 72-byte empty signatures.
void SerializeHDKeypaths(Stream &s, const std::map< CPubKey, KeyOriginInfo > &hd_keypaths, uint8_t type)
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
void UnserializeFromVector(Stream &s, X &... args)
void DeserializeHDKeypaths(Stream &s, const std::vector< unsigned char > &key, std::map< CPubKey, KeyOriginInfo > &hd_keypaths)
const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR
A signature creator that just produces 71-byte empty signatures.
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &scriptPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
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.
constexpr Span< A > MakeSpan(A(&a)[N])
MakeSpan for arrays:
A mutable version of CTransaction.
unsigned char fingerprint[4]
First 32 bits of the Hash160 of the public key at the root of the path.
std::vector< uint32_t > path
uint160 missing_redeem_script
ScriptID of the missing redeemScript (if any)
std::vector< CKeyID > missing_sigs
KeyIDs of pubkeys for signatures which could not be found.
void MergeSignatureData(SignatureData sigdata)
std::map< CKeyID, SigPair > signatures
BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a ...
TaprootSpendData tr_spenddata
Taproot spending data.
bool witness
Stores whether the input this SigData corresponds to is a witness input.
std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > misc_pubkeys
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format.
std::vector< unsigned char > taproot_key_path_sig
std::map< std::pair< XOnlyPubKey, uint256 >, std::vector< unsigned char > > taproot_script_sigs
Schnorr signature for key path spending.
CScript redeem_script
The redeemScript (if any) for the input.
uint256 missing_witness_script
SHA256 of the missing witnessScript (if any)
std::vector< CKeyID > missing_pubkeys
KeyIDs of pubkeys which could not be found.
CScript witness_script
The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
CScriptWitness scriptWitness
The scriptWitness of an input. Contains complete signatures or the traditional partial signatures for...
SignatureData(const CScript &script)
bool complete
Stores whether the scriptSig and scriptWitness are complete.