@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 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/IVerifier.sol";
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 is ISemaphore, SemaphoreCore, SemaphoreGroups {
11
- /// @dev Gets a tree depth and returns its verifier address.
12
- mapping(uint256 => IVerifier) public verifiers;
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 (address(verifiers[merkleTreeDepth]) == address(0)) {
33
+ if (merkleTreeDepth < 16 || merkleTreeDepth > 32) {
30
34
  revert Semaphore__MerkleTreeDepthIsNotSupported();
31
35
  }
32
36
  _;
33
37
  }
34
38
 
35
- /// @dev Initializes the Semaphore verifiers used to verify the user's ZK proofs.
36
- /// @param _verifiers: List of Semaphore verifiers (address and related Merkle tree depth).
37
- constructor(Verifier[] memory _verifiers) {
38
- for (uint8 i = 0; i < _verifiers.length; ) {
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, zeroValue);
51
+ _createGroup(groupId, merkleTreeDepth);
55
52
 
56
53
  groups[groupId].admin = admin;
57
- groups[groupId].merkleRootDuration = 1 hours;
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 merkleTreeRootDuration
64
+ uint256 merkleTreeDuration
69
65
  ) external override onlySupportedMerkleTreeDepth(merkleTreeDepth) {
70
- _createGroup(groupId, merkleTreeDepth, zeroValue);
66
+ _createGroup(groupId, merkleTreeDepth);
71
67
 
72
68
  groups[groupId].admin = admin;
73
- groups[groupId].merkleRootDuration = merkleTreeRootDuration;
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 (uint8 i = 0; i < identityCommitments.length; ) {
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
- bytes32 signal,
155
+ uint256 signal,
139
156
  uint256 nullifierHash,
140
157
  uint256 externalNullifier,
141
158
  uint256[8] calldata proof
142
159
  ) external override {
143
- uint256 currentMerkleTreeRoot = getMerkleTreeRoot(groupId);
160
+ uint256 merkleTreeDepth = getMerkleTreeDepth(groupId);
144
161
 
145
- if (currentMerkleTreeRoot == 0) {
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 merkleRootDuration = groups[groupId].merkleRootDuration;
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 + merkleRootDuration) {
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
- uint256 merkleTreeDepth = getMerkleTreeDepth(groupId);
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
 
@@ -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
+ }
@@ -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 The following code allows you to create groups, add and remove members.
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 merkleTree;
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
- /// @param zeroValue: Zero value of the tree.
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
- merkleTree[groupId].init(merkleTreeDepth, zeroValue);
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
- merkleTree[groupId].insert(identityCommitment);
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 (getMerkleTreeRoot(groupId) == 0) {
65
+ if (getMerkleTreeDepth(groupId) == 0) {
71
66
  revert Semaphore__GroupDoesNotExist();
72
67
  }
73
68
 
74
- merkleTree[groupId].update(identityCommitment, newIdentityCommitment, proofSiblings, proofPathIndices);
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 (getMerkleTreeRoot(groupId) == 0) {
89
+ if (getMerkleTreeDepth(groupId) == 0) {
95
90
  revert Semaphore__GroupDoesNotExist();
96
91
  }
97
92
 
98
- merkleTree[groupId].remove(identityCommitment, proofSiblings, proofPathIndices);
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 merkleTree[groupId].root;
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 merkleTree[groupId].depth;
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 merkleTree[groupId].numberOfLeaves;
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
+ }