-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgetMerkleRoot.circom
32 lines (25 loc) · 1.03 KB
/
getMerkleRoot.circom
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
pragma circom 2.0.0;
include "./circomlib/circuits/mimc.circom";
// Credits: RollupNC tutorial
template GetMerkleRoot(k){
// k is depth of tree
signal input leaf;
signal input paths2_root[k];
signal input paths2_root_pos[k];
signal output out;
// hash of first two entries in tx Merkle proof
component merkle_root[k];
merkle_root[0] = MultiMiMC7(2,91);
merkle_root[0].in[0] <== paths2_root[0] - paths2_root_pos[0]* (paths2_root[0] - leaf);
merkle_root[0].in[1] <== leaf - paths2_root_pos[0]* (leaf - paths2_root[0]);
merkle_root[0].k <== 0;
// hash of all other entries in tx Merkle proof
for (var v = 1; v < k; v++){
merkle_root[v] = MultiMiMC7(2,91);
merkle_root[v].in[0] <== paths2_root[v] - paths2_root_pos[v]* (paths2_root[v] - merkle_root[v-1].out);
merkle_root[v].in[1] <== merkle_root[v-1].out - paths2_root_pos[v]* (merkle_root[v-1].out - paths2_root[v]);
merkle_root[v].k <== 0;
}
// output computed Merkle root
out <== merkle_root[k-1].out;
}