Skip to content

Commit 2314693

Browse files
committed
Change semantic::Policy to Lifted
Observe: - The semantic/abstract policy is a rust-miniscript thing but the policy language (`concrete::Policy`) is a general miniscript thing. - The `semantic::Policy` can be created by lifting more than just a concrete policy (eg, a descriptor). Do the following: - Move `src/policy/semantic.rs` to `src/lift/lifted.rs` (leaving the type as `Policy`). - Move the contents of `src/policy/mod.rs` (excl. tests/benches) to `src/lift/mod.rs`. - Add a re-export `lift::lifted::Policy as Lifted` and use it in other parts of the code base. Note, the idea to keep the `lifted::Policy` as is and re-export helps keep this patch smaller but also gives some choice to how the type is used - `use crate::lift::Liftded` coupled with usage of `Lifted`. - `use crate::lift::lifted` coupled with usage of `lifted::Policy` We can the do a rename later if deemed appropriate.
1 parent b71f55f commit 2314693

File tree

15 files changed

+269
-259
lines changed

15 files changed

+269
-259
lines changed

examples/htlc.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ use std::str::FromStr;
77

88
use miniscript::bitcoin::Network;
99
use miniscript::descriptor::Wsh;
10-
use miniscript::policy::{Concrete, Lift};
10+
use miniscript::lift::Lift;
11+
use miniscript::policy::Concrete;
1112

1213
fn main() {
1314
// HTLC policy with 10:1 odds for happy (co-operative) case compared to uncooperative case.

fuzz/fuzz_targets/compile_descriptor.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::str::FromStr;
22

33
use honggfuzz::fuzz;
4+
use miniscript::lift::Lift;
45
use miniscript::{policy, Miniscript, Segwitv0};
5-
use policy::Lift;
66

77
type Script = Miniscript<String, Segwitv0>;
88
type Policy = policy::Concrete<String>;

fuzz/fuzz_targets/roundtrip_semantic.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use std::str::FromStr;
22

33
use honggfuzz::fuzz;
4-
use miniscript::policy;
4+
use miniscript::lift::lifted;
55

6-
type Policy = policy::Semantic<String>;
6+
type Policy = lifted::Policy<String>;
77

88
fn do_test(data: &[u8]) {
99
let data_str = String::from_utf8_lossy(data);

src/descriptor/bare.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ use bitcoin::{Address, Network, ScriptBuf};
1515
use super::checksum::{self, verify_checksum};
1616
use crate::descriptor::DefiniteDescriptorKey;
1717
use crate::expression::{self, FromTree};
18+
use crate::lift::{Lift, Lifted};
1819
use crate::miniscript::context::{ScriptContext, ScriptContextError};
1920
use crate::miniscript::satisfy::{Placeholder, Satisfaction, Witness};
2021
use crate::plan::AssetProvider;
21-
use crate::policy::{semantic, Lift};
2222
use crate::prelude::*;
2323
use crate::util::{varint_len, witness_to_scriptsig};
2424
use crate::{
@@ -165,7 +165,7 @@ impl<Pk: MiniscriptKey> fmt::Display for Bare<Pk> {
165165
}
166166

167167
impl<Pk: MiniscriptKey> Lift<Pk> for Bare<Pk> {
168-
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> { self.ms.lift() }
168+
fn lift(&self) -> Result<Lifted<Pk>, Error> { self.ms.lift() }
169169
}
170170

171171
impl_from_tree!(
@@ -362,9 +362,7 @@ impl<Pk: MiniscriptKey> fmt::Display for Pkh<Pk> {
362362
}
363363

364364
impl<Pk: MiniscriptKey> Lift<Pk> for Pkh<Pk> {
365-
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
366-
Ok(semantic::Policy::Key(self.pk.clone()))
367-
}
365+
fn lift(&self) -> Result<Lifted<Pk>, Error> { Ok(Lifted::Key(self.pk.clone())) }
368366
}
369367

370368
impl_from_tree!(

src/descriptor/segwitv0.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ use super::checksum::{self, verify_checksum};
1313
use super::SortedMultiVec;
1414
use crate::descriptor::DefiniteDescriptorKey;
1515
use crate::expression::{self, FromTree};
16+
use crate::lift::{Lift, Lifted};
1617
use crate::miniscript::context::{ScriptContext, ScriptContextError};
1718
use crate::miniscript::satisfy::{Placeholder, Satisfaction, Witness};
1819
use crate::plan::AssetProvider;
19-
use crate::policy::{semantic, Lift};
2020
use crate::prelude::*;
2121
use crate::util::varint_len;
2222
use crate::{
@@ -220,7 +220,7 @@ pub enum WshInner<Pk: MiniscriptKey> {
220220
}
221221

222222
impl<Pk: MiniscriptKey> Lift<Pk> for Wsh<Pk> {
223-
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
223+
fn lift(&self) -> Result<Lifted<Pk>, Error> {
224224
match self.inner {
225225
WshInner::SortedMulti(ref smv) => smv.lift(),
226226
WshInner::Ms(ref ms) => ms.lift(),
@@ -469,9 +469,7 @@ impl<Pk: MiniscriptKey> fmt::Display for Wpkh<Pk> {
469469
}
470470

471471
impl<Pk: MiniscriptKey> Lift<Pk> for Wpkh<Pk> {
472-
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
473-
Ok(semantic::Policy::Key(self.pk.clone()))
474-
}
472+
fn lift(&self) -> Result<Lifted<Pk>, Error> { Ok(Lifted::Key(self.pk.clone())) }
475473
}
476474

477475
impl_from_tree!(

src/descriptor/sh.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ use super::checksum::{self, verify_checksum};
1717
use super::{SortedMultiVec, Wpkh, Wsh};
1818
use crate::descriptor::DefiniteDescriptorKey;
1919
use crate::expression::{self, FromTree};
20+
use crate::lift::{Lift, Lifted};
2021
use crate::miniscript::context::ScriptContext;
2122
use crate::miniscript::satisfy::{Placeholder, Satisfaction};
2223
use crate::plan::AssetProvider;
23-
use crate::policy::{semantic, Lift};
2424
use crate::prelude::*;
2525
use crate::util::{varint_len, witness_to_scriptsig};
2626
use crate::{
@@ -49,10 +49,10 @@ pub enum ShInner<Pk: MiniscriptKey> {
4949
}
5050

5151
impl<Pk: MiniscriptKey> Lift<Pk> for Sh<Pk> {
52-
fn lift(&self) -> Result<semantic::Policy<Pk>, Error> {
52+
fn lift(&self) -> Result<Lifted<Pk>, Error> {
5353
match self.inner {
5454
ShInner::Wsh(ref wsh) => wsh.lift(),
55-
ShInner::Wpkh(ref pk) => Ok(semantic::Policy::Key(pk.as_inner().clone())),
55+
ShInner::Wpkh(ref pk) => Ok(Lifted::Key(pk.as_inner().clone())),
5656
ShInner::SortedMulti(ref smv) => smv.lift(),
5757
ShInner::Ms(ref ms) => ms.lift(),
5858
}

src/descriptor/sortedmulti.rs

+7-11
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,16 @@ use core::str::FromStr;
1111

1212
use bitcoin::script;
1313

14+
use crate::lift::{Lift, Lifted};
1415
use crate::miniscript::context::ScriptContext;
1516
use crate::miniscript::decode::Terminal;
1617
use crate::miniscript::limits::MAX_PUBKEYS_PER_MULTISIG;
1718
use crate::miniscript::satisfy::{Placeholder, Satisfaction};
1819
use crate::plan::AssetProvider;
1920
use crate::prelude::*;
2021
use crate::{
21-
errstr, expression, policy, script_num_size, Error, ForEachKey, Miniscript, MiniscriptKey,
22-
Satisfier, ToPublicKey, TranslateErr, Translator,
22+
errstr, expression, script_num_size, Error, ForEachKey, Miniscript, MiniscriptKey, Satisfier,
23+
ToPublicKey, TranslateErr, Translator,
2324
};
2425

2526
/// Contents of a "sortedmulti" descriptor
@@ -195,15 +196,10 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> SortedMultiVec<Pk, Ctx> {
195196
pub fn max_satisfaction_size(&self) -> usize { 1 + 73 * self.k }
196197
}
197198

198-
impl<Pk: MiniscriptKey, Ctx: ScriptContext> policy::Lift<Pk> for SortedMultiVec<Pk, Ctx> {
199-
fn lift(&self) -> Result<policy::semantic::Policy<Pk>, Error> {
200-
let ret = policy::semantic::Policy::Threshold(
201-
self.k,
202-
self.pks
203-
.iter()
204-
.map(|k| policy::semantic::Policy::Key(k.clone()))
205-
.collect(),
206-
);
199+
impl<Pk: MiniscriptKey, Ctx: ScriptContext> Lift<Pk> for SortedMultiVec<Pk, Ctx> {
200+
fn lift(&self) -> Result<Lifted<Pk>, Error> {
201+
let ret =
202+
Lifted::Threshold(self.k, self.pks.iter().map(|k| Lifted::Key(k.clone())).collect());
207203
Ok(ret)
208204
}
209205
}

src/descriptor/tr.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ use sync::Arc;
1313
use super::checksum::{self, verify_checksum};
1414
use crate::descriptor::DefiniteDescriptorKey;
1515
use crate::expression::{self, FromTree};
16+
use crate::lift::{Lift, Lifted};
1617
use crate::miniscript::satisfy::{Placeholder, Satisfaction, SchnorrSigType, Witness};
1718
use crate::miniscript::Miniscript;
1819
use crate::plan::AssetProvider;
19-
use crate::policy::semantic::Policy;
20-
use crate::policy::Lift;
2120
use crate::prelude::*;
2221
use crate::util::{varint_len, witness_size};
2322
use crate::{
@@ -617,11 +616,11 @@ fn split_once(inp: &str, delim: char) -> Option<(&str, &str)> {
617616
}
618617

619618
impl<Pk: MiniscriptKey> Lift<Pk> for TapTree<Pk> {
620-
fn lift(&self) -> Result<Policy<Pk>, Error> {
621-
fn lift_helper<Pk: MiniscriptKey>(s: &TapTree<Pk>) -> Result<Policy<Pk>, Error> {
619+
fn lift(&self) -> Result<Lifted<Pk>, Error> {
620+
fn lift_helper<Pk: MiniscriptKey>(s: &TapTree<Pk>) -> Result<Lifted<Pk>, Error> {
622621
match *s {
623622
TapTree::Tree { ref left, ref right, height: _ } => {
624-
Ok(Policy::Threshold(1, vec![lift_helper(left)?, lift_helper(right)?]))
623+
Ok(Lifted::Threshold(1, vec![lift_helper(left)?, lift_helper(right)?]))
625624
}
626625
TapTree::Leaf(ref leaf) => leaf.lift(),
627626
}
@@ -633,12 +632,12 @@ impl<Pk: MiniscriptKey> Lift<Pk> for TapTree<Pk> {
633632
}
634633

635634
impl<Pk: MiniscriptKey> Lift<Pk> for Tr<Pk> {
636-
fn lift(&self) -> Result<Policy<Pk>, Error> {
635+
fn lift(&self) -> Result<Lifted<Pk>, Error> {
637636
match &self.tree {
638637
Some(root) => {
639-
Ok(Policy::Threshold(1, vec![Policy::Key(self.internal_key.clone()), root.lift()?]))
638+
Ok(Lifted::Threshold(1, vec![Lifted::Key(self.internal_key.clone()), root.lift()?]))
640639
}
641-
None => Ok(Policy::Key(self.internal_key.clone())),
640+
None => Ok(Lifted::Key(self.internal_key.clone())),
642641
}
643642
}
644643
}

src/lib.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ pub mod descriptor;
122122
pub mod expression;
123123
pub mod interpreter;
124124
pub mod iter;
125+
pub mod lift;
125126
pub mod miniscript;
126127
pub mod plan;
127128
pub mod policy;
@@ -474,7 +475,7 @@ pub enum Error {
474475
/// Errors related to policy
475476
PolicyError(policy::concrete::PolicyError),
476477
/// Errors related to lifting
477-
LiftError(policy::LiftError),
478+
LiftError(lift::LiftError),
478479
/// Forward script context related errors
479480
ContextError(miniscript::context::ScriptContextError),
480481
/// Recursion depth exceeded when parsing policy/miniscript from string
@@ -644,8 +645,8 @@ where
644645
}
645646

646647
#[doc(hidden)]
647-
impl From<policy::LiftError> for Error {
648-
fn from(e: policy::LiftError) -> Error { Error::LiftError(e) }
648+
impl From<lift::LiftError> for Error {
649+
fn from(e: lift::LiftError) -> Error { Error::LiftError(e) }
649650
}
650651

651652
#[doc(hidden)]

src/policy/semantic.rs src/lift/lifted.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ use core::{fmt, str};
1010

1111
use bitcoin::{absolute, Sequence};
1212

13-
use super::concrete::PolicyError;
14-
use super::ENTAILMENT_MAX_TERMINALS;
13+
use crate::lift::ENTAILMENT_MAX_TERMINALS;
14+
use crate::policy::concrete::PolicyError;
1515
use crate::prelude::*;
1616
use crate::{errstr, expression, AbsLockTime, Error, ForEachKey, MiniscriptKey, Translator};
1717

0 commit comments

Comments
 (0)