]> Untitled Git - bdk/commitdiff
Update miniscript to version 1.0
authorAlekos Filini <alekos.filini@gmail.com>
Sun, 19 Jul 2020 17:24:05 +0000 (19:24 +0200)
committerAlekos Filini <alekos.filini@gmail.com>
Sun, 19 Jul 2020 17:31:40 +0000 (19:31 +0200)
Cargo.toml
src/cli.rs
src/descriptor/mod.rs
src/descriptor/policy.rs

index 994ea1bebdb83ee9330245daf00ae3eea747beb1..65be202de702f0e58d0be94cf3480cd079c90e2e 100644 (file)
@@ -7,10 +7,9 @@ authors = ["Riccardo Casatta <riccardo@casatta.it>", "Alekos Filini <alekos.fili
 [dependencies]
 log = "^0.4"
 bitcoin = { version = "0.23", features = ["use-serde"] }
-miniscript = { version = "0.12" }
+miniscript = { version = "1.0" }
 serde = { version = "^1.0", features = ["derive"] }
 serde_json = { version = "^1.0" }
-base64 = "^0.11"
 
 # Optional dependencies
 sled = { version = "0.31.0", optional = true }
@@ -19,6 +18,7 @@ reqwest = { version = "0.10", optional = true, features = ["json"] }
 tokio = { version = "0.2", optional = true, features = ["rt-core"] }
 futures = { version = "0.3", optional = true }
 clap = { version = "2.33", optional = true }
+base64 = { version = "^0.11", optional = true }
 
 [features]
 minimal = []
@@ -27,7 +27,7 @@ default = ["key-value-db", "electrum"]
 electrum = ["electrum-client"]
 esplora = ["reqwest", "futures", "tokio"]
 key-value-db = ["sled"]
-cli-utils = ["clap"]
+cli-utils = ["clap", "base64"]
 
 [dev-dependencies]
 lazy_static = "1.4"
@@ -41,6 +41,7 @@ name = "repl"
 required-features = ["cli-utils"]
 [[example]]
 name = "psbt"
+required-features = ["cli-utils"]
 [[example]]
 name = "parse_descriptor"
 
index 5d61ff0661875b872c05feaa8e608daf84bb09e4..90c0704d00dcef87eba0e97930a098e208ae6fd1 100644 (file)
@@ -240,7 +240,7 @@ pub fn add_global_flags<'a, 'b>(app: App<'a, 'b>) -> App<'a, 'b> {
             .value_name("SERVER:PORT")
             .help("Sets the Electrum server to use")
             .takes_value(true)
-            .default_value("tn.not.fyi:55001"),
+            .default_value("ssl://electrum.blockstream.info:60002"),
     )
     .arg(
         Arg::with_name("proxy")
index 6f142a83be3211bd42791b158d08545de5636061..3000416b239ed0e25074cb7eec9469607f749a1c 100644 (file)
@@ -10,7 +10,9 @@ use bitcoin::util::bip32::{DerivationPath, ExtendedPrivKey, Fingerprint};
 use bitcoin::util::psbt::PartiallySignedTransaction as PSBT;
 use bitcoin::{PrivateKey, PublicKey, Script};
 
-pub use miniscript::{Descriptor, Miniscript, MiniscriptKey, Terminal};
+pub use miniscript::{
+    Descriptor, Legacy, Miniscript, MiniscriptKey, ScriptContext, Segwitv0, Terminal,
+};
 
 use serde::{Deserialize, Serialize};
 
@@ -182,13 +184,28 @@ impl ExtendedDescriptor {
         })
     }
 
-    pub fn derive_with_miniscript(
+    pub fn derive_with_miniscript_legacy(
         &self,
-        miniscript: Miniscript<PublicKey>,
+        miniscript: Miniscript<PublicKey, Legacy>,
     ) -> Result<DerivedDescriptor, Error> {
         let derived_desc = match self.internal {
             Descriptor::Bare(_) => Descriptor::Bare(miniscript),
             Descriptor::Sh(_) => Descriptor::Sh(miniscript),
+            _ => return Err(Error::CantDeriveWithMiniscript),
+        };
+
+        // if !self.same_structure(&derived_desc) {
+        //     Err(Error::CantDeriveWithMiniscript)
+        // } else {
+        Ok(derived_desc)
+        // }
+    }
+
+    pub fn derive_with_miniscript_segwit_v0(
+        &self,
+        miniscript: Miniscript<PublicKey, Segwitv0>,
+    ) -> Result<DerivedDescriptor, Error> {
+        let derived_desc = match self.internal {
             Descriptor::Wsh(_) => Descriptor::Wsh(miniscript),
             Descriptor::ShWsh(_) => Descriptor::ShWsh(miniscript),
             _ => return Err(Error::CantDeriveWithMiniscript),
@@ -219,13 +236,13 @@ impl ExtendedDescriptor {
         };
 
         if let Some(wit_script) = &psbt.inputs[input_index].witness_script {
-            self.derive_with_miniscript(Miniscript::parse(wit_script)?)
+            self.derive_with_miniscript_segwit_v0(Miniscript::parse(wit_script)?)
         } else if let Some(p2sh_script) = &psbt.inputs[input_index].redeem_script {
             if p2sh_script.is_v0_p2wpkh() {
                 // wrapped p2wpkh
                 get_pk_from_partial_sigs().map(|pk| Descriptor::ShWpkh(*pk))
             } else {
-                self.derive_with_miniscript(Miniscript::parse(p2sh_script)?)
+                self.derive_with_miniscript_legacy(Miniscript::parse(p2sh_script)?)
             }
         } else if let Some(utxo) = psbt.get_utxo_for(input_index) {
             if utxo.script_pubkey.is_p2pkh() {
@@ -236,7 +253,7 @@ impl ExtendedDescriptor {
                 get_pk_from_partial_sigs().map(|pk| Descriptor::Wpkh(*pk))
             } else {
                 // try as bare script
-                self.derive_with_miniscript(Miniscript::parse(&utxo.script_pubkey)?)
+                self.derive_with_miniscript_legacy(Miniscript::parse(&utxo.script_pubkey)?)
             }
         } else {
             Err(Error::MissingDetails)
index 4e10390b30f3de026af93fb3311c0e74aec7b1c9..13158cb91a487f70650e9727048497fcf77f26e2 100644 (file)
@@ -9,7 +9,7 @@ use bitcoin::secp256k1::Secp256k1;
 use bitcoin::util::bip32::Fingerprint;
 use bitcoin::PublicKey;
 
-use miniscript::{Descriptor, Miniscript, Terminal};
+use miniscript::{Descriptor, Miniscript, ScriptContext, Terminal};
 
 #[allow(unused_imports)]
 use log::{debug, error, info, trace};
@@ -482,7 +482,11 @@ impl Policy {
         Ok(Some(policy))
     }
 
-    pub fn satisfy(&mut self, _satisfier: &PSBTSatisfier, _desc_node: &Terminal<PublicKey>) {
+    pub fn satisfy<Ctx: ScriptContext>(
+        &mut self,
+        _satisfier: &PSBTSatisfier,
+        _desc_node: &Terminal<PublicKey, Ctx>,
+    ) {
         //self.satisfaction = self.item.satisfy(satisfier, desc_node);
         //self.contribution += &self.satisfaction;
     }
@@ -606,7 +610,7 @@ fn signature_key_from_string(key: Option<&Box<dyn Key>>) -> Option<Policy> {
     })
 }
 
-impl MiniscriptExtractPolicy for Miniscript<String> {
+impl<Ctx: ScriptContext> MiniscriptExtractPolicy for Miniscript<String, Ctx> {
     fn extract_policy(
         &self,
         lookup_map: &BTreeMap<String, Box<dyn Key>>,
@@ -614,7 +618,7 @@ impl MiniscriptExtractPolicy for Miniscript<String> {
         Ok(match &self.node {
             // Leaves
             Terminal::True | Terminal::False => None,
-            Terminal::Pk(pubkey) => signature_from_string(lookup_map.get(pubkey)),
+            Terminal::PkK(pubkey) => signature_from_string(lookup_map.get(pubkey)),
             Terminal::PkH(pubkey_hash) => signature_key_from_string(lookup_map.get(pubkey_hash)),
             Terminal::After(value) => {
                 let mut policy: Policy = SatisfiableItem::AbsoluteTimelock { value: *value }.into();
@@ -648,7 +652,7 @@ impl MiniscriptExtractPolicy for Miniscript<String> {
             Terminal::Hash160(hash) => {
                 Some(SatisfiableItem::HASH160Preimage { hash: *hash }.into())
             }
-            Terminal::ThreshM(k, pks) => {
+            Terminal::Multi(k, pks) => {
                 Policy::make_multisig(pks.iter().map(|s| lookup_map.get(s)).collect(), *k)?
             }
             // Identities
@@ -706,10 +710,12 @@ impl MiniscriptExtractPolicy for Descriptor<String> {
             | Descriptor::Pkh(pubkey)
             | Descriptor::Wpkh(pubkey)
             | Descriptor::ShWpkh(pubkey) => Ok(signature_from_string(lookup_map.get(pubkey))),
-            Descriptor::Bare(inner)
-            | Descriptor::Sh(inner)
-            | Descriptor::Wsh(inner)
-            | Descriptor::ShWsh(inner) => Ok(inner.extract_policy(lookup_map)?),
+            Descriptor::Bare(inner) | Descriptor::Sh(inner) => {
+                Ok(inner.extract_policy(lookup_map)?)
+            }
+            Descriptor::Wsh(inner) | Descriptor::ShWsh(inner) => {
+                Ok(inner.extract_policy(lookup_map)?)
+            }
         }
     }
 }