14 typedef std::vector<unsigned char>
valtype;
21 if (!provider.
GetKey(address, key))
29 if (!key.
Sign(hash, vchSig))
31 vchSig.push_back((
unsigned char)
nHashType);
54 const auto it = sigdata.
signatures.find(address);
56 pubkey = it->second.first;
62 pubkey = pk_it->second.first;
66 if (provider.
GetPubKey(address, pubkey)) {
69 sigdata.
misc_pubkeys.emplace(address, std::make_pair(pubkey, std::move(info)));
79 const auto it = sigdata.
signatures.find(keyid);
81 sig_out = it->second.second;
86 sigdata.
misc_pubkeys.emplace(keyid, std::make_pair(pubkey, std::move(info)));
88 if (creator.
CreateSig(provider, sig_out, keyid, scriptcode, sigversion)) {
108 std::vector<unsigned char> sig;
110 std::vector<valtype> vSolutions;
111 whichTypeRet =
Solver(scriptPubKey, vSolutions);
113 switch (whichTypeRet)
120 if (!CreateSig(creator, sigdata, provider, sig,
CPubKey(vSolutions[0]), scriptPubKey, sigversion))
return false;
126 GetPubKey(provider, sigdata, keyID, pubkey);
127 if (!CreateSig(creator, sigdata, provider, sig, pubkey, scriptPubKey, sigversion))
return false;
133 if (GetCScript(provider, sigdata,
uint160(vSolutions[0]), scriptRet)) {
140 size_t required = vSolutions.front()[0];
142 for (
size_t i = 1; i < vSolutions.size() - 1; ++i) {
144 if (
ret.
size() < required + 1 && CreateSig(creator, sigdata, provider, sig, pubkey, scriptPubKey, sigversion)) {
148 bool ok =
ret.
size() == required + 1;
149 for (
size_t i = 0; i +
ret.
size() < required + 1; ++i) {
160 if (GetCScript(provider, sigdata, h160, scriptRet)) {
171 static CScript PushAll(
const std::vector<valtype>& values)
174 for (
const valtype& v : values) {
177 }
else if (v.size() == 1 && v[0] >= 1 && v[0] <= 16) {
190 std::vector<valtype> result;
192 bool solved = SignStep(provider, creator, fromPubKey, result, whichType,
SigVersion::BASE, sigdata);
202 subscript =
CScript(result[0].begin(), result[0].
end());
213 solved = solved && SignStep(provider, creator, witnessscript, result, subType,
SigVersion::WITNESS_V0, sigdata);
220 CScript witnessscript(result[0].begin(), result[0].
end());
224 result.push_back(std::vector<unsigned char>(witnessscript.
begin(), witnessscript.
end()));
233 result.push_back(std::vector<unsigned char>(subscript.
begin(), subscript.
end()));
254 bool require_witness_sig =
false;
271 require_witness_sig =
true;
280 if (require_witness_sig && !sigdata.
witness)
return false;
308 bool CheckSig(
const std::vector<unsigned char>& scriptSig,
const std::vector<unsigned char>& vchPubKey,
const CScript& scriptCode,
SigVersion sigversion)
const override;
325 std::vector<valtype> script;
326 std::vector<valtype> witness;
329 Stacks(
const Stacks&) =
delete;
330 explicit Stacks(
const SignatureData& data) : witness(data.scriptWitness.stack) {
340 assert(tx.
vin.size() > nIn);
354 std::vector<std::vector<unsigned char>> solutions;
359 if (script_type ==
TX_SCRIPTHASH && !stack.script.empty() && !stack.script.back().empty()) {
361 CScript redeem_script(stack.script.back().begin(), stack.script.back().end());
363 next_script = std::move(redeem_script);
366 script_type =
Solver(next_script, solutions);
367 stack.script.pop_back();
371 CScript witness_script(stack.witness.back().begin(), stack.witness.back().end());
373 next_script = std::move(witness_script);
376 script_type =
Solver(next_script, solutions);
377 stack.witness.pop_back();
378 stack.script = std::move(stack.witness);
379 stack.witness.clear();
382 if (script_type ==
TX_MULTISIG && !stack.script.empty()) {
384 assert(solutions.size() > 1);
385 unsigned int num_pubkeys = solutions.size()-2;
386 unsigned int last_success_key = 0;
387 for (
const valtype& sig : stack.script) {
388 for (
unsigned int i = last_success_key; i < num_pubkeys; ++i) {
389 const valtype& pubkey = solutions[i+1];
391 if (data.
signatures.count(
CPubKey(pubkey).GetID()) || extractor_checker.
CheckSig(sig, pubkey, next_script, sigversion)) {
392 last_success_key = i + 1;
412 *
this = std::move(sigdata);
426 assert(nIn < txTo.
vin.size());
438 assert(nIn < txTo.
vin.size());
440 assert(txin.prevout.n < txFrom.
vout.size());
441 const CTxOut& txout = txFrom.
vout[txin.prevout.n];
443 return SignSignature(provider, txout.scriptPubKey, txTo, nIn, txout.nValue, nHashType);
451 DummySignatureChecker() {}
452 bool CheckSig(
const std::vector<unsigned char>& scriptSig,
const std::vector<unsigned char>& vchPubKey,
const CScript& scriptCode,
SigVersion sigversion)
const override {
return true; }
454 const DummySignatureChecker DUMMY_CHECKER;
461 DummySignatureCreator(
char r_len,
char s_len) : m_r_len(r_len), m_s_len(s_len) {}
466 vchSig.assign(m_r_len + m_s_len + 7,
'\000');
468 vchSig[1] = m_r_len + m_s_len + 4;
472 vchSig[4 + m_r_len] = 0x02;
473 vchSig[5 + m_r_len] = m_s_len;
474 vchSig[6 + m_r_len] = 0x01;
480 template<
typename M,
typename K,
typename V>
481 bool LookupHelper(
const M& map,
const K& key, V& value)
483 auto it = map.find(key);
484 if (it != map.end()) {
523 for (
unsigned int i = 0; i <
inputs.size(); ++i) {
526 for (
unsigned int i = 0; i <
outputs.size(); ++i) {
535 if (!input.IsSane())
return false;
567 sigdata.
misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
639 sigdata.
misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
unspendable OP_RETURN script that carries data
CScript witness_script
The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
boost::optional< CMutableTransaction > tx
const SigningProvider * m_provider
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.
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, unsigned int flags, const BaseSignatureChecker &checker, ScriptError *serror)
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format...
std::map< CKeyID, CKey > keys
CScriptWitness scriptWitness
Only serialized through CTransaction.
UniValue ret(UniValue::VARR)
Interface for signature creators.
const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR
A signature creator that just produces 71-byte empty signatures.
std::map< CKeyID, KeyOriginInfo > origins
std::vector< std::vector< unsigned char > > stack
const BaseSignatureCreator & DUMMY_MAXIMUM_SIGNATURE_CREATOR
A signature creator that just produces 72-byte empty signatures.
void Merge(const PSBTOutput &output)
txnouttype Solver(const CScript &scriptPubKey, std::vector< std::vector< unsigned char >> &vSolutionsRet)
Parse a scriptPubKey and identify script type for standard scripts.
A version of CTransaction with the PSBT format.
std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > misc_pubkeys
A signature creator for transactions.
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
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.
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
void FromSignatureData(const SignatureData &sigdata)
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.
int64_t CAmount
Amount in satoshis (Can be negative)
A structure for PSBTs which contains per output information.
bool Sign(const uint256 &hash, std::vector< unsigned char > &vchSig, bool grind=true, uint32_t test_case=0) const
Create a DER-serialized signature.
std::vector< PSBTOutput > outputs
std::map< CPubKey, KeyOriginInfo > hd_keypaths
if(!params[0].isNull()) nMinDepth
bool push_back(const UniValue &val)
Only for Witness versions not already defined above.
virtual bool GetPubKey(const CKeyID &address, CPubKey &pubkey) const
std::map< CScriptID, CScript > scripts
An input of a transaction.
virtual bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
An encapsulated public key.
bool GetKey(const CKeyID &keyid, CKey &key) const override
std::map< CKeyID, CPubKey > pubkeys
std::pair< CPubKey, std::vector< unsigned char > > SigPair
const std::vector< CTxOut > vout
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
An output of a transaction.
void MergeSignatureData(SignatureData sigdata)
bool IsCompressed() const
Check whether the public key corresponding to this private key is (to be) compressed.
bool EvalScript(std::vector< std::vector< unsigned char > > &stack, const CScript &script, unsigned int flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptError *serror)
std::vector< PSBTInput > inputs
virtual bool GetCScript(const CScriptID &scriptid, CScript &script) const
CScriptWitness scriptWitness
The scriptWitness of an input. Contains complete signatures or the traditional partial signatures for...
virtual bool GetKey(const CKeyID &address, CKey &key) const
bool IsSolvable(const SigningProvider &provider, const CScript &script)
CRIPEMD160 & Write(const unsigned char *data, size_t len)
bool GetCScript(const CScriptID &scriptid, CScript &script) const override
bool GetKey(const CKeyID &keyid, CKey &key) const override
void FillSignatureData(SignatureData &sigdata) const
An interface to be implemented by keystores that support signing.
static opcodetype EncodeOP_N(int n)
SignatureData DataFromTransaction(const CMutableTransaction &tx, unsigned int nIn, const CTxOut &txout)
Extract signature data from a transaction input, and insert it.
Serialized script, used inside transaction inputs and outputs.
bool GetKeyOrigin(const CKeyID &keyid, KeyOriginInfo &info) const override
A reference to a CKey: the Hash360 of its serialized public key.
void UpdateInput(CTxIn &input, const SignatureData &data)
uint256 SignatureHash(const CScript &scriptCode, const T &txTo, unsigned int nIn, int nHashType, const CAmount &amount, SigVersion sigversion, const PrecomputedTransactionData *cache)
virtual bool CheckSig(const std::vector< unsigned char > &scriptSig, const std::vector< unsigned char > &vchPubKey, const CScript &scriptCode, SigVersion sigversion) const
std::vector< std::string > keys
std::vector< unsigned char > valtype
std::vector< unsigned char > valtype
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
A reference to a CScript: the Hash360 of its serialization (see script.h)
A mutable version of CTransaction.
An encapsulated private key.
const SigningProvider & DUMMY_SIGNING_PROVIDER
The basic transaction that is broadcasted on the network and contained in blocks. ...
void Merge(const PartiallySignedTransaction &psbt)
MutableTransactionSignatureCreator(const CMutableTransaction *txToIn, unsigned int nInIn, const CAmount &amountIn, int nHashTypeIn=SIGHASH_ALL)
bool SignPSBTInput(const SigningProvider &provider, const CMutableTransaction &tx, PSBTInput &input, int index, int sighash)
Signs a PSBTInput, verifying that all provided data matches what is being signed. ...
void Finalize(unsigned char hash[OUTPUT_SIZE])
bool complete
Stores whether the scriptSig and scriptWitness are complete.
FlatSigningProvider Merge(const FlatSigningProvider &a, const FlatSigningProvider &b)
bool GetPubKey(const CKeyID &keyid, CPubKey &pubkey) const override
CScript redeem_script
The redeemScript (if any) for the input.
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
bool witness
Stores whether the input this SigData corresponds to is a witness input.
std::map< CKeyID, SigPair > signatures
BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a ...
A hasher class for RIPEMD-160.
virtual const BaseSignatureChecker & Checker() const =0
const CMutableTransaction * txTo
std::vector< unsigned char > ToByteVector(const T &in)