diff --git a/package.json b/package.json index 825fd7941..9b77e4478 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "prettier": "^3.2.5", "rimraf": "^5.0.5", "semver": "^7.6.2", - "snarkjs": "0.7.4", + "snarkjs": "0.7.5", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", "tslib": "^2.6.2", diff --git a/packages/circuits/package.json b/packages/circuits/package.json index 9efb7f928..040ef6116 100644 --- a/packages/circuits/package.json +++ b/packages/circuits/package.json @@ -24,14 +24,14 @@ "access": "public" }, "dependencies": { - "@zk-kit/binary-merkle-root.circom": "1.0.0", + "@zk-kit/binary-merkle-root.circom": "2.0.0", "circomlib": "2.0.5" }, "devDependencies": { "@semaphore-protocol/core": "workspace:^", "@types/mocha": "^10.0.6", "@zk-kit/baby-jubjub": "1.0.3", - "circomkit": "0.0.19", + "circomkit": "0.3.3", "mocha": "^10.2.0", "poseidon-lite": "^0.3.0" } diff --git a/packages/circuits/src/semaphore.circom b/packages/circuits/src/semaphore.circom index cd576619c..4ee5c5a4b 100644 --- a/packages/circuits/src/semaphore.circom +++ b/packages/circuits/src/semaphore.circom @@ -27,7 +27,7 @@ template Semaphore(MAX_DEPTH) { // See the Semaphore identity package to know more about how the identity is generated: // https://github.com/semaphore-protocol/semaphore/tree/main/packages/identity. signal input secret; - signal input merkleProofLength, merkleProofIndices[MAX_DEPTH], merkleProofSiblings[MAX_DEPTH]; + signal input merkleProofLength, merkleProofIndex, merkleProofSiblings[MAX_DEPTH]; signal input message; signal input scope; @@ -58,7 +58,7 @@ template Semaphore(MAX_DEPTH) { // the circuit through the inputs of the Merkle proof. // See https://github.com/privacy-scaling-explorations/zk-kit.circom/blob/main/packages/binary-merkle-root/src/binary-merkle-root.circom // to know more about how the 'BinaryMerkleRoot' template works. - merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndices, merkleProofSiblings); + merkleRoot <== BinaryMerkleRoot(MAX_DEPTH)(identityCommitment, merkleProofLength, merkleProofIndex, merkleProofSiblings); // Nullifier generation. // The nullifier is a value that essentially identifies the proof generated in a specific scope diff --git a/packages/circuits/tests/common.ts b/packages/circuits/tests/common.ts index bb135ea96..f332c0a1e 100644 --- a/packages/circuits/tests/common.ts +++ b/packages/circuits/tests/common.ts @@ -12,21 +12,18 @@ export const circomkit = new Circomkit({ }) export function generateMerkleProof(group: Group, _index: number, maxDepth: number) { - const { siblings: merkleProofSiblings, index } = group.generateMerkleProof(_index) + const { siblings: merkleProofSiblings, index: merkleProofIndex } = group.generateMerkleProof(_index) - // The index must be converted to a list of indices, 1 for each tree level. - // The circuit tree depth is 20, so the number of siblings must be 20, even if - // the tree depth is actually 3. The missing siblings can be set to 0, as they - // won't be used to calculate the root in the circuit. - const merkleProofIndices: number[] = [] + // For example, if the circuit expects a Merkle tree of depth 20, + // the input must always include 20 sibling nodes, even if the actual + // tree depth is smaller (e.g., 3). The unused sibling positions can be + // filled with 0, as they won't affect the root calculation in the circuit. for (let i = 0; i < maxDepth; i += 1) { - merkleProofIndices.push((index >> i) & 1) - if (merkleProofSiblings[i] === undefined) { merkleProofSiblings[i] = BigInt(0) } } - return { merkleProofSiblings, merkleProofIndices } + return { merkleProofSiblings, merkleProofIndex } } diff --git a/packages/circuits/tests/semaphore.test.ts b/packages/circuits/tests/semaphore.test.ts index 8e4487a04..e7838336f 100644 --- a/packages/circuits/tests/semaphore.test.ts +++ b/packages/circuits/tests/semaphore.test.ts @@ -12,7 +12,7 @@ const r = 2188824287183927522224640574525727508854836440041603434369820418657580 describe("semaphore", () => { let circuit: WitnessTester< - ["secret", "merkleProofLength", "merkleProofIndices", "merkleProofSiblings", "scope", "message"], + ["secret", "merkleProofLength", "merkleProofIndex", "merkleProofSiblings", "scope", "message"], ["nullifier", "merkleRoot"] > @@ -36,12 +36,12 @@ describe("semaphore", () => { const group = new Group([commitment, 2n, 3n]) - const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH) + const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH) const INPUT = { secret, merkleProofLength: group.depth, - merkleProofIndices, + merkleProofIndex, merkleProofSiblings, scope, message @@ -61,12 +61,12 @@ describe("semaphore", () => { const commitment = poseidon2(mulPointEscalar(Base8, secret)) const group = new Group([commitment, 2n, 3n]) - const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH) + const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH) const INPUT = { secret, merkleProofLength: group.depth, - merkleProofIndices, + merkleProofIndex, merkleProofSiblings, scope, message @@ -81,12 +81,12 @@ describe("semaphore", () => { const commitment = poseidon2(mulPointEscalar(Base8, secret)) const group = new Group([commitment, 2n, 3n]) - const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH) + const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH) const INPUT = { secret, merkleProofLength: group.depth, - merkleProofIndices, + merkleProofIndex, merkleProofSiblings, scope, message @@ -100,12 +100,12 @@ describe("semaphore", () => { const group = new Group([commitment, 2n, 3n]) - const { merkleProofSiblings, merkleProofIndices } = generateMerkleProof(group, 0, MAX_DEPTH) + const { merkleProofSiblings, merkleProofIndex } = generateMerkleProof(group, 0, MAX_DEPTH) const INPUT = { secret, merkleProofLength: group.depth, - merkleProofIndices, + merkleProofIndex, merkleProofSiblings, scope, message diff --git a/packages/proof/package.json b/packages/proof/package.json index 93557cc71..5a34c84a0 100644 --- a/packages/proof/package.json +++ b/packages/proof/package.json @@ -55,6 +55,6 @@ "@zk-kit/artifacts": "1.8.0", "@zk-kit/utils": "1.3.0", "ethers": "6.13.4", - "snarkjs": "0.7.4" + "snarkjs": "0.7.5" } } diff --git a/yarn.lock b/yarn.lock index 125cb939a..0151802a6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7524,8 +7524,8 @@ __metadata: "@semaphore-protocol/core": "workspace:^" "@types/mocha": "npm:^10.0.6" "@zk-kit/baby-jubjub": "npm:1.0.3" - "@zk-kit/binary-merkle-root.circom": "npm:1.0.0" - circomkit: "npm:0.0.19" + "@zk-kit/binary-merkle-root.circom": "npm:2.0.0" + circomkit: "npm:0.3.3" circomlib: "npm:2.0.5" mocha: "npm:^10.2.0" poseidon-lite: "npm:^0.3.0" @@ -7732,7 +7732,7 @@ __metadata: rimraf: "npm:^5.0.5" rollup: "npm:^4.12.0" rollup-plugin-cleanup: "npm:^3.2.1" - snarkjs: "npm:0.7.4" + snarkjs: "npm:0.7.5" peerDependencies: "@semaphore-protocol/group": 4.11.1 "@semaphore-protocol/identity": 4.11.1 @@ -9767,12 +9767,12 @@ __metadata: languageName: node linkType: hard -"@zk-kit/binary-merkle-root.circom@npm:1.0.0": - version: 1.0.0 - resolution: "@zk-kit/binary-merkle-root.circom@npm:1.0.0" +"@zk-kit/binary-merkle-root.circom@npm:2.0.0": + version: 2.0.0 + resolution: "@zk-kit/binary-merkle-root.circom@npm:2.0.0" dependencies: circomlib: "npm:^2.0.5" - checksum: 10/3b3ab45b1bdb404b47ad1aef193b96490ad795fb31c2c3532f4b28198d305dd1ad409ba243feb4fa363ef83c5dfdd372728c5be6e3a02c633d6a2e0eb4458e39 + checksum: 10/e26eaf1553263475c91220124985ea82f8f57c64dd611188427d6bedaaaed14b05f44760af8bf89cd2cbbdca5b54f06108cdd9a335a6e26617887a9e2e42be43 languageName: node linkType: hard @@ -11615,21 +11615,6 @@ __metadata: languageName: node linkType: hard -"chai@npm:^4.3.7": - version: 4.5.0 - resolution: "chai@npm:4.5.0" - dependencies: - assertion-error: "npm:^1.1.0" - check-error: "npm:^1.0.3" - deep-eql: "npm:^4.1.3" - get-func-name: "npm:^2.0.2" - loupe: "npm:^2.3.6" - pathval: "npm:^1.1.1" - type-detect: "npm:^4.1.0" - checksum: 10/cde341aee15b0a51559c7cfc20788dcfb4d586a498cfb93b937bb568fd45c777b73b1461274be6092b6bf868adb4e3a63f3fec13c89f7d8fb194f84c6fa42d5f - languageName: node - linkType: hard - "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": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -11945,14 +11930,14 @@ __metadata: languageName: node linkType: hard -"circom_runtime@npm:0.1.25": - version: 0.1.25 - resolution: "circom_runtime@npm:0.1.25" +"circom_runtime@npm:0.1.28": + version: 0.1.28 + resolution: "circom_runtime@npm:0.1.28" dependencies: - ffjavascript: "npm:0.3.0" + ffjavascript: "npm:0.3.1" bin: calcwit: calcwit.js - checksum: 10/aebb1398df621524a84b4c067661943d8d42894856f4947f61f4768954f1143c9fbba76c3a7e9d805175b94e1ac997accbe46fbf67d08ff618062dfcec2737b1 + checksum: 10/c2ee10286c4e43c875ae3ba677f0f8df58016ab56ae8073fd82f382af6aa601b942036ef6f785f8614667a6323047ccac62c3e11bf41dbe56588e035233971ca languageName: node linkType: hard @@ -11972,17 +11957,19 @@ __metadata: languageName: node linkType: hard -"circomkit@npm:0.0.19": - version: 0.0.19 - resolution: "circomkit@npm:0.0.19" +"circomkit@npm:0.3.3": + version: 0.3.3 + resolution: "circomkit@npm:0.3.3" dependencies: - chai: "npm:^4.3.7" circom_tester: "npm:^0.0.19" - loglevel: "npm:^1.8.1" - snarkjs: "npm:^0.7.0" + commander: "npm:^12.1.0" + loglevel: "npm:^1.9.2" + peerDependencies: + "@types/snarkjs": ^0.7.x + snarkjs: ^0.7.x bin: - circomkit: dist/bin/index.js - checksum: 10/eaed7b3494d1269c4fa347e9eeef2efb8e119870e14a06b1adeca5b0d58c60d05730f23d9b5aa4bc917ee482ebb13334098b0a8d5a1ada27b3b0f18b42b2f5dc + circomkit: dist/cli.js + checksum: 10/c9509c7b64da8d05677ccd409185d0572a09117c9a43e28b0ca0d12a80847fa84db5b7e72af2d68f531b8e38446b3ade5cd16ed63af3590e5a2e759d19aae02b languageName: node linkType: hard @@ -12377,7 +12364,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^12.0.0": +"commander@npm:^12.0.0, commander@npm:^12.1.0": version: 12.1.0 resolution: "commander@npm:12.1.0" checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 @@ -15541,6 +15528,17 @@ __metadata: languageName: node linkType: hard +"ffjavascript@npm:0.3.1": + version: 0.3.1 + resolution: "ffjavascript@npm:0.3.1" + dependencies: + wasmbuilder: "npm:0.0.16" + wasmcurves: "npm:0.2.2" + web-worker: "npm:1.2.0" + checksum: 10/6b1a82a872cc80638b5e42c167817a88599940938eec80107dc45fb07ff0407cefc6d019c533e2b544e6ebce2fb1a94709cf39228b5fe9de80b750a9cc23ac8b + languageName: node + linkType: hard + "ffjavascript@npm:^0.2.48, ffjavascript@npm:^0.2.56": version: 0.2.63 resolution: "ffjavascript@npm:0.2.63" @@ -20001,10 +19999,10 @@ __metadata: languageName: node linkType: hard -"loglevel@npm:^1.8.1": - version: 1.9.1 - resolution: "loglevel@npm:1.9.1" - checksum: 10/863cbbcddf850a937482c604e2d11586574a5110b746bb49c7cc04739e01f6035f6db841d25377106dd330bca7142d74995f15a97c5f3ea0af86d9472d4a99f4 +"loglevel@npm:^1.9.2": + version: 1.9.2 + resolution: "loglevel@npm:1.9.2" + checksum: 10/6153d8db308323f7ee20130bc40309e7a976c30a10379d8666b596d9c6441965c3e074c8d7ee3347fe5cfc059c0375b6f3e8a10b93d5b813cc5547f5aa412a29 languageName: node linkType: hard @@ -26230,7 +26228,7 @@ __metadata: prettier: "npm:^3.2.5" rimraf: "npm:^5.0.5" semver: "npm:^7.6.2" - snarkjs: "npm:0.7.4" + snarkjs: "npm:0.7.5" ts-jest: "npm:^29.1.2" ts-node: "npm:^10.9.2" tslib: "npm:^2.6.2" @@ -26735,23 +26733,23 @@ __metadata: languageName: node linkType: hard -"snarkjs@npm:0.7.4, snarkjs@npm:^0.7.0": - version: 0.7.4 - resolution: "snarkjs@npm:0.7.4" +"snarkjs@npm:0.7.5": + version: 0.7.5 + resolution: "snarkjs@npm:0.7.5" dependencies: "@iden3/binfileutils": "npm:0.0.12" bfj: "npm:^7.0.2" blake2b-wasm: "npm:^2.4.0" - circom_runtime: "npm:0.1.25" + circom_runtime: "npm:0.1.28" ejs: "npm:^3.1.6" fastfile: "npm:0.0.20" - ffjavascript: "npm:0.3.0" + ffjavascript: "npm:0.3.1" js-sha3: "npm:^0.8.0" logplease: "npm:^1.2.15" r1csfile: "npm:0.0.48" bin: snarkjs: build/cli.cjs - checksum: 10/aaebcf57e11a36dc1ea77742a5062d67fcaa24bad37bc6532d9aaefc71ad302c4a65bd05cabb6ac893f3329e09f193d9cbd2a20053f8d5074e3864d933323e05 + checksum: 10/82f963e39ce77faa07a8d87390b38a9e709f5bd5db0f3893d97a4567870dc15dfad12a266963000d2bd4974732e666631e752492c1379eaf7796e27ea957e3db languageName: node linkType: hard @@ -28275,13 +28273,6 @@ __metadata: languageName: node linkType: hard -"type-detect@npm:^4.1.0": - version: 4.1.0 - resolution: "type-detect@npm:4.1.0" - checksum: 10/e363bf0352427a79301f26a7795a27718624c49c576965076624eb5495d87515030b207217845f7018093adcbe169b2d119bb9b7f1a31a92bfbb1ab9639ca8dd - languageName: node - linkType: hard - "type-fest@npm:^0.16.0": version: 0.16.0 resolution: "type-fest@npm:0.16.0"