@@ -2,7 +2,8 @@ mod constants;
22
33use 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
89struct 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