diff --git a/commit_verify/doc/MPC.drawio b/commit_verify/doc/MPC.drawio new file mode 100644 index 00000000..6bf8eb11 --- /dev/null +++ b/commit_verify/doc/MPC.drawio @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/commit_verify/doc/MPC.svg b/commit_verify/doc/MPC.svg new file mode 100644 index 00000000..79d705d9 --- /dev/null +++ b/commit_verify/doc/MPC.svg @@ -0,0 +1,4 @@ + + + +
0x10
protocol_id
message
1
32
32
Leaf::Inhabited
SHA256t(urn:ubideco:merkle:node#2024-01-31)
0x11
Leaf::Entropy
entropy
pos
8
4
1
MerkleHash
hash
32
branching
depth
32
1
width
node1
node2
1
32
32
MerkleNode
NodeBranching
u8
MerkleNode
u256
MerkleNode
98 bytes:
13 bytes:
65 bytes:
ProtocolId
Message
u64
u32
tag
tag
VIRTUAL_LEAF = u256::MAX
32
NodeBranching
0x00: empty (two virtual leafs)
0x01: single (one virtual leaf)
0x02: branch
tag
Commitment
hash
32
depth
cofactor
merkle_root
1
2
32
MerkleConcealed
65 bytes:
u16
MerkleHash
u5
SHA256t(urn:ubideco:mpc:commitment#2024-01-31)
Leaf::Inhabited
MerkleNode
NodeBranching::Single
Leaf::entropy
MerkleNode
NodeBranching::Empty
Leaf::Inhabited
MerkleNode
NodeBranching::Branch
Leaf::entropy
Leaf::entropy
cofactor=3
width=8
(2^depth)
depth=3
\ No newline at end of file diff --git a/commit_verify/src/bin/commit-stl.rs b/commit_verify/src/bin/commit-stl.rs index a13f01a5..22e9737d 100644 --- a/commit_verify/src/bin/commit-stl.rs +++ b/commit_verify/src/bin/commit-stl.rs @@ -79,6 +79,11 @@ Merklization vesper lexicon=types+commitments let tt = sys.type_tree("CommitVerify.Leaf").unwrap(); writeln!(file, "{tt}").unwrap(); + let layout = mpc::MerkleConcealed::commitment_layout(); + writeln!(file, "{layout}").unwrap(); + let tt = sys.type_tree("CommitVerify.MerkleConcealed").unwrap(); + writeln!(file, "{tt}").unwrap(); + let layout = mpc::MerkleBlock::commitment_layout(); writeln!(file, "{layout}").unwrap(); let tt = sys.type_tree("CommitVerify.MerkleBlock").unwrap(); diff --git a/commit_verify/src/mpc/block.rs b/commit_verify/src/mpc/block.rs index d5afa7fa..6a7cdfae 100644 --- a/commit_verify/src/mpc/block.rs +++ b/commit_verify/src/mpc/block.rs @@ -129,6 +129,34 @@ impl TreeNode { } } +#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)] +#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)] +#[strict_type(lib = LIB_NAME_COMMIT_VERIFY)] +#[derive(CommitEncode)] +#[commit_encode(crate = crate, strategy = strict, id = Commitment)] +#[cfg_attr( + feature = "serde", + derive(Serialize, Deserialize), + serde(crate = "serde_crate", rename_all = "camelCase") +)] +pub struct MerkleConcealed { + /// Tree depth (up to 16). + depth: u5, + + /// Cofactor is used as an additive to the modulo divisor to improve packing + /// of protocols inside a tree of a given depth. + cofactor: u16, + + /// The root of the Merkle Tree + merkle_root: MerkleHash, +} + +impl Conceal for MerkleConcealed { + type Concealed = Self; + + fn conceal(&self) -> Self::Concealed { *self } +} + /// Partially-concealed merkle tree data. #[derive(Getters, Clone, PartialEq, Eq, Hash, Debug)] #[derive(StrictType, StrictEncode, StrictDecode)] @@ -588,7 +616,7 @@ Changed commitment id: {}", } impl Conceal for MerkleBlock { - type Concealed = Self; + type Concealed = MerkleConcealed; /// Reduces merkle tree into merkle tree root. fn conceal(&self) -> Self::Concealed { @@ -597,7 +625,18 @@ impl Conceal for MerkleBlock { .conceal_except([]) .expect("broken internal MerkleBlock structure"); debug_assert_eq!(concealed.cross_section.len(), 1); - concealed + let Some(TreeNode::ConcealedNode { + depth: u5::ZERO, + hash, + }) = concealed.cross_section.first() + else { + panic!("broken MerkleBlock conceal procedure") + }; + MerkleConcealed { + depth: self.depth, + cofactor: self.cofactor, + merkle_root: *hash, + } } } diff --git a/commit_verify/src/mpc/mod.rs b/commit_verify/src/mpc/mod.rs index f903f318..c733263f 100644 --- a/commit_verify/src/mpc/mod.rs +++ b/commit_verify/src/mpc/mod.rs @@ -30,7 +30,9 @@ mod block; pub use atoms::{ Commitment, Leaf, Message, MessageMap, MultiSource, ProtocolId, MPC_MINIMAL_DEPTH, }; -pub use block::{InvalidProof, LeafNotKnown, MergeError, MerkleBlock, MerkleProof}; +pub use block::{ + InvalidProof, LeafNotKnown, MergeError, MerkleBlock, MerkleConcealed, MerkleProof, +}; pub use tree::{Error, MerkleTree}; /// Marker trait for variates of LNPBP-4 commitment proofs, which differ by the diff --git a/commit_verify/src/mpc/tree.rs b/commit_verify/src/mpc/tree.rs index 51cb7d2a..b559f02d 100644 --- a/commit_verify/src/mpc/tree.rs +++ b/commit_verify/src/mpc/tree.rs @@ -26,7 +26,9 @@ use amplify::Wrapper; pub use self::commit::Error; use crate::merkle::MerkleHash; use crate::mpc::atoms::Leaf; -use crate::mpc::{Commitment, MerkleBlock, Message, MessageMap, Proof, ProtocolId}; +use crate::mpc::{ + Commitment, MerkleBlock, MerkleConcealed, Message, MessageMap, Proof, ProtocolId, +}; use crate::{CommitId, Conceal, LIB_NAME_COMMIT_VERIFY}; /// Number of cofactor variants tried before moving to the next tree depth. @@ -77,7 +79,7 @@ impl MerkleTree { } impl Conceal for MerkleTree { - type Concealed = MerkleBlock; + type Concealed = MerkleConcealed; fn conceal(&self) -> Self::Concealed { MerkleBlock::from(self.clone()).conceal() } } diff --git a/commit_verify/src/stl.rs b/commit_verify/src/stl.rs index 8ede6e42..4fcd398e 100644 --- a/commit_verify/src/stl.rs +++ b/commit_verify/src/stl.rs @@ -24,7 +24,7 @@ use strict_types::{CompileError, LibBuilder, TypeLib}; use crate::{mpc, MerkleHash, MerkleNode, ReservedBytes, StrictHash, LIB_NAME_COMMIT_VERIFY}; pub const LIB_ID_COMMIT_VERIFY: &str = - "stl:4dHdHDpB-17hoScv-Z8f00we-UaQ4D!G-tTV1vSN-JseSamU#tennis-peace-olympic"; + "stl:egMd32l9-y$Kod0o-$FRcNAV-Q4U$O5h-pskW9YM-$irF0yY#miller-pancake-elastic"; fn _commit_verify_stl() -> Result { LibBuilder::new(libname!(LIB_NAME_COMMIT_VERIFY), tiny_bset! { @@ -33,6 +33,7 @@ fn _commit_verify_stl() -> Result { .transpile::>() .transpile::>() .transpile::>() + .transpile::() .transpile::() .transpile::() .transpile::() diff --git a/stl/CommitVerify@0.1.0.sta b/stl/CommitVerify@0.1.0.sta index 2cfbe4d6..5af897f2 100644 --- a/stl/CommitVerify@0.1.0.sta +++ b/stl/CommitVerify@0.1.0.sta @@ -1,31 +1,34 @@ -----BEGIN STRICT TYPE LIB----- -Id: stl:4dHdHDpB-17hoScv-Z8f00we-UaQ4D!G-tTV1vSN-JseSamU#tennis-peace-olympic +Id: stl:egMd32l9-y$Kod0o-$FRcNAV-Q4U$O5h-pskW9YM-$irF0yY#miller-pancake-elastic Name: CommitVerify Dependencies: Std#ralph-blue-lucky -Check-SHA256: 65c610ae37864b07fc960c412ea98cee2c9c528b0b0ef02d2c0b3ce4ba59290a +Check-SHA256: ce5ec3f773efffb6535247e84c9da1bfc1656c1a35c616832abf5eecaa5feb44 3`1{iZE18?WpZg|c>&5S9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3`&dbYuYoQ*>kj0A^Tl*p6J$ -36SYb7g#;qpQBTpwL(~+!(f@;t~vt?k^)sV4*&{7Z*6U9bZupBbOiwb2LJ#-AOHkRWnpFn0uTvlZfId* +36SYb7g#;qpQBTpwL(~+!(f@;t~vt?k^)sV5C958Z*6U9bZupBbOiwb2LJ#-AOHkRWnpFn0uTvlZfId* X>?^|00sgGaB^>SZ)0z40Wg(*<{e=)S-S-YV@1=_p5>Oab-~jCR3C`SFec^=zG+gvC|O;Wo~qGZ*X}41_B3VZgg^QaCra#2m^3$a{vGY3r%HmYiwmg Y;R+01_T9UWpH$80?I5NZ-bfLFbqC#o>4E?M+l67UG^w8*<_XZ#%uyqCuUf1*p6J$36SYb7g#;qpQBTp wL(~+!(f@;t~vt?k_cmOW?^G=Z*l+t0t{nvZ*y}~Wn*+{Z*Bkx0ob*-9G+(AKhLw+s!eDmlO2> -&}_PPHjCBJR{;P3000000RR90{{R3000(7mbaHQSc>n|g00eGtZe;)f009JZZ*64&1pxp62ntPQa%*g5 -NMUnm1pxpD002NB018cIa%*g5PH$vo1_cRXa$#;`XlZU|0lQ3Y3mf3jZajR1t6%zV^Qs{9ch%g}Wy;2! -c7I|^!UbeyaCB$@009MeX=HS0001BbZf|5|F#$N9Lxv|61vo|sZfv!yd427@;7veO2zMB=|GYd^+a%*g5P;zf?W(ETTaBp(}00anQZ)Ra* -bZ>G100IPXVRUE!2mv^rLxv|61vo|y0X3z7$AZgg^QaCra#2nb_uW?^G=Z*l+t0tjtob8}&5Wpe-u0Wg(*<{e=)S-S-Y -mzVsZkZk>V@1=_p5>Oab-~jCR3C`SFec^=zG+gvC{wm0000000960 -{{R30000ARVQ>Hn000C41p)yum44Q3WPbltNdpi4*91)SI!>0000000000|Ns90000002Tf&jb75y?1pxpD002NB01ZxWWMx8fVQyn+ -X>Ml&0|a(&X=DHfb7^j8Y-IrkVsc?_V`u^jP;zf{Z)0z4Nn`~900#g7Kp+4PQe|^xa&~28LV0v$b1?-0 -00#g7Kmh;_Qe|^xa&~28LV0v$b20@100#g7Kmq^`Qe|^xa&~28LV0v$b2J4300#g7Km-5^Q*?4^V{}Mi -b7%zt00#g7Kp+4JRB~lyPH$vo1OfmJV{dL_WnpY(WKM5nWdH^O1!QG#bZ7#~EFN!zncXl9K5w2;FV{y1 -jDTJCC^p$-mHEbO0#qkvSa8^mT+s=T=}Z?`J=~w8Q=GLzSfImTncuED0}GM_Xkl|`0XUvRh9?yTI7S;; -e;>sZfv!yd427@;7veO2zMB=|GXV}`Z*6U9bZupBbWCMoW&j2P3UG37bZ=vCY)NDRFqMAh9bq(Cy9Eg3 -;jcYvA-~r9`yDZYr+MW?bl_I82W@3@b75y?0W~+NQ5DGQh1^p2tAX-yWl;qtQn|g00eGtZe;)f009JZZ*64&1pxp62oFtVa%*g5 +LvLy0X3z7(9Z)Ra*bZ>G100IhaWpZn5Wm0c%bOAV?Lxv|61vo|G100IbYWpi_3 +XJvB$3IQ;ce&!uvG+Da^2;||fJ!&Dp*8BS%F@mRgpt-$m)gMQunKY@^NKR1twFJLRYVe +6X<)?o3YaX0000000030|Nj6000003ZDDW#3IG5E00ja8FqMAh9bq(Cy9Eg3;jcYvA-~r9`yDZYr+MW? +bl_I80W~+NQ5DGQh1^p2tAX-yWl;qtQ~GYywm#W>|38j$F|Rkm*bpSUudIqf?x@I6Zgfm#VP*gZ0t#?)Z**^C +Z){0q0Wg(*<{e=)S-S-YV@1=_p5>Oab-~j +CR3C`SFec^=zG+gvC{ -----END STRICT TYPE LIB----- diff --git a/stl/CommitVerify@0.1.0.stl b/stl/CommitVerify@0.1.0.stl index e191d7c7..6f83b362 100644 Binary files a/stl/CommitVerify@0.1.0.stl and b/stl/CommitVerify@0.1.0.stl differ diff --git a/stl/CommitVerify@0.1.0.sty b/stl/CommitVerify@0.1.0.sty index bb486709..ab2f6ba6 100644 --- a/stl/CommitVerify@0.1.0.sty +++ b/stl/CommitVerify@0.1.0.sty @@ -1,5 +1,5 @@ {- - Id: stl:4dHdHDpB-17hoScv-Z8f00we-UaQ4D!G-tTV1vSN-JseSamU#tennis-peace-olympic + Id: stl:egMd32l9-y$Kod0o-$FRcNAV-Q4U$O5h-pskW9YM-$irF0yY#miller-pancake-elastic Name: CommitVerify Version: 0.1.0 Description: Client-side-validation deterministic commitments @@ -28,6 +28,11 @@ data MerkleBlock : depth Std.U5 , crossSection [TreeNode ^ 1..0xffffffff] , entropy U64? +@mnemonic(aztec-miracle-igloo) +data MerkleConcealed : depth Std.U5 + , cofactor U16 + , merkleRoot MerkleHash + @mnemonic(horse-popcorn-bundle) data MerkleHash : [Byte ^ 32] diff --git a/stl/Merkle.vesper b/stl/Merkle.vesper index 0a33dc66..c4ee87a0 100644 --- a/stl/Merkle.vesper +++ b/stl/Merkle.vesper @@ -35,7 +35,21 @@ Leaf union pos is U32 Commitment commitment hasher=SHA256 tagged=urn:ubideco:mpc:commitment#2024-01-31 - MerkleBlock concealed concealed=MerkleBlock + MerkleConcealed serialized + +MerkleConcealed rec + depth enum { + U5 _0=0 _1=1 _2=2 _3=3 _4=4 _5=5 _6=6 _7=7 + _8=8 _9=9 _10=10 _11=11 _12=12 _13=13 _14=14 _15=15 + _16=16 _17=17 _18=18 _19=19 _20=20 _21=21 _22=22 _23=23 + _24=24 _25=25 _26=26 _27=27 _28=28 _29=29 _30=30 _31=31 + + } + cofactor is U16 + merkleRoot bytes len=32 aka=MerkleHash + +Commitment commitment hasher=SHA256 tagged=urn:ubideco:mpc:commitment#2024-01-31 + MerkleConcealed concealed concealed=MerkleConcealed MerkleBlock rec depth enum { @@ -63,7 +77,7 @@ MerkleBlock rec some is U64 option wrapped tag=1 Commitment commitment hasher=SHA256 tagged=urn:ubideco:mpc:commitment#2024-01-31 - MerkleBlock concealed concealed=MerkleBlock + MerkleConcealed concealed concealed=MerkleConcealed MerkleTree rec depth enum {