Skip to content

Commit 5bf65ec

Browse files
committed
Merge bitcoin/bitcoin#22558: psbt: Taproot fields for PSBT
b80de4c test: Test signing psbts without explicitly having scripts (Andrew Chow) a73b568 wallet: also search taproot pubkeys in FillPSBT (Andrew Chow) 6cff827 sign: Use sigdata taproot spenddata when signing (Andrew Chow) 5f12fe3 psbt: Implement merge for Taproot fields (Andrew Chow) 1ece9a3 psbt, test: Check for taproot fields in taproot psbt test (Andrew Chow) 496a1bb taproot: Use pre-existing signatures if available (Andrew Chow) 0ad21e7 tests: Test taproot fields for PSBT (Andrew Chow) 103c6fd psbt: Remove non_witness_utxo for segwit v1+ (Andrew Chow) 7dccdd3 Implement decodepsbt for Taproot fields (Andrew Chow) ac77475 Fill PSBT Taproot output data to/from SignatureData (Andrew Chow) 25b6ae4 Assert that TaprootBuilder is Finalized during GetSpendData (Andrew Chow) 3ae5b6a Store TaprootBuilder in SigningProviders instead of TaprootSpendData (Andrew Chow) 4d1223e Fetch key origins for Taproot keys (Andrew Chow) 52e3f2f Fill PSBT Taproot input data to/from SignatureData (Andrew Chow) 05e2cc9 Implement de/ser of PSBT's Taproot fields (Andrew Chow) d557eff Add serialization methods to XOnlyPubKey (Andrew Chow) d43923c Add TaprootBuilder::GetTreeTuples (Andrew Chow) ce91120 Move individual KeyOriginInfo de/ser to separate function (Andrew Chow) Pull request description: Implements the Taproot fields for PSBT described in [BIP 371](https://github.com/bitcoin/bips/blob/master/bip-0371.mediawiki). ACKs for top commit: laanwj: Code review ACK b80de4c Tree-SHA512: 50b79bb44f353c9ec2ef4c98aac08a81eba560987e5264a5684caa370e9c4e7a8255c06747fc47749511be45b32d01492e015f92b82be8d22bc8bf192073bd26
2 parents 55c9e2d + b80de4c commit 5bf65ec

File tree

17 files changed

+708
-31
lines changed

17 files changed

+708
-31
lines changed

src/psbt.cpp

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,24 @@ void PSBTInput::FillSignatureData(SignatureData& sigdata) const
113113
for (const auto& key_pair : hd_keypaths) {
114114
sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
115115
}
116+
if (!m_tap_key_sig.empty()) {
117+
sigdata.taproot_key_path_sig = m_tap_key_sig;
118+
}
119+
for (const auto& [pubkey_leaf, sig] : m_tap_script_sigs) {
120+
sigdata.taproot_script_sigs.emplace(pubkey_leaf, sig);
121+
}
122+
if (!m_tap_internal_key.IsNull()) {
123+
sigdata.tr_spenddata.internal_key = m_tap_internal_key;
124+
}
125+
if (!m_tap_merkle_root.IsNull()) {
126+
sigdata.tr_spenddata.merkle_root = m_tap_merkle_root;
127+
}
128+
for (const auto& [leaf_script, control_block] : m_tap_scripts) {
129+
sigdata.tr_spenddata.scripts.emplace(leaf_script, control_block);
130+
}
131+
for (const auto& [pubkey, leaf_origin] : m_tap_bip32_paths) {
132+
sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
133+
}
116134
}
117135

118136
void PSBTInput::FromSignatureData(const SignatureData& sigdata)
@@ -142,13 +160,30 @@ void PSBTInput::FromSignatureData(const SignatureData& sigdata)
142160
for (const auto& entry : sigdata.misc_pubkeys) {
143161
hd_keypaths.emplace(entry.second);
144162
}
163+
if (!sigdata.taproot_key_path_sig.empty()) {
164+
m_tap_key_sig = sigdata.taproot_key_path_sig;
165+
}
166+
for (const auto& [pubkey_leaf, sig] : sigdata.taproot_script_sigs) {
167+
m_tap_script_sigs.emplace(pubkey_leaf, sig);
168+
}
169+
if (!sigdata.tr_spenddata.internal_key.IsNull()) {
170+
m_tap_internal_key = sigdata.tr_spenddata.internal_key;
171+
}
172+
if (!sigdata.tr_spenddata.merkle_root.IsNull()) {
173+
m_tap_merkle_root = sigdata.tr_spenddata.merkle_root;
174+
}
175+
for (const auto& [leaf_script, control_block] : sigdata.tr_spenddata.scripts) {
176+
m_tap_scripts.emplace(leaf_script, control_block);
177+
}
178+
for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
179+
m_tap_bip32_paths.emplace(pubkey, leaf_origin);
180+
}
145181
}
146182

147183
void PSBTInput::Merge(const PSBTInput& input)
148184
{
149185
if (!non_witness_utxo && input.non_witness_utxo) non_witness_utxo = input.non_witness_utxo;
150186
if (witness_utxo.IsNull() && !input.witness_utxo.IsNull()) {
151-
// TODO: For segwit v1, we will want to clear out the non-witness utxo when setting a witness one. For v0 and non-segwit, this is not safe
152187
witness_utxo = input.witness_utxo;
153188
}
154189

@@ -159,11 +194,17 @@ void PSBTInput::Merge(const PSBTInput& input)
159194
hash256_preimages.insert(input.hash256_preimages.begin(), input.hash256_preimages.end());
160195
hd_keypaths.insert(input.hd_keypaths.begin(), input.hd_keypaths.end());
161196
unknown.insert(input.unknown.begin(), input.unknown.end());
197+
m_tap_script_sigs.insert(input.m_tap_script_sigs.begin(), input.m_tap_script_sigs.end());
198+
m_tap_scripts.insert(input.m_tap_scripts.begin(), input.m_tap_scripts.end());
199+
m_tap_bip32_paths.insert(input.m_tap_bip32_paths.begin(), input.m_tap_bip32_paths.end());
162200

163201
if (redeem_script.empty() && !input.redeem_script.empty()) redeem_script = input.redeem_script;
164202
if (witness_script.empty() && !input.witness_script.empty()) witness_script = input.witness_script;
165203
if (final_script_sig.empty() && !input.final_script_sig.empty()) final_script_sig = input.final_script_sig;
166204
if (final_script_witness.IsNull() && !input.final_script_witness.IsNull()) final_script_witness = input.final_script_witness;
205+
if (m_tap_key_sig.empty() && !input.m_tap_key_sig.empty()) m_tap_key_sig = input.m_tap_key_sig;
206+
if (m_tap_internal_key.IsNull() && !input.m_tap_internal_key.IsNull()) m_tap_internal_key = input.m_tap_internal_key;
207+
if (m_tap_merkle_root.IsNull() && !input.m_tap_merkle_root.IsNull()) m_tap_merkle_root = input.m_tap_merkle_root;
167208
}
168209

169210
void PSBTOutput::FillSignatureData(SignatureData& sigdata) const
@@ -177,6 +218,15 @@ void PSBTOutput::FillSignatureData(SignatureData& sigdata) const
177218
for (const auto& key_pair : hd_keypaths) {
178219
sigdata.misc_pubkeys.emplace(key_pair.first.GetID(), key_pair);
179220
}
221+
if (m_tap_tree.has_value() && m_tap_internal_key.IsFullyValid()) {
222+
TaprootSpendData spenddata = m_tap_tree->GetSpendData();
223+
224+
sigdata.tr_spenddata.internal_key = m_tap_internal_key;
225+
sigdata.tr_spenddata.Merge(spenddata);
226+
}
227+
for (const auto& [pubkey, leaf_origin] : m_tap_bip32_paths) {
228+
sigdata.taproot_misc_pubkeys.emplace(pubkey, leaf_origin);
229+
}
180230
}
181231

182232
void PSBTOutput::FromSignatureData(const SignatureData& sigdata)
@@ -190,6 +240,15 @@ void PSBTOutput::FromSignatureData(const SignatureData& sigdata)
190240
for (const auto& entry : sigdata.misc_pubkeys) {
191241
hd_keypaths.emplace(entry.second);
192242
}
243+
if (!sigdata.tr_spenddata.internal_key.IsNull()) {
244+
m_tap_internal_key = sigdata.tr_spenddata.internal_key;
245+
}
246+
if (sigdata.tr_builder.has_value()) {
247+
m_tap_tree = sigdata.tr_builder;
248+
}
249+
for (const auto& [pubkey, leaf_origin] : sigdata.taproot_misc_pubkeys) {
250+
m_tap_bip32_paths.emplace(pubkey, leaf_origin);
251+
}
193252
}
194253

195254
bool PSBTOutput::IsNull() const
@@ -201,9 +260,12 @@ void PSBTOutput::Merge(const PSBTOutput& output)
201260
{
202261
hd_keypaths.insert(output.hd_keypaths.begin(), output.hd_keypaths.end());
203262
unknown.insert(output.unknown.begin(), output.unknown.end());
263+
m_tap_bip32_paths.insert(output.m_tap_bip32_paths.begin(), output.m_tap_bip32_paths.end());
204264

205265
if (redeem_script.empty() && !output.redeem_script.empty()) redeem_script = output.redeem_script;
206266
if (witness_script.empty() && !output.witness_script.empty()) witness_script = output.witness_script;
267+
if (m_tap_internal_key.IsNull() && !output.m_tap_internal_key.IsNull()) m_tap_internal_key = output.m_tap_internal_key;
268+
if (m_tap_tree.has_value() && !output.m_tap_tree.has_value()) m_tap_tree = output.m_tap_tree;
207269
}
208270
bool PSBTInputSigned(const PSBTInput& input)
209271
{
@@ -313,10 +375,11 @@ bool SignPSBTInput(const SigningProvider& provider, PartiallySignedTransaction&
313375
input.FromSignatureData(sigdata);
314376

315377
// If we have a witness signature, put a witness UTXO.
316-
// TODO: For segwit v1, we should remove the non_witness_utxo
317378
if (sigdata.witness) {
318379
input.witness_utxo = utxo;
319-
// input.non_witness_utxo = nullptr;
380+
// We can remove the non_witness_utxo if and only if there are no non-segwit or segwit v0
381+
// inputs in this transaction. Since this requires inspecting the entire transaction, this
382+
// is something for the caller to deal with (i.e. FillPSBT).
320383
}
321384

322385
// Fill in the missing info

0 commit comments

Comments
 (0)