Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MPC: Add MerkleConcealed type #180

Merged
merged 2 commits into from
Aug 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
433 changes: 433 additions & 0 deletions commit_verify/doc/MPC.drawio

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions commit_verify/doc/MPC.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions commit_verify/src/bin/commit-stl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
43 changes: 41 additions & 2 deletions commit_verify/src/mpc/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -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 {
Expand All @@ -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,
}
}
}

Expand Down
4 changes: 3 additions & 1 deletion commit_verify/src/mpc/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 4 additions & 2 deletions commit_verify/src/mpc/tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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() }
}
Expand Down
3 changes: 2 additions & 1 deletion commit_verify/src/stl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<TypeLib, CompileError> {
LibBuilder::new(libname!(LIB_NAME_COMMIT_VERIFY), tiny_bset! {
Expand All @@ -33,6 +33,7 @@ fn _commit_verify_stl() -> Result<TypeLib, CompileError> {
.transpile::<ReservedBytes<1>>()
.transpile::<ReservedBytes<2>>()
.transpile::<ReservedBytes<4>>()
.transpile::<mpc::MerkleConcealed>()
.transpile::<mpc::MerkleTree>()
.transpile::<mpc::MerkleBlock>()
.transpile::<mpc::MerkleProof>()
Expand Down
41 changes: 22 additions & 19 deletions stl/[email protected]
Original file line number Diff line number Diff line change
@@ -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-Y<l(P9Y9YVY`}-X+f~R@qMRed+u?KBsb8}&5WdSuesZkZk
>V@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*<mh)A>-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|<S$`kJ6oIZx{|tq&1{dNqe!iO(;xh$q
Z)9aM0XUvRh9?yTI7S;;e;>sZfv!yd427@;7veO2zMB=|GYd^+a%*g5P;zf?W(ETTaBp(}00anQZ)Ra*
bZ>G100IPXVRUE!2mv^rLxv|61vo|<S$`kJ6oIZx{|tq&1{dNqe!iO(;xhmM00000001BW00000000V2
WpZn5WmIxyWd;QWWMy!4XadSC9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~OwaM+Gq(Fu_0Ocz)^
+@GUUoV7w&pu=F9->y0X3z7$AZgg^QaCra#2nb_uW?^G=Z*l+t0tjtob8}&5Wpe-u0Wg(*<{e=)S-S-Y
<l(P9Y9YVY`}-X+f~R@qMRed+u>mzVsZkZk>V@1=_p5>Oab-~jCR3C`SFec^=zG+gvC{wm0000000960
{{R30000ARVQ>Hn000C41p)yum44<OVKiC01qkHfuRUrZzt;Qv9WjEZdF4fP;8w8#H8-hI70Bv^+*0?e
f%0)>Q3WPbltNdpi4*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;qtQ<OqiuZa`rd(@k;(*
&}_PPHjCBJR{;P3000000RR90{{R3000(7mbaHQSc>n|g00eGtZe;)f009JZZ*64&1pxp62oFtVa%*g5
LvL<lWnpY(WCjBTWMy!4XadSC9&dx0-7pM3Z=O*v*GCA9fL-<|HrZsA`NnJlR3~OwaM+Gq(Fu_0Ocz)^
+@GUUoV7w&pu=F9->y0X3z7(9Z)Ra*bZ>G100IhaWpZn5Wm0c%bOAV?Lxv|61vo|<S$`kJ6oIZx{|tq&
1{dNqe!iO(;xh_OWpZn5Wk_LjXaxZP2LJ#-AOH$YWpZn5WlnEoWd;QaVsc?_V`yn^X92rRZVMaW&~7|@
gsWfrZu6=j^mo<V(`CxWoOXX=OTq<YWpH$800036cWGpFXaE2p1#WL-WibIbo<oKw6$Lm(8(DuJ#T0?A
O#cjpum%_6G=9FD72-1mZf|5|G66WALxv|61vo|<S$`kJ6oIZx{|tq&1{dNqe!iO(;xh|PWpZn5Wl(Z&
Z)OGq18{G1000CCV{c|*V{~tF00066aA9<400;p%o<oKw6$Lm(8(DuJ#T0?AO#cjpum%_6G=9FD72-1h
000000000W000000000AO=WUxY-Ln(Wn~5h1!QG#bZ7#~EFN!zncXl9K5w2;FV{y1jDTJCC^p$-mHEbO
0#qkvSa8^mT+s=T=}Z?`J=~w8Q=GLzSfImTncuED0}GM|Wo~qGZ*X}400;<UZ)Ra*bZ>G100IbYWpi_3
XJvB$3IQ;ce&!uvG+Da^2;||fJ!&Dp*8BS%F@mRg<wbPhR<Qv!H>pt-$m)gMQunKY@^NKR1twFJLRYVe
6X<)?o3YaX0000000030|Nj6000003ZDDW#3IG5E00ja8FqMAh9bq(Cy9Eg3;jcYvA-~r9`yDZYr+MW?
bl_I80W~+NQ5DGQh1^p2tAX-yWl;qtQ<OqiuZa`rd(@k;(*OVf000000RR900000000&KFb8}&5Wd#8M
2LJ#-AOH<cZ)9aca$#;`XlZU|0|NwhZ)s!z26Jg{XKZBw24ZqyZewTy3Q%%ybZ=vCY)NDV0RRU806-uB
4pL=vWpZ|9WI}m#WpgnF0RRU806+l%4pL=vWpZ|9WI}m#WpgqG0RRU806+o&4pL=vWpZ|9WI}m#WpgwI
0RRU806+u)3R84)X=8LqVRL8&0RRU806-uB2vl-qWlnEoWds5M4P$R^V`X7%Wn@loWMu#b0tIAcaCB$_
$}AplgPGkh3_fq3Q7_j=2#kPT_9!;lWR>~GYywm#W>|38j$F|Rkm*bpSUudIqf?x<LRg@~V42^pIs*%m
1ZZJ%XaP8$Lxv|61vo|<S$`kJ6oIZx{|tq&1{dNqe!iO(;xhpbV{dJ3X>@I6Zgfm#VP*gZ0t#?)Z**^C
Z){0q0Wg(*<{e=)S-S-Y<l(P9Y9YVY`}-X+f~R@qMRed+u?KBsb8}&5WdSuesZkZk>V@1=_p5>Oab-~j
CR3C`SFec^=zG+gvC{

-----END STRICT TYPE LIB-----

Binary file modified stl/[email protected]
Binary file not shown.
7 changes: 6 additions & 1 deletion stl/[email protected]
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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]

Expand Down
18 changes: 16 additions & 2 deletions stl/Merkle.vesper
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 {
Expand Down
Loading