Skip to content

Commit 21e9d5f

Browse files
committed
ScriptContext added to Miniscript
temp More fixes
1 parent cc7459c commit 21e9d5f

File tree

19 files changed

+591
-303
lines changed

19 files changed

+591
-303
lines changed

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: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
extern crate miniscript;
22

33
use miniscript::{policy, DummyKey, Miniscript};
4+
use miniscript::context::Segwitv0;
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

fuzz/fuzz_targets/roundtrip_miniscript_script.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@ extern crate miniscript;
33

44
use miniscript::Miniscript;
55
use miniscript::bitcoin::blockdata::script;
6+
use miniscript::context::Segwitv0;
67

78
fn do_test(data: &[u8]) {
89
// Try round-tripping as a script
910
let script = script::Script::from(data.to_owned());
1011

11-
if let Ok(pt) = Miniscript::parse(&script) {
12+
if let Ok(pt) = Miniscript::<_, Segwitv0>::parse(&script) {
1213
let output = pt.encode();
1314
assert_eq!(pt.script_size(), output.len());
1415
assert_eq!(output, script);

fuzz/fuzz_targets/roundtrip_miniscript_str.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ extern crate miniscript;
44
use std::str::FromStr;
55

66
use miniscript::{DummyKey};
7+
use miniscript::context::Segwitv0;
78
use miniscript::Miniscript;
89

910
fn do_test(data: &[u8]) {
1011
let s = String::from_utf8_lossy(data);
11-
if let Ok(desc) = Miniscript::<DummyKey>::from_str(&s) {
12+
if let Ok(desc) = Miniscript::<DummyKey, Segwitv0>::from_str(&s) {
1213
let output = desc.to_string();
1314
assert_eq!(s, output);
1415
}

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
}

src/descriptor/mod.rs

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ use std::fmt;
3131
use std::str::{self, FromStr};
3232

3333
use expression;
34-
use miniscript::Miniscript;
34+
use miniscript::{Legacy, Miniscript, Segwitv0};
3535
use Error;
3636
use MiniscriptKey;
3737
use Satisfier;
@@ -50,7 +50,7 @@ pub use self::satisfied_constraints::Stack;
5050
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
5151
pub enum Descriptor<Pk: MiniscriptKey> {
5252
/// A raw scriptpubkey (including pay-to-pubkey)
53-
Bare(Miniscript<Pk>),
53+
Bare(Miniscript<Pk, Legacy>),
5454
/// Pay-to-Pubkey
5555
Pk(Pk),
5656
/// Pay-to-PubKey-Hash
@@ -60,11 +60,11 @@ pub enum Descriptor<Pk: MiniscriptKey> {
6060
/// Pay-to-Witness-PubKey-Hash inside P2SH
6161
ShWpkh(Pk),
6262
/// Pay-to-ScriptHash
63-
Sh(Miniscript<Pk>),
63+
Sh(Miniscript<Pk, Legacy>),
6464
/// Pay-to-Witness-ScriptHash
65-
Wsh(Miniscript<Pk>),
65+
Wsh(Miniscript<Pk, Segwitv0>),
6666
/// P2SH-P2WSH
67-
ShWsh(Miniscript<Pk>),
67+
ShWsh(Miniscript<Pk, Segwitv0>),
6868
}
6969

7070
impl<Pk: MiniscriptKey> Descriptor<Pk> {
@@ -200,7 +200,8 @@ impl<Pk: MiniscriptKey + ToPublicKey> Descriptor<Pk> {
200200
let addr = bitcoin::Address::p2wpkh(&pk.to_public_key(), bitcoin::Network::Bitcoin);
201201
addr.script_pubkey()
202202
}
203-
Descriptor::Sh(ref d) | Descriptor::Wsh(ref d) | Descriptor::ShWsh(ref d) => d.encode(),
203+
Descriptor::Sh(ref d) => d.encode(),
204+
Descriptor::Wsh(ref d) | Descriptor::ShWsh(ref d) => d.encode(),
204205
}
205206
}
206207

@@ -395,25 +396,29 @@ where
395396
expression::terminal(&top.args[0], |pk| Pk::from_str(pk).map(Descriptor::Pkh))
396397
}
397398
("wpkh", 1) => {
398-
expression::terminal(&top.args[0], |pk| Pk::from_str(pk).map(Descriptor::Wpkh))
399+
let wpkh = expression::terminal(&top.args[0], |pk| Pk::from_str(pk))?;
400+
if wpkh.is_uncompressed() {
401+
Err(Error::BadDescriptor)
402+
} else {
403+
Ok(Descriptor::Wpkh(wpkh))
404+
}
399405
}
400406
("sh", 1) => {
401407
let newtop = &top.args[0];
402408
match (newtop.name, newtop.args.len()) {
403-
("wsh", 1) => {
404-
let sub = Miniscript::from_tree(&newtop.args[0])?;
405-
Ok(Descriptor::ShWsh(sub))
406-
}
407-
("wpkh", 1) => expression::terminal(&newtop.args[0], |pk| {
408-
Pk::from_str(pk).map(Descriptor::ShWpkh)
409-
}),
410-
_ => {
411-
let sub = Miniscript::from_tree(&top.args[0])?;
412-
Ok(Descriptor::Sh(sub))
409+
("wsh", 1) => Miniscript::from_tree(&newtop.args[0]).map(Descriptor::ShWsh),
410+
("wpkh", 1) => {
411+
let wpkh = expression::terminal(&newtop.args[0], |pk| Pk::from_str(pk))?;
412+
if wpkh.is_uncompressed() {
413+
Err(Error::BadDescriptor)
414+
} else {
415+
Ok(Descriptor::ShWpkh(wpkh))
416+
}
413417
}
418+
_ => Miniscript::from_tree(&top.args[0]).map(Descriptor::Sh),
414419
}
415420
}
416-
("wsh", 1) => expression::unary(top, Descriptor::Wsh),
421+
("wsh", 1) => Miniscript::from_tree(&top.args[0]).map(Descriptor::Wsh),
417422
_ => {
418423
let sub = expression::FromTree::from_tree(&top)?;
419424
Ok(Descriptor::Bare(sub))
@@ -841,6 +846,8 @@ mod tests {
841846
);
842847
assert_eq!(sh.unsigned_script_sig(), bitcoin::Script::new());
843848

849+
let ms = ms_str!("c:pk_k({})", pk);
850+
844851
let wsh = Descriptor::Wsh(ms.clone());
845852
wsh.satisfy(&mut txin, &satisfier).expect("satisfaction");
846853
assert_eq!(

0 commit comments

Comments
 (0)