@solarity/zkit 0.2.1 → 0.2.3
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/CircuitZKit.d.ts +0 -8
- package/dist/core/CircuitZKit.d.ts.map +1 -1
- package/dist/core/CircuitZKit.js +0 -15
- package/dist/core/CircuitZKit.js.map +1 -1
- package/dist/core/templates/verifier_groth16.sol.ejs +58 -65
- package/dist/types/circuit-zkit.d.ts +2 -4
- package/dist/types/circuit-zkit.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/CircuitZKit.ts +0 -17
- package/src/core/templates/verifier_groth16.sol.ejs +58 -65
- package/src/types/circuit-zkit.ts +2 -2
|
@@ -16,14 +16,6 @@ export declare class CircuitZKit {
|
|
|
16
16
|
* Creates a Solidity verifier contract.
|
|
17
17
|
*/
|
|
18
18
|
createVerifier(): Promise<void>;
|
|
19
|
-
/**
|
|
20
|
-
* Creates a witness for the given inputs.
|
|
21
|
-
*
|
|
22
|
-
* @dev The `inputs` should be in the same order as the circuit expects them.
|
|
23
|
-
*
|
|
24
|
-
* @param {Inputs} inputs - The inputs for the circuit.
|
|
25
|
-
*/
|
|
26
|
-
createWitness(inputs: Inputs): Promise<void>;
|
|
27
19
|
/**
|
|
28
20
|
* Generates a proof for the given inputs.
|
|
29
21
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CircuitZKit.d.ts","sourceRoot":"","sources":["../../src/core/CircuitZKit.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAEvD;;;;;OAKG;WACW,WAAW,CAAC,YAAY,EAAE,oBAAoB,GAAG,MAAM;IASrE;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5C
|
|
1
|
+
{"version":3,"file":"CircuitZKit.d.ts","sourceRoot":"","sources":["../../src/core/CircuitZKit.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,EACjB,MAAM,EACN,WAAW,EACX,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAE/B;;GAEG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,iBAAiB;IAEvD;;;;;OAKG;WACW,WAAW,CAAC,YAAY,EAAE,oBAAoB,GAAG,MAAM;IASrE;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB5C;;;;;;;;OAQG;IACU,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAOhE;;;;;;;;OAQG;IACU,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAQ9D;;;;;;OAMG;IACU,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAMpE;;;;OAIG;IACI,cAAc,IAAI,MAAM;IAI/B;;;;OAIG;IACI,eAAe,IAAI,MAAM;IAIhC;;;;OAIG;IACI,eAAe,IAAI,oBAAoB;IAI9C;;;;;OAKG;IACI,wBAAwB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM;IAUpE;;;;;OAKG;IACI,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM;CAgCjE"}
|
package/dist/core/CircuitZKit.js
CHANGED
|
@@ -68,18 +68,6 @@ class CircuitZKit {
|
|
|
68
68
|
const verifierCode = ejs_1.default.render(verifierTemplate, templateParams);
|
|
69
69
|
fs_1.default.writeFileSync(verifierFilePath, verifierCode, "utf-8");
|
|
70
70
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Creates a witness for the given inputs.
|
|
73
|
-
*
|
|
74
|
-
* @dev The `inputs` should be in the same order as the circuit expects them.
|
|
75
|
-
*
|
|
76
|
-
* @param {Inputs} inputs - The inputs for the circuit.
|
|
77
|
-
*/
|
|
78
|
-
async createWitness(inputs) {
|
|
79
|
-
const wasmFile = this.mustGetArtifactsFilePath("wasm");
|
|
80
|
-
const wtnsFile = this.getArtifactsFilePath("wtns");
|
|
81
|
-
await snarkjs.wtns.calculate(inputs, wasmFile, wtnsFile);
|
|
82
|
-
}
|
|
83
71
|
/**
|
|
84
72
|
* Generates a proof for the given inputs.
|
|
85
73
|
*
|
|
@@ -182,9 +170,6 @@ class CircuitZKit {
|
|
|
182
170
|
case "json":
|
|
183
171
|
fileName = `${circuitName}_constraints.json`;
|
|
184
172
|
break;
|
|
185
|
-
case "wtns":
|
|
186
|
-
fileName = `${circuitName}.wtns`;
|
|
187
|
-
break;
|
|
188
173
|
case "wasm":
|
|
189
174
|
fileName = `${circuitName}.wasm`;
|
|
190
175
|
fileDir = path_1.default.join(fileDir, `${circuitName}_js`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CircuitZKit.js","sourceRoot":"","sources":["../../src/core/CircuitZKit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAsB;AACtB,4CAAoB;AACpB,gDAAwB;AACxB,iDAAmC;AAWnC;;GAEG;AACH,MAAa,WAAW;IACO;IAA7B,YAA6B,OAA0B;QAA1B,YAAO,GAAP,OAAO,CAAmB;IAAG,CAAC;IAE3D;;;;;OAKG;IACI,MAAM,CAAC,WAAW,CAAC,YAAkC;QAC1D,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,SAAS;gBACZ,OAAO,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,0BAA0B,CAAC,EAAE,MAAM,CAAC,CAAC;YAChG;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,GAAG,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc;QACzB,MAAM,YAAY,GAAW,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,gBAAgB,GAAG,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAElG,MAAM,gBAAgB,GAAW,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC;QAEjF,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YACjD,YAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;QAC1E,cAAc,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvD,MAAM,YAAY,GAAG,aAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAElE,YAAE,CAAC,aAAa,CAAC,gBAAgB,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"CircuitZKit.js","sourceRoot":"","sources":["../../src/core/CircuitZKit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
/* AUTOGENERATED FILE BY HARDHAT-ZKIT. DO NOT EDIT. */
|
|
4
|
+
|
|
2
5
|
pragma solidity >=0.7.0 <0.9.0;
|
|
3
6
|
|
|
4
7
|
contract <%=verifier_id%> {
|
|
5
|
-
/// @dev
|
|
8
|
+
/// @dev base field size
|
|
6
9
|
uint256 public constant BASE_FIELD_SIZE =
|
|
7
10
|
21888242871839275222246405745257275088696311157297823662689037894645226208583;
|
|
8
11
|
|
|
9
|
-
/// @dev
|
|
12
|
+
/// @dev verification key data
|
|
10
13
|
uint256 public constant ALPHA_X =
|
|
11
14
|
<%=vk_alpha_1[0]%>;
|
|
12
15
|
uint256 public constant ALPHA_Y =
|
|
@@ -42,75 +45,66 @@ contract <%=verifier_id%> {
|
|
|
42
45
|
<%=IC[i][1]%>;
|
|
43
46
|
<% } -%>
|
|
44
47
|
|
|
45
|
-
/// @dev
|
|
46
|
-
uint16 public constant
|
|
47
|
-
uint16 public constant
|
|
48
|
-
uint16 public constant P_LAST_MEM = 896;
|
|
48
|
+
/// @dev memory pointer sizes
|
|
49
|
+
uint16 public constant P_PUBLIC_SIGNALS_ACCUMULATOR_SIZE = 128;
|
|
50
|
+
uint16 public constant P_TOTAL_SIZE = 896;
|
|
49
51
|
|
|
50
52
|
function verifyProof(
|
|
51
|
-
uint256[2]
|
|
52
|
-
uint256[2][2]
|
|
53
|
-
uint256[2]
|
|
54
|
-
uint256[<%=IC.length-1%>]
|
|
55
|
-
) public view returns (bool) {
|
|
53
|
+
uint256[2] memory pointA_,
|
|
54
|
+
uint256[2][2] memory pointB_,
|
|
55
|
+
uint256[2] memory pointC_,
|
|
56
|
+
uint256[<%=IC.length-1%>] memory publicSignals_
|
|
57
|
+
) public view returns (bool verified_) {
|
|
56
58
|
assembly {
|
|
57
|
-
function checkField(
|
|
58
|
-
|
|
59
|
-
mstore(0, 0)
|
|
60
|
-
return(0, 0x20)
|
|
61
|
-
}
|
|
59
|
+
function checkField(signal_) -> res_ {
|
|
60
|
+
res_ := lt(signal_, BASE_FIELD_SIZE)
|
|
62
61
|
}
|
|
63
62
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let success
|
|
67
|
-
let mIn := mload(0x40)
|
|
63
|
+
function g1MulAdd(pR_, x_, y_, s_) -> res_ {
|
|
64
|
+
let pointer_ := mload(64) // free pointer
|
|
68
65
|
|
|
69
|
-
mstore(
|
|
70
|
-
mstore(add(
|
|
71
|
-
mstore(add(
|
|
66
|
+
mstore(pointer_, x_)
|
|
67
|
+
mstore(add(pointer_, 32), y_)
|
|
68
|
+
mstore(add(pointer_, 64), s_)
|
|
72
69
|
|
|
73
|
-
|
|
70
|
+
res_ := staticcall(sub(gas(), 2000), 7, pointer_, 96, pointer_, 64) // ecMul
|
|
71
|
+
res_ := and(res_, gt(returndatasize(), 0)) // check that multiplication succeeded
|
|
74
72
|
|
|
75
|
-
if iszero(
|
|
76
|
-
|
|
77
|
-
return(0, 0x20)
|
|
73
|
+
if iszero(res_) {
|
|
74
|
+
leave
|
|
78
75
|
}
|
|
79
76
|
|
|
80
|
-
mstore(add(
|
|
81
|
-
mstore(add(
|
|
77
|
+
mstore(add(pointer_, 64), mload(pR_))
|
|
78
|
+
mstore(add(pointer_, 96), mload(add(pR_, 32)))
|
|
82
79
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if iszero(success) {
|
|
86
|
-
mstore(0, 0)
|
|
87
|
-
return(0, 0x20)
|
|
88
|
-
}
|
|
80
|
+
res_ := staticcall(sub(gas(), 2000), 6, pointer_, 128, pR_, 64) // ecAdd
|
|
81
|
+
res_ := and(res_, gt(returndatasize(), 0)) // check that addition succeeded
|
|
89
82
|
}
|
|
90
83
|
|
|
91
|
-
function checkPairing(
|
|
92
|
-
let pPairing_ := add(
|
|
93
|
-
let pVk_ := add(pMem, P_VK)
|
|
84
|
+
function checkPairing(pA_, pB_, pC_, pubSignals_, pointer_) -> res_ {
|
|
85
|
+
let pPairing_ := add(pointer_, P_PUBLIC_SIGNALS_ACCUMULATOR_SIZE)
|
|
94
86
|
|
|
95
|
-
mstore(
|
|
96
|
-
mstore(add(
|
|
87
|
+
mstore(pointer_, IC0_X)
|
|
88
|
+
mstore(add(pointer_, 32), IC0_Y)
|
|
97
89
|
|
|
98
|
-
/// @dev
|
|
99
|
-
<% for (let i = 1; i <= nPublic; i++) { %>
|
|
90
|
+
/// @dev compute the linear combination of public signals
|
|
91
|
+
<% for (let i = 1; i <= nPublic; i++) { %>if iszero(g1MulAdd(pointer_, IC<%=i%>_X, IC<%=i%>_Y, mload(add(pubSignals_, <%=(i-1)*32%>)))) {
|
|
92
|
+
leave
|
|
93
|
+
}
|
|
100
94
|
<% } -%>
|
|
101
95
|
|
|
102
96
|
/// @dev -A
|
|
103
|
-
mstore(pPairing_,
|
|
97
|
+
mstore(pPairing_, mload(pA_))
|
|
104
98
|
mstore(
|
|
105
99
|
add(pPairing_, 32),
|
|
106
|
-
mod(sub(BASE_FIELD_SIZE,
|
|
100
|
+
mod(sub(BASE_FIELD_SIZE, mload(add(pA_, 32))), BASE_FIELD_SIZE)
|
|
107
101
|
)
|
|
108
102
|
|
|
109
103
|
/// @dev B
|
|
110
|
-
mstore(add(pPairing_, 64),
|
|
111
|
-
mstore(add(pPairing_, 96),
|
|
112
|
-
mstore(add(pPairing_, 128),
|
|
113
|
-
mstore(add(pPairing_, 160),
|
|
104
|
+
mstore(add(pPairing_, 64), mload(mload(pB_)))
|
|
105
|
+
mstore(add(pPairing_, 96), mload(add(mload(pB_), 32)))
|
|
106
|
+
mstore(add(pPairing_, 128), mload(mload(add(pB_, 32))))
|
|
107
|
+
mstore(add(pPairing_, 160), mload(add(mload(add(pB_, 32)), 32)))
|
|
114
108
|
|
|
115
109
|
/// @dev alpha1
|
|
116
110
|
mstore(add(pPairing_, 192), ALPHA_X)
|
|
@@ -122,9 +116,9 @@ contract <%=verifier_id%> {
|
|
|
122
116
|
mstore(add(pPairing_, 320), BETA_Y1)
|
|
123
117
|
mstore(add(pPairing_, 352), BETA_Y2)
|
|
124
118
|
|
|
125
|
-
/// @dev
|
|
126
|
-
mstore(add(pPairing_, 384), mload(
|
|
127
|
-
mstore(add(pPairing_, 416), mload(add(
|
|
119
|
+
/// @dev public signals
|
|
120
|
+
mstore(add(pPairing_, 384), mload(pointer_))
|
|
121
|
+
mstore(add(pPairing_, 416), mload(add(pointer_, 32)))
|
|
128
122
|
|
|
129
123
|
/// @dev gamma2
|
|
130
124
|
mstore(add(pPairing_, 448), GAMMA_X1)
|
|
@@ -133,8 +127,8 @@ contract <%=verifier_id%> {
|
|
|
133
127
|
mstore(add(pPairing_, 544), GAMMA_Y2)
|
|
134
128
|
|
|
135
129
|
/// @dev C
|
|
136
|
-
mstore(add(pPairing_, 576),
|
|
137
|
-
mstore(add(pPairing_, 608),
|
|
130
|
+
mstore(add(pPairing_, 576), mload(pC_))
|
|
131
|
+
mstore(add(pPairing_, 608), mload(add(pC_, 32)))
|
|
138
132
|
|
|
139
133
|
/// @dev delta2
|
|
140
134
|
mstore(add(pPairing_, 640), DELTA_X1)
|
|
@@ -142,23 +136,22 @@ contract <%=verifier_id%> {
|
|
|
142
136
|
mstore(add(pPairing_, 704), DELTA_Y1)
|
|
143
137
|
mstore(add(pPairing_, 736), DELTA_Y2)
|
|
144
138
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
isOk := and(success_, mload(pPairing_))
|
|
139
|
+
res_ := staticcall(sub(gas(), 2000), 8, pPairing_, 768, pPairing_, 32) // ecPairing
|
|
140
|
+
res_ := and(res_, mload(pPairing_)) // check that pairing succeeded
|
|
148
141
|
}
|
|
149
142
|
|
|
150
|
-
let
|
|
151
|
-
mstore(
|
|
143
|
+
let pointer_ := mload(64) // free pointer
|
|
144
|
+
mstore(64, add(pointer_, P_TOTAL_SIZE))
|
|
152
145
|
|
|
153
|
-
/// @dev
|
|
154
|
-
|
|
146
|
+
/// @dev check that all public signals are in F
|
|
147
|
+
verified_ := 1
|
|
148
|
+
<% for (let i = 0; i < IC.length; i++) { %>verified_ := and(verified_, checkField(mload(add(publicSignals_, <%=i*32%>))))
|
|
155
149
|
<% } -%>
|
|
156
150
|
|
|
157
|
-
/// @dev
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
return(0, 0x20)
|
|
151
|
+
/// @dev check pairings
|
|
152
|
+
if not(iszero(verified_)) {
|
|
153
|
+
verified_ := checkPairing(pointA_, pointB_, pointC_, publicSignals_, pointer_)
|
|
154
|
+
}
|
|
162
155
|
}
|
|
163
156
|
}
|
|
164
157
|
}
|
|
@@ -20,9 +20,7 @@ export type Calldata = [
|
|
|
20
20
|
NumericString,
|
|
21
21
|
NumericString
|
|
22
22
|
],
|
|
23
|
-
|
|
24
|
-
NumericString
|
|
25
|
-
]
|
|
23
|
+
PublicSignals
|
|
26
24
|
];
|
|
27
25
|
export type ProofStruct = {
|
|
28
26
|
proof: Groth16Proof;
|
|
@@ -32,7 +30,7 @@ export type NumberLike = number | bigint | string;
|
|
|
32
30
|
export type ArrayLike = NumberLike[] | ArrayLike[];
|
|
33
31
|
export type InputLike = NumberLike | ArrayLike;
|
|
34
32
|
export type Inputs = Record<string, InputLike>;
|
|
35
|
-
export type ArtifactsFileType = "r1cs" | "zkey" | "vkey" | "sym" | "json" | "wasm"
|
|
33
|
+
export type ArtifactsFileType = "r1cs" | "zkey" | "vkey" | "sym" | "json" | "wasm";
|
|
36
34
|
export type VerifierTemplateType = "groth16";
|
|
37
35
|
export type CircuitZKitConfig = {
|
|
38
36
|
circuitName: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"circuit-zkit.d.ts","sourceRoot":"","sources":["../../src/types/circuit-zkit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,aAAa,EAAE,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB;QAAC,aAAa;QAAE,aAAa;KAAC;IAC9B;QAAC,CAAC,aAAa,EAAE,aAAa,CAAC;QAAE,CAAC,aAAa,EAAE,aAAa,CAAC;KAAC;IAChE;QAAC,aAAa;QAAE,aAAa;KAAC;IAC9B
|
|
1
|
+
{"version":3,"file":"circuit-zkit.d.ts","sourceRoot":"","sources":["../../src/types/circuit-zkit.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;AAEjD,MAAM,MAAM,aAAa,GAAG,aAAa,EAAE,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;IACvE,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB;QAAC,aAAa;QAAE,aAAa;KAAC;IAC9B;QAAC,CAAC,aAAa,EAAE,aAAa,CAAC;QAAE,CAAC,aAAa,EAAE,aAAa,CAAC;KAAC;IAChE;QAAC,aAAa;QAAE,aAAa;KAAC;IAC9B,aAAa;CACd,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,YAAY,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAClD,MAAM,MAAM,SAAS,GAAG,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;AACnD,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/C,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AACnF,MAAM,MAAM,oBAAoB,GAAG,SAAS,CAAC;AAE7C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC,CAAC"}
|
package/package.json
CHANGED
package/src/core/CircuitZKit.ts
CHANGED
|
@@ -54,20 +54,6 @@ export class CircuitZKit {
|
|
|
54
54
|
fs.writeFileSync(verifierFilePath, verifierCode, "utf-8");
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
/**
|
|
58
|
-
* Creates a witness for the given inputs.
|
|
59
|
-
*
|
|
60
|
-
* @dev The `inputs` should be in the same order as the circuit expects them.
|
|
61
|
-
*
|
|
62
|
-
* @param {Inputs} inputs - The inputs for the circuit.
|
|
63
|
-
*/
|
|
64
|
-
public async createWitness(inputs: Inputs): Promise<void> {
|
|
65
|
-
const wasmFile = this.mustGetArtifactsFilePath("wasm");
|
|
66
|
-
const wtnsFile = this.getArtifactsFilePath("wtns");
|
|
67
|
-
|
|
68
|
-
await snarkjs.wtns.calculate(inputs, wasmFile, wtnsFile);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
57
|
/**
|
|
72
58
|
* Generates a proof for the given inputs.
|
|
73
59
|
*
|
|
@@ -185,9 +171,6 @@ export class CircuitZKit {
|
|
|
185
171
|
case "json":
|
|
186
172
|
fileName = `${circuitName}_constraints.json`;
|
|
187
173
|
break;
|
|
188
|
-
case "wtns":
|
|
189
|
-
fileName = `${circuitName}.wtns`;
|
|
190
|
-
break;
|
|
191
174
|
case "wasm":
|
|
192
175
|
fileName = `${circuitName}.wasm`;
|
|
193
176
|
fileDir = path.join(fileDir, `${circuitName}_js`);
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
|
+
|
|
3
|
+
/* AUTOGENERATED FILE BY HARDHAT-ZKIT. DO NOT EDIT. */
|
|
4
|
+
|
|
2
5
|
pragma solidity >=0.7.0 <0.9.0;
|
|
3
6
|
|
|
4
7
|
contract <%=verifier_id%> {
|
|
5
|
-
/// @dev
|
|
8
|
+
/// @dev base field size
|
|
6
9
|
uint256 public constant BASE_FIELD_SIZE =
|
|
7
10
|
21888242871839275222246405745257275088696311157297823662689037894645226208583;
|
|
8
11
|
|
|
9
|
-
/// @dev
|
|
12
|
+
/// @dev verification key data
|
|
10
13
|
uint256 public constant ALPHA_X =
|
|
11
14
|
<%=vk_alpha_1[0]%>;
|
|
12
15
|
uint256 public constant ALPHA_Y =
|
|
@@ -42,75 +45,66 @@ contract <%=verifier_id%> {
|
|
|
42
45
|
<%=IC[i][1]%>;
|
|
43
46
|
<% } -%>
|
|
44
47
|
|
|
45
|
-
/// @dev
|
|
46
|
-
uint16 public constant
|
|
47
|
-
uint16 public constant
|
|
48
|
-
uint16 public constant P_LAST_MEM = 896;
|
|
48
|
+
/// @dev memory pointer sizes
|
|
49
|
+
uint16 public constant P_PUBLIC_SIGNALS_ACCUMULATOR_SIZE = 128;
|
|
50
|
+
uint16 public constant P_TOTAL_SIZE = 896;
|
|
49
51
|
|
|
50
52
|
function verifyProof(
|
|
51
|
-
uint256[2]
|
|
52
|
-
uint256[2][2]
|
|
53
|
-
uint256[2]
|
|
54
|
-
uint256[<%=IC.length-1%>]
|
|
55
|
-
) public view returns (bool) {
|
|
53
|
+
uint256[2] memory pointA_,
|
|
54
|
+
uint256[2][2] memory pointB_,
|
|
55
|
+
uint256[2] memory pointC_,
|
|
56
|
+
uint256[<%=IC.length-1%>] memory publicSignals_
|
|
57
|
+
) public view returns (bool verified_) {
|
|
56
58
|
assembly {
|
|
57
|
-
function checkField(
|
|
58
|
-
|
|
59
|
-
mstore(0, 0)
|
|
60
|
-
return(0, 0x20)
|
|
61
|
-
}
|
|
59
|
+
function checkField(signal_) -> res_ {
|
|
60
|
+
res_ := lt(signal_, BASE_FIELD_SIZE)
|
|
62
61
|
}
|
|
63
62
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
let success
|
|
67
|
-
let mIn := mload(0x40)
|
|
63
|
+
function g1MulAdd(pR_, x_, y_, s_) -> res_ {
|
|
64
|
+
let pointer_ := mload(64) // free pointer
|
|
68
65
|
|
|
69
|
-
mstore(
|
|
70
|
-
mstore(add(
|
|
71
|
-
mstore(add(
|
|
66
|
+
mstore(pointer_, x_)
|
|
67
|
+
mstore(add(pointer_, 32), y_)
|
|
68
|
+
mstore(add(pointer_, 64), s_)
|
|
72
69
|
|
|
73
|
-
|
|
70
|
+
res_ := staticcall(sub(gas(), 2000), 7, pointer_, 96, pointer_, 64) // ecMul
|
|
71
|
+
res_ := and(res_, gt(returndatasize(), 0)) // check that multiplication succeeded
|
|
74
72
|
|
|
75
|
-
if iszero(
|
|
76
|
-
|
|
77
|
-
return(0, 0x20)
|
|
73
|
+
if iszero(res_) {
|
|
74
|
+
leave
|
|
78
75
|
}
|
|
79
76
|
|
|
80
|
-
mstore(add(
|
|
81
|
-
mstore(add(
|
|
77
|
+
mstore(add(pointer_, 64), mload(pR_))
|
|
78
|
+
mstore(add(pointer_, 96), mload(add(pR_, 32)))
|
|
82
79
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
if iszero(success) {
|
|
86
|
-
mstore(0, 0)
|
|
87
|
-
return(0, 0x20)
|
|
88
|
-
}
|
|
80
|
+
res_ := staticcall(sub(gas(), 2000), 6, pointer_, 128, pR_, 64) // ecAdd
|
|
81
|
+
res_ := and(res_, gt(returndatasize(), 0)) // check that addition succeeded
|
|
89
82
|
}
|
|
90
83
|
|
|
91
|
-
function checkPairing(
|
|
92
|
-
let pPairing_ := add(
|
|
93
|
-
let pVk_ := add(pMem, P_VK)
|
|
84
|
+
function checkPairing(pA_, pB_, pC_, pubSignals_, pointer_) -> res_ {
|
|
85
|
+
let pPairing_ := add(pointer_, P_PUBLIC_SIGNALS_ACCUMULATOR_SIZE)
|
|
94
86
|
|
|
95
|
-
mstore(
|
|
96
|
-
mstore(add(
|
|
87
|
+
mstore(pointer_, IC0_X)
|
|
88
|
+
mstore(add(pointer_, 32), IC0_Y)
|
|
97
89
|
|
|
98
|
-
/// @dev
|
|
99
|
-
<% for (let i = 1; i <= nPublic; i++) { %>
|
|
90
|
+
/// @dev compute the linear combination of public signals
|
|
91
|
+
<% for (let i = 1; i <= nPublic; i++) { %>if iszero(g1MulAdd(pointer_, IC<%=i%>_X, IC<%=i%>_Y, mload(add(pubSignals_, <%=(i-1)*32%>)))) {
|
|
92
|
+
leave
|
|
93
|
+
}
|
|
100
94
|
<% } -%>
|
|
101
95
|
|
|
102
96
|
/// @dev -A
|
|
103
|
-
mstore(pPairing_,
|
|
97
|
+
mstore(pPairing_, mload(pA_))
|
|
104
98
|
mstore(
|
|
105
99
|
add(pPairing_, 32),
|
|
106
|
-
mod(sub(BASE_FIELD_SIZE,
|
|
100
|
+
mod(sub(BASE_FIELD_SIZE, mload(add(pA_, 32))), BASE_FIELD_SIZE)
|
|
107
101
|
)
|
|
108
102
|
|
|
109
103
|
/// @dev B
|
|
110
|
-
mstore(add(pPairing_, 64),
|
|
111
|
-
mstore(add(pPairing_, 96),
|
|
112
|
-
mstore(add(pPairing_, 128),
|
|
113
|
-
mstore(add(pPairing_, 160),
|
|
104
|
+
mstore(add(pPairing_, 64), mload(mload(pB_)))
|
|
105
|
+
mstore(add(pPairing_, 96), mload(add(mload(pB_), 32)))
|
|
106
|
+
mstore(add(pPairing_, 128), mload(mload(add(pB_, 32))))
|
|
107
|
+
mstore(add(pPairing_, 160), mload(add(mload(add(pB_, 32)), 32)))
|
|
114
108
|
|
|
115
109
|
/// @dev alpha1
|
|
116
110
|
mstore(add(pPairing_, 192), ALPHA_X)
|
|
@@ -122,9 +116,9 @@ contract <%=verifier_id%> {
|
|
|
122
116
|
mstore(add(pPairing_, 320), BETA_Y1)
|
|
123
117
|
mstore(add(pPairing_, 352), BETA_Y2)
|
|
124
118
|
|
|
125
|
-
/// @dev
|
|
126
|
-
mstore(add(pPairing_, 384), mload(
|
|
127
|
-
mstore(add(pPairing_, 416), mload(add(
|
|
119
|
+
/// @dev public signals
|
|
120
|
+
mstore(add(pPairing_, 384), mload(pointer_))
|
|
121
|
+
mstore(add(pPairing_, 416), mload(add(pointer_, 32)))
|
|
128
122
|
|
|
129
123
|
/// @dev gamma2
|
|
130
124
|
mstore(add(pPairing_, 448), GAMMA_X1)
|
|
@@ -133,8 +127,8 @@ contract <%=verifier_id%> {
|
|
|
133
127
|
mstore(add(pPairing_, 544), GAMMA_Y2)
|
|
134
128
|
|
|
135
129
|
/// @dev C
|
|
136
|
-
mstore(add(pPairing_, 576),
|
|
137
|
-
mstore(add(pPairing_, 608),
|
|
130
|
+
mstore(add(pPairing_, 576), mload(pC_))
|
|
131
|
+
mstore(add(pPairing_, 608), mload(add(pC_, 32)))
|
|
138
132
|
|
|
139
133
|
/// @dev delta2
|
|
140
134
|
mstore(add(pPairing_, 640), DELTA_X1)
|
|
@@ -142,23 +136,22 @@ contract <%=verifier_id%> {
|
|
|
142
136
|
mstore(add(pPairing_, 704), DELTA_Y1)
|
|
143
137
|
mstore(add(pPairing_, 736), DELTA_Y2)
|
|
144
138
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
isOk := and(success_, mload(pPairing_))
|
|
139
|
+
res_ := staticcall(sub(gas(), 2000), 8, pPairing_, 768, pPairing_, 32) // ecPairing
|
|
140
|
+
res_ := and(res_, mload(pPairing_)) // check that pairing succeeded
|
|
148
141
|
}
|
|
149
142
|
|
|
150
|
-
let
|
|
151
|
-
mstore(
|
|
143
|
+
let pointer_ := mload(64) // free pointer
|
|
144
|
+
mstore(64, add(pointer_, P_TOTAL_SIZE))
|
|
152
145
|
|
|
153
|
-
/// @dev
|
|
154
|
-
|
|
146
|
+
/// @dev check that all public signals are in F
|
|
147
|
+
verified_ := 1
|
|
148
|
+
<% for (let i = 0; i < IC.length; i++) { %>verified_ := and(verified_, checkField(mload(add(publicSignals_, <%=i*32%>))))
|
|
155
149
|
<% } -%>
|
|
156
150
|
|
|
157
|
-
/// @dev
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
return(0, 0x20)
|
|
151
|
+
/// @dev check pairings
|
|
152
|
+
if not(iszero(verified_)) {
|
|
153
|
+
verified_ := checkPairing(pointA_, pointB_, pointC_, publicSignals_, pointer_)
|
|
154
|
+
}
|
|
162
155
|
}
|
|
163
156
|
}
|
|
164
157
|
}
|
|
@@ -14,7 +14,7 @@ export type Calldata = [
|
|
|
14
14
|
[NumericString, NumericString],
|
|
15
15
|
[[NumericString, NumericString], [NumericString, NumericString]],
|
|
16
16
|
[NumericString, NumericString],
|
|
17
|
-
|
|
17
|
+
PublicSignals,
|
|
18
18
|
];
|
|
19
19
|
|
|
20
20
|
export type ProofStruct = {
|
|
@@ -28,7 +28,7 @@ export type InputLike = NumberLike | ArrayLike;
|
|
|
28
28
|
|
|
29
29
|
export type Inputs = Record<string, InputLike>;
|
|
30
30
|
|
|
31
|
-
export type ArtifactsFileType = "r1cs" | "zkey" | "vkey" | "sym" | "json" | "wasm"
|
|
31
|
+
export type ArtifactsFileType = "r1cs" | "zkey" | "vkey" | "sym" | "json" | "wasm";
|
|
32
32
|
export type VerifierTemplateType = "groth16";
|
|
33
33
|
|
|
34
34
|
export type CircuitZKitConfig = {
|