Bitcoin Core 31.99.0
P2P Digital Currency
psbt.cpp
Go to the documentation of this file.
1// Copyright (c) 2009-present The Bitcoin Core developers
2// Distributed under the MIT software license, see the accompanying
3// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
5#include <psbt.h>
6
7#include <common/types.h>
8#include <node/types.h>
9#include <policy/policy.h>
12#include <util/check.h>
13#include <util/result.h>
14#include <util/strencodings.h>
15
17
18PartiallySignedTransaction::PartiallySignedTransaction(const CMutableTransaction& tx, uint32_t version) : m_version(version)
19{
20 assert(m_version == 0 || m_version == 2);
21
24 inputs.reserve(tx.vin.size());
25 for (const CTxIn& input : tx.vin) {
26 inputs.emplace_back(GetVersion(), input.prevout.hash, input.prevout.n, input.nSequence);
27 }
28 outputs.reserve(tx.vout.size());
29 for (const CTxOut& output : tx.vout) {
30 outputs.emplace_back(GetVersion(), output.nValue, output.scriptPubKey);
31 }
32}
33
35{
36 return inputs.empty() && outputs.empty() && unknown.empty();
37}
38
40{
41 // Prohibited to merge two PSBTs over different transactions
42 std::optional<Txid> this_id = GetUniqueID();
43 std::optional<Txid> psbt_id = psbt.GetUniqueID();
44 if (!this_id || !psbt_id || this_id != psbt_id) {
45 return false;
46 }
47 if (GetVersion() != psbt.GetVersion()) {
48 return false;
49 }
50
51 for (unsigned int i = 0; i < inputs.size(); ++i) {
52 if (!inputs[i].Merge(psbt.inputs[i])) {
53 return false;
54 }
55 }
56 for (unsigned int i = 0; i < outputs.size(); ++i) {
57 if (!outputs[i].Merge(psbt.outputs[i])) {
58 return false;
59 }
60 }
61 for (auto& xpub_pair : psbt.m_xpubs) {
62 if (!m_xpubs.contains(xpub_pair.first)) {
63 m_xpubs[xpub_pair.first] = xpub_pair.second;
64 } else {
65 m_xpubs[xpub_pair.first].insert(xpub_pair.second.begin(), xpub_pair.second.end());
66 }
67 }
68 if (fallback_locktime == std::nullopt && psbt.fallback_locktime != std::nullopt) fallback_locktime = psbt.fallback_locktime;
69
70 // Set m_tx_modifiable only if either PSBT had it set
71 if (m_tx_modifiable.has_value() || psbt.m_tx_modifiable.has_value()) {
72 // In general, we AND the modifiable flags
73 std::bitset<8> this_modifiable = m_tx_modifiable.value_or(0);
74 std::bitset<8> psbt_modifiable = psbt.m_tx_modifiable.value_or(0);
75 std::bitset<8> final_modifiable = this_modifiable & psbt_modifiable;
76 // SIGHASH_SINGLE Modifiable (bit 2) needs to be bitwise OR'd
77 final_modifiable.set(2, this_modifiable[2] || psbt_modifiable[2]);
78
79 m_tx_modifiable = final_modifiable;
80 }
81
82 unknown.insert(psbt.unknown.begin(), psbt.unknown.end());
83
84 return true;
85}
86
87std::optional<uint32_t> PartiallySignedTransaction::ComputeTimeLock() const
88{
89 if (GetVersion() >= 2) {
90 std::optional<uint32_t> time_lock{0};
91 std::optional<uint32_t> height_lock{0};
92 for (const PSBTInput& input : inputs) {
93 if (input.time_locktime.has_value() && !input.height_locktime.has_value()) {
94 height_lock.reset(); // Transaction can no longer have a height locktime
95 if (!time_lock.has_value()) {
96 return std::nullopt;
97 }
98 } else if (!input.time_locktime.has_value() && input.height_locktime.has_value()) {
99 time_lock.reset(); // Transaction can no longer have a time locktime
100 if (!height_lock.has_value()) {
101 return std::nullopt;
102 }
103 }
104 if (input.time_locktime && time_lock.has_value()) {
105 time_lock = std::max(time_lock, input.time_locktime);
106 }
107 if (input.height_locktime && height_lock.has_value()) {
108 height_lock = std::max(height_lock, input.height_locktime);
109 }
110 }
111 if (height_lock.has_value() && *height_lock > 0) {
112 return *height_lock;
113 }
114 if (time_lock.has_value() && *time_lock > 0) {
115 return *time_lock;
116 }
117 }
118 return fallback_locktime.value_or(0);
119}
120
121std::optional<CMutableTransaction> PartiallySignedTransaction::GetUnsignedTx() const
122{
124 mtx.version = tx_version;
125 std::optional<uint32_t> locktime = ComputeTimeLock();
126 if (!locktime) {
127 return std::nullopt;
128 }
129 mtx.nLockTime = *locktime;
130 uint32_t max_sequence = CTxIn::SEQUENCE_FINAL;
131 for (const PSBTInput& input : inputs) {
132 CTxIn txin;
133 txin.prevout.hash = input.prev_txid;
134 txin.prevout.n = input.prev_out;
135 txin.nSequence = input.sequence.value_or(max_sequence);
136 mtx.vin.push_back(txin);
137 }
138 for (const PSBTOutput& output : outputs) {
139 CTxOut txout;
140 txout.nValue = output.amount;
141 txout.scriptPubKey = output.script;
142 mtx.vout.push_back(txout);
143 }
144 return mtx;
145}
146
148{
149 // Get the unsigned transaction
150 std::optional<CMutableTransaction> mtx = GetUnsignedTx();
151 if (!mtx) {
152 return std::nullopt;
153 }
154 if (GetVersion() >= 2) {
155 for (CTxIn& txin : mtx->vin) {
156 txin.nSequence = 0;
157 }
158 }
159 return mtx->GetHash();
160}
161
163{
164 // The input being added must be for this PSBT's version
165 if (psbtin.GetVersion() != GetVersion()) {
166 return false;
167 }
168
169 // Prevent duplicate inputs
170 if (std::find_if(inputs.begin(), inputs.end(),
171 [psbtin](const PSBTInput& psbt) {
172 return psbt.prev_txid == psbtin.prev_txid && psbt.prev_out == psbtin.prev_out;
173 }
174 ) != inputs.end()) {
175 return false;
176 }
177
178 if (GetVersion() < 2) {
179 // This is a v0 psbt, so do the v0 AddInput
180 inputs.push_back(psbtin);
181 inputs.back().partial_sigs.clear();
182 inputs.back().final_script_sig.clear();
183 inputs.back().final_script_witness.SetNull();
184 return true;
185 }
186
187 // Check inputs modifiable flag
188 if (!m_tx_modifiable.has_value() || !m_tx_modifiable->test(0)) {
189 return false;
190 }
191
192 // Determine if we need to iterate the inputs.
193 // For now, we only do this if the new input has a required time lock.
194 // BIP 370 states that we should also do this if m_tx_modifiable's bit 2 is set
195 // (Has SIGHASH_SINGLE flag) but since we are only adding inputs at the end of the vector,
196 // we don't care about that.
197 bool iterate_inputs = psbtin.time_locktime != std::nullopt || psbtin.height_locktime != std::nullopt;
198 if (iterate_inputs) {
199 std::optional<uint32_t> old_timelock = ComputeTimeLock();
200 if (!old_timelock) {
201 return false;
202 }
203
204 std::optional<uint32_t> time_lock = psbtin.time_locktime;
205 std::optional<uint32_t> height_lock = psbtin.height_locktime;
206 bool has_sigs = false;
207 for (const PSBTInput& input : inputs) {
208 if (input.time_locktime.has_value() && !input.height_locktime.has_value()) {
209 height_lock.reset(); // Transaction can no longer have a height locktime
210 if (time_lock == std::nullopt) {
211 return false;
212 }
213 } else if (!input.time_locktime.has_value() && input.height_locktime.has_value()) {
214 time_lock.reset(); // Transaction can no longer have a time locktime
215 if (height_lock == std::nullopt) {
216 return false;
217 }
218 }
219 if (input.time_locktime && time_lock.has_value()) {
220 time_lock = std::max(time_lock, input.time_locktime);
221 }
222 if (input.height_locktime && height_lock.has_value()) {
223 height_lock = std::max(height_lock, input.height_locktime);
224 }
225 if (input.HasSignatures()) {
226 has_sigs = true;
227 }
228 }
229 uint32_t new_timelock = fallback_locktime.value_or(0);
230 if (height_lock.has_value() && *height_lock > 0) {
231 new_timelock = *height_lock;
232 } else if (time_lock.has_value() && *time_lock > 0) {
233 new_timelock = *time_lock;
234 }
235 if (has_sigs && *old_timelock != new_timelock) {
236 return false;
237 }
238 }
239
240 // Add the input to the end
241 inputs.push_back(psbtin);
242 return true;
243}
244
246{
247 // The output being added must be for this PSBT's version
248 if (psbtout.GetVersion() != GetVersion()) {
249 return false;
250 }
251
252 if (GetVersion() < 2) {
253 // This is a v0 psbt, do the v0 AddOutput
254 outputs.push_back(psbtout);
255 return true;
256 }
257
258 // No global tx, must be PSBTv2
259 // Check outputs are modifiable
260 if (!m_tx_modifiable.has_value() || !m_tx_modifiable->test(1)) {
261 return false;
262 }
263 outputs.push_back(psbtout);
264
265 return true;
266}
267
268bool PSBTInput::GetUTXO(CTxOut& utxo) const
269{
270 if (non_witness_utxo) {
271 if (prev_out >= non_witness_utxo->vout.size()) {
272 return false;
273 }
274 if (non_witness_utxo->GetHash() != prev_txid) {
275 return false;
276 }
277 utxo = non_witness_utxo->vout[prev_out];
278 } else if (!witness_utxo.IsNull()) {
279 utxo = witness_utxo;
280 } else {
281 return false;
282 }
283 return true;
284}
285
287{
289}
290
292{
293 return !non_witness_utxo && witness_utxo.IsNull() && partial_sigs.empty() && unknown.empty() && hd_keypaths.empty() && redeem_script.empty() && witness_script.empty();
294}
295
297{
298 if (!final_script_sig.empty()) {
299 sigdata.scriptSig = final_script_sig;
300 sigdata.complete = true;
301 }
304 sigdata.complete = true;
305 }
306 if (sigdata.complete) {
307 return;
308 }
309
310 sigdata.signatures.insert(partial_sigs.begin(), partial_sigs.end());
311 if (!redeem_script.empty()) {
313 }
314 if (!witness_script.empty()) {
316 }
317 for (const auto& key_pair : hd_keypaths) {
318 sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
319 }
320 if (!m_tap_key_sig.empty()) {
322 }
323 for (const auto& [pubkey_leaf, sig] : m_tap_script_sigs) {
324 sigdata.taproot_script_sigs.emplace(pubkey_leaf, sig);
325 }
326 if (!m_tap_internal_key.IsNull()) {
328 }
329 if (!m_tap_merkle_root.IsNull()) {
331 }
332 for (const auto& [leaf_script, control_block] : m_tap_scripts) {
333 sigdata.tr_spenddata.scripts.emplace(leaf_script, control_block);
334 }
335 for (const auto& [pubkey, leaf_origin] : m_tap_bip32_paths) {
336 sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
337 sigdata.tap_pubkeys.emplace(Hash160(pubkey), pubkey);
338 }
339 for (const auto& [hash, preimage] : ripemd160_preimages) {
340 sigdata.ripemd160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
341 }
342 for (const auto& [hash, preimage] : sha256_preimages) {
343 sigdata.sha256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
344 }
345 for (const auto& [hash, preimage] : hash160_preimages) {
346 sigdata.hash160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
347 }
348 for (const auto& [hash, preimage] : hash256_preimages) {
349 sigdata.hash256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
350 }
351 sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end());
352 for (const auto& [agg_key_lh, pubnonces] : m_musig2_pubnonces) {
353 sigdata.musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
354 }
355 for (const auto& [agg_key_lh, psigs] : m_musig2_partial_sigs) {
356 sigdata.musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
357 }
358}
359
361{
362 if (sigdata.complete) {
363 partial_sigs.clear();
364 hd_keypaths.clear();
367
368 if (!sigdata.scriptSig.empty()) {
369 final_script_sig = sigdata.scriptSig;
370 }
371 if (!sigdata.scriptWitness.IsNull()) {
373 }
374 return;
375 }
376
377 partial_sigs.insert(sigdata.signatures.begin(), sigdata.signatures.end());
378 if (redeem_script.empty() && !sigdata.redeem_script.empty()) {
380 }
381 if (witness_script.empty() && !sigdata.witness_script.empty()) {
383 }
384 for (const auto& entry : sigdata.misc_pubkeys) {
385 hd_keypaths.emplace(entry.second);
386 }
387 if (!sigdata.taproot_key_path_sig.empty()) {
389 }
390 for (const auto& [pubkey_leaf, sig] : sigdata.taproot_script_sigs) {
391 m_tap_script_sigs.emplace(pubkey_leaf, sig);
392 }
393 if (!sigdata.tr_spenddata.internal_key.IsNull()) {
395 }
396 if (!sigdata.tr_spenddata.merkle_root.IsNull()) {
398 }
399 for (const auto& [leaf_script, control_block] : sigdata.tr_spenddata.scripts) {
400 m_tap_scripts.emplace(leaf_script, control_block);
401 }
402 for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
403 m_tap_bip32_paths.emplace(pubkey, leaf_origin);
404 }
405 m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end());
406 for (const auto& [agg_key_lh, pubnonces] : sigdata.musig2_pubnonces) {
407 m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
408 }
409 for (const auto& [agg_key_lh, psigs] : sigdata.musig2_partial_sigs) {
410 m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
411 }
412 for (const auto& [hash, preimage] : sigdata.ripemd160_preimages) {
413 ripemd160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
414 }
415 for (const auto& [hash, preimage] : sigdata.sha256_preimages) {
416 sha256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
417 }
418 for (const auto& [hash, preimage] : sigdata.hash160_preimages) {
419 hash160_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
420 }
421 for (const auto& [hash, preimage] : sigdata.hash256_preimages) {
422 hash256_preimages.emplace(std::vector<unsigned char>(hash.begin(), hash.end()), preimage);
423 }
424}
425
426bool PSBTInput::Merge(const PSBTInput& input)
427{
429 if (witness_utxo.IsNull() && !input.witness_utxo.IsNull()) {
431 }
432
433 partial_sigs.insert(input.partial_sigs.begin(), input.partial_sigs.end());
434 ripemd160_preimages.insert(input.ripemd160_preimages.begin(), input.ripemd160_preimages.end());
435 sha256_preimages.insert(input.sha256_preimages.begin(), input.sha256_preimages.end());
436 hash160_preimages.insert(input.hash160_preimages.begin(), input.hash160_preimages.end());
437 hash256_preimages.insert(input.hash256_preimages.begin(), input.hash256_preimages.end());
438 hd_keypaths.insert(input.hd_keypaths.begin(), input.hd_keypaths.end());
439 unknown.insert(input.unknown.begin(), input.unknown.end());
440 m_tap_script_sigs.insert(input.m_tap_script_sigs.begin(), input.m_tap_script_sigs.end());
441 m_tap_scripts.insert(input.m_tap_scripts.begin(), input.m_tap_scripts.end());
442 m_tap_bip32_paths.insert(input.m_tap_bip32_paths.begin(), input.m_tap_bip32_paths.end());
443
448 if (m_tap_key_sig.empty() && !input.m_tap_key_sig.empty()) m_tap_key_sig = input.m_tap_key_sig;
451 m_musig2_participants.insert(input.m_musig2_participants.begin(), input.m_musig2_participants.end());
452 for (const auto& [agg_key_lh, pubnonces] : input.m_musig2_pubnonces) {
453 m_musig2_pubnonces[agg_key_lh].insert(pubnonces.begin(), pubnonces.end());
454 }
455 for (const auto& [agg_key_lh, psigs] : input.m_musig2_partial_sigs) {
456 m_musig2_partial_sigs[agg_key_lh].insert(psigs.begin(), psigs.end());
457 }
458 if (sequence == std::nullopt && input.sequence != std::nullopt) sequence = input.sequence;
459 if (time_locktime == std::nullopt && input.time_locktime != std::nullopt) time_locktime = input.time_locktime;
460 if (height_locktime == std::nullopt && input.height_locktime != std::nullopt) height_locktime = input.height_locktime;
461
462 return true;
463}
464
466{
467 return !final_script_sig.empty()
469 || !partial_sigs.empty()
470 || !m_tap_key_sig.empty()
471 || !m_tap_script_sigs.empty()
472 || !m_musig2_partial_sigs.empty();
473}
474
476{
477 if (!redeem_script.empty()) {
479 }
480 if (!witness_script.empty()) {
482 }
483 for (const auto& key_pair : hd_keypaths) {
484 sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
485 }
486 if (!m_tap_tree.empty() && m_tap_internal_key.IsFullyValid()) {
487 TaprootBuilder builder;
488 for (const auto& [depth, leaf_ver, script] : m_tap_tree) {
489 builder.Add((int)depth, script, (int)leaf_ver, /*track=*/true);
490 }
491 assert(builder.IsComplete());
493 TaprootSpendData spenddata = builder.GetSpendData();
494
496 sigdata.tr_spenddata.Merge(spenddata);
497 sigdata.tr_builder = builder;
498 }
499 for (const auto& [pubkey, leaf_origin] : m_tap_bip32_paths) {
500 sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
501 sigdata.tap_pubkeys.emplace(Hash160(pubkey), pubkey);
502 }
503 sigdata.musig2_pubkeys.insert(m_musig2_participants.begin(), m_musig2_participants.end());
504}
505
507{
508 if (redeem_script.empty() && !sigdata.redeem_script.empty()) {
510 }
511 if (witness_script.empty() && !sigdata.witness_script.empty()) {
513 }
514 for (const auto& entry : sigdata.misc_pubkeys) {
515 hd_keypaths.emplace(entry.second);
516 }
517 if (!sigdata.tr_spenddata.internal_key.IsNull()) {
519 }
520 if (sigdata.tr_builder.has_value() && sigdata.tr_builder->HasScripts()) {
521 m_tap_tree = sigdata.tr_builder->GetTreeTuples();
522 }
523 for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
524 m_tap_bip32_paths.emplace(pubkey, leaf_origin);
525 }
526 m_musig2_participants.insert(sigdata.musig2_pubkeys.begin(), sigdata.musig2_pubkeys.end());
527}
528
530{
531 return redeem_script.empty() && witness_script.empty() && hd_keypaths.empty() && unknown.empty();
532}
533
534bool PSBTOutput::Merge(const PSBTOutput& output)
535{
536 hd_keypaths.insert(output.hd_keypaths.begin(), output.hd_keypaths.end());
537 unknown.insert(output.unknown.begin(), output.unknown.end());
538 m_tap_bip32_paths.insert(output.m_tap_bip32_paths.begin(), output.m_tap_bip32_paths.end());
539
543 if (m_tap_tree.empty() && !output.m_tap_tree.empty()) m_tap_tree = output.m_tap_tree;
544 m_musig2_participants.insert(output.m_musig2_participants.begin(), output.m_musig2_participants.end());
545
546 return true;
547}
548
549bool PSBTInputSigned(const PSBTInput& input)
550{
551 return !input.final_script_sig.empty() || !input.final_script_witness.IsNull();
552}
553
554bool PSBTInputSignedAndVerified(const PartiallySignedTransaction& psbt, unsigned int input_index, const PrecomputedTransactionData* txdata)
555{
556 CTxOut utxo;
557 assert(input_index < psbt.inputs.size());
558 const PSBTInput& input = psbt.inputs[input_index];
559
560 if (input.non_witness_utxo) {
561 // If we're taking our information from a non-witness UTXO, verify that it matches the prevout.
562 COutPoint prevout = input.GetOutPoint();
563 if (prevout.n >= input.non_witness_utxo->vout.size()) {
564 return false;
565 }
566 if (input.non_witness_utxo->GetHash() != prevout.hash) {
567 return false;
568 }
569 utxo = input.non_witness_utxo->vout[prevout.n];
570 } else if (!input.witness_utxo.IsNull()) {
571 utxo = input.witness_utxo;
572 } else {
573 return false;
574 }
575
576 std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
577 if (!unsigned_tx) {
578 return false;
579 }
580 const CMutableTransaction& tx = *unsigned_tx;
581 if (txdata) {
582 return VerifyScript(input.final_script_sig, utxo.scriptPubKey, &input.final_script_witness, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker{&tx, input_index, utxo.nValue, *txdata, MissingDataBehavior::FAIL});
583 } else {
584 return VerifyScript(input.final_script_sig, utxo.scriptPubKey, &input.final_script_witness, STANDARD_SCRIPT_VERIFY_FLAGS, MutableTransactionSignatureChecker{&tx, input_index, utxo.nValue, MissingDataBehavior::FAIL});
585 }
586}
587
589 size_t count = 0;
590 for (const auto& input : psbt.inputs) {
591 if (!PSBTInputSigned(input)) {
592 count++;
593 }
594 }
595
596 return count;
597}
598
599void UpdatePSBTOutput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index)
600{
601 std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
602 if (!unsigned_tx) {
603 return;
604 }
605 CMutableTransaction& tx = *unsigned_tx;
606 const CTxOut& out = tx.vout.at(index);
607 PSBTOutput& psbt_out = psbt.outputs.at(index);
608
609 // Fill a SignatureData with output info
610 SignatureData sigdata;
611 psbt_out.FillSignatureData(sigdata);
612
613 // Construct a would-be spend of this output, to update sigdata with.
614 // Note that ProduceSignature is used to fill in metadata (not actual signatures),
615 // so provider does not need to provide any private keys (it can be a HidingSigningProvider).
616 MutableTransactionSignatureCreator creator(tx, /*input_idx=*/0, out.nValue, {.sighash_type = SIGHASH_ALL});
617 ProduceSignature(provider, creator, out.scriptPubKey, sigdata);
618
619 // Put redeem_script, witness_script, key paths, into PSBTOutput.
620 psbt_out.FromSignatureData(sigdata);
621}
622
623std::optional<PrecomputedTransactionData> PrecomputePSBTData(const PartiallySignedTransaction& psbt)
624{
625 std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
626 if (!unsigned_tx) {
627 return std::nullopt;
628 }
629 const CMutableTransaction& tx = *unsigned_tx;
630 bool have_all_spent_outputs = true;
631 std::vector<CTxOut> utxos;
632 for (const PSBTInput& input : psbt.inputs) {
633 if (!input.GetUTXO(utxos.emplace_back())) have_all_spent_outputs = false;
634 }
636 if (have_all_spent_outputs) {
637 txdata.Init(tx, std::move(utxos), true);
638 } else {
639 txdata.Init(tx, {}, true);
640 }
641 return txdata;
642}
643
644PSBTError SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction& psbt, int index, const PrecomputedTransactionData* txdata, const common::PSBTFillOptions& options, SignatureData* out_sigdata)
645{
646 PSBTInput& input = psbt.inputs.at(index);
647 std::optional<CMutableTransaction> unsigned_tx = psbt.GetUnsignedTx();
648 if (!unsigned_tx) {
649 return PSBTError::INVALID_TX;
650 }
651 const CMutableTransaction& tx = *unsigned_tx;
652
653 if (PSBTInputSignedAndVerified(psbt, index, txdata)) {
654 return PSBTError::OK;
655 }
656
657 // Fill SignatureData with input info
658 SignatureData sigdata;
659 input.FillSignatureData(sigdata);
660
661 // Get UTXO
662 bool require_witness_sig = false;
663 CTxOut utxo;
664
665 if (input.non_witness_utxo) {
666 // If we're taking our information from a non-witness UTXO, verify that it matches the prevout.
667 COutPoint prevout = input.GetOutPoint();
668 if (prevout.n >= input.non_witness_utxo->vout.size()) {
669 return PSBTError::MISSING_INPUTS;
670 }
671 if (input.non_witness_utxo->GetHash() != prevout.hash) {
672 return PSBTError::MISSING_INPUTS;
673 }
674 utxo = input.non_witness_utxo->vout[prevout.n];
675 } else if (!input.witness_utxo.IsNull()) {
676 utxo = input.witness_utxo;
677 // When we're taking our information from a witness UTXO, we can't verify it is actually data from
678 // the output being spent. This is safe in case a witness signature is produced (which includes this
679 // information directly in the hash), but not for non-witness signatures. Remember that we require
680 // a witness signature in this situation.
681 require_witness_sig = true;
682 } else {
683 return PSBTError::MISSING_INPUTS;
684 }
685
686 // Get the sighash type
687 // If both the field and the parameter are provided, they must match
688 // If only the parameter is provided, use it and add it to the PSBT if it is other than SIGHASH_DEFAULT
689 // for all input types, and not SIGHASH_ALL for non-taproot input types.
690 // If neither are provided, use SIGHASH_DEFAULT if it is taproot, and SIGHASH_ALL for everything else.
691 int sighash{options.sighash_type.value_or(utxo.scriptPubKey.IsPayToTaproot() ? SIGHASH_DEFAULT : SIGHASH_ALL)};
692
693 // For user safety, the desired sighash must be provided if the PSBT wants something other than the default set in the previous line.
694 if (input.sighash_type && input.sighash_type != sighash) {
695 return PSBTError::SIGHASH_MISMATCH;
696 }
697 // Set the PSBT sighash field when sighash is not DEFAULT or ALL
698 // DEFAULT is allowed for non-taproot inputs since DEFAULT may be passed for them (e.g. the psbt being signed also has taproot inputs)
699 // Note that signing already aliases DEFAULT to ALL for non-taproot inputs.
700 if (utxo.scriptPubKey.IsPayToTaproot() ? sighash != SIGHASH_DEFAULT :
701 (sighash != SIGHASH_DEFAULT && sighash != SIGHASH_ALL)) {
702 input.sighash_type = sighash;
703 }
704
705 // Check all existing signatures use the sighash type
706 if (sighash == SIGHASH_DEFAULT) {
707 if (!input.m_tap_key_sig.empty() && input.m_tap_key_sig.size() != 64) {
708 return PSBTError::SIGHASH_MISMATCH;
709 }
710 for (const auto& [_, sig] : input.m_tap_script_sigs) {
711 if (sig.size() != 64) return PSBTError::SIGHASH_MISMATCH;
712 }
713 } else {
714 if (!input.m_tap_key_sig.empty() && (input.m_tap_key_sig.size() != 65 || input.m_tap_key_sig.back() != sighash)) {
715 return PSBTError::SIGHASH_MISMATCH;
716 }
717 for (const auto& [_, sig] : input.m_tap_script_sigs) {
718 if (sig.size() != 65 || sig.back() != sighash) return PSBTError::SIGHASH_MISMATCH;
719 }
720 for (const auto& [_, sig] : input.partial_sigs) {
721 if (sig.second.back() != sighash) return PSBTError::SIGHASH_MISMATCH;
722 }
723 }
724
725 sigdata.witness = false;
726 bool sig_complete;
727 if (txdata == nullptr) {
728 sig_complete = ProduceSignature(provider, DUMMY_SIGNATURE_CREATOR, utxo.scriptPubKey, sigdata);
729 } else {
730 MutableTransactionSignatureCreator creator(tx, index, utxo.nValue, txdata, {.sighash_type = sighash});
731 sig_complete = ProduceSignature(provider, creator, utxo.scriptPubKey, sigdata);
732 }
733 // Verify that a witness signature was produced in case one was required.
734 if (require_witness_sig && !sigdata.witness) return PSBTError::INCOMPLETE;
735
736 // If we are not finalizing, set sigdata.complete to false to not set the scriptWitness
737 if (!options.finalize && sigdata.complete) sigdata.complete = false;
738
739 input.FromSignatureData(sigdata);
740
741 // If we have a witness signature, put a witness UTXO.
742 if (sigdata.witness) {
743 input.witness_utxo = utxo;
744 // We can remove the non_witness_utxo if and only if there are no non-segwit or segwit v0
745 // inputs in this transaction. Since this requires inspecting the entire transaction, this
746 // is something for the caller to deal with (i.e. FillPSBT).
747 }
748
749 // Fill in the missing info
750 if (out_sigdata) {
751 out_sigdata->missing_pubkeys = sigdata.missing_pubkeys;
752 out_sigdata->missing_sigs = sigdata.missing_sigs;
753 out_sigdata->missing_redeem_script = sigdata.missing_redeem_script;
754 out_sigdata->missing_witness_script = sigdata.missing_witness_script;
755 }
756
757 return sig_complete ? PSBTError::OK : PSBTError::INCOMPLETE;
758}
759
761{
762 // Figure out if any non_witness_utxos should be dropped
763 std::vector<unsigned int> to_drop;
764 for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
765 const auto& input = psbtx.inputs.at(i);
766 int wit_ver;
767 std::vector<unsigned char> wit_prog;
768 if (input.witness_utxo.IsNull() || !input.witness_utxo.scriptPubKey.IsWitnessProgram(wit_ver, wit_prog)) {
769 // There's a non-segwit input, so we cannot drop any non_witness_utxos
770 to_drop.clear();
771 break;
772 }
773 if (wit_ver == 0) {
774 // Segwit v0, so we cannot drop any non_witness_utxos
775 to_drop.clear();
776 break;
777 }
778 // non_witness_utxos cannot be dropped if the sighash type includes SIGHASH_ANYONECANPAY
779 // Since callers should have called SignPSBTInput which updates the sighash type in the PSBT, we only
780 // need to look at that field. If it is not present, then we can assume SIGHASH_DEFAULT or SIGHASH_ALL.
781 if (input.sighash_type != std::nullopt && (*input.sighash_type & 0x80) == SIGHASH_ANYONECANPAY) {
782 to_drop.clear();
783 break;
784 }
785
786 if (input.non_witness_utxo) {
787 to_drop.push_back(i);
788 }
789 }
790
791 // Drop the non_witness_utxos that we can drop
792 for (unsigned int i : to_drop) {
793 psbtx.inputs.at(i).non_witness_utxo = nullptr;
794 }
795}
796
798{
799 // Finalize input signatures -- in case we have partial signatures that add up to a complete
800 // signature, but have not combined them yet (e.g. because the combiner that created this
801 // PartiallySignedTransaction did not understand them), this will combine them into a final
802 // script.
803 bool complete = true;
804 std::optional<PrecomputedTransactionData> txdata_res = PrecomputePSBTData(psbtx);
805 if (!txdata_res) {
806 return false;
807 }
808 const PrecomputedTransactionData& txdata = *txdata_res;
809 for (unsigned int i = 0; i < psbtx.inputs.size(); ++i) {
810 PSBTInput& input = psbtx.inputs.at(i);
811 complete &= (SignPSBTInput(DUMMY_SIGNING_PROVIDER, psbtx, i, &txdata, {.sighash_type = input.sighash_type, .finalize = true}, /*out_sigdata=*/nullptr) == PSBTError::OK);
812 }
813
814 return complete;
815}
816
818{
819 // It's not safe to extract a PSBT that isn't finalized, and there's no easy way to check
820 // whether a PSBT is finalized without finalizing it, so we just do this.
821 if (!FinalizePSBT(psbtx)) {
822 return false;
823 }
824
825 std::optional<CMutableTransaction> unsigned_tx = psbtx.GetUnsignedTx();
826 if (!unsigned_tx) {
827 return false;
828 }
829 result = *unsigned_tx;
830 for (unsigned int i = 0; i < result.vin.size(); ++i) {
831 result.vin[i].scriptSig = psbtx.inputs[i].final_script_sig;
832 result.vin[i].scriptWitness = psbtx.inputs[i].final_script_witness;
833 }
834 return true;
835}
836
837std::optional<PartiallySignedTransaction> CombinePSBTs(const std::vector<PartiallySignedTransaction>& psbtxs)
838{
839 PartiallySignedTransaction out = psbtxs[0]; // Copy the first one
840
841 // Merge
842 for (auto it = std::next(psbtxs.begin()); it != psbtxs.end(); ++it) {
843 if (!out.Merge(*it)) {
844 return std::nullopt;
845 }
846 }
847 return out;
848}
849
850std::string PSBTRoleName(PSBTRole role) {
851 switch (role) {
852 case PSBTRole::CREATOR: return "creator";
853 case PSBTRole::UPDATER: return "updater";
854 case PSBTRole::SIGNER: return "signer";
855 case PSBTRole::FINALIZER: return "finalizer";
856 case PSBTRole::EXTRACTOR: return "extractor";
857 } // no default case, so the compiler can warn about missing cases
858 assert(false);
859}
860
862{
863 auto tx_data = DecodeBase64(base64_tx);
864 if (!tx_data) {
865 return util::Error{Untranslated("invalid base64")};
866 }
867 return DecodeRawPSBT(MakeByteSpan(*tx_data));
868}
869
871{
872 SpanReader ss_data{tx_data};
873 try {
875 if (!ss_data.empty()) {
876 return util::Error{Untranslated("extra data after PSBT")};
877 }
878 return psbt;
879 } catch (const std::exception& e) {
880 return util::Error{Untranslated(e.what())};
881 }
882}
883
885{
886 if (m_version != std::nullopt) {
887 return *m_version;
888 }
889 return 0;
890}
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:29
uint32_t n
Definition: transaction.h:32
Txid hash
Definition: transaction.h:31
void clear()
Definition: script.h:568
bool IsPayToTaproot() const
Definition: script.cpp:240
An input of a transaction.
Definition: transaction.h:62
uint32_t nSequence
Definition: transaction.h:66
static const uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
Definition: transaction.h:76
COutPoint prevout
Definition: transaction.h:64
An output of a transaction.
Definition: transaction.h:140
CScript scriptPubKey
Definition: transaction.h:143
CAmount nValue
Definition: transaction.h:142
bool IsNull() const
Definition: transaction.h:160
A signature creator for transactions.
Definition: sign.h:48
A structure for PSBTs which contain per-input information.
Definition: psbt.h:280
std::vector< unsigned char > m_tap_key_sig
Definition: psbt.h:305
std::map< CPubKey, KeyOriginInfo > hd_keypaths
Definition: psbt.h:291
std::map< uint256, std::vector< unsigned char > > hash256_preimages
Definition: psbt.h:296
bool Merge(const PSBTInput &input)
Definition: psbt.cpp:426
CScriptWitness final_script_witness
Definition: psbt.h:290
std::optional< uint32_t > sequence
Definition: psbt.h:300
std::map< std::pair< CPubKey, uint256 >, std::map< CPubKey, std::vector< uint8_t > > > m_musig2_pubnonces
Definition: psbt.h:315
bool HasSignatures() const
Definition: psbt.cpp:465
bool GetUTXO(CTxOut &utxo) const
Retrieves the UTXO for this input.
Definition: psbt.cpp:268
std::map< std::pair< std::vector< unsigned char >, int >, std::set< std::vector< unsigned char >, ShortestVectorFirstComparator > > m_tap_scripts
Definition: psbt.h:307
CTransactionRef non_witness_utxo
Definition: psbt.h:285
Txid prev_txid
Definition: psbt.h:298
std::map< CKeyID, SigPair > partial_sigs
Definition: psbt.h:292
std::optional< int > sighash_type
Definition: psbt.h:321
std::map< std::pair< XOnlyPubKey, uint256 >, std::vector< unsigned char > > m_tap_script_sigs
Definition: psbt.h:306
std::optional< uint32_t > time_locktime
Definition: psbt.h:301
uint256 m_tap_merkle_root
Definition: psbt.h:310
std::map< uint256, std::vector< unsigned char > > sha256_preimages
Definition: psbt.h:294
void FillSignatureData(SignatureData &sigdata) const
Definition: psbt.cpp:296
std::map< std::pair< CPubKey, uint256 >, std::map< CPubKey, uint256 > > m_musig2_partial_sigs
Definition: psbt.h:317
COutPoint GetOutPoint() const
Definition: psbt.cpp:286
std::map< uint160, std::vector< unsigned char > > hash160_preimages
Definition: psbt.h:295
bool IsNull() const
Definition: psbt.cpp:291
uint32_t prev_out
Definition: psbt.h:299
std::map< CPubKey, std::vector< CPubKey > > m_musig2_participants
Definition: psbt.h:313
CScript redeem_script
Definition: psbt.h:287
CScript final_script_sig
Definition: psbt.h:289
void FromSignatureData(const SignatureData &sigdata)
Definition: psbt.cpp:360
uint32_t GetVersion() const
Definition: psbt.h:327
XOnlyPubKey m_tap_internal_key
Definition: psbt.h:309
std::optional< uint32_t > height_locktime
Definition: psbt.h:302
std::map< XOnlyPubKey, std::pair< std::set< uint256 >, KeyOriginInfo > > m_tap_bip32_paths
Definition: psbt.h:308
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition: psbt.h:319
std::map< uint160, std::vector< unsigned char > > ripemd160_preimages
Definition: psbt.h:293
CTxOut witness_utxo
Definition: psbt.h:286
CScript witness_script
Definition: psbt.h:288
A structure for PSBTs which contains per output information.
Definition: psbt.h:938
std::map< CPubKey, std::vector< CPubKey > > m_musig2_participants
Definition: psbt.h:950
XOnlyPubKey m_tap_internal_key
Definition: psbt.h:947
std::map< XOnlyPubKey, std::pair< std::set< uint256 >, KeyOriginInfo > > m_tap_bip32_paths
Definition: psbt.h:949
CScript witness_script
Definition: psbt.h:944
bool IsNull() const
Definition: psbt.cpp:529
CScript redeem_script
Definition: psbt.h:943
uint32_t GetVersion() const
Definition: psbt.h:962
bool Merge(const PSBTOutput &output)
Definition: psbt.cpp:534
std::map< CPubKey, KeyOriginInfo > hd_keypaths
Definition: psbt.h:945
std::vector< std::tuple< uint8_t, uint8_t, std::vector< unsigned char > > > m_tap_tree
Definition: psbt.h:948
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition: psbt.h:952
void FillSignatureData(SignatureData &sigdata) const
Definition: psbt.cpp:475
void FromSignatureData(const SignatureData &sigdata)
Definition: psbt.cpp:506
A version of CTransaction with the PSBT format.
Definition: psbt.h:1239
std::optional< std::bitset< 8 > > m_tx_modifiable
Definition: psbt.h:1247
uint32_t GetVersion() const
Definition: psbt.cpp:884
bool Merge(const PartiallySignedTransaction &psbt)
Merge psbt into this.
Definition: psbt.cpp:39
std::map< KeyOriginInfo, std::set< CExtPubKey > > m_xpubs
Definition: psbt.h:1246
std::optional< uint32_t > m_version
Definition: psbt.h:1241
bool IsNull() const
Definition: psbt.cpp:34
std::optional< Txid > GetUniqueID() const
Definition: psbt.cpp:147
std::map< std::vector< unsigned char >, std::vector< unsigned char > > unknown
Definition: psbt.h:1250
std::vector< PSBTInput > inputs
Definition: psbt.h:1248
std::optional< CMutableTransaction > GetUnsignedTx() const
Definition: psbt.cpp:121
std::optional< uint32_t > ComputeTimeLock() const
Definition: psbt.cpp:87
std::vector< PSBTOutput > outputs
Definition: psbt.h:1249
bool AddOutput(const PSBTOutput &psbtout)
Definition: psbt.cpp:245
std::optional< uint32_t > fallback_locktime
Definition: psbt.h:1254
PartiallySignedTransaction(const CMutableTransaction &tx, uint32_t version=2)
Definition: psbt.cpp:18
bool AddInput(const PSBTInput &psbtin)
Definition: psbt.cpp:162
An interface to be implemented by keystores that support signing.
Minimal stream for reading from an existing byte array by std::span.
Definition: streams.h:83
Utility class to construct Taproot outputs from internal key and script tree.
TaprootSpendData GetSpendData() const
Compute spending data (after Finalize()).
bool IsComplete() const
Return whether there were either no leaves, or the leaves form a Huffman tree.
TaprootBuilder & Add(int depth, std::span< const unsigned char > script, int leaf_version, bool track=true)
Add a new script at a certain depth in the tree.
TaprootBuilder & Finalize(const XOnlyPubKey &internal_key)
Finalize the construction.
bool IsNull() const
Test whether this is the 0 key (the result of default construction).
Definition: pubkey.h:250
bool IsFullyValid() const
Determine if this pubkey is fully valid.
Definition: pubkey.cpp:230
constexpr bool IsNull() const
Definition: uint256.h:49
bool empty() const
Definition: prevector.h:251
is a home for simple enum and struct type definitions that can be used internally by functions in the...
uint160 Hash160(const T1 &in1)
Compute the 160-bit hash an object.
Definition: hash.h:92
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, script_verify_flags flags, const BaseSignatureChecker &checker, ScriptError *serror)
@ SIGHASH_ANYONECANPAY
Definition: interpreter.h:34
@ SIGHASH_DEFAULT
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
Definition: interpreter.h:36
@ SIGHASH_ALL
Definition: interpreter.h:31
PSBTError
Definition: types.h:19
is a home for public enum and struct type definitions that are used internally by node code,...
static constexpr script_verify_flags STANDARD_SCRIPT_VERIFY_FLAGS
Standard script verification flags that standard transactions will comply with.
Definition: policy.h:118
void UpdatePSBTOutput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index)
Updates a PSBTOutput with information from provider.
Definition: psbt.cpp:599
bool PSBTInputSignedAndVerified(const PartiallySignedTransaction &psbt, unsigned int input_index, const PrecomputedTransactionData *txdata)
Checks whether a PSBTInput is already signed by doing script verification using final fields.
Definition: psbt.cpp:554
std::string PSBTRoleName(PSBTRole role)
Definition: psbt.cpp:850
util::Result< PartiallySignedTransaction > DecodeBase64PSBT(const std::string &base64_tx)
Decode a base64ed PSBT into a PartiallySignedTransaction.
Definition: psbt.cpp:861
std::optional< PartiallySignedTransaction > CombinePSBTs(const std::vector< PartiallySignedTransaction > &psbtxs)
Combines PSBTs with the same underlying transaction, resulting in a single PSBT with all partial sign...
Definition: psbt.cpp:837
void RemoveUnnecessaryTransactions(PartiallySignedTransaction &psbtx)
Reduces the size of the PSBT by dropping unnecessary non_witness_utxos (i.e.
Definition: psbt.cpp:760
std::optional< PrecomputedTransactionData > PrecomputePSBTData(const PartiallySignedTransaction &psbt)
Compute a PrecomputedTransactionData object from a psbt.
Definition: psbt.cpp:623
PSBTError SignPSBTInput(const SigningProvider &provider, PartiallySignedTransaction &psbt, int index, const PrecomputedTransactionData *txdata, const common::PSBTFillOptions &options, SignatureData *out_sigdata)
Signs a PSBTInput, verifying that all provided data matches what is being signed.
Definition: psbt.cpp:644
size_t CountPSBTUnsignedInputs(const PartiallySignedTransaction &psbt)
Counts the unsigned inputs of a PSBT.
Definition: psbt.cpp:588
bool FinalizeAndExtractPSBT(PartiallySignedTransaction &psbtx, CMutableTransaction &result)
Finalizes a PSBT if possible, and extracts it to a CMutableTransaction if it could be finalized.
Definition: psbt.cpp:817
bool PSBTInputSigned(const PSBTInput &input)
Checks whether a PSBTInput is already signed by checking for non-null finalized fields.
Definition: psbt.cpp:549
bool FinalizePSBT(PartiallySignedTransaction &psbtx)
Finalizes a PSBT if possible, combining partial signatures.
Definition: psbt.cpp:797
util::Result< PartiallySignedTransaction > DecodeRawPSBT(std::span< const std::byte > tx_data)
Decode a raw (binary blob) PSBT into a PartiallySignedTransaction.
Definition: psbt.cpp:870
PSBTRole
Definition: psbt.h:1624
constexpr deserialize_type deserialize
Definition: serialize.h:51
bool ProduceSignature(const SigningProvider &provider, const BaseSignatureCreator &creator, const CScript &fromPubKey, SignatureData &sigdata)
Produce a script signature using a generic signature creator.
Definition: sign.cpp:729
const BaseSignatureCreator & DUMMY_SIGNATURE_CREATOR
A signature creator that just produces 71-byte empty signatures.
Definition: sign.cpp:987
const SigningProvider & DUMMY_SIGNING_PROVIDER
auto MakeByteSpan(const V &v) noexcept
Definition: span.h:84
A mutable version of CTransaction.
Definition: transaction.h:358
std::vector< CTxOut > vout
Definition: transaction.h:360
std::vector< CTxIn > vin
Definition: transaction.h:359
bool IsNull() const
Definition: script.h:585
void Init(const T &tx, std::vector< CTxOut > &&spent_outputs, bool force=false)
Initialize this PrecomputedTransactionData with transaction data.
uint160 missing_redeem_script
ScriptID of the missing redeemScript (if any)
Definition: sign.h:98
std::vector< CKeyID > missing_sigs
KeyIDs of pubkeys for signatures which could not be found.
Definition: sign.h:97
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.
Definition: sign.h:102
std::map< CKeyID, XOnlyPubKey > tap_pubkeys
Misc Taproot pubkeys involved in this input, by hash. (Equivalent of misc_pubkeys but for Taproot....
Definition: sign.h:95
std::map< CKeyID, SigPair > signatures
BIP 174 style partial signatures for the input. May contain all signatures necessary for producing a ...
Definition: sign.h:90
TaprootSpendData tr_spenddata
Taproot spending data.
Definition: sign.h:88
bool witness
Stores whether the input this SigData corresponds to is a witness input.
Definition: sign.h:83
std::map< CKeyID, std::pair< CPubKey, KeyOriginInfo > > misc_pubkeys
Definition: sign.h:91
std::optional< TaprootBuilder > tr_builder
Taproot tree used to build tr_spenddata.
Definition: sign.h:89
CScript scriptSig
The scriptSig of an input. Contains complete signatures or the traditional partial signatures format.
Definition: sign.h:84
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.
Definition: sign.h:100
std::vector< unsigned char > taproot_key_path_sig
Definition: sign.h:92
std::map< std::pair< CPubKey, uint256 >, std::map< CPubKey, std::vector< uint8_t > > > musig2_pubnonces
Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys t...
Definition: sign.h:107
std::map< std::pair< XOnlyPubKey, uint256 >, std::vector< unsigned char > > taproot_script_sigs
Schnorr signature for key path spending.
Definition: sign.h:93
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:94
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.
Definition: sign.h:101
CScript redeem_script
The redeemScript (if any) for the input.
Definition: sign.h:85
std::map< std::pair< CPubKey, uint256 >, std::map< CPubKey, uint256 > > musig2_partial_sigs
Mapping from pair of MuSig2 aggregate pubkey, and tapleaf hash to map of MuSig2 participant pubkeys t...
Definition: sign.h:109
uint256 missing_witness_script
SHA256 of the missing witnessScript (if any)
Definition: sign.h:99
std::vector< CKeyID > missing_pubkeys
KeyIDs of pubkeys which could not be found.
Definition: sign.h:96
CScript witness_script
The witnessScript (if any) for the input. witnessScripts are used in P2WSH outputs.
Definition: sign.h:86
std::map< CPubKey, std::vector< CPubKey > > musig2_pubkeys
Map MuSig2 aggregate pubkeys to its participants.
Definition: sign.h:105
CScriptWitness scriptWitness
The scriptWitness of an input. Contains complete signatures or the traditional partial signatures for...
Definition: sign.h:87
bool complete
Stores whether the scriptSig and scriptWitness are complete.
Definition: sign.h:82
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.
Definition: sign.h:103
uint256 merkle_root
The Merkle root of the script tree (0 if no scripts).
std::map< std::pair< std::vector< unsigned char >, int >, std::set< std::vector< unsigned char >, ShortestVectorFirstComparator > > scripts
Map from (script, leaf_version) to (sets of) control blocks.
void Merge(TaprootSpendData other)
Merge other TaprootSpendData (for the same scriptPubKey) into this.
XOnlyPubKey internal_key
The BIP341 internal key.
Instructions for how a PSBT should be signed or filled with information.
Definition: types.h:32
std::optional< int > sighash_type
The sighash type to use when signing (if PSBT does not specify).
Definition: types.h:41
bool finalize
Whether to create the final scriptSig or scriptWitness if possible.
Definition: types.h:46
static int count
consteval auto _(util::TranslatedLiteral str)
Definition: translation.h:79
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:82
std::optional< std::vector< unsigned char > > DecodeBase64(std::string_view str)
assert(!tx.IsCoinBase())