Skip to content

Commit b2f21d2

Browse files
committed
Merge #911: Return error from at_derivation_index when descriptor has no wildcard
1062144 feat(descriptor): deprecate at_derivation_index, add derive_at_index and TryFrom (Yeji Han) Pull request description: Closes #829. - Previously, calling `at_derivation_index()` on a descriptor without wildcards would silently ignore the index and return the descriptor unchanged. This was error-prone because callers would expect different indices to produce different addresses. - Callers that need to convert a non-wildcard descriptor to a definite one should use `DefiniteDescriptorKey::new()` on individual keys, or check `has_wildcard()` before calling `at_derivation_index()`. - Add edge case tests for `at_derivation_index` wildcard check ACKs for top commit: apoelstra: ACK 1062144; successfully ran local tests Tree-SHA512: 820b8bc543b6884997839374aba3de0d78511c603763650816fe676936795b345e0bec96e19c6a334261b0b0eb252f9f7ae72dee9537830b69d21c485181a0fb
2 parents 78254b2 + 1062144 commit b2f21d2

6 files changed

Lines changed: 234 additions & 38 deletions

File tree

bitcoind-tests/tests/test_cpp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ pub(crate) fn parse_miniscripts(pubdata: &PubData) -> Vec<Descriptor<DefiniteDes
3030
for line in read_lines("tests/data/random_ms.txt") {
3131
let ms = test_util::parse_insane_ms(&line.unwrap(), pubdata);
3232
let wsh = Descriptor::new_wsh(ms).unwrap();
33-
desc_vec.push(wsh.at_derivation_index(0).unwrap());
33+
desc_vec.push(wsh.into_definite().unwrap());
3434
}
3535
desc_vec
3636
}

bitcoind-tests/tests/test_desc.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,13 @@ pub fn test_desc_satisfy(
8585
.unwrap();
8686
assert_eq!(blocks.0.len(), 1);
8787

88-
let definite_desc = test_util::parse_test_desc(descriptor, &testdata.pubdata)
89-
.map_err(|_| DescError::DescParseError)?
90-
.at_derivation_index(0)
91-
.unwrap();
88+
let desc = test_util::parse_test_desc(descriptor, &testdata.pubdata)
89+
.map_err(|_| DescError::DescParseError)?;
90+
let definite_desc = if desc.has_wildcard() {
91+
desc.derive_at_index(0).unwrap()
92+
} else {
93+
desc.into_definite().unwrap()
94+
};
9295

9396
let derived_desc = definite_desc.derived_descriptor(&secp);
9497
let desc_address = derived_desc.address(bitcoin::Network::Regtest);
@@ -449,10 +452,13 @@ fn test_plan_satisfy(
449452
.unwrap();
450453
assert_eq!(blocks.0.len(), 1);
451454

452-
let definite_desc = test_util::parse_test_desc(descriptor, &testdata.pubdata)
453-
.map_err(|_| DescError::DescParseError)?
454-
.at_derivation_index(0)
455-
.unwrap();
455+
let desc = test_util::parse_test_desc(descriptor, &testdata.pubdata)
456+
.map_err(|_| DescError::DescParseError)?;
457+
let definite_desc = if desc.has_wildcard() {
458+
desc.derive_at_index(0).unwrap()
459+
} else {
460+
desc.into_definite().unwrap()
461+
};
456462

457463
let derived_desc = definite_desc.derived_descriptor(&secp);
458464
let desc_address = derived_desc

examples/big.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ fn main() {
3333
use_descriptor(Descriptor::<String>::from_str(&i).unwrap());
3434

3535
let a = d
36-
.at_derivation_index(0)
36+
.derive_at_index(0)
3737
.unwrap()
3838
.address(bitcoin::Network::Bitcoin)
3939
.unwrap();

examples/taptree_of_horror/taptree_of_horror.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ fn main() {
186186
let policy_desc: Descriptor<DescriptorPublicKey> = pol.compile_tr(None).unwrap();
187187

188188
// Now, using this public descriptor create the script address
189-
let derived_descriptor = policy_desc.at_derivation_index(0).unwrap();
189+
let derived_descriptor = policy_desc.derive_at_index(0).unwrap();
190190
let _script_address = derived_descriptor.address(Network::Regtest).unwrap();
191191
println!("the receiving address of this script is: {}", _script_address);
192192
println!("\ndescriptor is: {}\n", policy_desc);

src/descriptor/key.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ pub enum NonDefiniteKeyError {
358358
Wildcard,
359359
Multipath,
360360
HardenedStep,
361+
NoWildcard,
361362
}
362363

363364
impl fmt::Display for NonDefiniteKeyError {
@@ -368,6 +369,9 @@ impl fmt::Display for NonDefiniteKeyError {
368369
Self::HardenedStep => {
369370
f.write_str("key with hardened derivation steps cannot be a DerivedDescriptorKey")
370371
}
372+
Self::NoWildcard => {
373+
f.write_str("descriptor does not have a wildcard; cannot derive at index")
374+
}
371375
}
372376
}
373377
}

0 commit comments

Comments
 (0)