Skip to content

Commit

Permalink
Merge #737: Misc compatibility-with-12.x things
Browse files Browse the repository at this point in the history
1259375 miniscript: make display prefer 'u' over 'l' in the fragment l:0 (Andrew Poelstra)
67fdc50 descriptor: reject strings of the form "tr(<key>,)" (Andrew Poelstra)
00cac40 descriptor: add unit test demonstrating sanity-checking behavior in <= 12.x (Andrew Poelstra)

Pull request description:

  This PR has three changes which are mostly unrelated except that they were all found when fuzzing my "rewrite expression parser to be nonrecursive" branch against 12.x.

  * First is a unit test demonstrating #734. It doesn't fix anything, just tests the current behavior.
  * Second is a fix for #736 (backported in #735).
  * Third tweaks the new `Display` code from #722 to change how the ambiguous `l:0`/`u:0` is serialized, to match 12.x.

ACKs for top commit:
  sanket1729:
    ACK 1259375

Tree-SHA512: 921d65a1efd49bda0f9db488a2854b004e14518f584d832497a9dbc13a845ceec99544375385570c6ac42d4985277e8dcbb3aa8654de93235cf9067ba601f91d
  • Loading branch information
apoelstra committed Sep 3, 2024
2 parents 734d34e + 1259375 commit b11cdc2
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 5 deletions.
39 changes: 39 additions & 0 deletions src/descriptor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1036,6 +1036,21 @@ mod tests {
);
}

#[test]
fn display_prefers_u() {
// The fragments u:0 and l:0 are identical in terms of Script and
// in terms of the in-memory representation -- OrI(False, False).
// Test that the way we display the ambiguous fragment doesn't
// change, in case somebody somehow is depending on it.
let desc = StdDescriptor::from_str("sh(u:0)").unwrap();
assert_eq!("sh(u:0)#ncq3yf9h", desc.to_string());

// This is a regression test for https://github.com/rust-bitcoin/rust-miniscript/pull/735
// which was found at the same time. It's just a bug plain and simple.
let desc = StdDescriptor::from_str("sh(and_n(u:0,1))").unwrap();
assert_eq!("sh(and_n(u:0,1))#5j5tw8nm", desc.to_string());
}

#[test]
fn desc_rtt_tests() {
roundtrip_descriptor("c:pk_k()");
Expand Down Expand Up @@ -2011,6 +2026,30 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
Descriptor::<DescriptorPublicKey>::from_str("wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/<0;1;2;3>/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/<0;1;2>/*)))").unwrap_err();
}

#[test]
fn regression_736() {
Descriptor::<DescriptorPublicKey>::from_str(
"tr(0000000000000000000000000000000000000000000000000000000000000002,)",
)
.unwrap_err();
}

#[test]
fn regression_734() {
Descriptor::<DescriptorPublicKey>::from_str(
"wsh(or_i(pk(0202baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a66a),1))",
)
.unwrap();
Descriptor::<DescriptorPublicKey>::from_str(
"sh(or_i(pk(0202baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a66a),1))",
)
.unwrap();
Descriptor::<DescriptorPublicKey>::from_str(
"tr(02baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0a66a,1)",
)
.unwrap_err();
}

#[test]
fn test_context_pks() {
let comp_key = bitcoin::PublicKey::from_str(
Expand Down
3 changes: 0 additions & 3 deletions src/descriptor/tr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -603,9 +603,6 @@ fn parse_tr_tree(s: &str) -> Result<expression::Tree, Error> {
return Err(Error::Unexpected("invalid taproot internal key".to_string()));
}
let internal_key = expression::Tree { name: key.name, args: vec![] };
if script.is_empty() {
return Ok(expression::Tree { name: "tr", args: vec![internal_key] });
}
let (tree, rest) = expression::Tree::from_slice_delim(script, 1, '{')?;
if rest.is_empty() {
Ok(expression::Tree { name: "tr", args: vec![internal_key, tree] })
Expand Down
4 changes: 2 additions & 2 deletions src/miniscript/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -260,14 +260,14 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
Terminal::ZeroNotEqual(..) => "n",
Terminal::AndV(_, ref r) if matches!(r.as_inner(), Terminal::True) => "t",
Terminal::AndV(..) => "and_v",
Terminal::AndB(..) => "and_b",
Terminal::AndOr(_, _, ref c) if matches!(c.as_inner(), Terminal::False) => "and_n",
Terminal::AndB(..) => "and_b",
Terminal::AndOr(..) => "andor",
Terminal::OrB(..) => "or_b",
Terminal::OrD(..) => "or_d",
Terminal::OrC(..) => "or_c",
Terminal::OrI(ref l, _) if matches!(l.as_inner(), Terminal::False) => "l",
Terminal::OrI(_, ref r) if matches!(r.as_inner(), Terminal::False) => "u",
Terminal::OrI(ref l, _) if matches!(l.as_inner(), Terminal::False) => "l",
Terminal::OrI(..) => "or_i",
Terminal::Thresh(..) => "thresh",
Terminal::Multi(..) => "multi",
Expand Down

0 comments on commit b11cdc2

Please sign in to comment.