Skip to content

Commit 1c5e211

Browse files
committed
.
1 parent 08e4508 commit 1c5e211

File tree

2 files changed

+68
-37
lines changed

2 files changed

+68
-37
lines changed
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
pub global CONST_STRING_LEN: u32 = 20;
22
pub global COINS_DATABASE_AMOUNT: u32 = 100;
3-
pub global MAX_USER_UTXOS_AMOUNT: u32 = 20;
3+
pub global MAX_USER_UTXOS_AMOUNT: u32 = 20;
4+
5+
pub global MAX_MERKLE_TREE_LEVELS: u32 = 6;

app/proof_of_reserve/src/main.nr

Lines changed: 65 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ mod constants;
22

33
use trees::merkle::{MerkleTree, MT_Creator, Modifier, MembershipProver};
44

5-
use constants::{CONST_STRING_LEN, COINS_DATABASE_AMOUNT, MAX_USER_UTXOS_AMOUNT};
5+
use constants::{CONST_STRING_LEN, COINS_DATABASE_AMOUNT, MAX_USER_UTXOS_AMOUNT, MAX_MERKLE_TREE_LEVELS};
6+
use std::cmp::max;
67

78
// p2pkh
89
struct COINS_DATABASE_ELEMENT {
@@ -21,50 +22,78 @@ fn main(
2122
// coins_database: [COINS_DATABASE_ELEMENT; COINS_DATABASE_AMOUNT],
2223
// own_utxo: [UTXO; MAX_USER_UTXOS_AMOUNT],
2324
) -> pub Field {
24-
//println(merkle_root([[0; 32], [1; 32], [2; 32]]));
25-
let mut mt = MerkleTree::new(hasher);
26-
let paths= [];
25+
println(merkle_root([[2; 32], [3; 32]]));
2726

28-
mt.add([0; 32], 0, paths);
29-
let mut paths = paths.concat([mt.root]);
30-
mt.add([1; 32], 1, paths);
31-
paths[0] = mt.root;
32-
mt.add([3; 32], 0, []);
33-
mt.add([4; 32], 1, paths);
34-
35-
36-
mt.membership([0; 32], 0, [[1; 32], [3; 32]]);
37-
println(mt.root);
3827
0
3928
}
4029

41-
fn hasher(leaves: [[u8; 32]; 2]) -> [u8; 32] {
42-
sha256::digest(leaves[0].as_slice().append(leaves[1]).as_array::<64>())
43-
}
30+
// fn hasher(leaves: [[u8; 32]; 2]) -> [u8; 32] {
31+
// sha256::digest(leaves[0].as_slice().append(leaves[1]).as_array::<64>())
32+
// }
4433

45-
fn merkle_root<let N: u32>(leafs: [[u8; 32]; N]) -> [u8; 32] {
46-
let mut mt = MerkleTree::new(hasher);
47-
let paths= [];
34+
// fn merkle_root<let N: u32>(leafs: [[u8; 32]; N]) -> [u8; 32] {
35+
// let mut mt = MerkleTree::new(hasher);
36+
// let paths= [];
4837

49-
let mut level_change = 0;
50-
let mut to_level = 2;
38+
// let mut level_change = 0;
39+
// let mut to_level = 2;
5140

52-
for i in 0..N {
53-
mt.add(leafs[i], i as Field, paths);
54-
let paths = paths.concat([mt.root]);
55-
}
41+
// for i in 0..N {
42+
// mt.add(leafs[i], i as Field, paths);
43+
// let paths = paths.concat([mt.root]);
44+
// }
45+
46+
// mt.root
47+
// }
5648

57-
mt.root
49+
fn hash(leaf1: [u8; 32], leaf2: [u8; 32]) -> [u8; 32] {
50+
sha256::digest(leaf1.as_slice().append(leaf2).as_array::<64>())
5851
}
5952

60-
// fn hash(leaf1: [u8; 32], leaf2: [u8; 32]) -> [u8; 32] {
61-
// sha256::digest(leaf1.as_slice().append(leaf2).as_array::<64>())
62-
// }
53+
fn merkle_root<let N: u32>(mut leafs: [[u8; 32]; N]) -> [u8; 32] {
54+
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
55+
assert((N as Field).lt(2.pow_32(MAX_MERKLE_TREE_LEVELS as Field)));
56+
let mut mtree = [[0; 32]; MAX_MERKLE_TREE_LEVELS];
57+
let mut last_level = 0;
6358

64-
// fn merkle_root<let N: u32>(mut leafs: [[u8; 32]; N]) -> [u8; 32] {
65-
// for i in 0..(N/2) {
66-
// leafs[i] = hash(leafs[2*i], leafs[2*i+1]);
67-
// }
59+
for i in 0..N {
60+
let mut leaf = leafs[i];
61+
for j in 0..MAX_MERKLE_TREE_LEVELS {
62+
if !leaf.all(|e| e == 0) {
63+
if mtree[j].all(|e| e == 0) {
64+
mtree[j] = leaf;
65+
leaf = [0; 32];
66+
}
67+
else {
68+
leaf = hash(leaf, mtree[j]);
69+
mtree[j] = [0; 32];
70+
}
71+
last_level = max(j, last_level);
72+
}
73+
}
74+
}
6875

69-
// leafs[0]
70-
// }
76+
let mut tmp_node = [0; 32];
77+
for i in 0..MAX_MERKLE_TREE_LEVELS {
78+
if ((i < last_level & tmp_node.all(|e| e == 0)) | (i <= last_level & !tmp_node.all(|e| e == 0))) {
79+
if !mtree[i].all(|e| e == 0) {
80+
let right = if tmp_node.all(|e| e == 0) {
81+
mtree[i]
82+
} else {
83+
tmp_node
84+
};
85+
86+
tmp_node = hash(mtree[i], right);
87+
mtree[i] = [0; 32];
88+
} else if !tmp_node.all(|e| e == 0) {
89+
tmp_node = hash(tmp_node, tmp_node);
90+
}
91+
}
92+
}
93+
94+
if tmp_node.all(|e| e == 0) {
95+
mtree[last_level]
96+
} else {
97+
tmp_node
98+
}
99+
}

0 commit comments

Comments
 (0)