Skip to content

Commit f61abc4

Browse files
authored
Merge pull request #97 from sanket1729/context
Add ScriptContext to Miniscript
2 parents e3746e2 + 4df9d76 commit f61abc4

24 files changed

+729
-369
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ matrix:
99
env: DO_FUZZ=true DO_LINT=true
1010
- rust: beta
1111
- rust: nightly
12-
env: DO_BENCH=true
12+
env: DO_BENCH=true DO_MIRI=true
1313
- rust: 1.22.0
1414

1515
script:

contrib/test.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,23 @@ then
4343
)
4444
fi
4545

46+
# Miri Checks if told to
47+
# Only supported in nightly
48+
if [ "$DO_MIRI" = true ]
49+
then
50+
(
51+
MIRI_NIGHTLY=nightly-$(curl -s https://rust-lang.github.io/rustup-components-history/x86_64-unknown-linux-gnu/miri)
52+
echo "Installing latest nightly with Miri: $MIRI_NIGHTLY"
53+
rustup set profile minimal
54+
rustup default "$MIRI_NIGHTLY"
55+
rustup component add miri
56+
cargo miri test -- -- miri_
57+
58+
# Change back to latest nightly possibly without Miri
59+
rustup default nightly
60+
)
61+
fi
62+
4663
# Bench if told to
4764
if [ "$DO_BENCH" = true ]
4865
then

examples/verify_tx.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ fn main() {
103103
0,
104104
0,
105105
);
106-
107106
println!("\nExample one");
108107
for elem in iter {
109108
match elem.expect("no evaluation error") {
@@ -129,7 +128,6 @@ fn main() {
129128
0,
130129
0,
131130
);
132-
133131
println!("\nExample two");
134132
for elem in iter {
135133
match elem.expect("no evaluation error") {
@@ -154,7 +152,6 @@ fn main() {
154152
0,
155153
0,
156154
);
157-
158155
println!("\nExample three");
159156
for elem in iter {
160157
let error = elem.expect_err("evaluation error");

fuzz/fuzz_targets/compile_descriptor.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
extern crate miniscript;
22

3+
use miniscript::Segwitv0;
34
use miniscript::{policy, DummyKey, Miniscript};
45
use policy::Liftable;
56

67
use std::str::FromStr;
78

8-
type DummyScript = Miniscript<DummyKey>;
9+
type DummyScript = Miniscript<DummyKey, Segwitv0>;
910
type DummyPolicy = policy::Concrete<DummyKey>;
1011

1112
fn do_test(data: &[u8]) {
1213
let data_str = String::from_utf8_lossy(data);
1314
if let Ok(pol) = DummyPolicy::from_str(&data_str) {
1415
// Compile
15-
if let Ok(desc) = pol.compile() {
16+
if let Ok(desc) = pol.compile::<Segwitv0>() {
1617
// Lift
1718
assert_eq!(desc.clone().lift(), pol.clone().lift());
1819
// Try to roundtrip the output of the compiler
@@ -37,7 +38,8 @@ fn main() {
3738
}
3839

3940
#[cfg(feature = "honggfuzz")]
40-
#[macro_use] extern crate honggfuzz;
41+
#[macro_use]
42+
extern crate honggfuzz;
4143
#[cfg(feature = "honggfuzz")]
4244
fn main() {
4345
loop {

fuzz/fuzz_targets/roundtrip_concrete.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
21
extern crate miniscript;
32
extern crate regex;
4-
use std::str::FromStr;
53
use miniscript::{policy, DummyKey};
64
use regex::Regex;
5+
use std::str::FromStr;
76

87
type DummyPolicy = policy::Concrete<DummyKey>;
98

@@ -29,7 +28,8 @@ fn main() {
2928
}
3029

3130
#[cfg(feature = "honggfuzz")]
32-
#[macro_use] extern crate honggfuzz;
31+
#[macro_use]
32+
extern crate honggfuzz;
3333
#[cfg(feature = "honggfuzz")]
3434
fn main() {
3535
loop {

fuzz/fuzz_targets/roundtrip_descriptor.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
extern crate miniscript;
32
extern crate regex;
43

@@ -10,13 +9,15 @@ fn do_test(data: &[u8]) {
109
let s = String::from_utf8_lossy(data);
1110
if let Ok(desc) = Descriptor::<DummyKey>::from_str(&s) {
1211
let output = desc.to_string();
13-
12+
1413
let multi_wrap_pk_re = Regex::new("([a-z]+)c:pk_k\\(").unwrap();
1514
let multi_wrap_pkh_re = Regex::new("([a-z]+)c:pk_h\\(").unwrap();
1615

1716
let normalize_aliases = multi_wrap_pk_re.replace_all(&s, "$1:pk(");
1817
let normalize_aliases = multi_wrap_pkh_re.replace_all(&normalize_aliases, "$1:pkh(");
19-
let normalize_aliases = normalize_aliases.replace("c:pk_k(", "pk(").replace("c:pk_h(", "pkh(");
18+
let normalize_aliases = normalize_aliases
19+
.replace("c:pk_k(", "pk(")
20+
.replace("c:pk_h(", "pkh(");
2021

2122
assert_eq!(normalize_aliases.to_lowercase(), output.to_lowercase());
2223
}
@@ -32,7 +33,8 @@ fn main() {
3233
}
3334

3435
#[cfg(feature = "honggfuzz")]
35-
#[macro_use] extern crate honggfuzz;
36+
#[macro_use]
37+
extern crate honggfuzz;
3638
#[cfg(feature = "honggfuzz")]
3739
fn main() {
3840
loop {

fuzz/fuzz_targets/roundtrip_miniscript_script.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
21
extern crate miniscript;
32

4-
use miniscript::Miniscript;
53
use miniscript::bitcoin::blockdata::script;
4+
use miniscript::Miniscript;
5+
use miniscript::Segwitv0;
66

77
fn do_test(data: &[u8]) {
88
// Try round-tripping as a script
99
let script = script::Script::from(data.to_owned());
1010

11-
if let Ok(pt) = Miniscript::parse(&script) {
11+
if let Ok(pt) = Miniscript::<_, Segwitv0>::parse(&script) {
1212
let output = pt.encode();
1313
assert_eq!(pt.script_size(), output.len());
1414
assert_eq!(output, script);
@@ -25,7 +25,8 @@ fn main() {
2525
}
2626

2727
#[cfg(feature = "honggfuzz")]
28-
#[macro_use] extern crate honggfuzz;
28+
#[macro_use]
29+
extern crate honggfuzz;
2930
#[cfg(feature = "honggfuzz")]
3031
fn main() {
3132
loop {

fuzz/fuzz_targets/roundtrip_miniscript_str.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,28 @@
1-
21
extern crate miniscript;
32
extern crate regex;
43

5-
use std::str::FromStr;
64
use regex::Regex;
5+
use std::str::FromStr;
76

8-
use miniscript::{DummyKey};
7+
use miniscript::DummyKey;
98
use miniscript::Miniscript;
9+
use miniscript::Segwitv0;
1010

1111
fn do_test(data: &[u8]) {
1212
let s = String::from_utf8_lossy(data);
13-
if let Ok(desc) = Miniscript::<DummyKey>::from_str(&s) {
13+
if let Ok(desc) = Miniscript::<DummyKey, Segwitv0>::from_str(&s) {
1414
let output = desc.to_string();
15-
15+
1616
let multi_wrap_pk_re = Regex::new("([a-z]+)c:pk_k\\(").unwrap();
1717
let multi_wrap_pkh_re = Regex::new("([a-z]+)c:pk_h\\(").unwrap();
1818

1919
let normalize_aliases = multi_wrap_pk_re.replace_all(&s, "$1:pk(");
2020
let normalize_aliases = multi_wrap_pkh_re.replace_all(&normalize_aliases, "$1:pkh(");
21-
let normalize_aliases = normalize_aliases.replace("c:pk_k(", "pk(").replace("c:pk_h(", "pkh(");
21+
let normalize_aliases = normalize_aliases
22+
.replace("c:pk_k(", "pk(")
23+
.replace("c:pk_h(", "pkh(");
2224

2325
assert_eq!(normalize_aliases.to_lowercase(), output.to_lowercase());
24-
2526
}
2627
}
2728

@@ -35,7 +36,8 @@ fn main() {
3536
}
3637

3738
#[cfg(feature = "honggfuzz")]
38-
#[macro_use] extern crate honggfuzz;
39+
#[macro_use]
40+
extern crate honggfuzz;
3941
#[cfg(feature = "honggfuzz")]
4042
fn main() {
4143
loop {

fuzz/fuzz_targets/roundtrip_semantic.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
21
extern crate miniscript;
32

4-
use std::str::FromStr;
53
use miniscript::{policy, DummyKey};
4+
use std::str::FromStr;
65

76
type DummyPolicy = policy::Semantic<DummyKey>;
87

@@ -24,12 +23,13 @@ fn main() {
2423
}
2524

2625
#[cfg(feature = "honggfuzz")]
27-
#[macro_use] extern crate honggfuzz;
26+
#[macro_use]
27+
extern crate honggfuzz;
2828
#[cfg(feature = "honggfuzz")]
2929
fn main() {
3030
loop {
3131
fuzz!(|data| {
3232
do_test(data);
3333
});
3434
}
35-
}
35+
}

src/descriptor/create_descriptor.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use bitcoin::blockdata::script::Instruction;
99
use descriptor::satisfied_constraints::Error as IntError;
1010
use descriptor::satisfied_constraints::{Stack, StackElement};
1111
use descriptor::Descriptor;
12-
use miniscript::Miniscript;
12+
use miniscript::{Legacy, Miniscript, Segwitv0};
1313
use Error;
1414
use ToPublicKey;
1515

@@ -112,7 +112,7 @@ fn verify_wsh<'txin>(
112112
script_pubkey: &bitcoin::Script,
113113
script_sig: &bitcoin::Script,
114114
witness: &'txin [Vec<u8>],
115-
) -> Result<(Miniscript<bitcoin::PublicKey>, Stack<'txin>), Error> {
115+
) -> Result<(Miniscript<bitcoin::PublicKey, Segwitv0>, Stack<'txin>), Error> {
116116
if !script_sig.is_empty() {
117117
return Err(Error::NonEmptyScriptSig);
118118
}
@@ -121,7 +121,7 @@ fn verify_wsh<'txin>(
121121
if witness_script.to_v0_p2wsh() != *script_pubkey {
122122
return Err(Error::IncorrectScriptHash);
123123
}
124-
let ms = Miniscript::parse(&witness_script)?;
124+
let ms = Miniscript::<bitcoin::PublicKey, Segwitv0>::parse(&witness_script)?;
125125
//only iter till len -1 to not include the witness script
126126
let stack: Vec<StackElement> = witness
127127
.iter()
@@ -218,7 +218,7 @@ pub fn from_txin_with_witness_stack<'txin>(
218218
if !witness.is_empty() {
219219
return Err(Error::NonEmptyWitness);
220220
}
221-
let ms = Miniscript::parse(&redeem_script)?;
221+
let ms = Miniscript::<bitcoin::PublicKey, Legacy>::parse(&redeem_script)?;
222222
Ok((Descriptor::Sh(ms), stack))
223223
}
224224
} else {
@@ -230,7 +230,7 @@ pub fn from_txin_with_witness_stack<'txin>(
230230
if !witness.is_empty() {
231231
return Err(Error::NonEmptyWitness);
232232
}
233-
let ms = Miniscript::parse(script_pubkey)?;
233+
let ms = Miniscript::<bitcoin::PublicKey, Legacy>::parse(script_pubkey)?;
234234
Ok((Descriptor::Bare(ms), Stack(stack?)))
235235
}
236236
}

0 commit comments

Comments
 (0)