@solarity/zkit 0.3.0-rc.0 → 0.3.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/templates/verifier_groth16.vy.ejs +3 -3
- package/dist/core/templates/verifier_plonk.sol.ejs +534 -436
- package/dist/core/templates/verifier_plonk.vy.ejs +92 -92
- package/package.json +1 -1
- package/src/core/templates/verifier_groth16.vy.ejs +3 -3
- package/src/core/templates/verifier_plonk.sol.ejs +534 -436
- package/src/core/templates/verifier_plonk.vy.ejs +92 -92
|
@@ -6,11 +6,11 @@ pragma solidity >=0.7.0 <0.9.0;
|
|
|
6
6
|
|
|
7
7
|
contract <%=verifier_id%> {
|
|
8
8
|
// Omega
|
|
9
|
-
uint256 constant W1 = <%=w%>;
|
|
9
|
+
uint256 constant W1 = <%=w%>;
|
|
10
10
|
// Scalar field size
|
|
11
|
-
uint256 constant
|
|
11
|
+
uint256 constant SCALAR_SIZE = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
|
|
12
12
|
// Base field size
|
|
13
|
-
uint256 constant
|
|
13
|
+
uint256 constant BASE_SIZE = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
|
|
14
14
|
|
|
15
15
|
// [1]_1
|
|
16
16
|
uint256 constant G1_X = 1;
|
|
@@ -22,10 +22,8 @@ contract <%=verifier_id%> {
|
|
|
22
22
|
uint256 constant G2_Y2 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;
|
|
23
23
|
|
|
24
24
|
// Verification Key data
|
|
25
|
-
uint32 constant N
|
|
26
|
-
|
|
27
|
-
uint16 constant N_LAGRANGE = <%=Math.max(nPublic, 1)%>;
|
|
28
|
-
|
|
25
|
+
uint32 constant N = <%=2**power%>;
|
|
26
|
+
|
|
29
27
|
uint256 constant QM_X = <%=Qm[0]%>;
|
|
30
28
|
uint256 constant QM_Y = <%=Qm[0] == "0" ? "0" : Qm[1]%>;
|
|
31
29
|
uint256 constant QL_X = <%=Ql[0]%>;
|
|
@@ -49,71 +47,72 @@ contract <%=verifier_id%> {
|
|
|
49
47
|
uint256 constant X2_Y1 = <%=X_2[1][0]%>;
|
|
50
48
|
uint256 constant X2_Y2 = <%=X_2[1][1]%>;
|
|
51
49
|
|
|
52
|
-
// Proof
|
|
53
|
-
// Byte offset of every parameter of the
|
|
50
|
+
// Proof values offsets
|
|
51
|
+
// Byte offset of every parameter of the proof array
|
|
54
52
|
// Polynomial commitments
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
uint256 constant P_A = 0;
|
|
54
|
+
uint256 constant P_B = 64;
|
|
55
|
+
uint256 constant P_C = 128;
|
|
56
|
+
uint256 constant P_Z = 192;
|
|
57
|
+
uint256 constant P_T1 = 256;
|
|
58
|
+
uint256 constant P_T2 = 320;
|
|
59
|
+
uint256 constant P_T3 = 384;
|
|
60
|
+
uint256 constant P_WX_I = 448;
|
|
61
|
+
uint256 constant P_WX_IW = 512;
|
|
64
62
|
// Opening evaluations
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
uint256 constant P_EVAL_A = 576;
|
|
64
|
+
uint256 constant P_EVAL_B = 608;
|
|
65
|
+
uint256 constant P_EVAL_C = 640;
|
|
66
|
+
uint256 constant P_EVAL_S1 = 672;
|
|
67
|
+
uint256 constant P_EVAL_S2 = 704;
|
|
68
|
+
uint256 constant P_EVAL_ZW = 736;
|
|
71
69
|
|
|
72
70
|
// Memory data
|
|
73
71
|
// Challenges
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
72
|
+
uint256 constant P_ALPHA = 0;
|
|
73
|
+
uint256 constant P_BETA = 32;
|
|
74
|
+
uint256 constant P_GAMMA = 64;
|
|
75
|
+
uint256 constant P_XI = 96;
|
|
76
|
+
uint256 constant P_XIN = 128;
|
|
77
|
+
uint256 constant P_BETA_XI = 160;
|
|
78
|
+
uint256 constant P_V1 = 192;
|
|
79
|
+
uint256 constant P_V2 = 224;
|
|
80
|
+
uint256 constant P_V3 = 256;
|
|
81
|
+
uint256 constant P_V4 = 288;
|
|
82
|
+
uint256 constant P_V5 = 320;
|
|
83
|
+
uint256 constant P_U = 352;
|
|
86
84
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
85
|
+
uint256 constant P_PI = 384;
|
|
86
|
+
uint256 constant P_EVAL_R0 = 416;
|
|
87
|
+
uint256 constant P_D = 448;
|
|
88
|
+
uint256 constant P_F = 512;
|
|
89
|
+
uint256 constant P_E = 576;
|
|
90
|
+
uint256 constant P_TMP = 640;
|
|
91
|
+
uint256 constant P_ALPHA2 = 704;
|
|
92
|
+
uint256 constant P_ZH = 736;
|
|
93
|
+
uint256 constant P_ZH_INV = 768;
|
|
94
|
+
|
|
95
|
+
uint256 constant P_EVAL_L1 = 800;
|
|
96
|
+
<% let pLastMem = 800+32*nPublic %>
|
|
97
|
+
uint256 constant P_TOTAL_SIZE = <%=pLastMem%>;
|
|
98
|
+
|
|
99
|
+
function verifyProof(
|
|
100
|
+
uint256[24] memory proofArr_,
|
|
101
|
+
uint256[<%=nPublic%>] memory publicSignals_
|
|
102
|
+
) public view returns (bool verified_) {
|
|
104
103
|
assembly {
|
|
105
|
-
function inverse(
|
|
106
|
-
let t := 0
|
|
104
|
+
function inverse(a_, q_) -> inv {
|
|
105
|
+
let t := 0
|
|
107
106
|
let newt := 1
|
|
108
|
-
let r :=
|
|
109
|
-
let newr :=
|
|
110
|
-
let quotient
|
|
111
|
-
let aux
|
|
107
|
+
let r := q_
|
|
108
|
+
let newr := a_
|
|
109
|
+
let quotient := 0
|
|
110
|
+
let aux := 0
|
|
112
111
|
|
|
113
112
|
for { } newr { } {
|
|
114
113
|
quotient := sdiv(r, newr)
|
|
115
114
|
aux := sub(t, mul(quotient, newt))
|
|
116
|
-
t:= newt
|
|
115
|
+
t := newt
|
|
117
116
|
newt:= aux
|
|
118
117
|
|
|
119
118
|
aux := sub(r,mul(quotient, newr))
|
|
@@ -122,68 +121,66 @@ contract <%=verifier_id%> {
|
|
|
122
121
|
}
|
|
123
122
|
|
|
124
123
|
if gt(r, 1) { revert(0,0) }
|
|
125
|
-
if slt(t, 0) { t:= add(t,
|
|
124
|
+
if slt(t, 0) { t:= add(t, q_) }
|
|
126
125
|
|
|
127
126
|
inv := t
|
|
128
127
|
}
|
|
129
128
|
|
|
130
|
-
function inverseArray(
|
|
131
|
-
let pAux := mload(
|
|
132
|
-
let pIn :=
|
|
133
|
-
let lastPIn := add(
|
|
129
|
+
function inverseArray(pVals_, n_) {
|
|
130
|
+
let pAux := mload(64) // Point to the next free position
|
|
131
|
+
let pIn := pVals_
|
|
132
|
+
let lastPIn := add(pVals_, mul(n_, 32)) // Read n elements
|
|
134
133
|
let acc := mload(pIn) // Read the first element
|
|
135
134
|
pIn := add(pIn, 32) // Point to the second element
|
|
136
|
-
let inv
|
|
135
|
+
let inv := 0
|
|
137
136
|
|
|
138
|
-
for { } lt(pIn, lastPIn) {
|
|
139
|
-
pAux := add(pAux, 32)
|
|
137
|
+
for { } lt(pIn, lastPIn) {
|
|
138
|
+
pAux := add(pAux, 32)
|
|
140
139
|
pIn := add(pIn, 32)
|
|
141
140
|
}
|
|
142
141
|
{
|
|
143
142
|
mstore(pAux, acc)
|
|
144
|
-
acc := mulmod(acc, mload(pIn),
|
|
143
|
+
acc := mulmod(acc, mload(pIn), SCALAR_SIZE)
|
|
145
144
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
145
|
+
|
|
146
|
+
acc := inverse(acc, SCALAR_SIZE)
|
|
147
|
+
|
|
148
|
+
// At this point pAux point to the next free position, we subtract 1 to point to the last used
|
|
149
149
|
pAux := sub(pAux, 32)
|
|
150
|
-
// pIn points to the n+1 element, we
|
|
150
|
+
// pIn points to the n+1 element, we subtract to point to n
|
|
151
151
|
pIn := sub(pIn, 32)
|
|
152
|
-
lastPIn :=
|
|
153
|
-
|
|
154
|
-
|
|
152
|
+
lastPIn := pVals_ // We don't process the first element
|
|
153
|
+
|
|
154
|
+
for { } gt(pIn, lastPIn) {
|
|
155
|
+
pAux := sub(pAux, 32)
|
|
155
156
|
pIn := sub(pIn, 32)
|
|
156
157
|
}
|
|
157
158
|
{
|
|
158
|
-
inv := mulmod(acc, mload(pAux),
|
|
159
|
-
acc := mulmod(acc, mload(pIn),
|
|
159
|
+
inv := mulmod(acc, mload(pAux), SCALAR_SIZE)
|
|
160
|
+
acc := mulmod(acc, mload(pIn), SCALAR_SIZE)
|
|
160
161
|
mstore(pIn, inv)
|
|
161
162
|
}
|
|
162
|
-
// pIn points to first element, we just set it
|
|
163
|
+
// pIn points to first element, we just set it
|
|
163
164
|
mstore(pIn, acc)
|
|
164
165
|
}
|
|
165
|
-
|
|
166
|
-
function checkField(
|
|
167
|
-
|
|
168
|
-
mstore(0, 0)
|
|
169
|
-
return(0,0x20)
|
|
170
|
-
}
|
|
166
|
+
|
|
167
|
+
function checkField(signal_) -> res_ {
|
|
168
|
+
res_ := lt(signal_, SCALAR_SIZE)
|
|
171
169
|
}
|
|
172
|
-
|
|
173
|
-
function checkInput() {
|
|
174
|
-
checkField(
|
|
175
|
-
checkField(
|
|
176
|
-
checkField(
|
|
177
|
-
checkField(
|
|
178
|
-
checkField(
|
|
179
|
-
checkField(
|
|
170
|
+
|
|
171
|
+
function checkInput(proof_) -> res_ {
|
|
172
|
+
res_ := checkField(mload(add(proof_, P_EVAL_A)))
|
|
173
|
+
res_ := and(res_, checkField(mload(add(proof_, P_EVAL_B))))
|
|
174
|
+
res_ := and(res_, checkField(mload(add(proof_, P_EVAL_C))))
|
|
175
|
+
res_ := and(res_, checkField(mload(add(proof_, P_EVAL_S1))))
|
|
176
|
+
res_ := and(res_, checkField(mload(add(proof_, P_EVAL_S2))))
|
|
177
|
+
res_ := and(res_, checkField(mload(add(proof_, P_EVAL_ZW))))
|
|
180
178
|
}
|
|
181
179
|
|
|
182
|
-
function calculateChallenges(
|
|
183
|
-
let beta
|
|
184
|
-
let aux
|
|
185
|
-
|
|
186
|
-
let mIn := mload(0x40) // Pointer to the next free memory position
|
|
180
|
+
function calculateChallenges(pMem_, proof_, pubSignals_) {
|
|
181
|
+
let beta := 0
|
|
182
|
+
let aux := 0
|
|
183
|
+
let mIn := mload(64) // Pointer to the next free memory position
|
|
187
184
|
|
|
188
185
|
// Compute challenge.beta & challenge.gamma
|
|
189
186
|
mstore(mIn, QM_X)
|
|
@@ -203,433 +200,517 @@ contract <%=verifier_id%> {
|
|
|
203
200
|
mstore(add(mIn, 448), S3_X)
|
|
204
201
|
mstore(add(mIn, 480), S3_Y)
|
|
205
202
|
|
|
206
|
-
<%for (let i=0; i<nPublic;i++) {%>
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
mstore(add(mIn, <%=
|
|
210
|
-
mstore(add(mIn, <%=
|
|
211
|
-
mstore(add(mIn, <%=
|
|
212
|
-
mstore(add(mIn, <%=
|
|
213
|
-
mstore(add(mIn, <%=
|
|
214
|
-
mstore(add(mIn, <%= 512 + nPublic*32 + 160 %> ), calldataload(add(P_C, 32)))
|
|
203
|
+
<% for (let i = 0; i < nPublic; i++) {%>mstore(add(mIn, <%=512 + i * 32%>), mload(add(pubSignals_, <%=i * 32%>)))
|
|
204
|
+
<% } %>
|
|
205
|
+
mstore(add(mIn, <%=512 + nPublic * 32%>), mload(add(proof_, P_A)))
|
|
206
|
+
mstore(add(mIn, <%=512 + nPublic * 32 + 32%>), mload(add(proof_, add(P_A, 32))))
|
|
207
|
+
mstore(add(mIn, <%=512 + nPublic * 32 + 64%>), mload(add(proof_, P_B)))
|
|
208
|
+
mstore(add(mIn, <%=512 + nPublic * 32 + 96%>), mload(add(proof_, add(P_B, 32))))
|
|
209
|
+
mstore(add(mIn, <%=512 + nPublic * 32 + 128%>), mload(add(proof_, P_C)))
|
|
210
|
+
mstore(add(mIn, <%=512 + nPublic * 32 + 160%>), mload(add(proof_, add(P_C, 32))))
|
|
215
211
|
|
|
216
|
-
beta := mod(keccak256(mIn, <%=
|
|
217
|
-
mstore(add(
|
|
212
|
+
beta := mod(keccak256(mIn, <%=704 + 32 * nPublic%>), SCALAR_SIZE)
|
|
213
|
+
mstore(add(pMem_, P_BETA), beta)
|
|
218
214
|
|
|
219
215
|
// challenges.gamma
|
|
220
|
-
mstore(
|
|
216
|
+
mstore(
|
|
217
|
+
add(pMem_, P_GAMMA),
|
|
218
|
+
mod(keccak256(add(pMem_, P_BETA), 32), SCALAR_SIZE)
|
|
219
|
+
)
|
|
221
220
|
|
|
222
221
|
// challenges.alpha
|
|
223
|
-
mstore(mIn, mload(add(
|
|
224
|
-
mstore(add(mIn, 32), mload(add(
|
|
225
|
-
mstore(add(mIn, 64),
|
|
226
|
-
mstore(add(mIn, 96),
|
|
222
|
+
mstore(mIn, mload(add(pMem_, P_BETA)))
|
|
223
|
+
mstore(add(mIn, 32), mload(add(pMem_, P_GAMMA)))
|
|
224
|
+
mstore(add(mIn, 64), mload(add(proof_, P_Z)))
|
|
225
|
+
mstore(add(mIn, 96), mload(add(proof_, add(P_Z, 32))))
|
|
227
226
|
|
|
228
|
-
aux := mod(keccak256(mIn, 128),
|
|
229
|
-
mstore(add(
|
|
230
|
-
mstore(add(
|
|
227
|
+
aux := mod(keccak256(mIn, 128), SCALAR_SIZE)
|
|
228
|
+
mstore(add(pMem_, P_ALPHA), aux)
|
|
229
|
+
mstore(add(pMem_, P_ALPHA2), mulmod(aux, aux, SCALAR_SIZE))
|
|
231
230
|
|
|
232
231
|
// challenges.xi
|
|
233
232
|
mstore(mIn, aux)
|
|
234
|
-
mstore(add(mIn, 32),
|
|
235
|
-
mstore(add(mIn, 64),
|
|
236
|
-
mstore(add(mIn, 96),
|
|
237
|
-
mstore(add(mIn, 128),
|
|
238
|
-
mstore(add(mIn, 160),
|
|
239
|
-
mstore(add(mIn, 192),
|
|
233
|
+
mstore(add(mIn, 32), mload(add(proof_, P_T1)))
|
|
234
|
+
mstore(add(mIn, 64), mload(add(proof_, add(P_T1, 32))))
|
|
235
|
+
mstore(add(mIn, 96), mload(add(proof_, P_T2)))
|
|
236
|
+
mstore(add(mIn, 128), mload(add(proof_, add(P_T2, 32))))
|
|
237
|
+
mstore(add(mIn, 160), mload(add(proof_, P_T3)))
|
|
238
|
+
mstore(add(mIn, 192), mload(add(proof_, add(P_T3, 32))))
|
|
240
239
|
|
|
241
|
-
aux := mod(keccak256(mIn, 224),
|
|
242
|
-
mstore(
|
|
240
|
+
aux := mod(keccak256(mIn, 224), SCALAR_SIZE)
|
|
241
|
+
mstore(add(pMem_, P_XI), aux)
|
|
243
242
|
|
|
244
243
|
// challenges.v
|
|
245
244
|
mstore(mIn, aux)
|
|
246
|
-
mstore(add(mIn, 32),
|
|
247
|
-
mstore(add(mIn, 64),
|
|
248
|
-
mstore(add(mIn, 96),
|
|
249
|
-
mstore(add(mIn, 128),
|
|
250
|
-
mstore(add(mIn, 160),
|
|
251
|
-
mstore(add(mIn, 192),
|
|
245
|
+
mstore(add(mIn, 32), mload(add(proof_, P_EVAL_A)))
|
|
246
|
+
mstore(add(mIn, 64), mload(add(proof_, P_EVAL_B)))
|
|
247
|
+
mstore(add(mIn, 96), mload(add(proof_, P_EVAL_C)))
|
|
248
|
+
mstore(add(mIn, 128), mload(add(proof_, P_EVAL_S1)))
|
|
249
|
+
mstore(add(mIn, 160), mload(add(proof_, P_EVAL_S2)))
|
|
250
|
+
mstore(add(mIn, 192), mload(add(proof_, P_EVAL_ZW)))
|
|
252
251
|
|
|
253
|
-
let v1 := mod(keccak256(mIn, 224),
|
|
254
|
-
mstore(add(
|
|
252
|
+
let v1 := mod(keccak256(mIn, 224), SCALAR_SIZE)
|
|
253
|
+
mstore(add(pMem_, P_V1), v1)
|
|
255
254
|
|
|
256
255
|
// challenges.beta * challenges.xi
|
|
257
|
-
mstore(add(
|
|
256
|
+
mstore(add(pMem_, P_BETA_XI), mulmod(beta, aux, SCALAR_SIZE))
|
|
258
257
|
|
|
259
258
|
// challenges.xi^n
|
|
260
|
-
<%for (let i=0; i<power;i++) {%>
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
mstore(add(pMem, P_XIN), aux)
|
|
259
|
+
<% for (let i = 0; i < power; i++) {%>aux := mulmod(aux, aux, SCALAR_SIZE)
|
|
260
|
+
<% } %>
|
|
261
|
+
mstore(add(pMem_, P_XIN), aux)
|
|
264
262
|
|
|
265
263
|
// Zh
|
|
266
|
-
aux:=
|
|
267
|
-
mstore(add(
|
|
268
|
-
mstore(add(
|
|
264
|
+
aux := addmod(aux, sub(SCALAR_SIZE, 1), SCALAR_SIZE)
|
|
265
|
+
mstore(add(pMem_, P_ZH), aux)
|
|
266
|
+
mstore(add(pMem_, P_ZH_INV), aux) // We will invert later together with lagrange pols
|
|
269
267
|
|
|
270
268
|
// challenges.v^2, challenges.v^3, challenges.v^4, challenges.v^5
|
|
271
|
-
aux := mulmod(v1, v1,
|
|
272
|
-
mstore(add(
|
|
273
|
-
aux := mulmod(aux, v1,
|
|
274
|
-
mstore(add(
|
|
275
|
-
aux := mulmod(aux, v1,
|
|
276
|
-
mstore(add(
|
|
277
|
-
aux := mulmod(aux, v1,
|
|
278
|
-
mstore(add(
|
|
269
|
+
aux := mulmod(v1, v1, SCALAR_SIZE)
|
|
270
|
+
mstore(add(pMem_, P_V2), aux)
|
|
271
|
+
aux := mulmod(aux, v1, SCALAR_SIZE)
|
|
272
|
+
mstore(add(pMem_, P_V3), aux)
|
|
273
|
+
aux := mulmod(aux, v1, SCALAR_SIZE)
|
|
274
|
+
mstore(add(pMem_, P_V4), aux)
|
|
275
|
+
aux := mulmod(aux, v1, SCALAR_SIZE)
|
|
276
|
+
mstore(add(pMem_, P_V5), aux)
|
|
279
277
|
|
|
280
278
|
// challenges.u
|
|
281
|
-
mstore(mIn,
|
|
282
|
-
mstore(add(mIn, 32),
|
|
283
|
-
mstore(add(mIn, 64),
|
|
284
|
-
mstore(add(mIn, 96),
|
|
279
|
+
mstore(mIn, mload(add(proof_, P_WX_I)))
|
|
280
|
+
mstore(add(mIn, 32), mload(add(proof_, add(P_WX_I, 32))))
|
|
281
|
+
mstore(add(mIn, 64), mload(add(proof_, P_WX_IW)))
|
|
282
|
+
mstore(add(mIn, 96), mload(add(proof_, add(P_WX_IW, 32))))
|
|
285
283
|
|
|
286
|
-
mstore(add(
|
|
284
|
+
mstore(add(pMem_, P_U), mod(keccak256(mIn, 128), SCALAR_SIZE))
|
|
287
285
|
}
|
|
288
286
|
|
|
289
|
-
function calculateLagrange(
|
|
290
|
-
let w := 1
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
sub(
|
|
299
|
-
|
|
300
|
-
w
|
|
301
|
-
),
|
|
302
|
-
Q
|
|
287
|
+
function calculateLagrange(pMem_) {
|
|
288
|
+
let w := 1
|
|
289
|
+
|
|
290
|
+
for { let i := 0 } lt(i, <%=nPublic%>) { i := add(i, 1) } {
|
|
291
|
+
mstore(
|
|
292
|
+
add(pMem_, add(P_EVAL_L1, mul(i, 32))),
|
|
293
|
+
mulmod(
|
|
294
|
+
N,
|
|
295
|
+
mod(
|
|
296
|
+
add(sub(mload(add(pMem_, P_XI)), w), SCALAR_SIZE),
|
|
297
|
+
SCALAR_SIZE
|
|
303
298
|
),
|
|
304
|
-
|
|
305
|
-
)
|
|
306
|
-
Q
|
|
299
|
+
SCALAR_SIZE
|
|
300
|
+
)
|
|
307
301
|
)
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
inverseArray(add(pMem, P_ZH_INV), <%=Math.max(nPublic, 1)+1%> )
|
|
302
|
+
|
|
303
|
+
w := mulmod(w, W1, SCALAR_SIZE)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
inverseArray(add(pMem_, P_ZH_INV), <%=nPublic + 1%>)
|
|
315
307
|
|
|
316
|
-
let zh := mload(add(
|
|
308
|
+
let zh := mload(add(pMem_, P_ZH))
|
|
317
309
|
w := 1
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
mulmod(
|
|
323
|
-
mload(add(pMem, P_EVAL_L1 )),
|
|
324
|
-
zh,
|
|
325
|
-
Q
|
|
326
|
-
)
|
|
327
|
-
)
|
|
328
|
-
<% } else { %>
|
|
329
|
-
mstore(
|
|
330
|
-
add(pMem, P_EVAL_L<%=i%>),
|
|
331
|
-
mulmod(
|
|
332
|
-
w,
|
|
310
|
+
|
|
311
|
+
for { let i := 0 } lt(i, <%=nPublic%>) { i := add(i, 1) } {
|
|
312
|
+
mstore(
|
|
313
|
+
add(pMem_, add(P_EVAL_L1, mul(i, 32))),
|
|
333
314
|
mulmod(
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
315
|
+
w,
|
|
316
|
+
mulmod(
|
|
317
|
+
mload(add(pMem_, add(P_EVAL_L1, mul(i, 32)))),
|
|
318
|
+
zh,
|
|
319
|
+
SCALAR_SIZE
|
|
320
|
+
),
|
|
321
|
+
SCALAR_SIZE
|
|
322
|
+
)
|
|
339
323
|
)
|
|
340
|
-
)
|
|
341
|
-
<% } %>
|
|
342
|
-
<% if (i<Math.max(nPublic, 1)) { %>
|
|
343
|
-
w := mulmod(w, W1, Q)
|
|
344
|
-
<% } %>
|
|
345
|
-
<% } %>
|
|
346
|
-
|
|
347
324
|
|
|
325
|
+
w := mulmod(w, W1, SCALAR_SIZE)
|
|
326
|
+
}
|
|
348
327
|
}
|
|
349
328
|
|
|
350
|
-
function calculatePI(
|
|
351
|
-
let
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
add(
|
|
329
|
+
function calculatePI(pMem_, pPub_) {
|
|
330
|
+
let pi := 0
|
|
331
|
+
|
|
332
|
+
for { let i := 0 } lt(i, <%=nPublic%>) { i := add(i, 1) } {
|
|
333
|
+
pi := addmod(
|
|
356
334
|
sub(
|
|
357
|
-
|
|
335
|
+
SCALAR_SIZE,
|
|
358
336
|
mulmod(
|
|
359
|
-
mload(add(
|
|
360
|
-
|
|
361
|
-
|
|
337
|
+
mload(add(pMem_, add(P_EVAL_L1, mul(i, 32)))),
|
|
338
|
+
mload(add(pPub_, mul(i, 32))),
|
|
339
|
+
SCALAR_SIZE
|
|
362
340
|
)
|
|
363
341
|
),
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
mstore(add(pMem, P_PI), pl)
|
|
342
|
+
pi,
|
|
343
|
+
SCALAR_SIZE
|
|
344
|
+
)
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
mstore(add(pMem_, P_PI), pi)
|
|
371
348
|
}
|
|
372
349
|
|
|
373
|
-
function calculateR0(
|
|
374
|
-
let e1 := mload(add(
|
|
350
|
+
function calculateR0(pMem_, proof_) {
|
|
351
|
+
let e1 := mload(add(pMem_, P_PI))
|
|
375
352
|
|
|
376
|
-
let e2 :=
|
|
353
|
+
let e2 := mulmod(
|
|
354
|
+
mload(add(pMem_, P_EVAL_L1)),
|
|
355
|
+
mload(add(pMem_, P_ALPHA2)),
|
|
356
|
+
SCALAR_SIZE
|
|
357
|
+
)
|
|
377
358
|
|
|
378
359
|
let e3a := addmod(
|
|
379
|
-
|
|
380
|
-
mulmod(
|
|
381
|
-
|
|
382
|
-
|
|
360
|
+
mload(add(proof_, P_EVAL_A)),
|
|
361
|
+
mulmod(
|
|
362
|
+
mload(add(pMem_, P_BETA)),
|
|
363
|
+
mload(add(proof_, P_EVAL_S1)),
|
|
364
|
+
SCALAR_SIZE
|
|
365
|
+
),
|
|
366
|
+
SCALAR_SIZE
|
|
367
|
+
)
|
|
368
|
+
e3a := addmod(e3a, mload(add(pMem_, P_GAMMA)), SCALAR_SIZE)
|
|
383
369
|
|
|
384
370
|
let e3b := addmod(
|
|
385
|
-
|
|
386
|
-
mulmod(
|
|
387
|
-
|
|
388
|
-
|
|
371
|
+
mload(add(proof_, P_EVAL_B)),
|
|
372
|
+
mulmod(
|
|
373
|
+
mload(add(pMem_, P_BETA)),
|
|
374
|
+
mload(add(proof_, P_EVAL_S2)),
|
|
375
|
+
SCALAR_SIZE
|
|
376
|
+
),
|
|
377
|
+
SCALAR_SIZE
|
|
378
|
+
)
|
|
379
|
+
e3b := addmod(e3b, mload(add(pMem_, P_GAMMA)), SCALAR_SIZE)
|
|
389
380
|
|
|
390
381
|
let e3c := addmod(
|
|
391
|
-
|
|
392
|
-
mload(add(
|
|
393
|
-
|
|
382
|
+
mload(add(proof_, P_EVAL_C)),
|
|
383
|
+
mload(add(pMem_, P_GAMMA)),
|
|
384
|
+
SCALAR_SIZE
|
|
385
|
+
)
|
|
394
386
|
|
|
395
|
-
let e3 := mulmod(mulmod(e3a, e3b,
|
|
396
|
-
e3 := mulmod(e3,
|
|
397
|
-
e3 := mulmod(e3, mload(add(
|
|
387
|
+
let e3 := mulmod(mulmod(e3a, e3b, SCALAR_SIZE), e3c, SCALAR_SIZE)
|
|
388
|
+
e3 := mulmod(e3, mload(add(proof_, P_EVAL_ZW)), SCALAR_SIZE)
|
|
389
|
+
e3 := mulmod(e3, mload(add(pMem_, P_ALPHA)), SCALAR_SIZE)
|
|
398
390
|
|
|
399
|
-
let r0 := addmod(
|
|
400
|
-
|
|
391
|
+
let r0 := addmod(
|
|
392
|
+
e1,
|
|
393
|
+
mod(sub(SCALAR_SIZE, e2), SCALAR_SIZE),
|
|
394
|
+
SCALAR_SIZE
|
|
395
|
+
)
|
|
396
|
+
r0 := addmod(r0, mod(sub(SCALAR_SIZE, e3), SCALAR_SIZE), SCALAR_SIZE)
|
|
401
397
|
|
|
402
|
-
mstore(add(
|
|
398
|
+
mstore(add(pMem_, P_EVAL_R0), r0)
|
|
403
399
|
}
|
|
404
400
|
|
|
405
|
-
function g1_set(
|
|
406
|
-
mstore(
|
|
407
|
-
mstore(add(
|
|
401
|
+
function g1_set(pR_, pP_) {
|
|
402
|
+
mstore(pR_, mload(pP_))
|
|
403
|
+
mstore(add(pR_, 32), mload(add(pP_,32)))
|
|
408
404
|
}
|
|
409
405
|
|
|
410
|
-
function g1_setC(
|
|
411
|
-
mstore(
|
|
412
|
-
mstore(add(
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
function g1_calldataSet(pR, pP) {
|
|
416
|
-
mstore(pR, calldataload(pP))
|
|
417
|
-
mstore(add(pR, 32), calldataload(add(pP, 32)))
|
|
406
|
+
function g1_setC(pR_, x_, y_) {
|
|
407
|
+
mstore(pR_, x_)
|
|
408
|
+
mstore(add(pR_, 32), y_)
|
|
418
409
|
}
|
|
419
410
|
|
|
420
|
-
function g1_acc(
|
|
421
|
-
let mIn := mload(
|
|
422
|
-
mstore(mIn, mload(
|
|
423
|
-
mstore(add(mIn,32), mload(add(
|
|
424
|
-
mstore(add(mIn,64), mload(
|
|
425
|
-
mstore(add(mIn,96), mload(add(
|
|
411
|
+
function g1_acc(pR_, pP_) -> res_ {
|
|
412
|
+
let mIn := mload(64)
|
|
413
|
+
mstore(mIn, mload(pR_))
|
|
414
|
+
mstore(add(mIn,32), mload(add(pR_, 32)))
|
|
415
|
+
mstore(add(mIn,64), mload(pP_))
|
|
416
|
+
mstore(add(mIn,96), mload(add(pP_, 32)))
|
|
426
417
|
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
if iszero(success) {
|
|
430
|
-
mstore(0, 0)
|
|
431
|
-
return(0,0x20)
|
|
432
|
-
}
|
|
418
|
+
res_ := staticcall(sub(gas(), 2000), 6, mIn, 128, pR_, 64)
|
|
433
419
|
}
|
|
434
420
|
|
|
435
|
-
function
|
|
436
|
-
let
|
|
437
|
-
|
|
438
|
-
mstore(mIn,
|
|
439
|
-
mstore(add(mIn,
|
|
440
|
-
mstore(add(mIn,64), s)
|
|
421
|
+
function g1_mulAccC(pR_, x_, y_, s_) -> res_ {
|
|
422
|
+
let mIn := mload(64)
|
|
423
|
+
mstore(mIn, x_)
|
|
424
|
+
mstore(add(mIn,32), y_)
|
|
425
|
+
mstore(add(mIn,64), s_)
|
|
441
426
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
if iszero(success) {
|
|
445
|
-
mstore(0, 0)
|
|
446
|
-
return(0,0x20)
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
mstore(add(mIn,64), mload(pR))
|
|
450
|
-
mstore(add(mIn,96), mload(add(pR, 32)))
|
|
427
|
+
res_ := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)
|
|
451
428
|
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
if iszero(success) {
|
|
455
|
-
mstore(0, 0)
|
|
456
|
-
return(0,0x20)
|
|
429
|
+
if iszero(res_) {
|
|
430
|
+
leave
|
|
457
431
|
}
|
|
458
|
-
|
|
459
|
-
}
|
|
460
432
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
let mIn := mload(0x40)
|
|
464
|
-
mstore(mIn, x)
|
|
465
|
-
mstore(add(mIn,32), y)
|
|
466
|
-
mstore(add(mIn,64), s)
|
|
433
|
+
mstore(add(mIn,64), mload(pR_))
|
|
434
|
+
mstore(add(mIn,96), mload(add(pR_, 32)))
|
|
467
435
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
if iszero(success) {
|
|
471
|
-
mstore(0, 0)
|
|
472
|
-
return(0,0x20)
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
mstore(add(mIn,64), mload(pR))
|
|
476
|
-
mstore(add(mIn,96), mload(add(pR, 32)))
|
|
477
|
-
|
|
478
|
-
success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)
|
|
479
|
-
|
|
480
|
-
if iszero(success) {
|
|
481
|
-
mstore(0, 0)
|
|
482
|
-
return(0,0x20)
|
|
483
|
-
}
|
|
436
|
+
res_ := staticcall(sub(gas(), 2000), 6, mIn, 128, pR_, 64)
|
|
484
437
|
}
|
|
485
438
|
|
|
486
|
-
function g1_mulSetC(
|
|
487
|
-
let
|
|
488
|
-
|
|
489
|
-
mstore(mIn,
|
|
490
|
-
mstore(add(mIn,
|
|
491
|
-
mstore(add(mIn,64), s)
|
|
439
|
+
function g1_mulSetC(pR_, x_, y_, s_) -> res_ {
|
|
440
|
+
let mIn := mload(64)
|
|
441
|
+
mstore(mIn, x_)
|
|
442
|
+
mstore(add(mIn,32), y_)
|
|
443
|
+
mstore(add(mIn,64), s_)
|
|
492
444
|
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
if iszero(success) {
|
|
496
|
-
mstore(0, 0)
|
|
497
|
-
return(0,0x20)
|
|
498
|
-
}
|
|
445
|
+
res_ := staticcall(sub(gas(), 2000), 7, mIn, 96, pR_, 64)
|
|
499
446
|
}
|
|
500
447
|
|
|
501
|
-
function g1_mulSet(
|
|
502
|
-
g1_mulSetC(
|
|
448
|
+
function g1_mulSet(pR_, pP_, s_) -> res_ {
|
|
449
|
+
res_ := g1_mulSetC(pR_, mload(pP_), mload(add(pP_, 32)), s_)
|
|
503
450
|
}
|
|
504
451
|
|
|
505
|
-
function calculateD(
|
|
506
|
-
let _pD:= add(
|
|
507
|
-
let gamma := mload(add(
|
|
508
|
-
let mIn := mload(
|
|
509
|
-
mstore(
|
|
452
|
+
function calculateD(pMem_, proof_) -> isOk_ {
|
|
453
|
+
let _pD := add(pMem_, P_D)
|
|
454
|
+
let gamma := mload(add(pMem_, P_GAMMA))
|
|
455
|
+
let mIn := mload(64)
|
|
456
|
+
mstore(64, add(mIn, 256)) // d1, d2, d3 & d4 (4 * 64 bytes)
|
|
510
457
|
|
|
511
458
|
g1_setC(_pD, QC_X, QC_Y)
|
|
512
|
-
g1_mulAccC(_pD, QM_X, QM_Y, mulmod(calldataload(P_EVAL_A), calldataload(P_EVAL_B), Q))
|
|
513
|
-
g1_mulAccC(_pD, QL_X, QL_Y, calldataload(P_EVAL_A))
|
|
514
|
-
g1_mulAccC(_pD, QR_X, QR_Y, calldataload(P_EVAL_B))
|
|
515
|
-
g1_mulAccC(_pD, QO_X, QO_Y, calldataload(P_EVAL_C))
|
|
516
459
|
|
|
517
|
-
|
|
460
|
+
if iszero(
|
|
461
|
+
g1_mulAccC(
|
|
462
|
+
_pD, QM_X, QM_Y,
|
|
463
|
+
mulmod(
|
|
464
|
+
mload(add(proof_, P_EVAL_A)),
|
|
465
|
+
mload(add(proof_, P_EVAL_B)),
|
|
466
|
+
SCALAR_SIZE
|
|
467
|
+
)
|
|
468
|
+
)
|
|
469
|
+
) {
|
|
470
|
+
leave
|
|
471
|
+
}
|
|
472
|
+
if iszero(g1_mulAccC(_pD, QL_X, QL_Y, mload(add(proof_, P_EVAL_A)))) {
|
|
473
|
+
leave
|
|
474
|
+
}
|
|
475
|
+
if iszero(g1_mulAccC(_pD, QR_X, QR_Y, mload(add(proof_, P_EVAL_B)))) {
|
|
476
|
+
leave
|
|
477
|
+
}
|
|
478
|
+
if iszero(g1_mulAccC(_pD, QO_X, QO_Y, mload(add(proof_, P_EVAL_C)))) {
|
|
479
|
+
leave
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
let betaxi := mload(add(pMem_, P_BETA_XI))
|
|
518
483
|
let val1 := addmod(
|
|
519
|
-
addmod(
|
|
520
|
-
gamma,
|
|
484
|
+
addmod(mload(add(proof_, P_EVAL_A)), betaxi, SCALAR_SIZE),
|
|
485
|
+
gamma,
|
|
486
|
+
SCALAR_SIZE
|
|
487
|
+
)
|
|
521
488
|
|
|
522
489
|
let val2 := addmod(
|
|
523
490
|
addmod(
|
|
524
|
-
|
|
525
|
-
mulmod(betaxi, K1,
|
|
526
|
-
|
|
491
|
+
mload(add(proof_, P_EVAL_B)),
|
|
492
|
+
mulmod(betaxi, K1, SCALAR_SIZE),
|
|
493
|
+
SCALAR_SIZE
|
|
494
|
+
),
|
|
495
|
+
gamma,
|
|
496
|
+
SCALAR_SIZE
|
|
497
|
+
)
|
|
527
498
|
|
|
528
499
|
let val3 := addmod(
|
|
529
500
|
addmod(
|
|
530
|
-
|
|
531
|
-
mulmod(betaxi, K2,
|
|
532
|
-
|
|
501
|
+
mload(add(proof_, P_EVAL_C)),
|
|
502
|
+
mulmod(betaxi, K2, SCALAR_SIZE),
|
|
503
|
+
SCALAR_SIZE
|
|
504
|
+
),
|
|
505
|
+
gamma,
|
|
506
|
+
SCALAR_SIZE
|
|
507
|
+
)
|
|
533
508
|
|
|
534
509
|
let d2a := mulmod(
|
|
535
|
-
mulmod(mulmod(val1, val2,
|
|
536
|
-
mload(add(
|
|
537
|
-
|
|
510
|
+
mulmod(mulmod(val1, val2, SCALAR_SIZE), val3, SCALAR_SIZE),
|
|
511
|
+
mload(add(pMem_, P_ALPHA)),
|
|
512
|
+
SCALAR_SIZE
|
|
538
513
|
)
|
|
539
514
|
|
|
540
515
|
let d2b := mulmod(
|
|
541
|
-
mload(add(
|
|
542
|
-
mload(add(
|
|
543
|
-
|
|
516
|
+
mload(add(pMem_, P_EVAL_L1)),
|
|
517
|
+
mload(add(pMem_, P_ALPHA2)),
|
|
518
|
+
SCALAR_SIZE
|
|
544
519
|
)
|
|
545
520
|
|
|
546
521
|
// We'll use mIn to save d2
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
522
|
+
g1_set(add(mIn, 192), add(proof_, P_Z))
|
|
523
|
+
|
|
524
|
+
if iszero(
|
|
525
|
+
g1_mulSet(
|
|
526
|
+
mIn,
|
|
527
|
+
add(mIn, 192),
|
|
528
|
+
addmod(
|
|
529
|
+
addmod(d2a, d2b, SCALAR_SIZE),
|
|
530
|
+
mload(add(pMem_, P_U)),
|
|
531
|
+
SCALAR_SIZE
|
|
532
|
+
)
|
|
533
|
+
)
|
|
534
|
+
) {
|
|
535
|
+
leave
|
|
536
|
+
}
|
|
553
537
|
|
|
554
538
|
val1 := addmod(
|
|
555
539
|
addmod(
|
|
556
|
-
|
|
557
|
-
mulmod(
|
|
558
|
-
|
|
540
|
+
mload(add(proof_, P_EVAL_A)),
|
|
541
|
+
mulmod(
|
|
542
|
+
mload(add(pMem_, P_BETA)),
|
|
543
|
+
mload(add(proof_, P_EVAL_S1)),
|
|
544
|
+
SCALAR_SIZE
|
|
545
|
+
),
|
|
546
|
+
SCALAR_SIZE
|
|
547
|
+
),
|
|
548
|
+
gamma,
|
|
549
|
+
SCALAR_SIZE
|
|
550
|
+
)
|
|
559
551
|
|
|
560
552
|
val2 := addmod(
|
|
561
553
|
addmod(
|
|
562
|
-
|
|
563
|
-
mulmod(
|
|
564
|
-
|
|
565
|
-
|
|
554
|
+
mload(add(proof_, P_EVAL_B)),
|
|
555
|
+
mulmod(
|
|
556
|
+
mload(add(pMem_, P_BETA)),
|
|
557
|
+
mload(add(proof_, P_EVAL_S2)),
|
|
558
|
+
SCALAR_SIZE
|
|
559
|
+
),
|
|
560
|
+
SCALAR_SIZE
|
|
561
|
+
),
|
|
562
|
+
gamma,
|
|
563
|
+
SCALAR_SIZE
|
|
564
|
+
)
|
|
565
|
+
|
|
566
566
|
val3 := mulmod(
|
|
567
|
-
mulmod(mload(add(
|
|
568
|
-
|
|
569
|
-
|
|
567
|
+
mulmod(mload(add(pMem_, P_ALPHA)), mload(add(pMem_, P_BETA)), SCALAR_SIZE),
|
|
568
|
+
mload(add(proof_, P_EVAL_ZW)),
|
|
569
|
+
SCALAR_SIZE
|
|
570
|
+
)
|
|
570
571
|
|
|
571
572
|
// We'll use mIn + 64 to save d3
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
573
|
+
if iszero(
|
|
574
|
+
g1_mulSetC(
|
|
575
|
+
add(mIn, 64), S3_X, S3_Y,
|
|
576
|
+
mulmod(mulmod(val1, val2, SCALAR_SIZE), val3, SCALAR_SIZE)
|
|
577
|
+
)
|
|
578
|
+
) {
|
|
579
|
+
leave
|
|
580
|
+
}
|
|
577
581
|
|
|
578
582
|
// We'll use mIn + 128 to save d4
|
|
579
|
-
|
|
583
|
+
g1_set(add(mIn, 128), add(proof_, P_T1))
|
|
584
|
+
|
|
585
|
+
if iszero(
|
|
586
|
+
g1_mulAccC(
|
|
587
|
+
add(mIn, 128),
|
|
588
|
+
mload(add(proof_, P_T2)),
|
|
589
|
+
mload(add(proof_, add(P_T2, 32))),
|
|
590
|
+
mload(add(pMem_, P_XIN))
|
|
591
|
+
)
|
|
592
|
+
) {
|
|
593
|
+
leave
|
|
594
|
+
}
|
|
580
595
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
596
|
+
let xin2 := mulmod(
|
|
597
|
+
mload(add(pMem_, P_XIN)),
|
|
598
|
+
mload(add(pMem_, P_XIN)),
|
|
599
|
+
SCALAR_SIZE
|
|
600
|
+
)
|
|
601
|
+
|
|
602
|
+
if iszero(
|
|
603
|
+
g1_mulAccC(
|
|
604
|
+
add(mIn, 128),
|
|
605
|
+
mload(add(proof_, P_T3)),
|
|
606
|
+
mload(add(proof_, add(P_T3, 32))),
|
|
607
|
+
xin2
|
|
608
|
+
)
|
|
609
|
+
) {
|
|
610
|
+
leave
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
if iszero(
|
|
614
|
+
g1_mulSetC(
|
|
615
|
+
add(mIn, 128),
|
|
616
|
+
mload(add(mIn, 128)),
|
|
617
|
+
mload(add(mIn, 160)),
|
|
618
|
+
mload(add(pMem_, P_ZH))
|
|
619
|
+
)
|
|
620
|
+
) {
|
|
621
|
+
leave
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
mstore(add(add(mIn, 64), 32), mod(sub(BASE_SIZE, mload(add(add(mIn, 64), 32))), BASE_SIZE))
|
|
625
|
+
mstore(add(mIn, 160), mod(sub(BASE_SIZE, mload(add(mIn, 160))), BASE_SIZE))
|
|
586
626
|
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
g1_acc(_pD, mIn)
|
|
590
|
-
|
|
591
|
-
|
|
627
|
+
if iszero(g1_acc(_pD, mIn)) { leave }
|
|
628
|
+
if iszero(g1_acc(_pD, add(mIn, 64))) { leave }
|
|
629
|
+
if iszero(g1_acc(_pD, add(mIn, 128))) { leave }
|
|
630
|
+
|
|
631
|
+
isOk_ := 1
|
|
592
632
|
}
|
|
593
633
|
|
|
594
|
-
function calculateF(
|
|
595
|
-
let p := add(
|
|
596
|
-
|
|
597
|
-
g1_set(p, add(
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
634
|
+
function calculateF(pMem_, proof_) -> isOk_ {
|
|
635
|
+
let p := add(pMem_, P_F)
|
|
636
|
+
|
|
637
|
+
g1_set(p, add(pMem_, P_D))
|
|
638
|
+
|
|
639
|
+
if iszero(
|
|
640
|
+
g1_mulAccC(
|
|
641
|
+
p,
|
|
642
|
+
mload(add(proof_, P_A)),
|
|
643
|
+
mload(add(proof_, add(P_A, 32))),
|
|
644
|
+
mload(add(pMem_, P_V1))
|
|
645
|
+
)
|
|
646
|
+
) {
|
|
647
|
+
leave
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
if iszero(
|
|
651
|
+
g1_mulAccC(
|
|
652
|
+
p,
|
|
653
|
+
mload(add(proof_, P_B)),
|
|
654
|
+
mload(add(proof_, add(P_B, 32))),
|
|
655
|
+
mload(add(pMem_, P_V2))
|
|
656
|
+
)
|
|
657
|
+
) {
|
|
658
|
+
leave
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
if iszero(
|
|
662
|
+
g1_mulAccC(
|
|
663
|
+
p,
|
|
664
|
+
mload(add(proof_, P_C)),
|
|
665
|
+
mload(add(proof_, add(P_C, 32))),
|
|
666
|
+
mload(add(pMem_, P_V3))
|
|
667
|
+
)
|
|
668
|
+
) {
|
|
669
|
+
leave
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
if iszero(g1_mulAccC(p, S1_X, S1_Y, mload(add(pMem_, P_V4)))) {
|
|
673
|
+
leave
|
|
674
|
+
}
|
|
675
|
+
if iszero(g1_mulAccC(p, S2_X, S2_Y, mload(add(pMem_, P_V5)))) {
|
|
676
|
+
leave
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
isOk_ := 1
|
|
603
680
|
}
|
|
604
681
|
|
|
605
|
-
function calculateE(
|
|
606
|
-
let s := mod(sub(
|
|
682
|
+
function calculateE(pMem_, proof_) -> isOk_ {
|
|
683
|
+
let s := mod(sub(SCALAR_SIZE, mload(add(pMem_, P_EVAL_R0))), SCALAR_SIZE)
|
|
607
684
|
|
|
608
|
-
s := addmod(s, mulmod(
|
|
609
|
-
s := addmod(s, mulmod(
|
|
610
|
-
s := addmod(s, mulmod(
|
|
611
|
-
s := addmod(s, mulmod(
|
|
612
|
-
s := addmod(s, mulmod(
|
|
613
|
-
s := addmod(s, mulmod(
|
|
685
|
+
s := addmod(s, mulmod(mload(add(proof_, P_EVAL_A)), mload(add(pMem_, P_V1)), SCALAR_SIZE), SCALAR_SIZE)
|
|
686
|
+
s := addmod(s, mulmod(mload(add(proof_, P_EVAL_B)), mload(add(pMem_, P_V2)), SCALAR_SIZE), SCALAR_SIZE)
|
|
687
|
+
s := addmod(s, mulmod(mload(add(proof_, P_EVAL_C)), mload(add(pMem_, P_V3)), SCALAR_SIZE), SCALAR_SIZE)
|
|
688
|
+
s := addmod(s, mulmod(mload(add(proof_, P_EVAL_S1)), mload(add(pMem_, P_V4)), SCALAR_SIZE), SCALAR_SIZE)
|
|
689
|
+
s := addmod(s, mulmod(mload(add(proof_, P_EVAL_S2)), mload(add(pMem_, P_V5)), SCALAR_SIZE), SCALAR_SIZE)
|
|
690
|
+
s := addmod(s, mulmod(mload(add(proof_, P_EVAL_ZW)), mload(add(pMem_, P_U)), SCALAR_SIZE), SCALAR_SIZE)
|
|
614
691
|
|
|
615
|
-
g1_mulSetC(add(
|
|
692
|
+
isOk_ := g1_mulSetC(add(pMem_, P_E), G1_X, G1_Y, s)
|
|
616
693
|
}
|
|
617
694
|
|
|
618
|
-
function checkPairing(
|
|
619
|
-
let mIn := mload(
|
|
620
|
-
mstore(
|
|
695
|
+
function checkPairing(pMem_, proof_) -> isOk_ {
|
|
696
|
+
let mIn := mload(64)
|
|
697
|
+
mstore(64, add(mIn, 576)) // [0..383] = pairing data, [384..447] = P_WX_I, [448..512] = P_WX_IW
|
|
621
698
|
|
|
622
699
|
let _pWxi := add(mIn, 384)
|
|
623
700
|
let _pWxiw := add(mIn, 448)
|
|
624
701
|
let _aux := add(mIn, 512)
|
|
625
702
|
|
|
626
|
-
|
|
627
|
-
|
|
703
|
+
g1_set(_pWxi, add(proof_, P_WX_I))
|
|
704
|
+
g1_set(_pWxiw, add(proof_, P_WX_IW))
|
|
628
705
|
|
|
629
706
|
// A1
|
|
630
|
-
g1_mulSet(mIn, _pWxiw, mload(add(
|
|
631
|
-
|
|
632
|
-
|
|
707
|
+
if iszero(g1_mulSet(mIn, _pWxiw, mload(add(pMem_, P_U)))) {
|
|
708
|
+
leave
|
|
709
|
+
}
|
|
710
|
+
if iszero(g1_acc(mIn, _pWxi)) {
|
|
711
|
+
leave
|
|
712
|
+
}
|
|
713
|
+
mstore(add(mIn, 32), mod(sub(BASE_SIZE, mload(add(mIn, 32))), BASE_SIZE))
|
|
633
714
|
|
|
634
715
|
// [X]_2
|
|
635
716
|
mstore(add(mIn,64), X2_X2)
|
|
@@ -638,44 +719,61 @@ contract <%=verifier_id%> {
|
|
|
638
719
|
mstore(add(mIn,160), X2_Y1)
|
|
639
720
|
|
|
640
721
|
// B1
|
|
641
|
-
g1_mulSet(add(mIn, 192), _pWxi, mload(add(
|
|
722
|
+
if iszero(g1_mulSet(add(mIn, 192), _pWxi, mload(add(pMem_, P_XI)))) {
|
|
723
|
+
leave
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
let s := mulmod(mload(add(pMem_, P_U)), mload(add(pMem_, P_XI)), SCALAR_SIZE)
|
|
727
|
+
s := mulmod(s, W1, SCALAR_SIZE)
|
|
642
728
|
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
g1_acc(add(mIn, 192), _aux)
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
g1_acc(add(mIn, 192), add(
|
|
729
|
+
if iszero(g1_mulSet(_aux, _pWxiw, s)) {
|
|
730
|
+
leave
|
|
731
|
+
}
|
|
732
|
+
if iszero(g1_acc(add(mIn, 192), _aux)) {
|
|
733
|
+
leave
|
|
734
|
+
}
|
|
735
|
+
if iszero(g1_acc(add(mIn, 192), add(pMem_, P_F))) {
|
|
736
|
+
leave
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
mstore(add(pMem_, add(P_E, 32)), mod(sub(BASE_SIZE, mload(add(pMem_, add(P_E, 32)))), BASE_SIZE))
|
|
740
|
+
|
|
741
|
+
if iszero(g1_acc(add(mIn, 192), add(pMem_, P_E))) {
|
|
742
|
+
leave
|
|
743
|
+
}
|
|
650
744
|
|
|
651
745
|
// [1]_2
|
|
652
746
|
mstore(add(mIn,256), G2_X2)
|
|
653
747
|
mstore(add(mIn,288), G2_X1)
|
|
654
748
|
mstore(add(mIn,320), G2_Y2)
|
|
655
749
|
mstore(add(mIn,352), G2_Y1)
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
750
|
+
|
|
751
|
+
if iszero(staticcall(sub(gas(), 2000), 8, mIn, 384, mIn, 0x20)) {
|
|
752
|
+
leave
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
isOk_ := and(1, mload(mIn))
|
|
660
756
|
}
|
|
661
757
|
|
|
662
|
-
let
|
|
663
|
-
mstore(
|
|
664
|
-
|
|
665
|
-
checkInput()
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
758
|
+
let pointer_ := mload(64) // free pointer
|
|
759
|
+
mstore(64, add(pointer_, P_TOTAL_SIZE))
|
|
760
|
+
|
|
761
|
+
verified_ := checkInput(proofArr_)
|
|
762
|
+
|
|
763
|
+
/// @dev check pairings
|
|
764
|
+
if not(iszero(verified_)) {
|
|
765
|
+
calculateChallenges(pointer_, proofArr_, publicSignals_)
|
|
766
|
+
calculateLagrange(pointer_)
|
|
767
|
+
calculatePI(pointer_, publicSignals_)
|
|
768
|
+
calculateR0(pointer_, proofArr_)
|
|
769
|
+
|
|
770
|
+
verified_ := and(verified_, calculateD(pointer_, proofArr_))
|
|
771
|
+
verified_ := and(verified_, calculateF(pointer_, proofArr_))
|
|
772
|
+
verified_ := and(verified_, calculateE(pointer_, proofArr_))
|
|
773
|
+
verified_ := and(verified_, checkPairing(pointer_, proofArr_))
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
mstore(64, sub(pointer_, P_TOTAL_SIZE))
|
|
678
777
|
}
|
|
679
|
-
|
|
680
778
|
}
|
|
681
|
-
}
|
|
779
|
+
}
|