Skip to content

Commit 8ad083a

Browse files
committed
Merge #254: Add timelock mix tests from miniscript alloy spec
003226e Add all tests from alloy spec (sanket1729) 0a7e9b4 Add malleable test vectors (sanket1729) f98ecbc Add timelock tests (sanket1729) e0af5b7 Don't enforce strict cannonical wrappers (sanket1729) Pull request description: There found one bug in the current type system! The last commit disables the test while I work on fuzzer fix for rust-secp256k1. ACKs for top commit: apoelstra: ACK 003226e Tree-SHA512: 399c8d2cc6c872d7c4a908809c492c495c04cbf59e757602f913fc11fb8d69ecb567da63a824faacfcf8dd0b116748c74ff4858ccb4e4d7c4444ce7bf6049481
2 parents 8887663 + 003226e commit 8ad083a

File tree

6 files changed

+23875
-59
lines changed

6 files changed

+23875
-59
lines changed

fuzz/fuzz_targets/roundtrip_descriptor.rs

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,10 @@ use std::str::FromStr;
88
fn do_test(data: &[u8]) {
99
let s = String::from_utf8_lossy(data);
1010
if let Ok(desc) = Descriptor::<DummyKey>::from_str(&s) {
11-
let output = desc.to_string();
11+
let str2 = desc.to_string();
12+
let desc2 = Descriptor::<DummyKey>::from_str(&str2).unwrap();
1213

13-
let multi_wrap_pk_re = Regex::new("([a-z]+)c:pk_k\\(").unwrap();
14-
let multi_wrap_pkh_re = Regex::new("([a-z]+)c:pk_h\\(").unwrap();
15-
16-
let normalize_aliases = multi_wrap_pk_re.replace_all(&s, "$1:pk(");
17-
let normalize_aliases = multi_wrap_pkh_re.replace_all(&normalize_aliases, "$1:pkh(");
18-
let normalize_aliases = normalize_aliases
19-
.replace("c:pk_k(", "pk(")
20-
.replace("c:pk_h(", "pkh(");
21-
22-
let mut checksum_split = output.split('#');
23-
let pre_checksum = checksum_split.next().unwrap();
24-
assert!(checksum_split.next().is_some());
25-
assert!(checksum_split.next().is_none());
26-
27-
if normalize_aliases.len() == output.len() {
28-
let len = pre_checksum.len();
29-
assert_eq!(normalize_aliases[..len].to_lowercase(), pre_checksum.to_lowercase());
30-
} else {
31-
assert_eq!(normalize_aliases.to_lowercase(), pre_checksum.to_lowercase());
32-
}
14+
assert_eq!(desc, desc2);
3315
}
3416
}
3517

@@ -62,4 +44,3 @@ mod tests {
6244
do_test(b"pkh()");
6345
}
6446
}
65-

fuzz/fuzz_targets/roundtrip_miniscript_str.rs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,10 @@ use miniscript::Segwitv0;
1111
fn do_test(data: &[u8]) {
1212
let s = String::from_utf8_lossy(data);
1313
if let Ok(desc) = Miniscript::<DummyKey, Segwitv0>::from_str(&s) {
14-
let output = desc.to_string();
14+
let str2 = desc.to_string();
15+
let desc2 = Miniscript::<DummyKey, Segwitv0>::from_str(&str2).unwrap();
1516

16-
let multi_wrap_pk_re = Regex::new("([a-z]+)c:pk_k\\(").unwrap();
17-
let multi_wrap_pkh_re = Regex::new("([a-z]+)c:pk_h\\(").unwrap();
18-
19-
let normalize_aliases = multi_wrap_pk_re.replace_all(&s, "$1:pk(");
20-
let normalize_aliases = multi_wrap_pkh_re.replace_all(&normalize_aliases, "$1:pkh(");
21-
let normalize_aliases = normalize_aliases
22-
.replace("c:pk_k(", "pk(")
23-
.replace("c:pk_h(", "pkh(");
24-
25-
assert_eq!(normalize_aliases.to_lowercase(), output.to_lowercase());
17+
assert_eq!(desc, desc2);
2618
}
2719
}
2820

src/lib.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -469,10 +469,6 @@ pub enum Error {
469469
MultiAt(String),
470470
/// Name of a fragment contained `@` but we were not parsing an OR
471471
AtOutsideOr(String),
472-
/// Fragment was an `and_v(_, true)` which should be written as `t:`
473-
NonCanonicalTrue,
474-
/// Fragment was an `or_i(_, false)` or `or_i(false,_)` which should be written as `u:` or `l:`
475-
NonCanonicalFalse,
476472
/// Encountered a `l:0` which is syntactically equal to `u:0` except stupid
477473
LikelyFalse,
478474
/// Encountered a wrapping character that we don't recognize
@@ -595,10 +591,6 @@ impl fmt::Display for Error {
595591
Error::MultiColon(ref s) => write!(f, "«{}» has multiple instances of «:»", s),
596592
Error::MultiAt(ref s) => write!(f, "«{}» has multiple instances of «@»", s),
597593
Error::AtOutsideOr(ref s) => write!(f, "«{}» contains «@» in non-or() context", s),
598-
Error::NonCanonicalTrue => f.write_str("Use «t:X» rather than «and_v(X,true())»"),
599-
Error::NonCanonicalFalse => {
600-
f.write_str("Use «u:X» «l:X» rather than «or_i(X,false)» «or_i(false,X)»")
601-
}
602594
Error::LikelyFalse => write!(f, "0 is not very likely (use «u:0»)"),
603595
Error::UnknownWrapper(ch) => write!(f, "unknown wrapper «{}:»", ch),
604596
Error::NonTopLevel(ref s) => write!(f, "non-T miniscript: {}", s),

src/miniscript/astelem.rs

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -503,15 +503,7 @@ where
503503
}),
504504
("1", 0) => Ok(Terminal::True),
505505
("0", 0) => Ok(Terminal::False),
506-
("and_v", 2) => {
507-
let expr = expression::binary(top, Terminal::AndV)?;
508-
if let Terminal::AndV(_, ref right) = expr {
509-
if let Terminal::True = right.node {
510-
return Err(Error::NonCanonicalTrue);
511-
}
512-
}
513-
Ok(expr)
514-
}
506+
("and_v", 2) => expression::binary(top, Terminal::AndV),
515507
("and_b", 2) => expression::binary(top, Terminal::AndB),
516508
("and_n", 2) => Ok(Terminal::AndOr(
517509
expression::FromTree::from_tree(&top.args[0])?,
@@ -526,15 +518,7 @@ where
526518
("or_b", 2) => expression::binary(top, Terminal::OrB),
527519
("or_d", 2) => expression::binary(top, Terminal::OrD),
528520
("or_c", 2) => expression::binary(top, Terminal::OrC),
529-
("or_i", 2) => {
530-
let expr = expression::binary(top, Terminal::OrI)?;
531-
if let Terminal::OrI(ref left, ref right) = expr {
532-
if left.node == Terminal::False || right.node == Terminal::False {
533-
return Err(Error::NonCanonicalFalse);
534-
}
535-
}
536-
Ok(expr)
537-
}
521+
("or_i", 2) => expression::binary(top, Terminal::OrI),
538522
("thresh", n) => {
539523
if n == 0 {
540524
return Err(errstr("no arguments given"));

src/miniscript/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ use std::sync::Arc;
5454
use MiniscriptKey;
5555
use {expression, Error, ForEach, ForEachKey, ToPublicKey, TranslatePk};
5656

57+
#[cfg(test)]
58+
mod ms_tests;
5759
/// Top-level script AST type
5860
#[derive(Clone, Hash)]
5961
pub struct Miniscript<Pk: MiniscriptKey, Ctx: ScriptContext> {

0 commit comments

Comments
 (0)