@semaphore-protocol/contracts 2.6.1 → 3.0.0-beta.6
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/LICENSE +21 -0
- package/Semaphore.sol +51 -34
- package/base/Pairing.sol +151 -0
- package/base/SemaphoreGroups.sol +17 -22
- package/base/SemaphoreVerifier.sol +113 -0
- package/extensions/SemaphoreVoting.sol +19 -37
- package/extensions/SemaphoreWhistleblowing.sol +21 -29
- package/interfaces/ISemaphore.sol +21 -16
- package/interfaces/ISemaphoreGroups.sol +1 -3
- package/interfaces/ISemaphoreVerifier.sol +37 -0
- package/interfaces/ISemaphoreVoting.sol +4 -4
- package/interfaces/ISemaphoreWhistleblowing.sol +3 -4
- package/package.json +2 -2
- package/base/SemaphoreConstants.sol +0 -4
- package/base/SemaphoreCore.sol +0 -45
- package/interfaces/ISemaphoreCore.sol +0 -10
- package/interfaces/ISemaphoreNullifiers.sol +0 -14
- package/interfaces/IVerifier.sol +0 -13
- package/verifiers/Verifier16.sol +0 -237
- package/verifiers/Verifier17.sol +0 -237
- package/verifiers/Verifier18.sol +0 -237
- package/verifiers/Verifier19.sol +0 -237
- package/verifiers/Verifier20.sol +0 -237
- package/verifiers/Verifier21.sol +0 -237
- package/verifiers/Verifier22.sol +0 -237
- package/verifiers/Verifier23.sol +0 -237
- package/verifiers/Verifier24.sol +0 -237
- package/verifiers/Verifier25.sol +0 -237
- package/verifiers/Verifier26.sol +0 -237
- package/verifiers/Verifier27.sol +0 -237
- package/verifiers/Verifier28.sol +0 -237
- package/verifiers/Verifier29.sol +0 -237
- package/verifiers/Verifier30.sol +0 -237
- package/verifiers/Verifier31.sol +0 -237
- package/verifiers/Verifier32.sol +0 -237
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2022 Ethereum Foundation
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/Semaphore.sol
CHANGED
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
pragma solidity 0.8.4;
|
|
3
3
|
|
|
4
4
|
import "./interfaces/ISemaphore.sol";
|
|
5
|
-
import "./interfaces/
|
|
6
|
-
import "./base/SemaphoreCore.sol";
|
|
5
|
+
import "./interfaces/ISemaphoreVerifier.sol";
|
|
7
6
|
import "./base/SemaphoreGroups.sol";
|
|
8
7
|
|
|
9
8
|
/// @title Semaphore
|
|
10
|
-
contract Semaphore
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
/// @dev This contract uses the Semaphore base contracts to provide a complete service
|
|
10
|
+
/// to allow admins to create and manage groups and their members to generate Semaphore proofs
|
|
11
|
+
/// and verify them. Group admins can add, update or remove group members, and can be
|
|
12
|
+
/// an Ethereum account or a smart contract. This contract also assigns each new Merkle tree
|
|
13
|
+
/// generated with a new root a duration (or an expiry) within which the proofs generated with that root
|
|
14
|
+
/// can be validated.
|
|
15
|
+
contract Semaphore is ISemaphore, SemaphoreGroups {
|
|
16
|
+
ISemaphoreVerifier public verifier;
|
|
13
17
|
|
|
14
18
|
/// @dev Gets a group id and returns the group parameters.
|
|
15
19
|
mapping(uint256 => Group) public groups;
|
|
@@ -26,35 +30,28 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
|
|
|
26
30
|
/// @dev Checks if there is a verifier for the given tree depth.
|
|
27
31
|
/// @param merkleTreeDepth: Depth of the tree.
|
|
28
32
|
modifier onlySupportedMerkleTreeDepth(uint256 merkleTreeDepth) {
|
|
29
|
-
if (
|
|
33
|
+
if (merkleTreeDepth < 16 || merkleTreeDepth > 32) {
|
|
30
34
|
revert Semaphore__MerkleTreeDepthIsNotSupported();
|
|
31
35
|
}
|
|
32
36
|
_;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
|
-
/// @dev Initializes the Semaphore
|
|
36
|
-
/// @param
|
|
37
|
-
constructor(
|
|
38
|
-
|
|
39
|
-
verifiers[_verifiers[i].merkleTreeDepth] = IVerifier(_verifiers[i].contractAddress);
|
|
40
|
-
|
|
41
|
-
unchecked {
|
|
42
|
-
++i;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
39
|
+
/// @dev Initializes the Semaphore verifier used to verify the user's ZK proofs.
|
|
40
|
+
/// @param _verifier: Semaphore verifier address.
|
|
41
|
+
constructor(ISemaphoreVerifier _verifier) {
|
|
42
|
+
verifier = _verifier;
|
|
45
43
|
}
|
|
46
44
|
|
|
47
45
|
/// @dev See {ISemaphore-createGroup}.
|
|
48
46
|
function createGroup(
|
|
49
47
|
uint256 groupId,
|
|
50
48
|
uint256 merkleTreeDepth,
|
|
51
|
-
uint256 zeroValue,
|
|
52
49
|
address admin
|
|
53
50
|
) external override onlySupportedMerkleTreeDepth(merkleTreeDepth) {
|
|
54
|
-
_createGroup(groupId, merkleTreeDepth
|
|
51
|
+
_createGroup(groupId, merkleTreeDepth);
|
|
55
52
|
|
|
56
53
|
groups[groupId].admin = admin;
|
|
57
|
-
groups[groupId].
|
|
54
|
+
groups[groupId].merkleTreeDuration = 1 hours;
|
|
58
55
|
|
|
59
56
|
emit GroupAdminUpdated(groupId, address(0), admin);
|
|
60
57
|
}
|
|
@@ -63,14 +60,13 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
|
|
|
63
60
|
function createGroup(
|
|
64
61
|
uint256 groupId,
|
|
65
62
|
uint256 merkleTreeDepth,
|
|
66
|
-
uint256 zeroValue,
|
|
67
63
|
address admin,
|
|
68
|
-
uint256
|
|
64
|
+
uint256 merkleTreeDuration
|
|
69
65
|
) external override onlySupportedMerkleTreeDepth(merkleTreeDepth) {
|
|
70
|
-
_createGroup(groupId, merkleTreeDepth
|
|
66
|
+
_createGroup(groupId, merkleTreeDepth);
|
|
71
67
|
|
|
72
68
|
groups[groupId].admin = admin;
|
|
73
|
-
groups[groupId].
|
|
69
|
+
groups[groupId].merkleTreeDuration = merkleTreeDuration;
|
|
74
70
|
|
|
75
71
|
emit GroupAdminUpdated(groupId, address(0), admin);
|
|
76
72
|
}
|
|
@@ -82,6 +78,19 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
|
|
|
82
78
|
emit GroupAdminUpdated(groupId, _msgSender(), newAdmin);
|
|
83
79
|
}
|
|
84
80
|
|
|
81
|
+
/// @dev See {ISemaphore-updateGroupMerkleTreeDuration}.
|
|
82
|
+
function updateGroupMerkleTreeDuration(uint256 groupId, uint256 newMerkleTreeDuration)
|
|
83
|
+
external
|
|
84
|
+
override
|
|
85
|
+
onlyGroupAdmin(groupId)
|
|
86
|
+
{
|
|
87
|
+
uint256 oldMerkleTreeDuration = groups[groupId].merkleTreeDuration;
|
|
88
|
+
|
|
89
|
+
groups[groupId].merkleTreeDuration = newMerkleTreeDuration;
|
|
90
|
+
|
|
91
|
+
emit GroupMerkleTreeDurationUpdated(groupId, oldMerkleTreeDuration, newMerkleTreeDuration);
|
|
92
|
+
}
|
|
93
|
+
|
|
85
94
|
/// @dev See {ISemaphore-addMember}.
|
|
86
95
|
function addMember(uint256 groupId, uint256 identityCommitment) external override onlyGroupAdmin(groupId) {
|
|
87
96
|
_addMember(groupId, identityCommitment);
|
|
@@ -97,7 +106,7 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
|
|
|
97
106
|
override
|
|
98
107
|
onlyGroupAdmin(groupId)
|
|
99
108
|
{
|
|
100
|
-
for (
|
|
109
|
+
for (uint256 i = 0; i < identityCommitments.length; ) {
|
|
101
110
|
_addMember(groupId, identityCommitments[i]);
|
|
102
111
|
|
|
103
112
|
unchecked {
|
|
@@ -119,6 +128,10 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
|
|
|
119
128
|
uint8[] calldata proofPathIndices
|
|
120
129
|
) external override onlyGroupAdmin(groupId) {
|
|
121
130
|
_updateMember(groupId, identityCommitment, newIdentityCommitment, proofSiblings, proofPathIndices);
|
|
131
|
+
|
|
132
|
+
uint256 merkleTreeRoot = getMerkleTreeRoot(groupId);
|
|
133
|
+
|
|
134
|
+
groups[groupId].merkleRootCreationDates[merkleTreeRoot] = block.timestamp;
|
|
122
135
|
}
|
|
123
136
|
|
|
124
137
|
/// @dev See {ISemaphore-removeMember}.
|
|
@@ -129,32 +142,40 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
|
|
|
129
142
|
uint8[] calldata proofPathIndices
|
|
130
143
|
) external override onlyGroupAdmin(groupId) {
|
|
131
144
|
_removeMember(groupId, identityCommitment, proofSiblings, proofPathIndices);
|
|
145
|
+
|
|
146
|
+
uint256 merkleTreeRoot = getMerkleTreeRoot(groupId);
|
|
147
|
+
|
|
148
|
+
groups[groupId].merkleRootCreationDates[merkleTreeRoot] = block.timestamp;
|
|
132
149
|
}
|
|
133
150
|
|
|
134
151
|
/// @dev See {ISemaphore-verifyProof}.
|
|
135
152
|
function verifyProof(
|
|
136
153
|
uint256 groupId,
|
|
137
154
|
uint256 merkleTreeRoot,
|
|
138
|
-
|
|
155
|
+
uint256 signal,
|
|
139
156
|
uint256 nullifierHash,
|
|
140
157
|
uint256 externalNullifier,
|
|
141
158
|
uint256[8] calldata proof
|
|
142
159
|
) external override {
|
|
143
|
-
uint256
|
|
160
|
+
uint256 merkleTreeDepth = getMerkleTreeDepth(groupId);
|
|
144
161
|
|
|
145
|
-
if (
|
|
162
|
+
if (merkleTreeDepth == 0) {
|
|
146
163
|
revert Semaphore__GroupDoesNotExist();
|
|
147
164
|
}
|
|
148
165
|
|
|
166
|
+
uint256 currentMerkleTreeRoot = getMerkleTreeRoot(groupId);
|
|
167
|
+
|
|
168
|
+
// A proof could have used an old Merkle tree root.
|
|
169
|
+
// https://github.com/semaphore-protocol/semaphore/issues/98
|
|
149
170
|
if (merkleTreeRoot != currentMerkleTreeRoot) {
|
|
150
171
|
uint256 merkleRootCreationDate = groups[groupId].merkleRootCreationDates[merkleTreeRoot];
|
|
151
|
-
uint256
|
|
172
|
+
uint256 merkleTreeDuration = groups[groupId].merkleTreeDuration;
|
|
152
173
|
|
|
153
174
|
if (merkleRootCreationDate == 0) {
|
|
154
175
|
revert Semaphore__MerkleTreeRootIsNotPartOfTheGroup();
|
|
155
176
|
}
|
|
156
177
|
|
|
157
|
-
if (block.timestamp > merkleRootCreationDate +
|
|
178
|
+
if (block.timestamp > merkleRootCreationDate + merkleTreeDuration) {
|
|
158
179
|
revert Semaphore__MerkleTreeRootIsExpired();
|
|
159
180
|
}
|
|
160
181
|
}
|
|
@@ -163,11 +184,7 @@ contract Semaphore is ISemaphore, SemaphoreCore, SemaphoreGroups {
|
|
|
163
184
|
revert Semaphore__YouAreUsingTheSameNillifierTwice();
|
|
164
185
|
}
|
|
165
186
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
IVerifier verifier = verifiers[merkleTreeDepth];
|
|
169
|
-
|
|
170
|
-
_verifyProof(signal, merkleTreeRoot, nullifierHash, externalNullifier, proof, verifier);
|
|
187
|
+
verifier.verifyProof(merkleTreeRoot, nullifierHash, signal, externalNullifier, proof, merkleTreeDepth);
|
|
171
188
|
|
|
172
189
|
groups[groupId].nullifierHashes[nullifierHash] = true;
|
|
173
190
|
|
package/base/Pairing.sol
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// Copyright 2017 Christian Reitwiessner
|
|
2
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
3
|
+
// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
4
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
5
|
+
//
|
|
6
|
+
// The following Pairing library is a modified version adapted to Semaphore.
|
|
7
|
+
//
|
|
8
|
+
// SPDX-License-Identifier: MIT
|
|
9
|
+
pragma solidity ^0.8.4;
|
|
10
|
+
|
|
11
|
+
library Pairing {
|
|
12
|
+
error Semaphore__InvalidProof();
|
|
13
|
+
|
|
14
|
+
// The prime q in the base field F_q for G1
|
|
15
|
+
uint256 constant BASE_MODULUS = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
|
|
16
|
+
|
|
17
|
+
// The prime moludus of the scalar field of G1.
|
|
18
|
+
uint256 constant SCALAR_MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
|
|
19
|
+
|
|
20
|
+
struct G1Point {
|
|
21
|
+
uint256 X;
|
|
22
|
+
uint256 Y;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Encoding of field elements is: X[0] * z + X[1]
|
|
26
|
+
struct G2Point {
|
|
27
|
+
uint256[2] X;
|
|
28
|
+
uint256[2] Y;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/// @return the generator of G1
|
|
32
|
+
function P1() public pure returns (G1Point memory) {
|
|
33
|
+
return G1Point(1, 2);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// @return the generator of G2
|
|
37
|
+
function P2() public pure returns (G2Point memory) {
|
|
38
|
+
return
|
|
39
|
+
G2Point(
|
|
40
|
+
[
|
|
41
|
+
11559732032986387107991004021392285783925812861821192530917403151452391805634,
|
|
42
|
+
10857046999023057135944570762232829481370756359578518086990519993285655852781
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
4082367875863433681332203403145435568316851327593401208105741076214120093531,
|
|
46
|
+
8495653923123431417604973247489272438418190587263600148770280649306958101930
|
|
47
|
+
]
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/// @return r the negation of p, i.e. p.addition(p.negate()) should be zero.
|
|
52
|
+
function negate(G1Point memory p) public pure returns (G1Point memory r) {
|
|
53
|
+
if (p.X == 0 && p.Y == 0) {
|
|
54
|
+
return G1Point(0, 0);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Validate input or revert
|
|
58
|
+
if (p.X >= BASE_MODULUS || p.Y >= BASE_MODULUS) {
|
|
59
|
+
revert Semaphore__InvalidProof();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// We know p.Y > 0 and p.Y < BASE_MODULUS.
|
|
63
|
+
return G1Point(p.X, BASE_MODULUS - p.Y);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// @return r the sum of two points of G1
|
|
67
|
+
function addition(G1Point memory p1, G1Point memory p2) public view returns (G1Point memory r) {
|
|
68
|
+
// By EIP-196 all input is validated to be less than the BASE_MODULUS and form points
|
|
69
|
+
// on the curve.
|
|
70
|
+
uint256[4] memory input;
|
|
71
|
+
|
|
72
|
+
input[0] = p1.X;
|
|
73
|
+
input[1] = p1.Y;
|
|
74
|
+
input[2] = p2.X;
|
|
75
|
+
input[3] = p2.Y;
|
|
76
|
+
|
|
77
|
+
bool success;
|
|
78
|
+
|
|
79
|
+
// solium-disable-next-line security/no-inline-assembly
|
|
80
|
+
assembly {
|
|
81
|
+
success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (!success) {
|
|
85
|
+
revert Semaphore__InvalidProof();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/// @return r the product of a point on G1 and a scalar, i.e.
|
|
90
|
+
/// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p.
|
|
91
|
+
function scalar_mul(G1Point memory p, uint256 s) public view returns (G1Point memory r) {
|
|
92
|
+
// By EIP-196 the values p.X and p.Y are verified to less than the BASE_MODULUS and
|
|
93
|
+
// form a valid point on the curve. But the scalar is not verified, so we do that explicitelly.
|
|
94
|
+
if (s >= SCALAR_MODULUS) {
|
|
95
|
+
revert Semaphore__InvalidProof();
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
uint256[3] memory input;
|
|
99
|
+
|
|
100
|
+
input[0] = p.X;
|
|
101
|
+
input[1] = p.Y;
|
|
102
|
+
input[2] = s;
|
|
103
|
+
|
|
104
|
+
bool success;
|
|
105
|
+
|
|
106
|
+
// solium-disable-next-line security/no-inline-assembly
|
|
107
|
+
assembly {
|
|
108
|
+
success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!success) {
|
|
112
|
+
revert Semaphore__InvalidProof();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/// Asserts the pairing check
|
|
117
|
+
/// e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1
|
|
118
|
+
/// For example pairing([P1(), P1().negate()], [P2(), P2()]) should succeed
|
|
119
|
+
function pairingCheck(G1Point[] memory p1, G2Point[] memory p2) public view {
|
|
120
|
+
// By EIP-197 all input is verified to be less than the BASE_MODULUS and form elements in their
|
|
121
|
+
// respective groups of the right order.
|
|
122
|
+
if (p1.length != p2.length) {
|
|
123
|
+
revert Semaphore__InvalidProof();
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
uint256 elements = p1.length;
|
|
127
|
+
uint256 inputSize = elements * 6;
|
|
128
|
+
uint256[] memory input = new uint256[](inputSize);
|
|
129
|
+
|
|
130
|
+
for (uint256 i = 0; i < elements; i++) {
|
|
131
|
+
input[i * 6 + 0] = p1[i].X;
|
|
132
|
+
input[i * 6 + 1] = p1[i].Y;
|
|
133
|
+
input[i * 6 + 2] = p2[i].X[0];
|
|
134
|
+
input[i * 6 + 3] = p2[i].X[1];
|
|
135
|
+
input[i * 6 + 4] = p2[i].Y[0];
|
|
136
|
+
input[i * 6 + 5] = p2[i].Y[1];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
uint256[1] memory out;
|
|
140
|
+
bool success;
|
|
141
|
+
|
|
142
|
+
// solium-disable-next-line security/no-inline-assembly
|
|
143
|
+
assembly {
|
|
144
|
+
success := staticcall(sub(gas(), 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20)
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (!success || out[0] != 1) {
|
|
148
|
+
revert Semaphore__InvalidProof();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
package/base/SemaphoreGroups.sol
CHANGED
|
@@ -1,38 +1,33 @@
|
|
|
1
1
|
//SPDX-License-Identifier: MIT
|
|
2
2
|
pragma solidity 0.8.4;
|
|
3
3
|
|
|
4
|
-
import {SNARK_SCALAR_FIELD} from "./SemaphoreConstants.sol";
|
|
5
4
|
import "../interfaces/ISemaphoreGroups.sol";
|
|
6
5
|
import "@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol";
|
|
7
6
|
import "@openzeppelin/contracts/utils/Context.sol";
|
|
8
7
|
|
|
9
8
|
/// @title Semaphore groups contract.
|
|
10
|
-
/// @dev
|
|
9
|
+
/// @dev This contract allows you to create groups, add, remove and update members.
|
|
11
10
|
/// You can use getters to obtain informations about groups (root, depth, number of leaves).
|
|
12
11
|
abstract contract SemaphoreGroups is Context, ISemaphoreGroups {
|
|
13
12
|
using IncrementalBinaryTree for IncrementalTreeData;
|
|
14
13
|
|
|
15
14
|
/// @dev Gets a group id and returns the tree data.
|
|
16
|
-
mapping(uint256 => IncrementalTreeData) internal
|
|
15
|
+
mapping(uint256 => IncrementalTreeData) internal merkleTrees;
|
|
17
16
|
|
|
18
17
|
/// @dev Creates a new group by initializing the associated tree.
|
|
19
18
|
/// @param groupId: Id of the group.
|
|
20
19
|
/// @param merkleTreeDepth: Depth of the tree.
|
|
21
|
-
|
|
22
|
-
function _createGroup(
|
|
23
|
-
uint256 groupId,
|
|
24
|
-
uint256 merkleTreeDepth,
|
|
25
|
-
uint256 zeroValue
|
|
26
|
-
) internal virtual {
|
|
27
|
-
if (groupId >= SNARK_SCALAR_FIELD) {
|
|
28
|
-
revert Semaphore__GroupIdIsNotLessThanSnarkScalarField();
|
|
29
|
-
}
|
|
30
|
-
|
|
20
|
+
function _createGroup(uint256 groupId, uint256 merkleTreeDepth) internal virtual {
|
|
31
21
|
if (getMerkleTreeDepth(groupId) != 0) {
|
|
32
22
|
revert Semaphore__GroupAlreadyExists();
|
|
33
23
|
}
|
|
34
24
|
|
|
35
|
-
|
|
25
|
+
// The zeroValue is an implicit member of the group, or an implicit leaf of the Merkle tree.
|
|
26
|
+
// Although there is a remote possibility that the preimage of
|
|
27
|
+
// the hash may be calculated, using this value we aim to minimize the risk.
|
|
28
|
+
uint256 zeroValue = uint256(keccak256(abi.encodePacked(groupId))) >> 8;
|
|
29
|
+
|
|
30
|
+
merkleTrees[groupId].init(merkleTreeDepth, zeroValue);
|
|
36
31
|
|
|
37
32
|
emit GroupCreated(groupId, merkleTreeDepth, zeroValue);
|
|
38
33
|
}
|
|
@@ -45,7 +40,7 @@ abstract contract SemaphoreGroups is Context, ISemaphoreGroups {
|
|
|
45
40
|
revert Semaphore__GroupDoesNotExist();
|
|
46
41
|
}
|
|
47
42
|
|
|
48
|
-
|
|
43
|
+
merkleTrees[groupId].insert(identityCommitment);
|
|
49
44
|
|
|
50
45
|
uint256 merkleTreeRoot = getMerkleTreeRoot(groupId);
|
|
51
46
|
uint256 index = getNumberOfMerkleTreeLeaves(groupId) - 1;
|
|
@@ -67,11 +62,11 @@ abstract contract SemaphoreGroups is Context, ISemaphoreGroups {
|
|
|
67
62
|
uint256[] calldata proofSiblings,
|
|
68
63
|
uint8[] calldata proofPathIndices
|
|
69
64
|
) internal virtual {
|
|
70
|
-
if (
|
|
65
|
+
if (getMerkleTreeDepth(groupId) == 0) {
|
|
71
66
|
revert Semaphore__GroupDoesNotExist();
|
|
72
67
|
}
|
|
73
68
|
|
|
74
|
-
|
|
69
|
+
merkleTrees[groupId].update(identityCommitment, newIdentityCommitment, proofSiblings, proofPathIndices);
|
|
75
70
|
|
|
76
71
|
uint256 merkleTreeRoot = getMerkleTreeRoot(groupId);
|
|
77
72
|
uint256 index = proofPathIndicesToMemberIndex(proofPathIndices);
|
|
@@ -91,11 +86,11 @@ abstract contract SemaphoreGroups is Context, ISemaphoreGroups {
|
|
|
91
86
|
uint256[] calldata proofSiblings,
|
|
92
87
|
uint8[] calldata proofPathIndices
|
|
93
88
|
) internal virtual {
|
|
94
|
-
if (
|
|
89
|
+
if (getMerkleTreeDepth(groupId) == 0) {
|
|
95
90
|
revert Semaphore__GroupDoesNotExist();
|
|
96
91
|
}
|
|
97
92
|
|
|
98
|
-
|
|
93
|
+
merkleTrees[groupId].remove(identityCommitment, proofSiblings, proofPathIndices);
|
|
99
94
|
|
|
100
95
|
uint256 merkleTreeRoot = getMerkleTreeRoot(groupId);
|
|
101
96
|
uint256 index = proofPathIndicesToMemberIndex(proofPathIndices);
|
|
@@ -105,17 +100,17 @@ abstract contract SemaphoreGroups is Context, ISemaphoreGroups {
|
|
|
105
100
|
|
|
106
101
|
/// @dev See {ISemaphoreGroups-getMerkleTreeRoot}.
|
|
107
102
|
function getMerkleTreeRoot(uint256 groupId) public view virtual override returns (uint256) {
|
|
108
|
-
return
|
|
103
|
+
return merkleTrees[groupId].root;
|
|
109
104
|
}
|
|
110
105
|
|
|
111
106
|
/// @dev See {ISemaphoreGroups-getMerkleTreeDepth}.
|
|
112
107
|
function getMerkleTreeDepth(uint256 groupId) public view virtual override returns (uint256) {
|
|
113
|
-
return
|
|
108
|
+
return merkleTrees[groupId].depth;
|
|
114
109
|
}
|
|
115
110
|
|
|
116
111
|
/// @dev See {ISemaphoreGroups-getNumberOfMerkleTreeLeaves}.
|
|
117
112
|
function getNumberOfMerkleTreeLeaves(uint256 groupId) public view virtual override returns (uint256) {
|
|
118
|
-
return
|
|
113
|
+
return merkleTrees[groupId].numberOfLeaves;
|
|
119
114
|
}
|
|
120
115
|
|
|
121
116
|
/// @dev Converts the path indices of a Merkle proof to the identity commitment index in the tree.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
//SPDX-License-Identifier: MIT
|
|
2
|
+
pragma solidity 0.8.4;
|
|
3
|
+
|
|
4
|
+
import "../interfaces/ISemaphoreVerifier.sol";
|
|
5
|
+
|
|
6
|
+
/// @title Semaphore verifier contract.
|
|
7
|
+
/// @notice Minimal code to allow users to verify their Semaphore proofs.
|
|
8
|
+
/// @dev This contract allows you to verify whether a Semaphore proof is correct.
|
|
9
|
+
/// It is a modified version of the Groth16 verifier template of SnarkJS
|
|
10
|
+
/// (https://github.com/iden3/snarkjs) adapted to Semaphore. The Pairing library
|
|
11
|
+
/// is external.
|
|
12
|
+
contract SemaphoreVerifier is ISemaphoreVerifier {
|
|
13
|
+
using Pairing for *;
|
|
14
|
+
|
|
15
|
+
// prettier-ignore
|
|
16
|
+
// solhint-disable-next-line
|
|
17
|
+
uint256[2][7][17] VK_POINTS = [[[13406811599156507528361773763681356312643537981039994686313383243831956396116,16243966861079634958125511652590761846958471358623040426599000904006426210032],[11781596534582143578120404722739278517564025497573071755253972265891888117374,15688083679237922164673518758181461582601853873216319711156397437601833996222],[1964404930528116823793003656764176108669615750422202377358993070935069307720,2137714996673694828207437580381836490878070731768805974506391024595988817424],[19568893707760843340848992184233194433177372925415116053368211122719346671126,11639469568629189918046964192305250472192697612201524135560178632824282818614],[5317268879687484957437879782519918549127939892210247573193613900261494313825,528174394975085006443543773707702838726735933116136102590448357278717993744],[14865918005176722116473730206622066845866539143554731094374354951675249722731,3197770568483953664363740385883457803041685902965668289308665954510373380344],[6863358721495494421022713667808247652425178970453300712435830652679038918987,15025816433373311798308762709072064417001390853103872064614174594927359131281]],[[15629200772768268814959330350023920183087521275477047626405113853190187031523,13589689305661231568162336263197960570915890299814486885851912452076929115480],[11464919285924930973853174493551975632739604254498590354200272115844983493029,16004221700357242255845535848024178544616388017965468694776181247983831995562],[17789438292552571310739605737896030466581277887660997531707911256058650850910,4112657509505371631825493224748310061184972897405589115208158208294581472016],[3322052920119834475842380240689494113984887785733316517680891208549118967155,381029395779795399840019487059126246243641886087320875571067736504031557148],[8777645223617381095463415690983421308854368583891690388850387317049320450400,11923582117369144413749726090967341613266070909169947059497952692052020331958],[15493263571528401950994933073246603557158047091963487223668240334879173885581,6315532173951617115856055775098532808695228294437279844344466163873167020700],[3481637421055377106140197938175958155334313900824697193932986771017625492245,20088416136090515091300914661950097694450984520235647990572441134215240947932]],[[9218320951536642499143228327011901814587826948504871816273184688188019956292,19717684456458906358368865507225121991585492363133107109865920739019288468011],[16717590750910963405756115910371408378114896008824240863060392362901176601412,18221695645112467945186983098720611586049108689347006136423489099202471884089],[4691595252082380256698158158199364410440273386659834000993210659508747323919,9205801980459323513061837717352821162780471027241700646145937351740096374660],[16150531426263112884093068164597994126623437929929609532055221646496813246000,20245743178241899668170758952526381872637304119026868520579207157118516761827],[6063536446992770713985314309889717594240410784717230886576072989709763902848,18258781411255795973918859665416013869184055573057512603788635470145328981347],[10109932964756104512054045207253535333686585863745296080906925765480296575285,4174640428253153601540284363759502713687021920150940723252842152556151210349],[18049428534741480832385046397049175120355008065781483226058177421025493210952,591730261265040164434889324846001338201068482543108348317417391345612814922]],[[3995128789564535587814512245259203300137618476815456454931286633947953135662,15953239752392927777442331623182226063776310198012173504208557434319753428770],[20957319343912866335583737646657534123362052690050674068142580221965936605075,2523786679709693946058523307330825034772478122295850507521258983130425334580],[9877211178693075145402462781884120278654771727348087433632224794894486095150,19972682062587174829535281061580296764150591339640180868104711395548066529340],[6324578424031095537345184040149690238371517387586958921377481904541316423724,15513931720576048544404512239839508014664224085062729779520992909505663748296],[11371337652479737143800707796204655130812036287859296372695832558127430723628,11757275188600040111649009832378343123994225623498773406233261322165903848967],[13282496583564708104981015168203451877588903263486398132954741568835583461335,1746144324840370907926720490289700342734912534857331743685374514401176014195],[7993952462467372951144011615584426050192046712674662254138390197508963352374,5156942148925224345709309361345680948125600198010285179548841917923439945819]],[[18976133691706015337908381757202123182841901611067930614519324084182946094218,1382518990777992893805140303684642328066746531257780279226677247567004248173],[6627710380771660558660627878547223719795356903257079198333641681330388499309,21806956747910197517744499423107239699428979652113081469385876768212706694581],[19918517214839406678907482305035208173510172567546071380302965459737278553528,7151186077716310064777520690144511885696297127165278362082219441732663131220],[690581125971423619528508316402701520070153774868732534279095503611995849608,21271996888576045810415843612869789314680408477068973024786458305950370465558],[16461282535702132833442937829027913110152135149151199860671943445720775371319,2814052162479976678403678512565563275428791320557060777323643795017729081887],[4319780315499060392574138782191013129592543766464046592208884866569377437627,13920930439395002698339449999482247728129484070642079851312682993555105218086],[3554830803181375418665292545416227334138838284686406179598687755626325482686,5951609174746846070367113593675211691311013364421437923470787371738135276998]],[[3811592683283527904145155808200366192489850711742363953668998371801696238057,9032545080831535702239063467087720597970266046938395860207839433937324718536],[16308433125974933290258540904373317426123214107276055539769464205982500660715,12429982191499850873612518410809641163252887523090441166572590809691267943605],[9494885690931955877467315318223108618392113101843890678090902614660136056680,11783514256715757384821021009301806722951917744219075907912683963173706887379],[7562082660623781416745328104576133910743071878837764423695105915778139873834,17954307004260053757579194018551114133664721761483240877658498973152950708099],[19338184851116432029108109461622579541195083625346674255186169347975445785058,38361206266360048012365562393026952048730052530888439195454086987795985927],[21178537742782571863590222710872928190886000600239072595684369348717288330049,9786438258541172244884631831247223050494423968411444302812755467521949734320],[11330504221972341797183339350494223413034293674225690456356444509688810101433,1490009915387901405464437253469086864085891770312035292355706249426866485365]],[[9485639152672984144988597737758037391807993615552051606205480347442429414340,17626503110323089701269363177710295379967225765713250625279671011873619640598],[12391874700409435648975069978280047983726144854114915177376036190441913967689,18953587685067712486092665232725058638563458484886448540567142557894080640927],[21791720972262589799021600767292883644106575897307484548888696814333235336885,11092962469758788187888592619035811117815082357439060720677582048880121542623],[9418924955930663972575130074928583215922927562059194231976193350658171304436,16113558481826020406162261319744796072664750077095575593106901121115073101408],[20054934960262983176880675919444457578562219675808407582143519621873973120773,14877415271301547911435683263206245199959943680225555496786470669330176961657],[4215199263810110748751715719957184804379752373072771007598572158043965517488,5225943468606602818132879686778547605180105897615251160509064537462109826521],[6250242626034734280813142093008675407723196706248829741247204621913994561803,1472231555266678689888727724824566171966416459791722465278225775922487343641]],[[9830856103389248449121962275587399130605902703453384856543071762984116567573,11408965575174993375815840422438995549652812400401163392501956884932167624437],[11814906841949499037550820576929552248172160643991870665022770052632331265834,19969543376625663966419118899515353499678204573709836615846115182224340858492],[3047486363455933831148688762823238723024952519326207356549121929667745957778,20241836359289449005887237560564358543646542598344362915541027571505243817211],[5965631918800530319167124148627450454569264331058008407732200168631989208657,20463557477532480934514091877628554948892025887087712764683631108388998871350],[16605042322692983282732511249912403956057999815658038166796858627082222971215,12219061498275616585164456833410962809536084885494309093787669879221959361956],[1548998572074037722622224303222294716243074837074272552644853986075252666508,10393312002885367652301897874262367916506364670364584602554176742602334134772],[16180907689593358346406392015123900260925622357393826746385511046141256905390,12267326749885120640972074479210537480053065569337817484467225562817467244765]],[[15035335306919942325459417688135340085377315274625768597233474641923619728582,10090041889587324002759549286390619541526396451963494627957072069124011137562],[21342049717074059749518233491526445388158772701642182532370641230478027030319,10507786999799841055999967456762679569286329319056926475375760604262707147294],[19590996174696909242575628014943555633938195923520472786993379268302478708283,2673753072556442230312995111304911178679525806396134504594492458566941824354],[13411253172375451489380472831999887223592471057462692619008484995624281735092,17181767455563581254432161119660408482332423481128600038352147258951772423229],[19138864631164378176055647711995352935065134904103255748190268290992108588628,14282526277736365863821375748687709839392307698935143595732632710176778519757],[20183773658676161990469276414858234178608794783112866811307579993999118293429,5223464433544489066271184294750886227362580875255044558831927430970236355539],[12333466991139269670298178539679773509487545471126920233507132846828588847444,3787586478923104354547687861486563468235879611952775292288436085429794222238]],[[15718373132479769904443326381037437528372212185108294117696143473979328398658,43456740675249348549891878341522275183186932745162972528932808393415299552],[11236864934894600819960883124570686936554376109344998527334431594565774237827,4289247401578837038775845192875793775418122783738936298355403103074020081838],[18580370382199518848261939652153768394883698461842792002922164533882262019935,20516185953882700254387267244708111605796661864845495645678049276372075842359],[20041291712709610738573661974551517833120775539593003477018637287434210072702,6326630253906616820412999166182553773360987412889775567442543181359104720511],[13268971611130152315428629919012388924225656285593904211561391821918930327614,9247437189452353488017802041158840512956111558640958728149597697508914590433],[6267384495557139339708615182113725421733376438932580472141549274050146739549,1832264154031452148715318442722960696977572389206897240030908464579133134237],[16650684165487873559901140599157559153018449083939294496255590830891994564285,14140282729498011406186082176268025578697081678243955538935501306868500498994]],[[1723458149089715907994189658689343304709709060535625667210252753337752162173,4023016874169005249382064394379671330447496454371261692205411970999350949293],[7651670126664625790835334090273463062538865895183205964669372719235003083565,17710652158212212080502343565075513548898593397103675832636832371532093744857],[4247947150009812467217672970806328247513830308400387953244764907353849211641,14500381439127180474801393438175928191199696177607750163263715436006533630877],[21213779524495874664157797605662894019112036728653622806607467354233012380232,1429370857470083395421401524518861545167550347090873730934256398864585069083],[12465277751642747637430517396067173985821959773399832969105187923427872239200,4377704428607835904642653580543541241155601291484645500691968624389522190030],[11283027832501128633761619552392013253304972822086786857121687098087331014745,21463394238922953607096052056881931791797740737164052798044623278557203313720],[19687293493101130967741578773742597470558958652351513582962108464055656171331,4445165696525061401582979300506082669540223774145877762689724631935313716632]],[[745924679191739894055143748466112994378439645681039136007774787076115375124,13132169670125192016391258838554965176628317453468870968867717287446623320643],[2126777833939378028304266129616145667925849332481755567268747182629795296580,20909608709868730010029182074820840312550443752829480953667886902663547957991],[3388767735894417381503201756905214431625081913405504580464345986403824999889,21014112837214011009096825602791072748195337199912773858499588477762724153070],[10521317016331497094903116740581271122844131442882845700567581775404872949272,13201921794561774338466680421903602920184688290946713194187958007088351657367],[16170260722059932609965743383032703380650557609693540121262881902248073364496,6004983491336500911294872035126141746032033211872472427212274143945425740617],[10275615677574391293596971122111363003313434841806630200532546038183081960924,5955568702561336410725734958627459212680756023420452791680213386065159525989],[19059081014385850734732058652137664919364805650872154944590269874395511868415,19202365837673729366500417038229950532560250566916189579621883380623278182155]],[[4553625243522856553165922942982108474187282402890756796515747778282922584601,16835654219229187428071649241190746119082269636345872682107941472241044260584],[3272293478534046729728233267765357195255129499603632413158978822084188871854,873742823867191038535544062852920538566418819521732785500614249239215175476],[7856986171681248404396064225772749784181602218562773063185003409958949630985,11707218736744382138692483591389641607570557654489363179025201039696228471230],[2902255937308264958973169948617099471543255757887963647238093192858290079050,4092153880227661899721872164083575597602963673456107552146583620177664115673],[18380478859138320895837407377103009470968863533040661874531861881638854174636,14502773952184441371657781525836310753176308880224816843041318743809785835984],[2781117248053224106149213822307598926495461873135153638774638501111353469325,3500056595279027698683405880585654897391289317486204483344715855049598477604],[8880120765926282932795149634761705738498809569874317407549203808931092257005,19080036326648068547894941015038877788526324720587349784852594495705578761000]],[[7252337675475138150830402909353772156046809729627064992143762325769537840623,7601443214415704135008588588192028557655441716696726549510699770097979655628],[436607343827794507835462908831699962173244647704538949914686722631806931932,18500126298578278987997086114400065402270866280547473913420536595663876273004],[18427701611614193839908361166447988195308352665132182219164437649866377475111,5299493942596042045861137432338955179078182570752746487573709678936617478454],[4188155714164125069834512529839479682516489319499446390214266838952761728656,2720966082507704094346897998659841489771837229143573083003847010258396944787],[13256461570028177373135283778770729308216900804505379897951455548375840027026,10722074030307391322177899534114921764931623271723882054692012663305322382747],[9824147497244652955949696442395586567974424828238608972020527958186701134273,15755269950882650791869946186461432242513999576056199368058858215068920022191],[21172488506061181949536573476893375313339715931330476837156243346077173297265,13892434487977776248366965108031841947713544939953824768291380177301871559945]],[[10202326166286888893675634318107715186834588694714750762952081034135561546271,15028154694713144242204861571552635520290993855826554325002991692907421516918],[18486039841380105976272577521609866666900576498507352937328726490052296469859,12766289885372833812620582632847872978085960777075662988932200910695848591357],[1452272927738590248356371174422184656932731110936062990115610832462181634644,3608050114233210789542189629343107890943266759827387991788718454179833288695],[14798240452388909327945424685903532333765637883272751382037716636327236955001,10773894897711848209682368488916121016695006898681985691467605219098835500201],[17204267933132009093604099819536245144503489322639121825381131096467570698650,7704298975420304156332734115679983371345754866278811368869074990486717531131],[8060465662017324080560848316478407038163145149983639907596180500095598669247,20475082166427284188002500222093571716651248980245637602667562336751029856573],[7457566682692308112726332096733260585025339741083447785327706250123165087868,11904519443874922292602150685069370036383697877657723976244907400392778002614]],[[14930624777162656776068112402283260602512252179767747308433194885322661150422,13682963731073238132274278610660469286329368216526659590944079211949686450402],[18705481657148807016785305378773304476425591636333098330324049960258682574070,21315724107376627085778492378001676935454590984229146391746301404292016287653],[12628427235010608529869146871556870477182704310235373946877240509680742038961,15093298104438768585559335868663959710321348106117735180051519837845319121254],[6593907467779318957599440584793099005109789224774644007604434924706249001015,18549596630007199540674697114946251030815675677713256327810772799104711621483],[6271101737045248834759003849256661059806617144229427987717476992610974162336,355748132218964841305454070022507122319085542484477110563322753565651576458],[2116139772133141967317791473319540620104888687412078412336248003979594158546,4004400204967325849492155713520296687406035356901102254880522534085890616486],[4206647028595764233995379982714022410660284578620723510907006350595207905228,19380634286337609988098517090003334645113675227742745065381519159322795845003]],[[12315240965742683516581565369496371929586281338862761742109651525191835544242,18994803742708336446369128568423705404354655742604689352630273180469431952708],[18019403342409608922812569436317484250134945386869657285229378095251425778096,12707009780301102830224094192984906206920666691015255692741008594808694787917],[2592407181901686208061988776764501828311271519595797153264758207470081204331,11847594161160074962679125411562687287595382335410213641115001866587988494499],[3346927026869562921166545684451290646273836362895645367665514203662899621366,15758185693543979820528128025093553492246135914029575732836221618882836493143],[20528686657810499188368147206002308531447185877994439397529705707372170337045,18025396678079701612906003769476076600196287001844168390936182972248852818155],[9799815250059685769827017947834627563597884023490186073806184882963949644596,4998495094322372762314630336611134866447406022687118703953312157819349892603],[16176535527670849161173306151058200762642157343823553073439957507563856439772,21877331533292960470552563236986670222564955589137303622102707801351340670855]]];
|
|
18
|
+
|
|
19
|
+
/// @dev See {ISemaphoreVerifier-verifyProof}.
|
|
20
|
+
function verifyProof(
|
|
21
|
+
uint256 merkleTreeRoot,
|
|
22
|
+
uint256 nullifierHash,
|
|
23
|
+
uint256 signal,
|
|
24
|
+
uint256 externalNullifier,
|
|
25
|
+
uint256[8] calldata proof,
|
|
26
|
+
uint256 merkleTreeDepth
|
|
27
|
+
) external view override {
|
|
28
|
+
signal = _hash(signal);
|
|
29
|
+
externalNullifier = _hash(externalNullifier);
|
|
30
|
+
|
|
31
|
+
Proof memory p;
|
|
32
|
+
|
|
33
|
+
p.A = Pairing.G1Point(proof[0], proof[1]);
|
|
34
|
+
p.B = Pairing.G2Point([proof[2], proof[3]], [proof[4], proof[5]]);
|
|
35
|
+
p.C = Pairing.G1Point(proof[6], proof[7]);
|
|
36
|
+
|
|
37
|
+
VerificationKey memory vk = _getVerificationKey(merkleTreeDepth - 16);
|
|
38
|
+
|
|
39
|
+
Pairing.G1Point memory vk_x = vk.IC[0];
|
|
40
|
+
|
|
41
|
+
vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[1], merkleTreeRoot));
|
|
42
|
+
vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[2], nullifierHash));
|
|
43
|
+
vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[3], signal));
|
|
44
|
+
vk_x = Pairing.addition(vk_x, Pairing.scalar_mul(vk.IC[4], externalNullifier));
|
|
45
|
+
|
|
46
|
+
Pairing.G1Point[] memory p1 = new Pairing.G1Point[](4);
|
|
47
|
+
Pairing.G2Point[] memory p2 = new Pairing.G2Point[](4);
|
|
48
|
+
|
|
49
|
+
p1[0] = Pairing.negate(p.A);
|
|
50
|
+
p2[0] = p.B;
|
|
51
|
+
p1[1] = vk.alfa1;
|
|
52
|
+
p2[1] = vk.beta2;
|
|
53
|
+
p1[2] = vk_x;
|
|
54
|
+
p2[2] = vk.gamma2;
|
|
55
|
+
p1[3] = p.C;
|
|
56
|
+
p2[3] = vk.delta2;
|
|
57
|
+
|
|
58
|
+
Pairing.pairingCheck(p1, p2);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// @dev Creates the verification key for a specific Merkle tree depth.
|
|
62
|
+
/// @param vkPointsIndex: Index of the verification key points.
|
|
63
|
+
/// @return Verification key.
|
|
64
|
+
function _getVerificationKey(uint256 vkPointsIndex) private view returns (VerificationKey memory) {
|
|
65
|
+
VerificationKey memory vk;
|
|
66
|
+
|
|
67
|
+
vk.alfa1 = Pairing.G1Point(
|
|
68
|
+
20491192805390485299153009773594534940189261866228447918068658471970481763042,
|
|
69
|
+
9383485363053290200918347156157836566562967994039712273449902621266178545958
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
vk.beta2 = Pairing.G2Point(
|
|
73
|
+
[
|
|
74
|
+
4252822878758300859123897981450591353533073413197771768651442665752259397132,
|
|
75
|
+
6375614351688725206403948262868962793625744043794305715222011528459656738731
|
|
76
|
+
],
|
|
77
|
+
[
|
|
78
|
+
21847035105528745403288232691147584728191162732299865338377159692350059136679,
|
|
79
|
+
10505242626370262277552901082094356697409835680220590971873171140371331206856
|
|
80
|
+
]
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
vk.gamma2 = Pairing.G2Point(
|
|
84
|
+
[
|
|
85
|
+
11559732032986387107991004021392285783925812861821192530917403151452391805634,
|
|
86
|
+
10857046999023057135944570762232829481370756359578518086990519993285655852781
|
|
87
|
+
],
|
|
88
|
+
[
|
|
89
|
+
4082367875863433681332203403145435568316851327593401208105741076214120093531,
|
|
90
|
+
8495653923123431417604973247489272438418190587263600148770280649306958101930
|
|
91
|
+
]
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
vk.delta2 = Pairing.G2Point(VK_POINTS[vkPointsIndex][0], VK_POINTS[vkPointsIndex][1]);
|
|
95
|
+
|
|
96
|
+
vk.IC = new Pairing.G1Point[](5);
|
|
97
|
+
|
|
98
|
+
vk.IC[0] = Pairing.G1Point(VK_POINTS[vkPointsIndex][2][0], VK_POINTS[vkPointsIndex][2][1]);
|
|
99
|
+
vk.IC[1] = Pairing.G1Point(VK_POINTS[vkPointsIndex][3][0], VK_POINTS[vkPointsIndex][3][1]);
|
|
100
|
+
vk.IC[2] = Pairing.G1Point(VK_POINTS[vkPointsIndex][4][0], VK_POINTS[vkPointsIndex][4][1]);
|
|
101
|
+
vk.IC[3] = Pairing.G1Point(VK_POINTS[vkPointsIndex][5][0], VK_POINTS[vkPointsIndex][5][1]);
|
|
102
|
+
vk.IC[4] = Pairing.G1Point(VK_POINTS[vkPointsIndex][6][0], VK_POINTS[vkPointsIndex][6][1]);
|
|
103
|
+
|
|
104
|
+
return vk;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/// @dev Creates a keccak256 hash of a message compatible with the SNARK scalar modulus.
|
|
108
|
+
/// @param message: Message to be hashed.
|
|
109
|
+
/// @return Message digest.
|
|
110
|
+
function _hash(uint256 message) private pure returns (uint256) {
|
|
111
|
+
return uint256(keccak256(abi.encodePacked(message))) >> 8;
|
|
112
|
+
}
|
|
113
|
+
}
|