Skip to content

Commit 4a3e1ab

Browse files
committed
Use bitcoin::EcdsaSig from rust-bitcoin
1 parent d1e3b0f commit 4a3e1ab

File tree

11 files changed

+116
-131
lines changed

11 files changed

+116
-131
lines changed

examples/sign_multisig.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,19 @@ fn main() {
6161
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
6262
]).expect("key 3"),
6363
];
64-
let bitcoin_sig = (
64+
let bitcoin_sig = bitcoin::EcdsaSig {
6565
// copied at random off the blockchain; this is not actually a valid
6666
// signature for this transaction; Miniscript does not verify
67-
secp256k1::ecdsa::Signature::from_str(
67+
sig: secp256k1::ecdsa::Signature::from_str(
6868
"3045\
6969
0221\
7070
00f7c3648c390d87578cd79c8016940aa8e3511c4104cb78daa8fb8e429375efc1\
7171
0220\
7272
531d75c136272f127a5dc14acc0722301cbddc222262934151f140da345af177",
7373
)
7474
.unwrap(),
75-
bitcoin::EcdsaSigHashType::All,
76-
);
75+
hash_ty: bitcoin::EcdsaSigHashType::All,
76+
};
7777

7878
let descriptor_str = format!(
7979
"wsh(multi(2,{},{},{}))",
@@ -112,7 +112,7 @@ fn main() {
112112
// Attempt to satisfy at age 0, height 0
113113
let original_txin = tx.input[0].clone();
114114

115-
let mut sigs = HashMap::<bitcoin::PublicKey, miniscript::BitcoinSig>::new();
115+
let mut sigs = HashMap::<bitcoin::PublicKey, miniscript::bitcoin::EcdsaSig>::new();
116116

117117
// Doesn't work with no signatures
118118
assert!(my_descriptor.satisfy(&mut tx.input[0], &sigs).is_err());

examples/verify_tx.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@ fn main() {
140140
.expect("Can only fail in sighash single when corresponding output is not present");
141141
// Restrict to sighash_all just to demonstrate how to add additional filters
142142
// `&_` needed here because of https://github.com/rust-lang/rust/issues/79187
143-
let vfyfn = move |pk: &_, bitcoinsig: miniscript::BitcoinSig| {
144-
bitcoinsig.1 == bitcoin::EcdsaSigHashType::All && vfyfn(pk, bitcoinsig)
143+
let vfyfn = move |pk: &_, bitcoinsig: miniscript::bitcoin::EcdsaSig| {
144+
bitcoinsig.hash_ty == bitcoin::EcdsaSigHashType::All && vfyfn(pk, bitcoinsig)
145145
};
146146

147147
println!("\nExample two");
@@ -168,9 +168,9 @@ fn main() {
168168
)
169169
.unwrap();
170170

171-
let iter = interpreter.iter(|pk, (sig, sighashtype)| {
172-
sighashtype == bitcoin::EcdsaSigHashType::All
173-
&& secp.verify_ecdsa(&message, &sig, &pk.key).is_ok()
171+
let iter = interpreter.iter(|pk, ecdsa_sig| {
172+
ecdsa_sig.hash_ty == bitcoin::EcdsaSigHashType::All
173+
&& secp.verify_ecdsa(&message, &ecdsa_sig.sig, &pk.key).is_ok()
174174
});
175175
println!("\nExample three");
176176
for elem in iter {

src/descriptor/bare.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -335,9 +335,8 @@ impl<Pk: MiniscriptKey> DescriptorTrait<Pk> for Pkh<Pk> {
335335
Pk: ToPublicKey,
336336
S: Satisfier<Pk>,
337337
{
338-
if let Some(sig) = satisfier.lookup_sig(&self.pk) {
339-
let mut sig_vec = sig.0.serialize_der().to_vec();
340-
sig_vec.push(sig.1.as_u32() as u8);
338+
if let Some(sig) = satisfier.lookup_ec_sig(&self.pk) {
339+
let sig_vec = sig.to_vec();
341340
let script_sig = script::Builder::new()
342341
.push_slice(&sig_vec[..])
343342
.push_key(&self.pk.to_public_key())

src/descriptor/mod.rs

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -655,13 +655,12 @@ mod tests {
655655
use bitcoin::hashes::hex::FromHex;
656656
use bitcoin::hashes::{hash160, sha256};
657657
use bitcoin::util::bip32;
658-
use bitcoin::{self, secp256k1, PublicKey};
658+
use bitcoin::{self, secp256k1, EcdsaSigHashType, PublicKey};
659659
use descriptor::key::Wildcard;
660660
use descriptor::{
661661
DescriptorPublicKey, DescriptorSecretKey, DescriptorSinglePub, DescriptorXKey,
662662
};
663663
use hex_script;
664-
use miniscript::satisfy::BitcoinSig;
665664
use std::cmp;
666665
use std::collections::HashMap;
667666
use std::str::FromStr;
@@ -950,9 +949,12 @@ mod tests {
950949
}
951950

952951
impl Satisfier<bitcoin::PublicKey> for SimpleSat {
953-
fn lookup_sig(&self, pk: &bitcoin::PublicKey) -> Option<BitcoinSig> {
952+
fn lookup_ec_sig(&self, pk: &bitcoin::PublicKey) -> Option<bitcoin::EcdsaSig> {
954953
if *pk == self.pk {
955-
Some((self.sig, bitcoin::EcdsaSigHashType::All))
954+
Some(bitcoin::EcdsaSig {
955+
sig: self.sig,
956+
hash_ty: bitcoin::EcdsaSigHashType::All,
957+
})
956958
} else {
957959
None
958960
}
@@ -1161,8 +1163,20 @@ mod tests {
11611163
let satisfier = {
11621164
let mut satisfier = HashMap::with_capacity(2);
11631165

1164-
satisfier.insert(a, (sig_a.clone(), ::bitcoin::EcdsaSigHashType::All));
1165-
satisfier.insert(b, (sig_b.clone(), ::bitcoin::EcdsaSigHashType::All));
1166+
satisfier.insert(
1167+
a,
1168+
bitcoin::EcdsaSig {
1169+
sig: sig_a,
1170+
hash_ty: EcdsaSigHashType::All,
1171+
},
1172+
);
1173+
satisfier.insert(
1174+
b,
1175+
bitcoin::EcdsaSig {
1176+
sig: sig_b,
1177+
hash_ty: EcdsaSigHashType::All,
1178+
},
1179+
);
11661180

11671181
satisfier
11681182
};

src/descriptor/segwitv0.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -436,9 +436,8 @@ impl<Pk: MiniscriptKey> DescriptorTrait<Pk> for Wpkh<Pk> {
436436
Pk: ToPublicKey,
437437
S: Satisfier<Pk>,
438438
{
439-
if let Some(sig) = satisfier.lookup_sig(&self.pk) {
440-
let mut sig_vec = sig.0.serialize_der().to_vec();
441-
sig_vec.push(sig.1.as_u32() as u8);
439+
if let Some(sig) = satisfier.lookup_ec_sig(&self.pk) {
440+
let sig_vec = sig.to_vec();
442441
let script_sig = Script::new();
443442
let witness = vec![sig_vec, self.pk.to_public_key().to_bytes()];
444443
Ok((witness, script_sig))

src/interpreter/mod.rs

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use miniscript::context::NoChecks;
2626
use miniscript::ScriptContext;
2727
use Miniscript;
2828
use Terminal;
29-
use {BitcoinSig, Descriptor, ToPublicKey};
29+
use {Descriptor, ToPublicKey};
3030

3131
mod error;
3232
mod inner;
@@ -81,7 +81,7 @@ impl<'txin> Interpreter<'txin> {
8181
///
8282
/// Running the iterator through will consume the internal stack of the
8383
/// `Iterpreter`, and it should not be used again after this.
84-
pub fn iter<'iter, F: FnMut(&bitcoin::PublicKey, BitcoinSig) -> bool>(
84+
pub fn iter<'iter, F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool>(
8585
&'iter mut self,
8686
verify_sig: F,
8787
) -> Iter<'txin, 'iter, F> {
@@ -189,7 +189,7 @@ impl<'txin> Interpreter<'txin> {
189189
unsigned_tx: &'a bitcoin::Transaction,
190190
input_idx: usize,
191191
amount: u64,
192-
) -> Result<impl Fn(&bitcoin::PublicKey, BitcoinSig) -> bool + 'a, Error> {
192+
) -> Result<impl Fn(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool + 'a, Error> {
193193
// Precompute all sighash types because the borrowck doesn't like us
194194
// pulling self into the closure
195195
let sighashes = [
@@ -231,19 +231,21 @@ impl<'txin> Interpreter<'txin> {
231231
)?,
232232
];
233233

234-
Ok(move |pk: &bitcoin::PublicKey, (sig, sighash_type)| {
235-
// This is an awkward way to do this lookup, but it lets us do exhaustiveness
236-
// checking in case future rust-bitcoin versions add new sighash types
237-
let sighash = match sighash_type {
238-
bitcoin::EcdsaSigHashType::All => sighashes[0],
239-
bitcoin::EcdsaSigHashType::None => sighashes[1],
240-
bitcoin::EcdsaSigHashType::Single => sighashes[2],
241-
bitcoin::EcdsaSigHashType::AllPlusAnyoneCanPay => sighashes[3],
242-
bitcoin::EcdsaSigHashType::NonePlusAnyoneCanPay => sighashes[4],
243-
bitcoin::EcdsaSigHashType::SinglePlusAnyoneCanPay => sighashes[5],
244-
};
245-
secp.verify_ecdsa(&sighash, &sig, &pk.key).is_ok()
246-
})
234+
Ok(
235+
move |pk: &bitcoin::PublicKey, ecdsa_sig: bitcoin::EcdsaSig| {
236+
// This is an awkward way to do this lookup, but it lets us do exhaustiveness
237+
// checking in case future rust-bitcoin versions add new sighash types
238+
let sighash = match ecdsa_sig.hash_ty {
239+
bitcoin::EcdsaSigHashType::All => sighashes[0],
240+
bitcoin::EcdsaSigHashType::None => sighashes[1],
241+
bitcoin::EcdsaSigHashType::Single => sighashes[2],
242+
bitcoin::EcdsaSigHashType::AllPlusAnyoneCanPay => sighashes[3],
243+
bitcoin::EcdsaSigHashType::NonePlusAnyoneCanPay => sighashes[4],
244+
bitcoin::EcdsaSigHashType::SinglePlusAnyoneCanPay => sighashes[5],
245+
};
246+
secp.verify_ecdsa(&sighash, &ecdsa_sig.sig, &pk.key).is_ok()
247+
},
248+
)
247249
}
248250
}
249251

@@ -326,7 +328,7 @@ struct NodeEvaluationState<'intp> {
326328
///
327329
/// In case the script is actually dissatisfied, this may return several values
328330
/// before ultimately returning an error.
329-
pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&bitcoin::PublicKey, BitcoinSig) -> bool> {
331+
pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool> {
330332
verify_sig: F,
331333
public_key: Option<&'intp bitcoin::PublicKey>,
332334
state: Vec<NodeEvaluationState<'intp>>,
@@ -340,7 +342,7 @@ pub struct Iter<'intp, 'txin: 'intp, F: FnMut(&bitcoin::PublicKey, BitcoinSig) -
340342
impl<'intp, 'txin: 'intp, F> Iterator for Iter<'intp, 'txin, F>
341343
where
342344
NoChecks: ScriptContext,
343-
F: FnMut(&bitcoin::PublicKey, BitcoinSig) -> bool,
345+
F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
344346
{
345347
type Item = Result<SatisfiedConstraint<'intp, 'txin>, Error>;
346348

@@ -361,7 +363,7 @@ where
361363
impl<'intp, 'txin: 'intp, F> Iter<'intp, 'txin, F>
362364
where
363365
NoChecks: ScriptContext,
364-
F: FnMut(&bitcoin::PublicKey, BitcoinSig) -> bool,
366+
F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
365367
{
366368
/// Helper function to push a NodeEvaluationState on state stack
367369
fn push_evaluation_state(
@@ -769,14 +771,15 @@ fn verify_sersig<'txin, F>(
769771
sigser: &[u8],
770772
) -> Result<secp256k1::ecdsa::Signature, Error>
771773
where
772-
F: FnOnce(&bitcoin::PublicKey, BitcoinSig) -> bool,
774+
F: FnOnce(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
773775
{
774776
if let Some((sighash_byte, sig)) = sigser.split_last() {
775-
let sighashtype = bitcoin::EcdsaSigHashType::from_u32_standard(*sighash_byte as u32)
777+
let hash_ty = bitcoin::EcdsaSigHashType::from_u32_standard(*sighash_byte as u32)
776778
.map_err(|_| Error::NonStandardSigHash([sig, &[*sighash_byte]].concat().to_vec()))?;
777779
let sig = secp256k1::ecdsa::Signature::from_der(sig)?;
778-
if verify_sig(pk, (sig, sighashtype)) {
779-
Ok(sig)
780+
let ecdsa_sig = bitcoin::EcdsaSig { sig, hash_ty };
781+
if verify_sig(pk, ecdsa_sig) {
782+
Ok(ecdsa_sig.sig)
780783
} else {
781784
Err(Error::InvalidSignature(*pk))
782785
}
@@ -793,7 +796,6 @@ mod tests {
793796
use bitcoin::hashes::{hash160, ripemd160, sha256, sha256d, Hash};
794797
use bitcoin::secp256k1::{self, Secp256k1, VerifyOnly};
795798
use miniscript::context::NoChecks;
796-
use BitcoinSig;
797799
use Miniscript;
798800
use MiniscriptKey;
799801
use ToPublicKey;
@@ -838,16 +840,17 @@ mod tests {
838840
#[test]
839841
fn sat_constraints() {
840842
let (pks, der_sigs, secp_sigs, sighash, secp) = setup_keys_sigs(10);
841-
let vfyfn_ =
842-
|pk: &bitcoin::PublicKey, (sig, _)| secp.verify_ecdsa(&sighash, &sig, &pk.key).is_ok();
843+
let vfyfn_ = |pk: &bitcoin::PublicKey, ecdsa_sig: bitcoin::EcdsaSig| {
844+
secp.verify_ecdsa(&sighash, &ecdsa_sig.sig, &pk.key).is_ok()
845+
};
843846

844847
fn from_stack<'txin, 'elem, F>(
845848
verify_fn: F,
846849
stack: &'elem mut Stack<'txin>,
847850
ms: &'elem Miniscript<bitcoin::PublicKey, NoChecks>,
848851
) -> Iter<'elem, 'txin, F>
849852
where
850-
F: FnMut(&bitcoin::PublicKey, BitcoinSig) -> bool,
853+
F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
851854
{
852855
Iter {
853856
verify_sig: verify_fn,

src/interpreter/stack.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use bitcoin;
1818
use bitcoin::blockdata::{opcodes, script};
1919
use bitcoin::hashes::{hash160, ripemd160, sha256, sha256d, Hash};
2020

21-
use {BitcoinSig, ToPublicKey};
21+
use ToPublicKey;
2222

2323
use super::{verify_sersig, Error, HashLockType, SatisfiedConstraint};
2424

@@ -132,7 +132,7 @@ impl<'txin> Stack<'txin> {
132132
pk: &'intp bitcoin::PublicKey,
133133
) -> Option<Result<SatisfiedConstraint<'intp, 'txin>, Error>>
134134
where
135-
F: FnMut(&bitcoin::PublicKey, BitcoinSig) -> bool,
135+
F: FnMut(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
136136
{
137137
if let Some(sigser) = self.pop() {
138138
match sigser {
@@ -171,7 +171,7 @@ impl<'txin> Stack<'txin> {
171171
pkh: &'intp hash160::Hash,
172172
) -> Option<Result<SatisfiedConstraint<'intp, 'txin>, Error>>
173173
where
174-
F: FnOnce(&bitcoin::PublicKey, BitcoinSig) -> bool,
174+
F: FnOnce(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
175175
{
176176
if let Some(Element::Push(pk)) = self.pop() {
177177
let pk_hash = hash160::Hash::hash(pk);
@@ -367,7 +367,7 @@ impl<'txin> Stack<'txin> {
367367
pk: &'intp bitcoin::PublicKey,
368368
) -> Option<Result<SatisfiedConstraint<'intp, 'txin>, Error>>
369369
where
370-
F: FnOnce(&bitcoin::PublicKey, BitcoinSig) -> bool,
370+
F: FnOnce(&bitcoin::PublicKey, bitcoin::EcdsaSig) -> bool,
371371
{
372372
if let Some(witness_sig) = self.pop() {
373373
if let Element::Push(sigser) = witness_sig {

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ pub use descriptor::{Descriptor, DescriptorPublicKey, DescriptorTrait};
126126
pub use interpreter::Interpreter;
127127
pub use miniscript::context::{BareCtx, Legacy, ScriptContext, Segwitv0, Tap};
128128
pub use miniscript::decode::Terminal;
129-
pub use miniscript::satisfy::{BitcoinSig, Preimage32, Satisfier};
129+
pub use miniscript::satisfy::{Preimage32, Satisfier};
130130
pub use miniscript::Miniscript;
131131

132132
///Public key trait which can be converted to Hash type

0 commit comments

Comments
 (0)