Skip to content

Commit 815fd1c

Browse files
committed
Bug fix: pkh->pk lookup API
psbts where we needed to dissatisfy pkh did not work properly as we did not implement the mapping pkh->pk required for dissatisfaction of pkh fragment. We now look for this mapping in bip32 derivation field of psbt. Our update_utxo_from_descriptor API correctly procesess these fields.
1 parent 43abc43 commit 815fd1c

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

src/miniscript/satisfy.rs

+33-7
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,13 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
6060
None
6161
}
6262

63-
/// Given a raw `Pkh`, lookup corresponding `Pk`
64-
fn lookup_raw_pkh_pk(&self, _: &hash160::Hash) -> Option<Pk> {
63+
/// Given a raw `Pkh`, lookup corresponding [`bitcoin::PublicKey`]
64+
fn lookup_raw_pkh_pk(&self, _: &hash160::Hash) -> Option<bitcoin::PublicKey> {
65+
None
66+
}
67+
68+
/// Given a raw `Pkh`, lookup corresponding [`bitcoin::XOnlyPublicKey`]
69+
fn lookup_raw_pkh_x_only_pk(&self, _: &hash160::Hash) -> Option<XOnlyPublicKey> {
6570
None
6671
}
6772

@@ -183,8 +188,8 @@ where
183188
self.get(&key.to_pubkeyhash(SigType::Ecdsa)).map(|x| x.1)
184189
}
185190

186-
fn lookup_raw_pkh_pk(&self, pk_hash: &hash160::Hash) -> Option<Pk> {
187-
self.get(pk_hash).map(|x| x.0.clone())
191+
fn lookup_raw_pkh_pk(&self, pk_hash: &hash160::Hash) -> Option<bitcoin::PublicKey> {
192+
self.get(pk_hash).map(|x| x.0.to_public_key())
188193
}
189194

190195
fn lookup_raw_pkh_ecdsa_sig(
@@ -224,10 +229,14 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
224229
(**self).lookup_tap_leaf_script_sig(p, h)
225230
}
226231

227-
fn lookup_raw_pkh_pk(&self, pkh: &hash160::Hash) -> Option<Pk> {
232+
fn lookup_raw_pkh_pk(&self, pkh: &hash160::Hash) -> Option<bitcoin::PublicKey> {
228233
(**self).lookup_raw_pkh_pk(pkh)
229234
}
230235

236+
fn lookup_raw_pkh_x_only_pk(&self, pkh: &hash160::Hash) -> Option<XOnlyPublicKey> {
237+
(**self).lookup_raw_pkh_x_only_pk(pkh)
238+
}
239+
231240
fn lookup_raw_pkh_ecdsa_sig(
232241
&self,
233242
pkh: &hash160::Hash,
@@ -290,10 +299,14 @@ impl<'a, Pk: MiniscriptKey + ToPublicKey, S: Satisfier<Pk>> Satisfier<Pk> for &'
290299
(**self).lookup_tap_key_spend_sig()
291300
}
292301

293-
fn lookup_raw_pkh_pk(&self, pkh: &hash160::Hash) -> Option<Pk> {
302+
fn lookup_raw_pkh_pk(&self, pkh: &hash160::Hash) -> Option<bitcoin::PublicKey> {
294303
(**self).lookup_raw_pkh_pk(pkh)
295304
}
296305

306+
fn lookup_raw_pkh_x_only_pk(&self, pkh: &hash160::Hash) -> Option<XOnlyPublicKey> {
307+
(**self).lookup_raw_pkh_x_only_pk(pkh)
308+
}
309+
297310
fn lookup_raw_pkh_ecdsa_sig(
298311
&self,
299312
pkh: &hash160::Hash,
@@ -406,7 +419,7 @@ macro_rules! impl_tuple_satisfier {
406419
fn lookup_raw_pkh_pk(
407420
&self,
408421
key_hash: &hash160::Hash,
409-
) -> Option<Pk> {
422+
) -> Option<bitcoin::PublicKey> {
410423
let &($(ref $ty,)*) = self;
411424
$(
412425
if let Some(result) = $ty.lookup_raw_pkh_pk(key_hash) {
@@ -416,6 +429,19 @@ macro_rules! impl_tuple_satisfier {
416429
None
417430
}
418431

432+
fn lookup_raw_pkh_x_only_pk(
433+
&self,
434+
key_hash: &hash160::Hash,
435+
) -> Option<XOnlyPublicKey> {
436+
let &($(ref $ty,)*) = self;
437+
$(
438+
if let Some(result) = $ty.lookup_raw_pkh_x_only_pk(key_hash) {
439+
return Some(result);
440+
}
441+
)*
442+
None
443+
}
444+
419445
fn lookup_tap_control_block_map(
420446
&self,
421447
) -> Option<&BTreeMap<ControlBlock, (bitcoin::Script, LeafVersion)>> {

src/psbt/mod.rs

+8
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,14 @@ impl<'psbt, Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for PsbtInputSatisfie
297297
.copied()
298298
}
299299

300+
fn lookup_raw_pkh_pk(&self, pkh: &hash160::Hash) -> Option<bitcoin::PublicKey> {
301+
self.psbt.inputs[self.index]
302+
.bip32_derivation
303+
.iter()
304+
.find(|&(pubkey, _)| pubkey.to_pubkeyhash(SigType::Ecdsa) == *pkh)
305+
.map(|(pubkey, _)| bitcoin::PublicKey::new(*pubkey))
306+
}
307+
300308
fn lookup_tap_control_block_map(
301309
&self,
302310
) -> Option<&BTreeMap<ControlBlock, (bitcoin::Script, LeafVersion)>> {

0 commit comments

Comments
 (0)