Skip to content

Commit 7070067

Browse files
committed
Cleanup context code with SigType enum
NoChecks context needs to know how to serialize the given public key or where to lookup for it's signature (schnorr or ecdsa). The simplest way to convey this information is to separate out NoChecks for ecdsa and schnorr. When using NoChecksEcdsa the associated type bitcoin::PublicKey or when using NoChecksSchnorr, the associated type XOnlyPublicKey should take care of it.
1 parent 80a9435 commit 7070067

File tree

6 files changed

+206
-43
lines changed

6 files changed

+206
-43
lines changed

src/interpreter/inner.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use bitcoin::blockdata::witness::Witness;
1717
use bitcoin::hashes::{hash160, sha256, Hash};
1818

1919
use super::{stack, Error, Stack};
20-
use miniscript::context::NoChecks;
20+
use miniscript::context::NoChecksEcdsa;
2121
use {Miniscript, MiniscriptKey};
2222

2323
/// Attempts to parse a slice as a Bitcoin public key, checking compressedness
@@ -48,7 +48,7 @@ fn pk_from_stackelem<'a>(
4848

4949
fn script_from_stackelem<'a>(
5050
elem: &stack::Element<'a>,
51-
) -> Result<Miniscript<bitcoin::PublicKey, NoChecks>, Error> {
51+
) -> Result<Miniscript<bitcoin::PublicKey, NoChecksEcdsa>, Error> {
5252
match *elem {
5353
stack::Element::Push(sl) => {
5454
Miniscript::<bitcoin::PublicKey, _>::parse_insane(&bitcoin::Script::from(sl.to_owned()))
@@ -86,7 +86,7 @@ pub enum Inner {
8686
/// pay-to-pkhash or pay-to-witness-pkhash)
8787
PublicKey(bitcoin::PublicKey, PubkeyType),
8888
/// The script being evaluated is an actual script
89-
Script(Miniscript<bitcoin::PublicKey, NoChecks>, ScriptType),
89+
Script(Miniscript<bitcoin::PublicKey, NoChecksEcdsa>, ScriptType),
9090
}
9191

9292
// The `Script` returned by this method is always generated/cloned ... when
@@ -598,7 +598,7 @@ mod tests {
598598
fn script_bare() {
599599
let preimage = b"12345678----____12345678----____";
600600
let hash = hash160::Hash::hash(&preimage[..]);
601-
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecks> =
601+
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecksEcdsa> =
602602
::Miniscript::from_str_insane(&format!("hash160({})", hash)).unwrap();
603603

604604
let spk = miniscript.encode();
@@ -625,7 +625,7 @@ mod tests {
625625
fn script_sh() {
626626
let preimage = b"12345678----____12345678----____";
627627
let hash = hash160::Hash::hash(&preimage[..]);
628-
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecks> =
628+
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecksEcdsa> =
629629
::Miniscript::from_str_insane(&format!("hash160({})", hash)).unwrap();
630630

631631
let redeem_script = miniscript.encode();
@@ -663,7 +663,7 @@ mod tests {
663663
fn script_wsh() {
664664
let preimage = b"12345678----____12345678----____";
665665
let hash = hash160::Hash::hash(&preimage[..]);
666-
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecks> =
666+
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecksEcdsa> =
667667
::Miniscript::from_str_insane(&format!("hash160({})", hash)).unwrap();
668668

669669
let witness_script = miniscript.encode();
@@ -701,7 +701,7 @@ mod tests {
701701
fn script_sh_wsh() {
702702
let preimage = b"12345678----____12345678----____";
703703
let hash = hash160::Hash::hash(&preimage[..]);
704-
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecks> =
704+
let miniscript: ::Miniscript<bitcoin::PublicKey, NoChecksEcdsa> =
705705
::Miniscript::from_str_insane(&format!("hash160({})", hash)).unwrap();
706706

707707
let witness_script = miniscript.encode();

src/interpreter/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use bitcoin::blockdata::witness::Witness;
2323
use bitcoin::hashes::{hash160, ripemd160, sha256, sha256d};
2424
use bitcoin::util::sighash;
2525
use bitcoin::{self, secp256k1};
26-
use miniscript::context::NoChecks;
26+
use miniscript::context::NoChecksEcdsa;
2727
use miniscript::ScriptContext;
2828
use Miniscript;
2929
use Terminal;
@@ -311,7 +311,7 @@ pub enum SatisfiedConstraint<'intp, 'txin> {
311311
///depending on evaluation of the children.
312312
struct NodeEvaluationState<'intp> {
313313
///The node which is being evaluated
314-
node: &'intp Miniscript<bitcoin::PublicKey, NoChecks>,
314+
node: &'intp Miniscript<bitcoin::PublicKey, NoChecksEcdsa>,
315315
///number of children evaluated
316316
n_evaluated: usize,
317317
///number of children satisfied
@@ -342,7 +342,7 @@ pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&bitcoin::PublicKey, bitcoin::Ecds
342342
///Iterator for Iter
343343
impl<'intp, 'txin: 'intp, F> Iterator for Iter<'intp, 'txin, F>
344344
where
345-
NoChecks: ScriptContext,
345+
NoChecksEcdsa: ScriptContext,
346346
F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
347347
{
348348
type Item = Result<SatisfiedConstraint<'intp, 'txin>, Error>;
@@ -363,13 +363,13 @@ where
363363

364364
impl<'intp, 'txin: 'intp, F> Iter<'intp, 'txin, F>
365365
where
366-
NoChecks: ScriptContext,
366+
NoChecksEcdsa: ScriptContext,
367367
F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
368368
{
369369
/// Helper function to push a NodeEvaluationState on state stack
370370
fn push_evaluation_state(
371371
&mut self,
372-
node: &'intp Miniscript<bitcoin::PublicKey, NoChecks>,
372+
node: &'intp Miniscript<bitcoin::PublicKey, NoChecksEcdsa>,
373373
n_evaluated: usize,
374374
n_satisfied: usize,
375375
) -> () {
@@ -796,7 +796,7 @@ mod tests {
796796
use bitcoin;
797797
use bitcoin::hashes::{hash160, ripemd160, sha256, sha256d, Hash};
798798
use bitcoin::secp256k1::{self, Secp256k1, VerifyOnly};
799-
use miniscript::context::NoChecks;
799+
use miniscript::context::NoChecksEcdsa;
800800
use Miniscript;
801801
use MiniscriptKey;
802802
use ToPublicKey;
@@ -848,7 +848,7 @@ mod tests {
848848
fn from_stack<'txin, 'elem, F>(
849849
verify_fn: F,
850850
stack: &'elem mut Stack<'txin>,
851-
ms: &'elem Miniscript<bitcoin::PublicKey, NoChecks>,
851+
ms: &'elem Miniscript<bitcoin::PublicKey, NoChecksEcdsa>,
852852
) -> Iter<'elem, 'txin, F>
853853
where
854854
F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,

src/miniscript/astelem.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ use bitcoin::hashes::{hash160, ripemd160, sha256, sha256d, Hash};
2929

3030
use errstr;
3131
use expression;
32+
use miniscript::context::SigType;
3233
use miniscript::types::{self, Property};
3334
use miniscript::ScriptContext;
3435
use script_num_size;
@@ -761,7 +762,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
761762
.push_opcode(opcodes::all::OP_EQUAL)
762763
}
763764
Terminal::Multi(k, ref keys) => {
764-
debug_assert!(!Ctx::is_tap());
765+
debug_assert!(Ctx::sig_type() == SigType::Ecdsa);
765766
builder = builder.push_int(k as i64);
766767
for pk in keys {
767768
builder = builder.push_key(&pk.to_public_key());
@@ -771,7 +772,7 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> Terminal<Pk, Ctx> {
771772
.push_opcode(opcodes::all::OP_CHECKMULTISIG)
772773
}
773774
Terminal::MultiA(k, ref keys) => {
774-
debug_assert!(Ctx::is_tap());
775+
debug_assert!(Ctx::sig_type() == SigType::Schnorr);
775776
// keys must be atleast len 1 here, guaranteed by typing rules
776777
builder = builder.push_ms_key::<_, Ctx>(&keys[0]);
777778
builder = builder.push_opcode(opcodes::all::OP_CHECKSIG);

0 commit comments

Comments
 (0)