Skip to content

Commit 1062144

Browse files
committed
feat(descriptor): deprecate at_derivation_index, add derive_at_index and TryFrom
- Deprecate at_derivation_index() preserving old behavior (non-wildcard silently works) - Add derive_at_index() that strictly requires wildcards, delegates to at_derivation_index() - Add TryFrom<Descriptor<DescriptorPublicKey>> for Descriptor<DefiniteDescriptorKey> - Split Definitor enum into separate local Translator structs (ToDefinite, AtIndex) - Update internal callers, tests, and examples to use new API
1 parent 04f1c58 commit 1062144

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);
@@ -444,10 +447,13 @@ fn test_plan_satisfy(
444447
.unwrap();
445448
assert_eq!(blocks.0.len(), 1);
446449

447-
let definite_desc = test_util::parse_test_desc(descriptor, &testdata.pubdata)
448-
.map_err(|_| DescError::DescParseError)?
449-
.at_derivation_index(0)
450-
.unwrap();
450+
let desc = test_util::parse_test_desc(descriptor, &testdata.pubdata)
451+
.map_err(|_| DescError::DescParseError)?;
452+
let definite_desc = if desc.has_wildcard() {
453+
desc.derive_at_index(0).unwrap()
454+
} else {
455+
desc.into_definite().unwrap()
456+
};
451457

452458
let derived_desc = definite_desc.derived_descriptor(&secp);
453459
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)