6 #ifndef BITCOIN_SCRIPT_SIGN_H
7 #define BITCOIN_SCRIPT_SIGN_H
55 typedef std::pair<CPubKey, std::vector<unsigned char>>
SigPair;
81 template<
typename Stream,
typename...
X>
89 template<
typename Stream,
typename...
X>
93 size_t remaining_before = s.size();
95 size_t remaining_after = s.size();
96 if (remaining_after + expected_size != remaining_before) {
97 throw std::ios_base::failure(
"Size of value was not the stated size");
102 template<
typename Stream>
103 void DeserializeHDKeypaths(Stream& s,
const std::vector<unsigned char>& key, std::map<CPubKey, KeyOriginInfo>& hd_keypaths)
107 throw std::ios_base::failure(
"Size of key was not the expected size for the type BIP32 keypath");
110 CPubKey pubkey(key.begin() + 1, key.end());
112 throw std::ios_base::failure(
"Invalid pubkey");
114 if (hd_keypaths.count(pubkey) > 0) {
115 throw std::ios_base::failure(
"Duplicate Key, pubkey derivation path already provided");
120 if (value_len % 4 || value_len == 0) {
121 throw std::ios_base::failure(
"Invalid length for HD key path");
126 for (
unsigned int i = 4; i < value_len; i +=
sizeof(uint32_t)) {
129 keypath.
path.push_back(index);
133 hd_keypaths.emplace(pubkey, std::move(keypath));
137 template<
typename Stream>
140 for (
auto keypath_pair : hd_keypaths) {
141 if (!keypath_pair.first.IsValid()) {
142 throw std::ios_base::failure(
"Invalid CPubKey being serialized");
145 WriteCompactSize(s, (keypath_pair.second.path.size() + 1) *
sizeof(uint32_t));
146 s << keypath_pair.second.fingerprint;
147 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 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.
A reference to a CScript: the Hash160 of its serialization (see script.h)
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.
const BaseSignatureChecker & Checker() const override
MutableTransactionSignatureCreator(const CMutableTransaction *txToIn, unsigned int nInIn, const CAmount &amountIn, int nHashTypeIn=SIGHASH_ALL)
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 MutableTransactionSignatureChecker checker
An interface to be implemented by keystores that support signing.
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.
bool SignTransaction(CMutableTransaction &mtx, const SigningProvider *provider, const std::map< COutPoint, Coin > &coins, int sighash, std::map< int, std::string > &input_errors)
Sign the CMutableTransaction.
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.
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 ...
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.
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.