Skip to content

Commit 3521c96

Browse files
authored
Fix/update binary merkle root circuit version (#1000)
* fix(circuits)!: update binary merkle root circuit version re #999 * chore: update snarkjs version from 0.7.4 to 0.7.5
1 parent feb8c9c commit 3521c96

File tree

7 files changed

+66
-78
lines changed

7 files changed

+66
-78
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
"prettier": "^3.2.5",
8181
"rimraf": "^5.0.5",
8282
"semver": "^7.6.2",
83-
"snarkjs": "0.7.4",
83+
"snarkjs": "0.7.5",
8484
"ts-jest": "^29.1.2",
8585
"ts-node": "^10.9.2",
8686
"tslib": "^2.6.2",

packages/circuits/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@
2424
"access": "public"
2525
},
2626
"dependencies": {
27-
"@zk-kit/binary-merkle-root.circom": "1.0.0",
27+
"@zk-kit/binary-merkle-root.circom": "2.0.0",
2828
"circomlib": "2.0.5"
2929
},
3030
"devDependencies": {
3131
"@semaphore-protocol/core": "workspace:^",
3232
"@types/mocha": "^10.0.6",
3333
"@zk-kit/baby-jubjub": "1.0.3",
34-
"circomkit": "0.0.19",
34+
"circomkit": "0.3.3",
3535
"mocha": "^10.2.0",
3636
"poseidon-lite": "^0.3.0"
3737
}

packages/circuits/src/semaphore.circom

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ template Semaphore(MAX_DEPTH) {
2727
// See the Semaphore identity package to know more about how the identity is generated:
2828
// https://github.com/semaphore-protocol/semaphore/tree/main/packages/identity.
2929
signal input secret;
30-
signal input merkleProofLength, merkleProofIndices[MAX_DEPTH], merkleProofSiblings[MAX_DEPTH];
30+
signal input merkleProofLength, merkleProofIndex, merkleProofSiblings[MAX_DEPTH];
3131
signal input message;
3232
signal input scope;
3333

@@ -58,7 +58,7 @@ template Semaphore(MAX_DEPTH) {
5858
// the circuit through the inputs of the Merkle proof.
5959
// See https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/main/packages/binary-merkle-root/src/binary-merkle-root.circom
6060
// to know more about how the 'BinaryMerkleRoot' template works.
61-
merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndices, merkleProofSiblings);
61+
merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndex, merkleProofSiblings);
6262

6363
// Nullifier generation.
6464
// The nullifier is a value that essentially identifies the proof generated in a specific scope

packages/circuits/tests/common.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,18 @@ export const circomkit = new Circomkit({
1212
})
1313

1414
export function generateMerkleProof(group: Group, _index: number, maxDepth: number) {
15-
const { siblings: merkleProofSiblings, index } = group.generateMerkleProof(_index)
15+
const { siblings: merkleProofSiblings, index: merkleProofIndex } = group.generateMerkleProof(_index)
1616

17-
// The index must be converted to a list of indices, 1 for each tree level.
18-
// The circuit tree depth is 20, so the number of siblings must be 20, even if
19-
// the tree depth is actually 3. The missing siblings can be set to 0, as they
20-
// won't be used to calculate the root in the circuit.
21-
const merkleProofIndices: number[] = []
17+
// For example, if the circuit expects a Merkle tree of depth 20,
18+
// the input must always include 20 sibling nodes, even if the actual
19+
// tree depth is smaller (e.g., 3). The unused sibling positions can be
20+
// filled with 0, as they won't affect the root calculation in the circuit.
2221

2322
for (let i = 0; i < maxDepth; i += 1) {
24-
merkleProofIndices.push((index >> i) & 1)
25-
2623
if (merkleProofSiblings[i] === undefined) {
2724
merkleProofSiblings[i] = BigInt(0)
2825
}
2926
}
3027

31-
return { merkleProofSiblings, merkleProofIndices }
28+
return { merkleProofSiblings, merkleProofIndex }
3229
}

packages/circuits/tests/semaphore.test.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const r = 2188824287183927522224640574525727508854836440041603434369820418657580
1212

1313
describe("semaphore", () => {
1414
let circuit: WitnessTester<
15-
["secret", "merkleProofLength", "merkleProofIndices", "merkleProofSiblings", "scope", "message"],
15+
["secret", "merkleProofLength", "merkleProofIndex", "merkleProofSiblings", "scope", "message"],
1616
["nullifier", "merkleRoot"]
1717
>
1818

@@ -36,12 +36,12 @@ describe("semaphore", () => {
3636

3737
const group = new Group([commitment, 2n, 3n])
3838

39-
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
39+
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
4040

4141
const INPUT = {
4242
secret,
4343
merkleProofLength: group.depth,
44-
merkleProofIndices,
44+
merkleProofIndex,
4545
merkleProofSiblings,
4646
scope,
4747
message
@@ -61,12 +61,12 @@ describe("semaphore", () => {
6161
const commitment = poseidon2(mulPointEscalar(Base8, secret))
6262
const group = new Group([commitment, 2n, 3n])
6363

64-
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
64+
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
6565

6666
const INPUT = {
6767
secret,
6868
merkleProofLength: group.depth,
69-
merkleProofIndices,
69+
merkleProofIndex,
7070
merkleProofSiblings,
7171
scope,
7272
message
@@ -81,12 +81,12 @@ describe("semaphore", () => {
8181
const commitment = poseidon2(mulPointEscalar(Base8, secret))
8282
const group = new Group([commitment, 2n, 3n])
8383

84-
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
84+
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
8585

8686
const INPUT = {
8787
secret,
8888
merkleProofLength: group.depth,
89-
merkleProofIndices,
89+
merkleProofIndex,
9090
merkleProofSiblings,
9191
scope,
9292
message
@@ -100,12 +100,12 @@ describe("semaphore", () => {
100100

101101
const group = new Group([commitment, 2n, 3n])
102102

103-
const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH)
103+
const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH)
104104

105105
const INPUT = {
106106
secret,
107107
merkleProofLength: group.depth,
108-
merkleProofIndices,
108+
merkleProofIndex,
109109
merkleProofSiblings,
110110
scope,
111111
message

packages/proof/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,6 @@
5555
"@zk-kit/artifacts": "1.8.0",
5656
"@zk-kit/utils": "1.3.0",
5757
"ethers": "6.13.4",
58-
"snarkjs": "0.7.4"
58+
"snarkjs": "0.7.5"
5959
}
6060
}

yarn.lock

Lines changed: 45 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -7524,8 +7524,8 @@ __metadata:
75247524
"@semaphore-protocol/core": "workspace:^"
75257525
"@types/mocha": "npm:^10.0.6"
75267526
"@zk-kit/baby-jubjub": "npm:1.0.3"
7527-
"@zk-kit/binary-merkle-root.circom": "npm:1.0.0"
7528-
circomkit: "npm:0.0.19"
7527+
"@zk-kit/binary-merkle-root.circom": "npm:2.0.0"
7528+
circomkit: "npm:0.3.3"
75297529
circomlib: "npm:2.0.5"
75307530
mocha: "npm:^10.2.0"
75317531
poseidon-lite: "npm:^0.3.0"
@@ -7732,7 +7732,7 @@ __metadata:
77327732
rimraf: "npm:^5.0.5"
77337733
rollup: "npm:^4.12.0"
77347734
rollup-plugin-cleanup: "npm:^3.2.1"
7735-
snarkjs: "npm:0.7.4"
7735+
snarkjs: "npm:0.7.5"
77367736
peerDependencies:
77377737
"@semaphore-protocol/group": 4.11.1
77387738
"@semaphore-protocol/identity": 4.11.1
@@ -9767,12 +9767,12 @@ __metadata:
97679767
languageName: node
97689768
linkType: hard
97699769

9770-
"@zk-kit/binary-merkle-root.circom@npm:1.0.0":
9771-
version: 1.0.0
9772-
resolution: "@zk-kit/binary-merkle-root.circom@npm:1.0.0"
9770+
"@zk-kit/binary-merkle-root.circom@npm:2.0.0":
9771+
version: 2.0.0
9772+
resolution: "@zk-kit/binary-merkle-root.circom@npm:2.0.0"
97739773
dependencies:
97749774
circomlib: "npm:^2.0.5"
9775-
checksum: 10/3b3ab45b1bdb404b47ad1aef193b96490ad795fb31c2c3532f4b28198d305dd1ad409ba243feb4fa363ef83c5dfdd372728c5be6e3a02c633d6a2e0eb4458e39
9775+
checksum: 10/e26eaf1553263475c91220124985ea82f8f57c64dd611188427d6bedaaaed14b05f44760af8bf89cd2cbbdca5b54f06108cdd9a335a6e26617887a9e2e42be43
97769776
languageName: node
97779777
linkType: hard
97789778

@@ -11615,21 +11615,6 @@ __metadata:
1161511615
languageName: node
1161611616
linkType: hard
1161711617

11618-
"chai@npm:^4.3.7":
11619-
version: 4.5.0
11620-
resolution: "chai@npm:4.5.0"
11621-
dependencies:
11622-
assertion-error: "npm:^1.1.0"
11623-
check-error: "npm:^1.0.3"
11624-
deep-eql: "npm:^4.1.3"
11625-
get-func-name: "npm:^2.0.2"
11626-
loupe: "npm:^2.3.6"
11627-
pathval: "npm:^1.1.1"
11628-
type-detect: "npm:^4.1.0"
11629-
checksum: 10/cde341aee15b0a51559c7cfc20788dcfb4d586a498cfb93b937bb568fd45c777b73b1461274be6092b6bf868adb4e3a63f3fec13c89f7d8fb194f84c6fa42d5f
11630-
languageName: node
11631-
linkType: hard
11632-
1163311618
"chalk@npm:5.3.0, chalk@npm:^5.0.0, chalk@npm:^5.0.1, chalk@npm:^5.2.0, chalk@npm:^5.3.0":
1163411619
version: 5.3.0
1163511620
resolution: "chalk@npm:5.3.0"
@@ -11945,14 +11930,14 @@ __metadata:
1194511930
languageName: node
1194611931
linkType: hard
1194711932

11948-
"circom_runtime@npm:0.1.25":
11949-
version: 0.1.25
11950-
resolution: "circom_runtime@npm:0.1.25"
11933+
"circom_runtime@npm:0.1.28":
11934+
version: 0.1.28
11935+
resolution: "circom_runtime@npm:0.1.28"
1195111936
dependencies:
11952-
ffjavascript: "npm:0.3.0"
11937+
ffjavascript: "npm:0.3.1"
1195311938
bin:
1195411939
calcwit: calcwit.js
11955-
checksum: 10/aebb1398df621524a84b4c067661943d8d42894856f4947f61f4768954f1143c9fbba76c3a7e9d805175b94e1ac997accbe46fbf67d08ff618062dfcec2737b1
11940+
checksum: 10/c2ee10286c4e43c875ae3ba677f0f8df58016ab56ae8073fd82f382af6aa601b942036ef6f785f8614667a6323047ccac62c3e11bf41dbe56588e035233971ca
1195611941
languageName: node
1195711942
linkType: hard
1195811943

@@ -11972,17 +11957,19 @@ __metadata:
1197211957
languageName: node
1197311958
linkType: hard
1197411959

11975-
"circomkit@npm:0.0.19":
11976-
version: 0.0.19
11977-
resolution: "circomkit@npm:0.0.19"
11960+
"circomkit@npm:0.3.3":
11961+
version: 0.3.3
11962+
resolution: "circomkit@npm:0.3.3"
1197811963
dependencies:
11979-
chai: "npm:^4.3.7"
1198011964
circom_tester: "npm:^0.0.19"
11981-
loglevel: "npm:^1.8.1"
11982-
snarkjs: "npm:^0.7.0"
11965+
commander: "npm:^12.1.0"
11966+
loglevel: "npm:^1.9.2"
11967+
peerDependencies:
11968+
"@types/snarkjs": ^0.7.x
11969+
snarkjs: ^0.7.x
1198311970
bin:
11984-
circomkit: dist/bin/index.js
11985-
checksum: 10/eaed7b3494d1269c4fa347e9eeef2efb8e119870e14a06b1adeca5b0d58c60d05730f23d9b5aa4bc917ee482ebb13334098b0a8d5a1ada27b3b0f18b42b2f5dc
11971+
circomkit: dist/cli.js
11972+
checksum: 10/c9509c7b64da8d05677ccd409185d0572a09117c9a43e28b0ca0d12a80847fa84db5b7e72af2d68f531b8e38446b3ade5cd16ed63af3590e5a2e759d19aae02b
1198611973
languageName: node
1198711974
linkType: hard
1198811975

@@ -12377,7 +12364,7 @@ __metadata:
1237712364
languageName: node
1237812365
linkType: hard
1237912366

12380-
"commander@npm:^12.0.0":
12367+
"commander@npm:^12.0.0, commander@npm:^12.1.0":
1238112368
version: 12.1.0
1238212369
resolution: "commander@npm:12.1.0"
1238312370
checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93
@@ -15541,6 +15528,17 @@ __metadata:
1554115528
languageName: node
1554215529
linkType: hard
1554315530

15531+
"ffjavascript@npm:0.3.1":
15532+
version: 0.3.1
15533+
resolution: "ffjavascript@npm:0.3.1"
15534+
dependencies:
15535+
wasmbuilder: "npm:0.0.16"
15536+
wasmcurves: "npm:0.2.2"
15537+
web-worker: "npm:1.2.0"
15538+
checksum: 10/6b1a82a872cc80638b5e42c167817a88599940938eec80107dc45fb07ff0407cefc6d019c533e2b544e6ebce2fb1a94709cf39228b5fe9de80b750a9cc23ac8b
15539+
languageName: node
15540+
linkType: hard
15541+
1554415542
"ffjavascript@npm:^0.2.48, ffjavascript@npm:^0.2.56":
1554515543
version: 0.2.63
1554615544
resolution: "ffjavascript@npm:0.2.63"
@@ -20001,10 +19999,10 @@ __metadata:
2000119999
languageName: node
2000220000
linkType: hard
2000320001

20004-
"loglevel@npm:^1.8.1":
20005-
version: 1.9.1
20006-
resolution: "loglevel@npm:1.9.1"
20007-
checksum: 10/863cbbcddf850a937482c604e2d11586574a5110b746bb49c7cc04739e01f6035f6db841d25377106dd330bca7142d74995f15a97c5f3ea0af86d9472d4a99f4
20002+
"loglevel@npm:^1.9.2":
20003+
version: 1.9.2
20004+
resolution: "loglevel@npm:1.9.2"
20005+
checksum: 10/6153d8db308323f7ee20130bc40309e7a976c30a10379d8666b596d9c6441965c3e074c8d7ee3347fe5cfc059c0375b6f3e8a10b93d5b813cc5547f5aa412a29
2000820006
languageName: node
2000920007
linkType: hard
2001020008

@@ -26230,7 +26228,7 @@ __metadata:
2623026228
prettier: "npm:^3.2.5"
2623126229
rimraf: "npm:^5.0.5"
2623226230
semver: "npm:^7.6.2"
26233-
snarkjs: "npm:0.7.4"
26231+
snarkjs: "npm:0.7.5"
2623426232
ts-jest: "npm:^29.1.2"
2623526233
ts-node: "npm:^10.9.2"
2623626234
tslib: "npm:^2.6.2"
@@ -26735,23 +26733,23 @@ __metadata:
2673526733
languageName: node
2673626734
linkType: hard
2673726735

26738-
"snarkjs@npm:0.7.4, snarkjs@npm:^0.7.0":
26739-
version: 0.7.4
26740-
resolution: "snarkjs@npm:0.7.4"
26736+
"snarkjs@npm:0.7.5":
26737+
version: 0.7.5
26738+
resolution: "snarkjs@npm:0.7.5"
2674126739
dependencies:
2674226740
"@iden3/binfileutils": "npm:0.0.12"
2674326741
bfj: "npm:^7.0.2"
2674426742
blake2b-wasm: "npm:^2.4.0"
26745-
circom_runtime: "npm:0.1.25"
26743+
circom_runtime: "npm:0.1.28"
2674626744
ejs: "npm:^3.1.6"
2674726745
fastfile: "npm:0.0.20"
26748-
ffjavascript: "npm:0.3.0"
26746+
ffjavascript: "npm:0.3.1"
2674926747
js-sha3: "npm:^0.8.0"
2675026748
logplease: "npm:^1.2.15"
2675126749
r1csfile: "npm:0.0.48"
2675226750
bin:
2675326751
snarkjs: build/cli.cjs
26754-
checksum: 10/aaebcf57e11a36dc1ea77742a5062d67fcaa24bad37bc6532d9aaefc71ad302c4a65bd05cabb6ac893f3329e09f193d9cbd2a20053f8d5074e3864d933323e05
26752+
checksum: 10/82f963e39ce77faa07a8d87390b38a9e709f5bd5db0f3893d97a4567870dc15dfad12a266963000d2bd4974732e666631e752492c1379eaf7796e27ea957e3db
2675526753
languageName: node
2675626754
linkType: hard
2675726755

@@ -28275,13 +28273,6 @@ __metadata:
2827528273
languageName: node
2827628274
linkType: hard
2827728275

28278-
"type-detect@npm:^4.1.0":
28279-
version: 4.1.0
28280-
resolution: "type-detect@npm:4.1.0"
28281-
checksum: 10/e363bf0352427a79301f26a7795a27718624c49c576965076624eb5495d87515030b207217845f7018093adcbe169b2d119bb9b7f1a31a92bfbb1ab9639ca8dd
28282-
languageName: node
28283-
linkType: hard
28284-
2828528276
"type-fest@npm:^0.16.0":
2828628277
version: 0.16.0
2828728278
resolution: "type-fest@npm:0.16.0"

0 commit comments

Comments
 (0)