Skip to content

Commit 98486fb

Browse files
committed
add dedicated type impls for Dictionary,Set,Array (without traits)
1 parent 7338cd2 commit 98486fb

File tree

6 files changed

+82
-132
lines changed

6 files changed

+82
-132
lines changed

book/src/merkletree.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,15 @@ For the current use cases, we don't need to prove that the key exists but the va
144144
## Interface
145145

146146
```rust
147-
trait MerkleTreeTrait {
147+
impl MerkleTree {
148148
/// returns the root of the tree
149149
fn root(&self) -> Hash;
150150

151151
/// returns the value at the given key
152152
fn get(&self, key: &Value) -> Result<Value>;
153+
154+
/// returns a boolean indicating whether the key exists in the tree
155+
fn contains(&self, key: &Value) -> bool;
153156

154157
/// returns a proof of existence, which proves that the given key exists in
155158
/// the tree. It returns the `MerkleProof`.

src/backends/mock_signed.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use crate::middleware::{
2-
containers::{Container, Dictionary},
3-
hash_str, Hash, Params, PodId, PodSigner, PodType, SignedPod, Value, KEY_SIGNER, KEY_TYPE,
2+
containers::Dictionary, hash_str, Hash, Params, PodId, PodSigner, PodType, SignedPod, Value,
3+
KEY_SIGNER, KEY_TYPE,
44
};
5-
use crate::primitives::merkletree::{MerkleTree, MerkleTreeTrait};
5+
use crate::primitives::merkletree::MerkleTree;
66
use anyhow::Result;
77
use std::any::Any;
88
use std::collections::HashMap;
@@ -19,7 +19,7 @@ impl PodSigner for MockSigner {
1919
kvs.insert(hash_str(&KEY_TYPE), Value::from(PodType::MockSigned));
2020

2121
let dict = Dictionary::new(&kvs);
22-
let id = PodId(dict.root());
22+
let id = PodId(dict.commitment());
2323
let signature = format!("{}_signed_by_{}", id, pk_hash);
2424
Ok(Box::new(MockSignedPod {
2525
dict,
@@ -48,7 +48,7 @@ impl SignedPod for MockSignedPod {
4848
}
4949

5050
// Verify id
51-
let mt = MerkleTree::build(
51+
let mt = MerkleTree::new(
5252
&self
5353
.dict
5454
.iter()
@@ -127,7 +127,7 @@ pub mod tests {
127127
.into_iter()
128128
.map(|(k, v)| (Value(k.0), v))
129129
.collect::<HashMap<Value, Value>>();
130-
let bad_mt = MerkleTree::build(&bad_kvs_mt);
130+
let bad_mt = MerkleTree::new(&bad_kvs_mt);
131131
bad_pod.dict.mt = bad_mt;
132132
assert_eq!(bad_pod.verify(), false);
133133

@@ -138,7 +138,7 @@ pub mod tests {
138138
.into_iter()
139139
.map(|(k, v)| (Value(k.0), v))
140140
.collect::<HashMap<Value, Value>>();
141-
let bad_mt = MerkleTree::build(&bad_kvs_mt);
141+
let bad_mt = MerkleTree::new(&bad_kvs_mt);
142142
bad_pod.dict.mt = bad_mt;
143143
assert_eq!(bad_pod.verify(), false);
144144
}

src/examples.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
use std::collections::HashMap;
22

33
use crate::frontend::{MainPodBuilder, SignedPod, SignedPodBuilder, Value};
4-
use crate::middleware::{
5-
containers::{Container, Dictionary},
6-
Params, PodType, KEY_SIGNER, KEY_TYPE,
7-
};
4+
use crate::middleware::{containers::Dictionary, Params, PodType, KEY_SIGNER, KEY_TYPE};
85
use crate::op;
96

107
// ZuKYC

src/frontend.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use crate::middleware::{
1313
hash_str, Hash, MainPodInputs, NativeOperation, NativeStatement, Params, PodId, PodProver,
1414
PodSigner, SELF,
1515
};
16-
use crate::primitives::merkletree::MerkleTreeTrait;
1716

1817
/// This type is just for presentation purposes.
1918
#[derive(Clone, Debug, Default, Hash, PartialEq, Eq)]
@@ -53,9 +52,9 @@ impl From<&Value> for middleware::Value {
5352
match v {
5453
Value::String(s) => middleware::Value(hash_str(s).0),
5554
Value::Int(v) => middleware::Value::from(*v),
56-
Value::Dictionary(d) => middleware::Value(d.root().0),
57-
Value::Set(s) => middleware::Value(s.root().0),
58-
Value::Array(a) => middleware::Value(a.root().0),
55+
Value::Dictionary(d) => middleware::Value(d.commitment().0),
56+
Value::Set(s) => middleware::Value(s.commitment().0),
57+
Value::Array(a) => middleware::Value(a.commitment().0),
5958
}
6059
}
6160
}
@@ -65,9 +64,9 @@ impl fmt::Display for Value {
6564
match self {
6665
Value::String(s) => write!(f, "\"{}\"", s),
6766
Value::Int(v) => write!(f, "{}", v),
68-
Value::Dictionary(d) => write!(f, "dict:{}", d.root()),
69-
Value::Set(s) => write!(f, "set:{}", s.root()),
70-
Value::Array(a) => write!(f, "arr:{}", a.root()),
67+
Value::Dictionary(d) => write!(f, "dict:{}", d.commitment()),
68+
Value::Set(s) => write!(f, "set:{}", s.commitment()),
69+
Value::Array(a) => write!(f, "arr:{}", a.commitment()),
7170
}
7271
}
7372
}

src/middleware/containers.rs

Lines changed: 36 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,7 @@ use plonky2::plonk::config::Hasher;
66
use std::collections::HashMap;
77

88
use super::{Hash, Value, EMPTY};
9-
use crate::primitives::merkletree::{MerkleProof, MerkleTree, MerkleTreeTrait};
10-
11-
/// Container is a wrapper of a MerkleTree, used to achieve Dictionary, Set, Array frontend types.
12-
/// It offers all the methods of the trait `MerkleTreeTrait`, with an additional constructor `new`
13-
/// that allows each specific type (ie. Dictionary, Set, Array) to define how each type is
14-
/// constructed (for example a Dictionary is built from HashMap<Hash,Value>, whereas a set is built
15-
/// from Vec<Value>).
16-
pub trait Container: MerkleTreeTrait {
17-
type Raw: Clone;
18-
19-
fn new(raw: &Self::Raw) -> Self;
20-
}
9+
use crate::primitives::merkletree::{MerkleProof, MerkleTree};
2110

2211
/// Dictionary: the user original keys and values are hashed to be used in the leaf.
2312
/// leaf.key=hash(original_key)
@@ -28,37 +17,32 @@ pub struct Dictionary {
2817
pub(crate) mt: MerkleTree,
2918
}
3019

31-
impl Container for Dictionary {
32-
type Raw = HashMap<Hash, Value>;
33-
34-
fn new(raw: &Self::Raw) -> Self {
35-
let kvs: HashMap<Value, Value> = raw.into_iter().map(|(&k, &v)| (Value(k.0), v)).collect();
20+
impl Dictionary {
21+
pub fn new(kvs: &HashMap<Hash, Value>) -> Self {
22+
let kvs: HashMap<Value, Value> = kvs.into_iter().map(|(&k, &v)| (Value(k.0), v)).collect();
3623
Self {
37-
mt: MerkleTree::build(&kvs),
24+
mt: MerkleTree::new(&kvs),
3825
}
3926
}
40-
}
41-
42-
impl MerkleTreeTrait for Dictionary {
43-
fn root(&self) -> Hash {
27+
pub fn commitment(&self) -> Hash {
4428
self.mt.root()
4529
}
46-
fn get(&self, key: &Value) -> Result<Value> {
30+
pub fn get(&self, key: &Value) -> Result<Value> {
4731
self.mt.get(key)
4832
}
49-
fn prove(&self, key: &Value) -> Result<MerkleProof> {
33+
pub fn prove(&self, key: &Value) -> Result<MerkleProof> {
5034
self.mt.prove(key)
5135
}
52-
fn prove_nonexistence(&self, key: &Value) -> Result<MerkleProof> {
36+
pub fn prove_nonexistence(&self, key: &Value) -> Result<MerkleProof> {
5337
self.mt.prove_nonexistence(key)
5438
}
55-
fn verify(root: Hash, proof: &MerkleProof, key: &Value, value: &Value) -> Result<()> {
39+
pub fn verify(root: Hash, proof: &MerkleProof, key: &Value, value: &Value) -> Result<()> {
5640
MerkleTree::verify(root, proof, key, value)
5741
}
58-
fn verify_nonexistence(root: Hash, proof: &MerkleProof, key: &Value) -> Result<()> {
42+
pub fn verify_nonexistence(root: Hash, proof: &MerkleProof, key: &Value) -> Result<()> {
5943
MerkleTree::verify_nonexistence(root, proof, key)
6044
}
61-
fn iter(&self) -> std::collections::hash_map::Iter<Value, Value> {
45+
pub fn iter(&self) -> std::collections::hash_map::Iter<Value, Value> {
6246
self.mt.iter()
6347
}
6448
}
@@ -86,43 +70,38 @@ pub struct Set {
8670
mt: MerkleTree,
8771
}
8872

89-
impl Container for Set {
90-
type Raw = Vec<Value>;
91-
92-
fn new(raw: &Self::Raw) -> Self {
93-
let kvs: HashMap<Value, Value> = raw
73+
impl Set {
74+
pub fn new(set: &Vec<Value>) -> Self {
75+
let kvs: HashMap<Value, Value> = set
9476
.into_iter()
9577
.map(|e| {
9678
let h = PoseidonHash::hash_no_pad(&e.0).elements;
9779
(Value(h), EMPTY)
9880
})
9981
.collect();
10082
Self {
101-
mt: MerkleTree::build(&kvs),
83+
mt: MerkleTree::new(&kvs),
10284
}
10385
}
104-
}
105-
106-
impl MerkleTreeTrait for Set {
107-
fn root(&self) -> Hash {
86+
pub fn commitment(&self) -> Hash {
10887
self.mt.root()
10988
}
110-
fn get(&self, key: &Value) -> Result<Value> {
111-
self.mt.get(key)
89+
pub fn contains(&self, key: &Value) -> bool {
90+
self.mt.contains(key)
11291
}
113-
fn prove(&self, key: &Value) -> Result<MerkleProof> {
92+
pub fn prove(&self, key: &Value) -> Result<MerkleProof> {
11493
self.mt.prove(key)
11594
}
116-
fn prove_nonexistence(&self, key: &Value) -> Result<MerkleProof> {
95+
pub fn prove_nonexistence(&self, key: &Value) -> Result<MerkleProof> {
11796
self.mt.prove_nonexistence(key)
11897
}
119-
fn verify(root: Hash, proof: &MerkleProof, key: &Value, value: &Value) -> Result<()> {
98+
pub fn verify(root: Hash, proof: &MerkleProof, key: &Value, value: &Value) -> Result<()> {
12099
MerkleTree::verify(root, proof, key, value)
121100
}
122-
fn verify_nonexistence(root: Hash, proof: &MerkleProof, key: &Value) -> Result<()> {
101+
pub fn verify_nonexistence(root: Hash, proof: &MerkleProof, key: &Value) -> Result<()> {
123102
MerkleTree::verify_nonexistence(root, proof, key)
124103
}
125-
fn iter(&self) -> std::collections::hash_map::Iter<Value, Value> {
104+
pub fn iter(&self) -> std::collections::hash_map::Iter<Value, Value> {
126105
self.mt.iter()
127106
}
128107
}
@@ -143,42 +122,31 @@ pub struct Array {
143122
mt: MerkleTree,
144123
}
145124

146-
impl Container for Array {
147-
type Raw = Vec<Value>;
148-
149-
fn new(raw: &Self::Raw) -> Self {
150-
let kvs: HashMap<Value, Value> = raw
125+
impl Array {
126+
pub fn new(array: &Vec<Value>) -> Self {
127+
let kvs: HashMap<Value, Value> = array
151128
.into_iter()
152129
.enumerate()
153130
.map(|(i, &e)| (Value::from(i as i64), e))
154131
.collect();
155132

156133
Self {
157-
mt: MerkleTree::build(&kvs),
134+
mt: MerkleTree::new(&kvs),
158135
}
159136
}
160-
}
161-
162-
impl MerkleTreeTrait for Array {
163-
fn root(&self) -> Hash {
137+
pub fn commitment(&self) -> Hash {
164138
self.mt.root()
165139
}
166-
fn get(&self, key: &Value) -> Result<Value> {
167-
self.mt.get(key)
168-
}
169-
fn prove(&self, key: &Value) -> Result<MerkleProof> {
170-
self.mt.prove(key)
140+
pub fn get(&self, i: usize) -> Result<Value> {
141+
self.mt.get(&Value::from(i as i64))
171142
}
172-
fn prove_nonexistence(&self, key: &Value) -> Result<MerkleProof> {
173-
self.mt.prove_nonexistence(key)
143+
pub fn prove(&self, i: usize) -> Result<MerkleProof> {
144+
self.mt.prove(&Value::from(i as i64))
174145
}
175-
fn verify(root: Hash, proof: &MerkleProof, key: &Value, value: &Value) -> Result<()> {
176-
MerkleTree::verify(root, proof, key, value)
177-
}
178-
fn verify_nonexistence(root: Hash, proof: &MerkleProof, key: &Value) -> Result<()> {
179-
MerkleTree::verify_nonexistence(root, proof, key)
146+
pub fn verify(root: Hash, proof: &MerkleProof, i: usize, value: &Value) -> Result<()> {
147+
MerkleTree::verify(root, proof, &Value::from(i as i64), value)
180148
}
181-
fn iter(&self) -> std::collections::hash_map::Iter<Value, Value> {
149+
pub fn iter(&self) -> std::collections::hash_map::Iter<Value, Value> {
182150
self.mt.iter()
183151
}
184152
}

0 commit comments

Comments
 (0)