From 445863800665dc95e803a344c2ee959c38f05f88 Mon Sep 17 00:00:00 2001 From: "Dr. Maxim Orlovsky" Date: Fri, 18 Nov 2022 13:46:14 +0100 Subject: [PATCH 1/3] New descriptor data types draft --- Cargo.lock | 2 +- descriptors/src/descriptors2.rs | 84 +++++++++++++++++++++++++++++++++ descriptors/src/lib.rs | 1 + 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 descriptors/src/descriptors2.rs diff --git a/Cargo.lock b/Cargo.lock index f8cf347..03d667e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -826,7 +826,7 @@ dependencies = [ [[package]] name = "psbt" -version = "0.9.0-alpha.1" +version = "0.9.0-alpha.2" dependencies = [ "amplify", "bitcoin 0.29.2", diff --git a/descriptors/src/descriptors2.rs b/descriptors/src/descriptors2.rs new file mode 100644 index 0000000..fe826c6 --- /dev/null +++ b/descriptors/src/descriptors2.rs @@ -0,0 +1,84 @@ +//! Experiments on new descriptor type system + +#![allow(unused)] + +use bitcoin::util::bip32::ChainCode; +use bitcoin::XOnlyPublicKey; +use bitcoin_hd::{DerivationSubpath, TerminalStep}; +use bitcoin_scripts::address::AddressPayload; +use bitcoin_scripts::{LeafScript, TapNodeHash}; +use miniscript_crate::{Legacy, Miniscript, MiniscriptKey, Segwitv0, Tap}; + +pub trait ScriptData: MiniscriptKey { + type Key; + type CompKey; + type XonlyKey; +} + +pub trait OutputDescriptor {} + +pub enum Descr { + Sh(ScriptDescr), + Wsh(WScriptDescr), + Pk(D), + Pkh(D), + Wpkh(D), + + Combo(ComboDescr), + Multi(MultiDescr), + Sortedmulti(MultiDescr), + + Tr(TapKeyDescr, TapNodeDescr), + + Raw(ScriptDescr), + RawTr(XOnlyPublicKey), + + Addr(AddressPayload), +} + +pub enum ScriptDescr { + Bitcoin(BitcoinScript), + Miniscript(Miniscript), +} + +pub enum WScriptDescr { + Bitcoin(BitcoinScript), + Miniscript(Miniscript), +} + +pub struct ComboDescr(Vec /* at least 1 element, no repeated elements */); + +pub struct MultiDescr { + threshold: u8, + keys: Vec, // at least 1 element, no repeated elements, ensure # >= threshold +} + +pub enum TapKeyDescr { + Unspend(ChainCode, DerivationSubpath), + Key(D), + MuSig(Vec), +} + +pub enum TapNodeDescr { + TapScript(TapScript), + TapMiniscript(Miniscript), + RawLeaf(LeafScript), + RawNode(TapNodeHash), + Branch(Box>, Box>), +} + +pub struct BitcoinScript { + instructions: Vec>, +} + +pub struct TapScript { + instructions: Vec>, +} + +pub enum LegacyInstr { + Data(D), // enumerate opcodes +} + +pub enum TapInstr { + Data(D), // enumerate opcodes +} diff --git a/descriptors/src/lib.rs b/descriptors/src/lib.rs index 2e63e89..6d6a9d0 100644 --- a/descriptors/src/lib.rs +++ b/descriptors/src/lib.rs @@ -33,6 +33,7 @@ extern crate serde_crate as serde; mod deduction; pub mod derive; mod descriptor; +pub mod descriptors2; mod input; #[cfg(feature = "miniscript")] mod templates; From 903bc03f7afa8e76c34b271e6685499871cd692e Mon Sep 17 00:00:00 2001 From: "Dr. Maxim Orlovsky" Date: Fri, 18 Nov 2022 14:12:16 +0100 Subject: [PATCH 2/3] Drafto for account-level descriptors --- descriptors/src/descriptors2.rs | 36 ++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/descriptors/src/descriptors2.rs b/descriptors/src/descriptors2.rs index fe826c6..f623396 100644 --- a/descriptors/src/descriptors2.rs +++ b/descriptors/src/descriptors2.rs @@ -2,9 +2,13 @@ #![allow(unused)] +use std::collections::HashMap; +use std::hash::Hash; + +use amplify::Slice32; use bitcoin::util::bip32::ChainCode; use bitcoin::XOnlyPublicKey; -use bitcoin_hd::{DerivationSubpath, TerminalStep}; +use bitcoin_hd::{DerivationSubpath, TerminalStep, UnhardenedIndex}; use bitcoin_scripts::address::AddressPayload; use bitcoin_scripts::{LeafScript, TapNodeHash}; use miniscript_crate::{Legacy, Miniscript, MiniscriptKey, Segwitv0, Tap}; @@ -13,11 +17,37 @@ pub trait ScriptData: MiniscriptKey { type Key; type CompKey; type XonlyKey; + type Definite; +} + +pub trait Descriptor { + type Translated; + fn translate(&self) -> Self::Translated; +} + +pub struct AccDescr { + keys: HashMap, + descr: OutputDescr, + terminal: Option>, + tapret: HashMap, } -pub trait OutputDescriptor {} +impl Descriptor for AccDescr { + type Translated = K::Definite; + fn translate(&self) -> K::Definite { todo!() } +} + +// Temporary type holder +pub type AccId = Slice32; +// Temporary type holder +pub type AccStateId = Slice32; + +impl AccDescr { + pub fn id() -> AccId { todo!("commit to permanent parts") } + pub fn state_id() -> AccStateId { todo!("commit to variable parts") } +} -pub enum Descr { +pub enum OutputDescr { Sh(ScriptDescr), Wsh(WScriptDescr), Pk(D), From 65a79b804bcd7fcad001581b83fd67ff2245c175 Mon Sep 17 00:00:00 2001 From: "Dr. Maxim Orlovsky" Date: Fri, 18 Nov 2022 14:29:54 +0100 Subject: [PATCH 3/3] Extend tapret info in new descriptors --- descriptors/src/descriptors2.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/descriptors/src/descriptors2.rs b/descriptors/src/descriptors2.rs index f623396..adf0bf0 100644 --- a/descriptors/src/descriptors2.rs +++ b/descriptors/src/descriptors2.rs @@ -25,14 +25,20 @@ pub trait Descriptor { fn translate(&self) -> Self::Translated; } -pub struct AccDescr { +pub struct AccDescr { keys: HashMap, descr: OutputDescr, terminal: Option>, - tapret: HashMap, + tapret: Vec>, } -impl Descriptor for AccDescr { +pub struct TapretInfo { + pub terminal: [UnhardenedIndex; TERM_LEN], + pub nonce: u8, + pub tweak: Slice32, +} + +impl Descriptor for AccDescr { type Translated = K::Definite; fn translate(&self) -> K::Definite { todo!() } } @@ -42,7 +48,7 @@ pub type AccId = Slice32; // Temporary type holder pub type AccStateId = Slice32; -impl AccDescr { +impl AccDescr { pub fn id() -> AccId { todo!("commit to permanent parts") } pub fn state_id() -> AccStateId { todo!("commit to variable parts") } }