Skip to content

Commit c169af0

Browse files
committed
key.rs: remove a bunch of unwrap()s which are impossible
Now that we are consistent about the rules that a DerivedDescriptor must obey, we no longer return a Result from derived_key(), which in turn eliminates a bunch of other unwraps.
1 parent 6267818 commit c169af0

File tree

6 files changed

+27
-36
lines changed

6 files changed

+27
-36
lines changed

bitcoind-tests/tests/test_cpp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ pub fn test_from_cpp_ms(cl: &Client, testdata: &TestData) {
145145
// Sign the transactions with all keys
146146
// AKA the signer role of psbt
147147
for i in 0..psbts.len() {
148-
let wsh_derived = desc_vec[i].derived_descriptor(&secp).unwrap();
148+
let wsh_derived = desc_vec[i].derived_descriptor(&secp);
149149
let ms = if let Descriptor::Wsh(wsh) = &wsh_derived {
150150
match wsh.as_inner() {
151151
miniscript::descriptor::WshInner::Ms(ms) => ms,

bitcoind-tests/tests/test_desc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pub fn test_desc_satisfy(
8989
.at_derivation_index(0)
9090
.unwrap();
9191

92-
let derived_desc = definite_desc.derived_descriptor(&secp).unwrap();
92+
let derived_desc = definite_desc.derived_descriptor(&secp);
9393
let desc_address = derived_desc.address(bitcoin::Network::Regtest);
9494
let desc_address = desc_address.map_err(|_x| DescError::AddressComputationError)?;
9595

examples/xpub_descriptors.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ fn p2wsh<C: Verification>(secp: &Secp256k1<C>) -> Address {
3131
let address = Descriptor::<DefiniteDescriptorKey>::from_str(&s)
3232
.unwrap()
3333
.derived_descriptor(secp)
34-
.unwrap()
3534
.address(Network::Bitcoin)
3635
.unwrap();
3736

src/descriptor/key.rs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,29 +1254,26 @@ impl DefiniteDescriptorKey {
12541254
///
12551255
/// Will return an error if the descriptor key has any hardened derivation steps in its path. To
12561256
/// avoid this error you should replace any such public keys first with [`crate::Descriptor::translate_pk`].
1257-
pub fn derive_public_key<C: Verification>(
1258-
&self,
1259-
secp: &Secp256k1<C>,
1260-
) -> Result<bitcoin::PublicKey, ConversionError> {
1257+
pub fn derive_public_key<C: Verification>(&self, secp: &Secp256k1<C>) -> bitcoin::PublicKey {
12611258
match self.0 {
12621259
DescriptorPublicKey::Single(ref pk) => match pk.key {
1263-
SinglePubKey::FullKey(pk) => Ok(pk),
1264-
SinglePubKey::XOnly(xpk) => Ok(xpk.to_public_key()),
1260+
SinglePubKey::FullKey(pk) => pk,
1261+
SinglePubKey::XOnly(xpk) => xpk.to_public_key(),
12651262
},
12661263
DescriptorPublicKey::XPub(ref xpk) => match xpk.wildcard {
12671264
Wildcard::Unhardened | Wildcard::Hardened => {
1268-
unreachable!("we've excluded this error case")
1265+
unreachable!("impossible by construction of DefiniteDescriptorKey")
12691266
}
12701267
Wildcard::None => match xpk.xkey.derive_pub(secp, &xpk.derivation_path.as_ref()) {
1271-
Ok(xpub) => Ok(bitcoin::PublicKey::new(xpub.public_key)),
1268+
Ok(xpub) => bitcoin::PublicKey::new(xpub.public_key),
12721269
Err(bip32::Error::CannotDeriveFromHardenedKey) => {
1273-
Err(ConversionError::HardenedChild)
1270+
unreachable!("impossible by construction of DefiniteDescriptorKey")
12741271
}
12751272
Err(e) => unreachable!("cryptographically unreachable: {}", e),
12761273
},
12771274
},
12781275
DescriptorPublicKey::MultiXPub(_) => {
1279-
unreachable!("A definite key cannot contain a multipath key.")
1276+
unreachable!("impossible by construction of DefiniteDescriptorKey")
12801277
}
12811278
}
12821279
}
@@ -1346,7 +1343,7 @@ impl MiniscriptKey for DefiniteDescriptorKey {
13461343
impl ToPublicKey for DefiniteDescriptorKey {
13471344
fn to_public_key(&self) -> bitcoin::PublicKey {
13481345
let secp = Secp256k1::verification_only();
1349-
self.derive_public_key(&secp).unwrap()
1346+
self.derive_public_key(&secp)
13501347
}
13511348

13521349
fn to_sha256(hash: &sha256::Hash) -> sha256::Hash { *hash }

src/descriptor/mod.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -693,7 +693,7 @@ impl Descriptor<DescriptorPublicKey> {
693693
/// .expect("Valid ranged descriptor");
694694
/// # let index = 42;
695695
/// # let secp = Secp256k1::verification_only();
696-
/// let derived_descriptor = descriptor.at_derivation_index(index).unwrap().derived_descriptor(&secp).unwrap();
696+
/// let derived_descriptor = descriptor.at_derivation_index(index).unwrap().derived_descriptor(&secp);
697697
/// # assert_eq!(descriptor.derived_descriptor(&secp, index).unwrap(), derived_descriptor);
698698
/// ```
699699
///
@@ -712,7 +712,7 @@ impl Descriptor<DescriptorPublicKey> {
712712
secp: &secp256k1::Secp256k1<C>,
713713
index: u32,
714714
) -> Result<Descriptor<bitcoin::PublicKey>, ConversionError> {
715-
self.at_derivation_index(index)?.derived_descriptor(secp)
715+
Ok(self.at_derivation_index(index)?.derived_descriptor(secp))
716716
}
717717

718718
/// Parse a descriptor that may contain secret keys
@@ -948,7 +948,7 @@ impl Descriptor<DefiniteDescriptorKey> {
948948
/// let secp = secp256k1::Secp256k1::verification_only();
949949
/// let descriptor = Descriptor::<DescriptorPublicKey>::from_str("tr(xpub6BgBgsespWvERF3LHQu6CnqdvfEvtMcQjYrcRzx53QJjSxarj2afYWcLteoGVky7D3UKDP9QyrLprQ3VCECoY49yfdDEHGCtMMj92pReUsQ/0/*)")
950950
/// .expect("Valid ranged descriptor");
951-
/// let result = descriptor.at_derivation_index(0).unwrap().derived_descriptor(&secp).expect("Non-hardened derivation");
951+
/// let result = descriptor.at_derivation_index(0).unwrap().derived_descriptor(&secp);
952952
/// assert_eq!(result.to_string(), "tr(03cc8a4bc64d897bddc5fbc2f670f7a8ba0b386779106cf1223c6fc5d7cd6fc115)#6qm9h8ym");
953953
/// ```
954954
///
@@ -958,27 +958,26 @@ impl Descriptor<DefiniteDescriptorKey> {
958958
pub fn derived_descriptor<C: secp256k1::Verification>(
959959
&self,
960960
secp: &secp256k1::Secp256k1<C>,
961-
) -> Result<Descriptor<bitcoin::PublicKey>, ConversionError> {
961+
) -> Descriptor<bitcoin::PublicKey> {
962962
struct Derivator<'a, C: secp256k1::Verification>(&'a secp256k1::Secp256k1<C>);
963963

964964
impl<C: secp256k1::Verification> Translator<DefiniteDescriptorKey> for Derivator<'_, C> {
965965
type TargetPk = bitcoin::PublicKey;
966-
type Error = ConversionError;
966+
type Error = core::convert::Infallible;
967967

968-
fn pk(
969-
&mut self,
970-
pk: &DefiniteDescriptorKey,
971-
) -> Result<bitcoin::PublicKey, ConversionError> {
972-
pk.derive_public_key(self.0)
968+
fn pk(&mut self, pk: &DefiniteDescriptorKey) -> Result<Self::TargetPk, Self::Error> {
969+
Ok(pk.derive_public_key(self.0))
973970
}
974971

975972
translate_hash_clone!(DefiniteDescriptorKey);
976973
}
977974

978975
let derived = self.translate_pk(&mut Derivator(secp));
979976
match derived {
980-
Ok(derived) => Ok(derived),
981-
Err(e) => Err(e.expect_translator_err("No Context errors when deriving keys")),
977+
Ok(derived) => derived,
978+
// Impossible to hit, since deriving keys does not change any Miniscript-relevant
979+
// properties of the key.
980+
Err(e) => panic!("Context errors when deriving keys: {}", e.into_outer_err()),
982981
}
983982
}
984983
}
@@ -1825,14 +1824,12 @@ mod tests {
18251824
.at_derivation_index(index)
18261825
.unwrap()
18271826
.derived_descriptor(&secp_ctx)
1828-
.unwrap()
18291827
.address(bitcoin::Network::Bitcoin)
18301828
.unwrap();
18311829
let addr_two = desc_two
18321830
.at_derivation_index(index)
18331831
.unwrap()
18341832
.derived_descriptor(&secp_ctx)
1835-
.unwrap()
18361833
.address(bitcoin::Network::Bitcoin)
18371834
.unwrap();
18381835
let addr_expected = bitcoin::Address::from_str(raw_addr_expected)

src/psbt/mod.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -981,19 +981,16 @@ struct KeySourceLookUp(
981981

982982
impl Translator<DefiniteDescriptorKey> for KeySourceLookUp {
983983
type TargetPk = bitcoin::PublicKey;
984-
type Error = descriptor::ConversionError;
984+
type Error = core::convert::Infallible;
985985

986-
fn pk(
987-
&mut self,
988-
xpk: &DefiniteDescriptorKey,
989-
) -> Result<bitcoin::PublicKey, descriptor::ConversionError> {
990-
let derived = xpk.derive_public_key(&self.1)?;
986+
fn pk(&mut self, xpk: &DefiniteDescriptorKey) -> Result<Self::TargetPk, Self::Error> {
987+
let derived = xpk.derive_public_key(&self.1);
991988
self.0.insert(
992989
derived.to_public_key().inner,
993990
(
994991
xpk.master_fingerprint(),
995992
xpk.full_derivation_path()
996-
.ok_or(descriptor::ConversionError::MultiKey)?,
993+
.expect("definite keys cannot be multikeys"),
997994
),
998995
);
999996
Ok(derived)
@@ -1097,7 +1094,8 @@ fn update_item_with_descriptor_helper<F: PsbtFields>(
10971094
let mut bip32_derivation = KeySourceLookUp(BTreeMap::new(), secp);
10981095
let derived = descriptor
10991096
.translate_pk(&mut bip32_derivation)
1100-
.map_err(|e| e.expect_translator_err("No Outer Context errors in translations"))?;
1097+
.map_err(crate::TranslateErr::into_outer_err)
1098+
.expect("No Context errors while translating");
11011099

11021100
// 2. If we have a specific scriptpubkey we are targeting, bail out.
11031101
if let Some(check_script) = check_script {

0 commit comments

Comments
 (0)