Skip to content

Commit f16927c

Browse files
committed
Remove PkTranslator trait
This is the second commit in a series of two in order to remove the PkTranslator trait. The triat has a general implementation of Tranlator like `impl Translator for PkTranslator where P::Sha256 ...`. However, this blanket implemented has constraints on associated types and makes it impossible to implement the trait for a generic type downstream. Rust compiler does not support for trait specialization yet, and so we should only provide a macro to ease implementation rather than a blanket implementation that causes duplicate conflicts downstream
1 parent 9ddf516 commit f16927c

File tree

5 files changed

+33
-51
lines changed

5 files changed

+33
-51
lines changed

src/descriptor/mod.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ use self::checksum::verify_checksum;
3737
use crate::miniscript::{Legacy, Miniscript, Segwitv0};
3838
use crate::prelude::*;
3939
use crate::{
40-
expression, hash256, miniscript, BareCtx, Error, ForEach, ForEachKey, MiniscriptKey,
41-
PkTranslator, Satisfier, ToPublicKey, TranslatePk, Translator,
40+
expression, hash256, miniscript, BareCtx, Error, ForEach, ForEachKey, MiniscriptKey, Satisfier,
41+
ToPublicKey, TranslatePk, Translator,
4242
};
4343

4444
mod bare;
@@ -526,14 +526,16 @@ impl Descriptor<DescriptorPublicKey> {
526526
pub fn derive(&self, index: u32) -> Descriptor<DerivedDescriptorKey> {
527527
struct Derivator(u32);
528528

529-
impl PkTranslator<DescriptorPublicKey, DerivedDescriptorKey, ()> for Derivator {
529+
impl Translator<DescriptorPublicKey, DerivedDescriptorKey, ()> for Derivator {
530530
fn pk(&mut self, pk: &DescriptorPublicKey) -> Result<DerivedDescriptorKey, ()> {
531531
Ok(pk.clone().derive(self.0))
532532
}
533533

534534
fn pkh(&mut self, pkh: &DescriptorPublicKey) -> Result<DerivedDescriptorKey, ()> {
535535
Ok(pkh.clone().derive(self.0))
536536
}
537+
538+
translate_assoc_clone!(DescriptorPublicKey, DescriptorPublicKey, ());
537539
}
538540
self.translate_pk(&mut Derivator(index))
539541
.expect("BIP 32 key index substitution cannot fail")
@@ -571,7 +573,7 @@ impl Descriptor<DescriptorPublicKey> {
571573
struct Derivator<'a, C: secp256k1::Verification>(&'a secp256k1::Secp256k1<C>);
572574

573575
impl<'a, C: secp256k1::Verification>
574-
PkTranslator<DerivedDescriptorKey, bitcoin::PublicKey, ConversionError>
576+
Translator<DerivedDescriptorKey, bitcoin::PublicKey, ConversionError>
575577
for Derivator<'a, C>
576578
{
577579
fn pk(
@@ -587,6 +589,8 @@ impl Descriptor<DescriptorPublicKey> {
587589
) -> Result<bitcoin::hashes::hash160::Hash, ConversionError> {
588590
Ok(pkh.derive_public_key(&self.0)?.to_pubkeyhash())
589591
}
592+
593+
translate_assoc_clone!(DerivedDescriptorKey, bitcoin::PublicKey, ConversionError);
590594
}
591595

592596
let derived = self.derive(index).translate_pk(&mut Derivator(secp))?;

src/interpreter/inner.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use bitcoin::util::taproot::{ControlBlock, TAPROOT_ANNEX_PREFIX};
2020
use super::{stack, BitcoinKey, Error, Stack, TypedHash160};
2121
use crate::miniscript::context::{NoChecks, ScriptContext};
2222
use crate::prelude::*;
23-
use crate::{BareCtx, Legacy, Miniscript, MiniscriptKey, PkTranslator, Segwitv0, Tap};
23+
use crate::{BareCtx, Legacy, Miniscript, MiniscriptKey, Segwitv0, Tap, Translator};
2424

2525
/// Attempts to parse a slice as a Bitcoin public key, checking compressedness
2626
/// if asked to, but otherwise dropping it
@@ -377,14 +377,16 @@ impl<Ctx: ScriptContext> ToNoChecks for Miniscript<bitcoin::PublicKey, Ctx> {
377377
fn to_no_checks_ms(&self) -> Miniscript<BitcoinKey, NoChecks> {
378378
struct TranslateFullPk;
379379

380-
impl PkTranslator<bitcoin::PublicKey, BitcoinKey, ()> for TranslateFullPk {
380+
impl Translator<bitcoin::PublicKey, BitcoinKey, ()> for TranslateFullPk {
381381
fn pk(&mut self, pk: &bitcoin::PublicKey) -> Result<BitcoinKey, ()> {
382382
Ok(BitcoinKey::Fullkey(*pk))
383383
}
384384

385385
fn pkh(&mut self, pkh: &hash160::Hash) -> Result<TypedHash160, ()> {
386386
Ok(TypedHash160::FullKey(*pkh))
387387
}
388+
389+
translate_assoc_clone!(bitcoin::PublicKey, BitcoinKey, ());
388390
}
389391

390392
self.real_translate_pk(&mut TranslateFullPk)
@@ -397,14 +399,15 @@ impl<Ctx: ScriptContext> ToNoChecks for Miniscript<bitcoin::XOnlyPublicKey, Ctx>
397399
// specify the () error type as this cannot error
398400
struct TranslateXOnlyPk;
399401

400-
impl PkTranslator<bitcoin::XOnlyPublicKey, BitcoinKey, ()> for TranslateXOnlyPk {
402+
impl Translator<bitcoin::XOnlyPublicKey, BitcoinKey, ()> for TranslateXOnlyPk {
401403
fn pk(&mut self, pk: &bitcoin::XOnlyPublicKey) -> Result<BitcoinKey, ()> {
402404
Ok(BitcoinKey::XOnlyPublicKey(*pk))
403405
}
404406

405407
fn pkh(&mut self, pkh: &hash160::Hash) -> Result<TypedHash160, ()> {
406408
Ok(TypedHash160::XonlyKey(*pkh))
407409
}
410+
translate_assoc_clone!(bitcoin::XOnlyPublicKey, BitcoinKey, ());
408411
}
409412
self.real_translate_pk(&mut TranslateXOnlyPk)
410413
.expect("Translation should succeed")

src/lib.rs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -465,44 +465,6 @@ where
465465
fn hash256(&mut self, hash256: &P::Hash256) -> Result<Q::Hash256, E>;
466466
}
467467

468-
/// Provides the conversion information required in [`TranslatePk`].
469-
/// Same as [`Translator`], but useful when all the associated types apart
470-
/// from Pk/Pkh don't change in translation
471-
pub trait PkTranslator<P, Q, E>
472-
where
473-
P: MiniscriptKey,
474-
Q: MiniscriptKey<Sha256 = P::Sha256>,
475-
{
476-
/// Provides the translation public keys P -> Q
477-
fn pk(&mut self, pk: &P) -> Result<Q, E>;
478-
479-
/// Provides the translation public keys hashes P::Hash -> Q::Hash
480-
fn pkh(&mut self, pkh: &P::Hash) -> Result<Q::Hash, E>;
481-
}
482-
483-
impl<P, Q, E, T> Translator<P, Q, E> for T
484-
where
485-
T: PkTranslator<P, Q, E>,
486-
P: MiniscriptKey,
487-
Q: MiniscriptKey<Sha256 = P::Sha256, Hash256 = P::Hash256>,
488-
{
489-
fn pk(&mut self, pk: &P) -> Result<Q, E> {
490-
<Self as PkTranslator<P, Q, E>>::pk(self, pk)
491-
}
492-
493-
fn pkh(&mut self, pkh: &<P as MiniscriptKey>::Hash) -> Result<<Q as MiniscriptKey>::Hash, E> {
494-
<Self as PkTranslator<P, Q, E>>::pkh(self, pkh)
495-
}
496-
497-
fn sha256(&mut self, sha256: &<P as MiniscriptKey>::Sha256) -> Result<<Q>::Sha256, E> {
498-
Ok(sha256.clone())
499-
}
500-
501-
fn hash256(&mut self, hash256: &<P as MiniscriptKey>::Hash256) -> Result<<Q>::Hash256, E> {
502-
Ok(hash256.clone())
503-
}
504-
}
505-
506468
/// Converts a descriptor using abstract keys to one using specific keys. Uses translator `t` to do
507469
/// the actual translation function calls.
508470
pub trait TranslatePk<P, Q>

src/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,14 @@ macro_rules! translate_assoc_clone {
3131
($source: ty, $target:ty, $error_ty: ty) => {
3232
fn sha256(
3333
&mut self,
34-
_sha256: &<$source as MiniscriptKey>::Sha256,
34+
sha256: &<$source as MiniscriptKey>::Sha256,
3535
) -> Result<<$target as MiniscriptKey>::Sha256, $error_ty> {
3636
Ok(sha256.clone())
3737
}
3838

3939
fn hash256(
4040
&mut self,
41-
_hash256: &<$source as MiniscriptKey>::Hash256,
41+
hash256: &<$source as MiniscriptKey>::Hash256,
4242
) -> Result<<$target as MiniscriptKey>::Hash256, $error_ty> {
4343
Ok(hash256.clone())
4444
}

src/psbt/mod.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ use crate::miniscript::limits::SEQUENCE_LOCKTIME_DISABLE_FLAG;
3636
use crate::miniscript::satisfy::{After, Older};
3737
use crate::prelude::*;
3838
use crate::{
39-
descriptor, interpreter, Descriptor, DescriptorPublicKey, MiniscriptKey, PkTranslator,
40-
Preimage32, Satisfier, ToPublicKey, TranslatePk,
39+
descriptor, interpreter, Descriptor, DescriptorPublicKey, MiniscriptKey, Preimage32, Satisfier,
40+
ToPublicKey, TranslatePk, Translator,
4141
};
4242

4343
mod finalizer;
@@ -937,7 +937,7 @@ struct XOnlyHashLookUp(
937937
pub secp256k1::Secp256k1<VerifyOnly>,
938938
);
939939

940-
impl PkTranslator<DescriptorPublicKey, bitcoin::PublicKey, descriptor::ConversionError>
940+
impl Translator<DescriptorPublicKey, bitcoin::PublicKey, descriptor::ConversionError>
941941
for XOnlyHashLookUp
942942
{
943943
fn pk(
@@ -957,6 +957,13 @@ impl PkTranslator<DescriptorPublicKey, bitcoin::PublicKey, descriptor::Conversio
957957
self.0.insert(hash, xonly);
958958
Ok(hash)
959959
}
960+
961+
// Clone all the associated types in translation
962+
translate_assoc_clone!(
963+
DescriptorPublicKey,
964+
bitcoin::PublicKey,
965+
descriptor::ConversionError
966+
);
960967
}
961968

962969
// Traverse the pkh lookup while maintaining a reverse map for storing the map
@@ -966,7 +973,7 @@ struct KeySourceLookUp(
966973
pub secp256k1::Secp256k1<VerifyOnly>,
967974
);
968975

969-
impl PkTranslator<DescriptorPublicKey, bitcoin::PublicKey, descriptor::ConversionError>
976+
impl Translator<DescriptorPublicKey, bitcoin::PublicKey, descriptor::ConversionError>
970977
for KeySourceLookUp
971978
{
972979
fn pk(
@@ -987,6 +994,12 @@ impl PkTranslator<DescriptorPublicKey, bitcoin::PublicKey, descriptor::Conversio
987994
) -> Result<hash160::Hash, descriptor::ConversionError> {
988995
Ok(self.pk(xpk)?.to_pubkeyhash())
989996
}
997+
998+
translate_assoc_clone!(
999+
DescriptorPublicKey,
1000+
bitcoin::PublicKey,
1001+
descriptor::ConversionError
1002+
);
9901003
}
9911004

9921005
fn update_input_with_descriptor_helper(

0 commit comments

Comments
 (0)