@semaphore-protocol/proof 0.2.1 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -31
- package/dist/index.mjs +20 -52
- package/dist/index.node.js +19 -53
- package/dist/types/generateProof.d.ts +2 -2
- package/dist/types/index.d.ts +1 -4
- package/package.json +4 -4
- package/src/generateProof.ts +11 -2
- package/src/index.test.ts +21 -34
- package/src/index.ts +1 -13
- package/dist/types/createMerkleProof.d.ts +0 -11
- package/dist/types/createMerkleTree.d.ts +0 -10
- package/src/createMerkleProof.ts +0 -32
- package/src/createMerkleTree.ts +0 -28
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<h1 align="center">
|
|
3
3
|
Semaphore proof
|
|
4
4
|
</h1>
|
|
5
|
-
<p align="center">A library
|
|
5
|
+
<p align="center">A library to generate and verify Semaphore proofs.</p>
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
@@ -58,44 +58,20 @@ yarn add @semaphore-protocol/proof
|
|
|
58
58
|
|
|
59
59
|
## 📜 Usage
|
|
60
60
|
|
|
61
|
-
\# **
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
import { createMerkleTree } from "@semaphore-protocol/proof"
|
|
65
|
-
|
|
66
|
-
const depth = 20
|
|
67
|
-
const zeroValue = BigInt(0)
|
|
68
|
-
const leaves = [BigInt(1), BigInt(2)]
|
|
69
|
-
|
|
70
|
-
const merkleTree = createMerkleTree(treeDepth, zeroValue, leaves)
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
\# **createMerkleProof**(depth: _number_, zeroValue: _BigNumberish_, leaves: _BigNumberish\[]_, leaf: _BigNumberish_): _MerkleProof_
|
|
74
|
-
|
|
75
|
-
```typescript
|
|
76
|
-
import { Identity } from "@semaphore-protocol/identity"
|
|
77
|
-
import { createMerkleProof } from "@semaphore-protocol/proof"
|
|
78
|
-
|
|
79
|
-
const depth = 20
|
|
80
|
-
const zeroValue = BigInt(0)
|
|
81
|
-
|
|
82
|
-
const identity = new Identity()
|
|
83
|
-
|
|
84
|
-
const leaf = identity.genIdentityCommitment()
|
|
85
|
-
const leaves = [BigInt(1), identityCommitment, BigInt(2)]
|
|
86
|
-
|
|
87
|
-
const merkleProof = createMerkleProof(treeDepth, zeroValue, leaves, leaf)
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
\# **generateProof**(identity: _Identity_, merkleProof: _MerkleProof_, externalNullifier: _BigNumberish_, signal: _string_, snarkArtifacts: _SnarkArtifacts_): Promise\<_SemaphoreFullProof_>
|
|
61
|
+
\# **generateProof**(identity: _Identity_, group: _Group_, externalNullifier: _BigNumberish_, signal: _string_, snarkArtifacts: _SnarkArtifacts_): Promise\<_SemaphoreFullProof_>
|
|
91
62
|
|
|
92
63
|
```typescript
|
|
93
64
|
import { Identity } from "@semaphore-protocol/identity"
|
|
65
|
+
import { Group } from "@semaphore-protocol/group"
|
|
94
66
|
import { generateProof } from "@semaphore-protocol/proof"
|
|
95
67
|
|
|
68
|
+
const identity = new Identity()
|
|
69
|
+
const group = new Group()
|
|
96
70
|
const externalNullifier = BigInt(1)
|
|
97
71
|
const signal = "Hello world"
|
|
98
72
|
|
|
73
|
+
group.addMembers([...identityCommitments, identity.generateCommitment()])
|
|
74
|
+
|
|
99
75
|
const fullProof = await generateProof(identity, merkleProof, externalNullifier, signal, {
|
|
100
76
|
zkeyFilePath: "./semaphore.zkey",
|
|
101
77
|
wasmFilePath: "./semaphore.wasm"
|
package/dist/index.mjs
CHANGED
|
@@ -1,55 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module @semaphore-protocol/proof
|
|
3
|
-
* @version 0.
|
|
4
|
-
* @file A library
|
|
3
|
+
* @version 0.3.1
|
|
4
|
+
* @file A library to generate and verify Semaphore proofs.
|
|
5
5
|
* @copyright Ethereum Foundation 2022
|
|
6
6
|
* @license MIT
|
|
7
7
|
* @see [Github]{@link https://github.com/semaphore-protocol/semaphore.js/tree/main/packages/proof}
|
|
8
8
|
*/
|
|
9
|
-
import { IncrementalMerkleTree } from '@zk-kit/incremental-merkle-tree';
|
|
10
9
|
import { poseidon } from 'circomlibjs';
|
|
11
10
|
import { groth16 } from 'snarkjs';
|
|
12
11
|
import { keccak256 } from '@ethersproject/solidity';
|
|
13
12
|
import { formatBytes32String } from '@ethersproject/strings';
|
|
14
13
|
|
|
15
|
-
/**
|
|
16
|
-
* Creates a Merkle tree.
|
|
17
|
-
* @param depth The depth of the tree.
|
|
18
|
-
* @param zeroValue The zero value of the tree.
|
|
19
|
-
* @param leaves The list of the leaves of the tree.
|
|
20
|
-
* @returns The Merkle tree.
|
|
21
|
-
*/
|
|
22
|
-
function createMerkleTree(depth, zeroValue, leaves) {
|
|
23
|
-
var tree = new IncrementalMerkleTree(poseidon, depth, zeroValue, 2);
|
|
24
|
-
for (var _i = 0, leaves_1 = leaves; _i < leaves_1.length; _i++) {
|
|
25
|
-
var leaf = leaves_1[_i];
|
|
26
|
-
if (leaf === zeroValue) {
|
|
27
|
-
throw new Error("Leaves cannot have zero values");
|
|
28
|
-
}
|
|
29
|
-
tree.insert(BigInt(leaf));
|
|
30
|
-
}
|
|
31
|
-
return tree;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Creates a Merkle proof.
|
|
36
|
-
* @param depth The depth of the tree.
|
|
37
|
-
* @param zeroValue The zero value of the tree.
|
|
38
|
-
* @param leaves The list of the leaves of the tree.
|
|
39
|
-
* @param leaf The leaf for which Merkle proof should be created.
|
|
40
|
-
* @returns The Merkle proof.
|
|
41
|
-
*/
|
|
42
|
-
function createMerkleProof(depth, zeroValue, leaves, leaf) {
|
|
43
|
-
var tree = createMerkleTree(depth, zeroValue, leaves);
|
|
44
|
-
var leafIndex = tree.leaves.indexOf(BigInt(leaf));
|
|
45
|
-
if (leafIndex === -1) {
|
|
46
|
-
throw new Error("The leaf does not exist");
|
|
47
|
-
}
|
|
48
|
-
var merkleProof = tree.createProof(leafIndex);
|
|
49
|
-
merkleProof.siblings = merkleProof.siblings.map(function (s) { return s[0]; });
|
|
50
|
-
return merkleProof;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
14
|
/**
|
|
54
15
|
* Generates a nullifier by hashing the external and the identity nullifiers.
|
|
55
16
|
* @param externalNullifier The external nullifier.
|
|
@@ -122,19 +83,26 @@ function genSignalHash(signal) {
|
|
|
122
83
|
return BigInt(keccak256(["bytes32"], [formatBytes32String(signal)])) >> BigInt(8);
|
|
123
84
|
}
|
|
124
85
|
|
|
125
|
-
function generateProof(identity,
|
|
86
|
+
function generateProof(identity, group, externalNullifier, signal, snarkArtifacts) {
|
|
126
87
|
return __awaiter(this, void 0, void 0, function () {
|
|
127
|
-
var _a, proof, publicSignals;
|
|
88
|
+
var commitment, index, merkleProof, _a, proof, publicSignals;
|
|
128
89
|
return __generator(this, function (_b) {
|
|
129
90
|
switch (_b.label) {
|
|
130
|
-
case 0:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
91
|
+
case 0:
|
|
92
|
+
commitment = identity.generateCommitment();
|
|
93
|
+
index = group.indexOf(commitment);
|
|
94
|
+
if (index === -1) {
|
|
95
|
+
throw new Error("The identity is not part of the group");
|
|
96
|
+
}
|
|
97
|
+
merkleProof = group.generateProofOfMembership(index);
|
|
98
|
+
return [4 /*yield*/, groth16.fullProve({
|
|
99
|
+
identityTrapdoor: identity.getTrapdoor(),
|
|
100
|
+
identityNullifier: identity.getNullifier(),
|
|
101
|
+
treePathIndices: merkleProof.pathIndices,
|
|
102
|
+
treeSiblings: merkleProof.siblings,
|
|
103
|
+
externalNullifier: externalNullifier,
|
|
104
|
+
signalHash: genSignalHash(signal)
|
|
105
|
+
}, snarkArtifacts.wasmFilePath, snarkArtifacts.zkeyFilePath)];
|
|
138
106
|
case 1:
|
|
139
107
|
_a = _b.sent(), proof = _a.proof, publicSignals = _a.publicSignals;
|
|
140
108
|
return [2 /*return*/, {
|
|
@@ -185,4 +153,4 @@ function packToSolidityProof(proof) {
|
|
|
185
153
|
];
|
|
186
154
|
}
|
|
187
155
|
|
|
188
|
-
export {
|
|
156
|
+
export { generateNullifierHash, generateProof, genSignalHash as generateSignalHash, packToSolidityProof, verifyProof };
|
package/dist/index.node.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module @semaphore-protocol/proof
|
|
3
|
-
* @version 0.
|
|
4
|
-
* @file A library
|
|
3
|
+
* @version 0.3.1
|
|
4
|
+
* @file A library to generate and verify Semaphore proofs.
|
|
5
5
|
* @copyright Ethereum Foundation 2022
|
|
6
6
|
* @license MIT
|
|
7
7
|
* @see [Github]{@link https://github.com/semaphore-protocol/semaphore.js/tree/main/packages/proof}
|
|
@@ -10,50 +10,11 @@
|
|
|
10
10
|
|
|
11
11
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
12
12
|
|
|
13
|
-
var incrementalMerkleTree = require('@zk-kit/incremental-merkle-tree');
|
|
14
13
|
var circomlibjs = require('circomlibjs');
|
|
15
14
|
var snarkjs = require('snarkjs');
|
|
16
15
|
var solidity = require('@ethersproject/solidity');
|
|
17
16
|
var strings = require('@ethersproject/strings');
|
|
18
17
|
|
|
19
|
-
/**
|
|
20
|
-
* Creates a Merkle tree.
|
|
21
|
-
* @param depth The depth of the tree.
|
|
22
|
-
* @param zeroValue The zero value of the tree.
|
|
23
|
-
* @param leaves The list of the leaves of the tree.
|
|
24
|
-
* @returns The Merkle tree.
|
|
25
|
-
*/
|
|
26
|
-
function createMerkleTree(depth, zeroValue, leaves) {
|
|
27
|
-
var tree = new incrementalMerkleTree.IncrementalMerkleTree(circomlibjs.poseidon, depth, zeroValue, 2);
|
|
28
|
-
for (var _i = 0, leaves_1 = leaves; _i < leaves_1.length; _i++) {
|
|
29
|
-
var leaf = leaves_1[_i];
|
|
30
|
-
if (leaf === zeroValue) {
|
|
31
|
-
throw new Error("Leaves cannot have zero values");
|
|
32
|
-
}
|
|
33
|
-
tree.insert(BigInt(leaf));
|
|
34
|
-
}
|
|
35
|
-
return tree;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Creates a Merkle proof.
|
|
40
|
-
* @param depth The depth of the tree.
|
|
41
|
-
* @param zeroValue The zero value of the tree.
|
|
42
|
-
* @param leaves The list of the leaves of the tree.
|
|
43
|
-
* @param leaf The leaf for which Merkle proof should be created.
|
|
44
|
-
* @returns The Merkle proof.
|
|
45
|
-
*/
|
|
46
|
-
function createMerkleProof(depth, zeroValue, leaves, leaf) {
|
|
47
|
-
var tree = createMerkleTree(depth, zeroValue, leaves);
|
|
48
|
-
var leafIndex = tree.leaves.indexOf(BigInt(leaf));
|
|
49
|
-
if (leafIndex === -1) {
|
|
50
|
-
throw new Error("The leaf does not exist");
|
|
51
|
-
}
|
|
52
|
-
var merkleProof = tree.createProof(leafIndex);
|
|
53
|
-
merkleProof.siblings = merkleProof.siblings.map(function (s) { return s[0]; });
|
|
54
|
-
return merkleProof;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
18
|
/**
|
|
58
19
|
* Generates a nullifier by hashing the external and the identity nullifiers.
|
|
59
20
|
* @param externalNullifier The external nullifier.
|
|
@@ -126,19 +87,26 @@ function genSignalHash(signal) {
|
|
|
126
87
|
return BigInt(solidity.keccak256(["bytes32"], [strings.formatBytes32String(signal)])) >> BigInt(8);
|
|
127
88
|
}
|
|
128
89
|
|
|
129
|
-
function generateProof(identity,
|
|
90
|
+
function generateProof(identity, group, externalNullifier, signal, snarkArtifacts) {
|
|
130
91
|
return __awaiter(this, void 0, void 0, function () {
|
|
131
|
-
var _a, proof, publicSignals;
|
|
92
|
+
var commitment, index, merkleProof, _a, proof, publicSignals;
|
|
132
93
|
return __generator(this, function (_b) {
|
|
133
94
|
switch (_b.label) {
|
|
134
|
-
case 0:
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
95
|
+
case 0:
|
|
96
|
+
commitment = identity.generateCommitment();
|
|
97
|
+
index = group.indexOf(commitment);
|
|
98
|
+
if (index === -1) {
|
|
99
|
+
throw new Error("The identity is not part of the group");
|
|
100
|
+
}
|
|
101
|
+
merkleProof = group.generateProofOfMembership(index);
|
|
102
|
+
return [4 /*yield*/, snarkjs.groth16.fullProve({
|
|
103
|
+
identityTrapdoor: identity.getTrapdoor(),
|
|
104
|
+
identityNullifier: identity.getNullifier(),
|
|
105
|
+
treePathIndices: merkleProof.pathIndices,
|
|
106
|
+
treeSiblings: merkleProof.siblings,
|
|
107
|
+
externalNullifier: externalNullifier,
|
|
108
|
+
signalHash: genSignalHash(signal)
|
|
109
|
+
}, snarkArtifacts.wasmFilePath, snarkArtifacts.zkeyFilePath)];
|
|
142
110
|
case 1:
|
|
143
111
|
_a = _b.sent(), proof = _a.proof, publicSignals = _a.publicSignals;
|
|
144
112
|
return [2 /*return*/, {
|
|
@@ -189,8 +157,6 @@ function packToSolidityProof(proof) {
|
|
|
189
157
|
];
|
|
190
158
|
}
|
|
191
159
|
|
|
192
|
-
exports.createMerkleProof = createMerkleProof;
|
|
193
|
-
exports.createMerkleTree = createMerkleTree;
|
|
194
160
|
exports.generateNullifierHash = generateNullifierHash;
|
|
195
161
|
exports.generateProof = generateProof;
|
|
196
162
|
exports.generateSignalHash = genSignalHash;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Identity } from "@semaphore-protocol/identity";
|
|
2
|
-
import {
|
|
2
|
+
import { Group } from "@semaphore-protocol/group";
|
|
3
3
|
import { BigNumberish, FullProof, SnarkArtifacts } from "./types";
|
|
4
|
-
export default function generateProof(identity: Identity,
|
|
4
|
+
export default function generateProof(identity: Identity, group: Group, externalNullifier: BigNumberish, signal: string, snarkArtifacts: SnarkArtifacts): Promise<FullProof>;
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { MerkleProof } from "@zk-kit/incremental-merkle-tree";
|
|
2
|
-
import createMerkleTree from "./createMerkleTree";
|
|
3
|
-
import createMerkleProof from "./createMerkleProof";
|
|
4
1
|
import generateNullifierHash from "./generateNullifierHash";
|
|
5
2
|
import generateProof from "./generateProof";
|
|
6
3
|
import verifyProof from "./verifyProof";
|
|
7
4
|
import generateSignalHash from "./generateSignalHash";
|
|
8
5
|
import packToSolidityProof from "./packToSolidityProof";
|
|
9
|
-
export {
|
|
6
|
+
export { generateNullifierHash, generateProof, verifyProof, generateSignalHash, packToSolidityProof };
|
|
10
7
|
export * from "./types";
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semaphore-protocol/proof",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A library
|
|
3
|
+
"version": "0.3.1",
|
|
4
|
+
"description": "A library to generate and verify Semaphore proofs.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.node.js",
|
|
7
7
|
"exports": {
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"@ethersproject/bytes": "^5.5.0",
|
|
38
38
|
"@ethersproject/solidity": "^5.5.0",
|
|
39
39
|
"@ethersproject/strings": "^5.5.0",
|
|
40
|
-
"@semaphore-protocol/
|
|
41
|
-
"@
|
|
40
|
+
"@semaphore-protocol/group": "0.1.1",
|
|
41
|
+
"@semaphore-protocol/identity": "0.2.2",
|
|
42
42
|
"circomlibjs": "0.0.8",
|
|
43
43
|
"snarkjs": "^0.4.13"
|
|
44
44
|
}
|
package/src/generateProof.ts
CHANGED
|
@@ -1,16 +1,25 @@
|
|
|
1
1
|
import type { Identity } from "@semaphore-protocol/identity"
|
|
2
|
-
import {
|
|
2
|
+
import { Group } from "@semaphore-protocol/group"
|
|
3
3
|
import { groth16 } from "snarkjs"
|
|
4
4
|
import generateSignalHash from "./generateSignalHash"
|
|
5
5
|
import { BigNumberish, FullProof, SnarkArtifacts } from "./types"
|
|
6
6
|
|
|
7
7
|
export default async function generateProof(
|
|
8
8
|
identity: Identity,
|
|
9
|
-
|
|
9
|
+
group: Group,
|
|
10
10
|
externalNullifier: BigNumberish,
|
|
11
11
|
signal: string,
|
|
12
12
|
snarkArtifacts: SnarkArtifacts
|
|
13
13
|
): Promise<FullProof> {
|
|
14
|
+
const commitment = identity.generateCommitment()
|
|
15
|
+
const index = group.indexOf(commitment)
|
|
16
|
+
|
|
17
|
+
if (index === -1) {
|
|
18
|
+
throw new Error("The identity is not part of the group")
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const merkleProof = group.generateProofOfMembership(index)
|
|
22
|
+
|
|
14
23
|
const { proof, publicSignals } = await groth16.fullProve(
|
|
15
24
|
{
|
|
16
25
|
identityTrapdoor: identity.getTrapdoor(),
|
package/src/index.test.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
+
import { Group } from "@semaphore-protocol/group"
|
|
1
2
|
import { Identity } from "@semaphore-protocol/identity"
|
|
2
3
|
import download from "download"
|
|
3
4
|
import { getCurveFromName } from "ffjavascript"
|
|
4
5
|
import fs from "fs"
|
|
5
|
-
import createMerkleProof from "./createMerkleProof"
|
|
6
|
-
import createMerkleTree from "./createMerkleTree"
|
|
7
6
|
import generateNullifierHash from "./generateNullifierHash"
|
|
8
7
|
import generateProof from "./generateProof"
|
|
9
8
|
import generateSignalHash from "./generateSignalHash"
|
|
@@ -13,13 +12,16 @@ import verifyProof from "./verifyProof"
|
|
|
13
12
|
|
|
14
13
|
describe("Proof", () => {
|
|
15
14
|
const treeDepth = 20
|
|
15
|
+
|
|
16
16
|
const externalNullifier = "1"
|
|
17
17
|
const signal = "0x111"
|
|
18
18
|
|
|
19
19
|
const snarkArtifactsPath = "./packages/proof/snark-artifacts"
|
|
20
20
|
const snarkArtifactsUrl = `http://www.trusted-setup-pse.org/semaphore/${treeDepth}`
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const identity = new Identity()
|
|
23
|
+
const identityCommitment = identity.generateCommitment()
|
|
24
|
+
|
|
23
25
|
let fullProof: FullProof
|
|
24
26
|
let curve: any
|
|
25
27
|
|
|
@@ -35,55 +37,40 @@ describe("Proof", () => {
|
|
|
35
37
|
await download(`${snarkArtifactsUrl}/semaphore.zkey`, snarkArtifactsPath)
|
|
36
38
|
await download(`${snarkArtifactsUrl}/semaphore.json`, snarkArtifactsPath)
|
|
37
39
|
}
|
|
38
|
-
})
|
|
40
|
+
}, 10000)
|
|
39
41
|
|
|
40
42
|
afterAll(async () => {
|
|
41
43
|
await curve.terminate()
|
|
42
44
|
})
|
|
43
45
|
|
|
44
|
-
describe("#
|
|
45
|
-
it("Should not generate
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
expect(fun).toThrow("Leaves cannot have zero values")
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it("Should generate a Merkle tree", async () => {
|
|
52
|
-
const merkleTree = createMerkleTree(treeDepth, BigInt(0), [BigInt(1), BigInt(2)])
|
|
53
|
-
|
|
54
|
-
expect(merkleTree.leaves).toHaveLength(2)
|
|
55
|
-
})
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
describe("# createMerkleProof", () => {
|
|
59
|
-
it("Should not generate a Merkle proof of a non-existing leaf", async () => {
|
|
60
|
-
const fun = () => createMerkleProof(treeDepth, BigInt(0), [BigInt(1), BigInt(2)], BigInt(3))
|
|
46
|
+
describe("# generateProof", () => {
|
|
47
|
+
it("Should not generate Semaphore proofs if the identity is not part of the group", async () => {
|
|
48
|
+
const group = new Group(treeDepth)
|
|
61
49
|
|
|
62
|
-
|
|
63
|
-
})
|
|
50
|
+
group.addMembers([BigInt(1), BigInt(2)])
|
|
64
51
|
|
|
65
|
-
|
|
66
|
-
|
|
52
|
+
const fun = () =>
|
|
53
|
+
generateProof(identity, group, externalNullifier, signal, {
|
|
54
|
+
wasmFilePath: `${snarkArtifactsPath}/semaphore.wasm`,
|
|
55
|
+
zkeyFilePath: `${snarkArtifactsPath}/semaphore.zkey`
|
|
56
|
+
})
|
|
67
57
|
|
|
68
|
-
expect(
|
|
58
|
+
await expect(fun).rejects.toThrow("The identity is not part of the group")
|
|
69
59
|
})
|
|
70
|
-
})
|
|
71
60
|
|
|
72
|
-
describe("# generateProof", () => {
|
|
73
61
|
it("Should generate a Semaphore proof", async () => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const merkleProof = createMerkleProof(treeDepth, BigInt(0), leaves, identityCommitment)
|
|
62
|
+
const group = new Group(treeDepth)
|
|
63
|
+
|
|
64
|
+
group.addMembers([BigInt(1), BigInt(2), identityCommitment])
|
|
78
65
|
|
|
79
|
-
fullProof = await generateProof(identity,
|
|
66
|
+
fullProof = await generateProof(identity, group, externalNullifier, signal, {
|
|
80
67
|
wasmFilePath: `${snarkArtifactsPath}/semaphore.wasm`,
|
|
81
68
|
zkeyFilePath: `${snarkArtifactsPath}/semaphore.zkey`
|
|
82
69
|
})
|
|
83
70
|
|
|
84
71
|
expect(typeof fullProof).toBe("object")
|
|
85
72
|
expect(fullProof.publicSignals.externalNullifier).toBe(externalNullifier)
|
|
86
|
-
expect(fullProof.publicSignals.merkleRoot).toBe(
|
|
73
|
+
expect(fullProof.publicSignals.merkleRoot).toBe(group.root.toString())
|
|
87
74
|
}, 20000)
|
|
88
75
|
})
|
|
89
76
|
|
package/src/index.ts
CHANGED
|
@@ -1,20 +1,8 @@
|
|
|
1
|
-
import { MerkleProof } from "@zk-kit/incremental-merkle-tree"
|
|
2
|
-
import createMerkleTree from "./createMerkleTree"
|
|
3
|
-
import createMerkleProof from "./createMerkleProof"
|
|
4
1
|
import generateNullifierHash from "./generateNullifierHash"
|
|
5
2
|
import generateProof from "./generateProof"
|
|
6
3
|
import verifyProof from "./verifyProof"
|
|
7
4
|
import generateSignalHash from "./generateSignalHash"
|
|
8
5
|
import packToSolidityProof from "./packToSolidityProof"
|
|
9
6
|
|
|
10
|
-
export {
|
|
11
|
-
MerkleProof,
|
|
12
|
-
createMerkleTree,
|
|
13
|
-
createMerkleProof,
|
|
14
|
-
generateNullifierHash,
|
|
15
|
-
generateProof,
|
|
16
|
-
verifyProof,
|
|
17
|
-
generateSignalHash,
|
|
18
|
-
packToSolidityProof
|
|
19
|
-
}
|
|
7
|
+
export { generateNullifierHash, generateProof, verifyProof, generateSignalHash, packToSolidityProof }
|
|
20
8
|
export * from "./types"
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { MerkleProof } from "@zk-kit/incremental-merkle-tree";
|
|
2
|
-
import { BigNumberish } from "./types";
|
|
3
|
-
/**
|
|
4
|
-
* Creates a Merkle proof.
|
|
5
|
-
* @param depth The depth of the tree.
|
|
6
|
-
* @param zeroValue The zero value of the tree.
|
|
7
|
-
* @param leaves The list of the leaves of the tree.
|
|
8
|
-
* @param leaf The leaf for which Merkle proof should be created.
|
|
9
|
-
* @returns The Merkle proof.
|
|
10
|
-
*/
|
|
11
|
-
export default function createMerkleProof(depth: number, zeroValue: BigNumberish, leaves: BigNumberish[], leaf: BigNumberish): MerkleProof;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { IncrementalMerkleTree } from "@zk-kit/incremental-merkle-tree";
|
|
2
|
-
import { BigNumberish } from "./types";
|
|
3
|
-
/**
|
|
4
|
-
* Creates a Merkle tree.
|
|
5
|
-
* @param depth The depth of the tree.
|
|
6
|
-
* @param zeroValue The zero value of the tree.
|
|
7
|
-
* @param leaves The list of the leaves of the tree.
|
|
8
|
-
* @returns The Merkle tree.
|
|
9
|
-
*/
|
|
10
|
-
export default function createMerkleTree(depth: number, zeroValue: BigNumberish, leaves: BigNumberish[]): IncrementalMerkleTree;
|
package/src/createMerkleProof.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { MerkleProof } from "@zk-kit/incremental-merkle-tree"
|
|
2
|
-
import createMerkleTree from "./createMerkleTree"
|
|
3
|
-
import { BigNumberish } from "./types"
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates a Merkle proof.
|
|
7
|
-
* @param depth The depth of the tree.
|
|
8
|
-
* @param zeroValue The zero value of the tree.
|
|
9
|
-
* @param leaves The list of the leaves of the tree.
|
|
10
|
-
* @param leaf The leaf for which Merkle proof should be created.
|
|
11
|
-
* @returns The Merkle proof.
|
|
12
|
-
*/
|
|
13
|
-
export default function createMerkleProof(
|
|
14
|
-
depth: number,
|
|
15
|
-
zeroValue: BigNumberish,
|
|
16
|
-
leaves: BigNumberish[],
|
|
17
|
-
leaf: BigNumberish
|
|
18
|
-
): MerkleProof {
|
|
19
|
-
const tree = createMerkleTree(depth, zeroValue, leaves)
|
|
20
|
-
|
|
21
|
-
const leafIndex = tree.leaves.indexOf(BigInt(leaf))
|
|
22
|
-
|
|
23
|
-
if (leafIndex === -1) {
|
|
24
|
-
throw new Error("The leaf does not exist")
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const merkleProof = tree.createProof(leafIndex)
|
|
28
|
-
|
|
29
|
-
merkleProof.siblings = merkleProof.siblings.map((s) => s[0])
|
|
30
|
-
|
|
31
|
-
return merkleProof
|
|
32
|
-
}
|
package/src/createMerkleTree.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { IncrementalMerkleTree } from "@zk-kit/incremental-merkle-tree"
|
|
2
|
-
import { poseidon } from "circomlibjs"
|
|
3
|
-
import { BigNumberish } from "./types"
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Creates a Merkle tree.
|
|
7
|
-
* @param depth The depth of the tree.
|
|
8
|
-
* @param zeroValue The zero value of the tree.
|
|
9
|
-
* @param leaves The list of the leaves of the tree.
|
|
10
|
-
* @returns The Merkle tree.
|
|
11
|
-
*/
|
|
12
|
-
export default function createMerkleTree(
|
|
13
|
-
depth: number,
|
|
14
|
-
zeroValue: BigNumberish,
|
|
15
|
-
leaves: BigNumberish[]
|
|
16
|
-
): IncrementalMerkleTree {
|
|
17
|
-
const tree = new IncrementalMerkleTree(poseidon, depth, zeroValue, 2)
|
|
18
|
-
|
|
19
|
-
for (const leaf of leaves) {
|
|
20
|
-
if (leaf === zeroValue) {
|
|
21
|
-
throw new Error("Leaves cannot have zero values")
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
tree.insert(BigInt(leaf))
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return tree
|
|
28
|
-
}
|