Skip to content

Commit 6cc2b6a

Browse files
committed
feat(proof): add function to calculate nullifier hash
1 parent 22f33a8 commit 6cc2b6a

File tree

7 files changed

+98
-3
lines changed

7 files changed

+98
-3
lines changed

packages/proof/README.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,13 @@ yarn add @semaphore-protocol/identity @semaphore-protocol/group @semaphore-proto
6767

6868
## 📜 Usage
6969

70-
\# **generateProof**(identity: _Identity_, group: _Group_ | _MerkleProof_, externalNullifier: _BigNumberish_, signal: _string_, snarkArtifacts?: _SnarkArtifacts_): Promise\<_SemaphoreFullProof_>
70+
\# **generateProof**(
71+
identity: _Identity_,
72+
group: _Group_ | _MerkleProof_,
73+
externalNullifier: _BytesLike | Hexable | number | bigint_,
74+
signal: _BytesLike | Hexable | number | bigint_,
75+
snarkArtifacts?: _SnarkArtifacts_
76+
): Promise\<_SemaphoreFullProof_>
7177

7278
```typescript
7379
import { Identity } from "@semaphore-protocol/identity"
@@ -98,3 +104,18 @@ import { verifyProof } from "@semaphore-protocol/proof"
98104

99105
await verifyProof(fullProof, 20)
100106
```
107+
108+
\# **calculateNullifierHash**(
109+
identityNullifier: _bigint | number | string_,
110+
externalNullifier: \__BytesLike | Hexable | number | bigint_
111+
): Promise\<_boolean_>
112+
113+
```typescript
114+
import { Identity } from "@semaphore-protocol/identity"
115+
import { calculateNullifierHash } from "@semaphore-protocol/proof"
116+
117+
const identity = new Identity()
118+
const externalNullifier = utils.formatBytes32String("Topic")
119+
120+
const nullifierHash = calculateNullifierHash(identity.nullifier, externalNullifier)
121+
```

packages/proof/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@
3030
"access": "public"
3131
},
3232
"devDependencies": {
33+
"@rollup/plugin-commonjs": "^24.1.0",
3334
"@rollup/plugin-json": "^5.0.1",
35+
"@rollup/plugin-node-resolve": "^15.0.2",
3436
"ffjavascript": "^0.2.54",
37+
"poseidon-lite": "^0.2.0",
3538
"rollup-plugin-cleanup": "^3.2.1",
3639
"rollup-plugin-typescript2": "^0.31.2",
3740
"typedoc": "^0.22.11"

packages/proof/rollup.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import typescript from "rollup-plugin-typescript2"
2+
import commonjs from "@rollup/plugin-commonjs"
23
import * as fs from "fs"
34
import cleanup from "rollup-plugin-cleanup"
45
import json from "@rollup/plugin-json"
6+
import { nodeResolve } from "@rollup/plugin-node-resolve"
57

68
const pkg = JSON.parse(fs.readFileSync("./package.json", "utf-8"))
79
const banner = `/**
@@ -25,6 +27,8 @@ export default {
2527
tsconfig: "./build.tsconfig.json",
2628
useTsconfigDeclarationDir: true
2729
}),
30+
commonjs(),
31+
nodeResolve(),
2832
cleanup({ comments: "jsdoc" }),
2933
json()
3034
]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { BytesLike, Hexable } from "@ethersproject/bytes"
2+
import { poseidon2 } from "poseidon-lite/poseidon2"
3+
import hash from "./hash"
4+
5+
/**
6+
* Given the identity nullifier and the external nullifier, it calculates nullifier hash.
7+
* @param identityNullifier The identity nullifier.
8+
* @param externalNullifier The external nullifier.
9+
* @returns The nullifier hash.
10+
*/
11+
export default function calculateNullifierHash(
12+
identityNullifier: number | bigint | string,
13+
externalNullifier: BytesLike | Hexable | number | bigint
14+
): bigint {
15+
return poseidon2([hash(externalNullifier), identityNullifier])
16+
}

packages/proof/src/index.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { formatBytes32String } from "@ethersproject/strings"
22
import { Group } from "@semaphore-protocol/group"
33
import { Identity } from "@semaphore-protocol/identity"
44
import { getCurveFromName } from "ffjavascript"
5+
import calculateNullifierHash from "./calculateNullifierHash"
56
import generateProof from "./generateProof"
67
import hash from "./hash"
78
import packProof from "./packProof"
@@ -147,6 +148,14 @@ describe("Proof", () => {
147148
})
148149
})
149150

151+
describe("# calculateNullifierHash", () => {
152+
it("Should calculate the nullifier hash correctly", async () => {
153+
const nullifierHash = calculateNullifierHash(identity.nullifier, externalNullifier)
154+
155+
expect(fullProof.nullifierHash).toBe(nullifierHash.toString())
156+
})
157+
})
158+
150159
describe("# packProof/unpackProof", () => {
151160
it("Should return a packed proof", async () => {
152161
const originalProof = unpackProof(fullProof.proof)

packages/proof/src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import generateProof from "./generateProof"
22
import verifyProof from "./verifyProof"
3+
import calculateNullifierHash from "./calculateNullifierHash"
34

4-
export { generateProof, verifyProof }
5+
export { generateProof, verifyProof, calculateNullifierHash }
56
export * from "./types"

yarn.lock

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4110,6 +4110,25 @@ __metadata:
41104110
languageName: node
41114111
linkType: hard
41124112

4113+
"@rollup/plugin-commonjs@npm:^24.1.0":
4114+
version: 24.1.0
4115+
resolution: "@rollup/plugin-commonjs@npm:24.1.0"
4116+
dependencies:
4117+
"@rollup/pluginutils": ^5.0.1
4118+
commondir: ^1.0.1
4119+
estree-walker: ^2.0.2
4120+
glob: ^8.0.3
4121+
is-reference: 1.2.1
4122+
magic-string: ^0.27.0
4123+
peerDependencies:
4124+
rollup: ^2.68.0||^3.0.0
4125+
peerDependenciesMeta:
4126+
rollup:
4127+
optional: true
4128+
checksum: 42faafc9bc8e04d75c86bb50d693ebb9c5eee19bf9ab3c09780b872547d12ff5ea85cfec7da75f5176d0aa4b5233101f667f44b85b331450a7bb14c95180852e
4129+
languageName: node
4130+
linkType: hard
4131+
41134132
"@rollup/plugin-json@npm:^5.0.1":
41144133
version: 5.0.2
41154134
resolution: "@rollup/plugin-json@npm:5.0.2"
@@ -4173,6 +4192,25 @@ __metadata:
41734192
languageName: node
41744193
linkType: hard
41754194

4195+
"@rollup/plugin-node-resolve@npm:^15.0.2":
4196+
version: 15.0.2
4197+
resolution: "@rollup/plugin-node-resolve@npm:15.0.2"
4198+
dependencies:
4199+
"@rollup/pluginutils": ^5.0.1
4200+
"@types/resolve": 1.20.2
4201+
deepmerge: ^4.2.2
4202+
is-builtin-module: ^3.2.1
4203+
is-module: ^1.0.0
4204+
resolve: ^1.22.1
4205+
peerDependencies:
4206+
rollup: ^2.78.0||^3.0.0
4207+
peerDependenciesMeta:
4208+
rollup:
4209+
optional: true
4210+
checksum: 328eafee06ff967a36441b55e77fbd0d4f599d256e5d1977800ee71915846c46bc1b6185df35c7b512ad2b4023b05b65a332be77b8b00b9d8a20f87d056b8166
4211+
languageName: node
4212+
linkType: hard
4213+
41764214
"@rollup/plugin-replace@npm:^2.4.1":
41774215
version: 2.4.2
41784216
resolution: "@rollup/plugin-replace@npm:2.4.2"
@@ -4466,9 +4504,12 @@ __metadata:
44664504
"@ethersproject/bytes": ^5.7.0
44674505
"@ethersproject/keccak256": ^5.7.0
44684506
"@ethersproject/strings": ^5.5.0
4507+
"@rollup/plugin-commonjs": ^24.1.0
44694508
"@rollup/plugin-json": ^5.0.1
4509+
"@rollup/plugin-node-resolve": ^15.0.2
44704510
"@zk-kit/incremental-merkle-tree": 0.4.3
44714511
ffjavascript: ^0.2.54
4512+
poseidon-lite: ^0.2.0
44724513
rollup-plugin-cleanup: ^3.2.1
44734514
rollup-plugin-typescript2: ^0.31.2
44744515
snarkjs: 0.4.13
@@ -12164,7 +12205,7 @@ __metadata:
1216412205
languageName: node
1216512206
linkType: hard
1216612207

12167-
"is-builtin-module@npm:^3.2.0":
12208+
"is-builtin-module@npm:^3.2.0, is-builtin-module@npm:^3.2.1":
1216812209
version: 3.2.1
1216912210
resolution: "is-builtin-module@npm:3.2.1"
1217012211
dependencies:

0 commit comments

Comments
 (0)