@aztec/bb.js 0.3.6 → 0.4.2

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/README.md CHANGED
@@ -118,3 +118,4 @@ To run the tests run `yarn test`.
118
118
  To run a continuous "stress test" run `yarn simple_test` to do 10 full pk/proof/vk iterations.
119
119
 
120
120
  To run the same test in the browser run `yarn serve`, navigate to appropriate URL and open the console.
121
+
Binary file
Binary file
@@ -1604,6 +1604,7 @@ function generateUUID() {
1604
1604
  "use strict";
1605
1605
  __webpack_require__.r(__webpack_exports__);
1606
1606
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
1607
+ /* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
1607
1608
  /* harmony export */ __assign: () => (/* binding */ __assign),
1608
1609
  /* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
1609
1610
  /* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
@@ -1615,6 +1616,7 @@ __webpack_require__.r(__webpack_exports__);
1615
1616
  /* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
1616
1617
  /* harmony export */ __createBinding: () => (/* binding */ __createBinding),
1617
1618
  /* harmony export */ __decorate: () => (/* binding */ __decorate),
1619
+ /* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
1618
1620
  /* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
1619
1621
  /* harmony export */ __exportStar: () => (/* binding */ __exportStar),
1620
1622
  /* harmony export */ __extends: () => (/* binding */ __extends),
@@ -1649,7 +1651,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
1649
1651
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
1650
1652
  PERFORMANCE OF THIS SOFTWARE.
1651
1653
  ***************************************************************************** */
1652
- /* global Reflect, Promise */
1654
+ /* global Reflect, Promise, SuppressedError, Symbol */
1653
1655
 
1654
1656
  var extendStatics = function(d, b) {
1655
1657
  extendStatics = Object.setPrototypeOf ||
@@ -1929,6 +1931,53 @@ function __classPrivateFieldIn(state, receiver) {
1929
1931
  return typeof state === "function" ? receiver === state : state.has(receiver);
1930
1932
  }
1931
1933
 
1934
+ function __addDisposableResource(env, value, async) {
1935
+ if (value !== null && value !== void 0) {
1936
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
1937
+ var dispose;
1938
+ if (async) {
1939
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
1940
+ dispose = value[Symbol.asyncDispose];
1941
+ }
1942
+ if (dispose === void 0) {
1943
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
1944
+ dispose = value[Symbol.dispose];
1945
+ }
1946
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
1947
+ env.stack.push({ value: value, dispose: dispose, async: async });
1948
+ }
1949
+ else if (async) {
1950
+ env.stack.push({ async: true });
1951
+ }
1952
+ return value;
1953
+ }
1954
+
1955
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
1956
+ var e = new Error(message);
1957
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
1958
+ };
1959
+
1960
+ function __disposeResources(env) {
1961
+ function fail(e) {
1962
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
1963
+ env.hasError = true;
1964
+ }
1965
+ function next() {
1966
+ while (env.stack.length) {
1967
+ var rec = env.stack.pop();
1968
+ try {
1969
+ var result = rec.dispose && rec.dispose.call(rec.value);
1970
+ if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
1971
+ }
1972
+ catch (e) {
1973
+ fail(e);
1974
+ }
1975
+ }
1976
+ if (env.hasError) throw env.error;
1977
+ }
1978
+ return next();
1979
+ }
1980
+
1932
1981
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
1933
1982
  __extends,
1934
1983
  __assign,
@@ -1955,6 +2004,8 @@ function __classPrivateFieldIn(state, receiver) {
1955
2004
  __classPrivateFieldGet,
1956
2005
  __classPrivateFieldSet,
1957
2006
  __classPrivateFieldIn,
2007
+ __addDisposableResource,
2008
+ __disposeResources,
1958
2009
  });
1959
2010
 
1960
2011
 
@@ -353,14 +353,14 @@ tslib_1.__exportStar(__webpack_require__(754), exports);
353
353
  /***/ 77:
354
354
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
355
355
 
356
- module.exports = __webpack_require__.p + "622893dfa9efcd1f244c.wasm";
356
+ module.exports = __webpack_require__.p + "b03fe9ef064d8eba5ff7.wasm";
357
357
 
358
358
  /***/ }),
359
359
 
360
360
  /***/ 90:
361
361
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
362
362
 
363
- module.exports = __webpack_require__.p + "1c27be86ce84ef20f268.wasm";
363
+ module.exports = __webpack_require__.p + "7d24b8a508ae77ca0b04.wasm";
364
364
 
365
365
  /***/ })
366
366
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- export declare function proveAndVerify(jsonPath: string, witnessPath: string, crsPath: string, isRecursive: boolean): Promise<boolean>;
3
- export declare function prove(jsonPath: string, witnessPath: string, crsPath: string, isRecursive: boolean, outputPath: string): Promise<void>;
4
- export declare function gateCount(jsonPath: string): Promise<void>;
2
+ export declare function proveAndVerify(bytecodePath: string, witnessPath: string, crsPath: string, isRecursive: boolean): Promise<boolean>;
3
+ export declare function prove(bytecodePath: string, witnessPath: string, crsPath: string, isRecursive: boolean, outputPath: string): Promise<void>;
4
+ export declare function gateCount(bytecodePath: string): Promise<void>;
5
5
  export declare function verify(proofPath: string, isRecursive: boolean, vkPath: string): Promise<boolean>;
6
6
  export declare function contract(outputPath: string, vkPath: string): Promise<void>;
7
- export declare function writeVk(jsonPath: string, crsPath: string, outputPath: string): Promise<void>;
7
+ export declare function writeVk(bytecodePath: string, crsPath: string, outputPath: string): Promise<void>;
8
8
  export declare function proofAsFields(proofPath: string, numInnerPublicInputs: number, outputPath: string): Promise<void>;
9
9
  export declare function vkAsFields(vkPath: string, vkeyOutputPath: string): Promise<void>;
10
10
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AA0FA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,oBAehH;AAED,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,MAAM,iBAenB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,iBAO/C;AAED,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAUnF;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAchE;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAkBlF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAgBtG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAatE"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AA6EA,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,oBAepH;AAED,wBAAsB,KAAK,CACzB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,MAAM,iBAiBnB;AAED,wBAAsB,SAAS,CAAC,YAAY,EAAE,MAAM,iBAOnD;AAED,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAWnF;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAahE;AAED,wBAAsB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAiBtF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAmBtG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAiBtE"}
@@ -5446,7 +5446,7 @@ exports.RawBuffer = RawBuffer;
5446
5446
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
5447
5447
 
5448
5448
  "use strict";
5449
- module.exports = __webpack_require__.p + "622893dfa9efcd1f244c.wasm";
5449
+ module.exports = __webpack_require__.p + "b03fe9ef064d8eba5ff7.wasm";
5450
5450
 
5451
5451
  /***/ }),
5452
5452
 
@@ -5454,7 +5454,7 @@ module.exports = __webpack_require__.p + "622893dfa9efcd1f244c.wasm";
5454
5454
  /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
5455
5455
 
5456
5456
  "use strict";
5457
- module.exports = __webpack_require__.p + "1c27be86ce84ef20f268.wasm";
5457
+ module.exports = __webpack_require__.p + "7d24b8a508ae77ca0b04.wasm";
5458
5458
 
5459
5459
  /***/ }),
5460
5460
 
@@ -6039,6 +6039,7 @@ function entries(customStore = defaultGetStore()) {
6039
6039
  "use strict";
6040
6040
  __webpack_require__.r(__webpack_exports__);
6041
6041
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
6042
+ /* harmony export */ __addDisposableResource: () => (/* binding */ __addDisposableResource),
6042
6043
  /* harmony export */ __assign: () => (/* binding */ __assign),
6043
6044
  /* harmony export */ __asyncDelegator: () => (/* binding */ __asyncDelegator),
6044
6045
  /* harmony export */ __asyncGenerator: () => (/* binding */ __asyncGenerator),
@@ -6050,6 +6051,7 @@ __webpack_require__.r(__webpack_exports__);
6050
6051
  /* harmony export */ __classPrivateFieldSet: () => (/* binding */ __classPrivateFieldSet),
6051
6052
  /* harmony export */ __createBinding: () => (/* binding */ __createBinding),
6052
6053
  /* harmony export */ __decorate: () => (/* binding */ __decorate),
6054
+ /* harmony export */ __disposeResources: () => (/* binding */ __disposeResources),
6053
6055
  /* harmony export */ __esDecorate: () => (/* binding */ __esDecorate),
6054
6056
  /* harmony export */ __exportStar: () => (/* binding */ __exportStar),
6055
6057
  /* harmony export */ __extends: () => (/* binding */ __extends),
@@ -6084,7 +6086,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
6084
6086
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
6085
6087
  PERFORMANCE OF THIS SOFTWARE.
6086
6088
  ***************************************************************************** */
6087
- /* global Reflect, Promise */
6089
+ /* global Reflect, Promise, SuppressedError, Symbol */
6088
6090
 
6089
6091
  var extendStatics = function(d, b) {
6090
6092
  extendStatics = Object.setPrototypeOf ||
@@ -6364,6 +6366,53 @@ function __classPrivateFieldIn(state, receiver) {
6364
6366
  return typeof state === "function" ? receiver === state : state.has(receiver);
6365
6367
  }
6366
6368
 
6369
+ function __addDisposableResource(env, value, async) {
6370
+ if (value !== null && value !== void 0) {
6371
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
6372
+ var dispose;
6373
+ if (async) {
6374
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
6375
+ dispose = value[Symbol.asyncDispose];
6376
+ }
6377
+ if (dispose === void 0) {
6378
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
6379
+ dispose = value[Symbol.dispose];
6380
+ }
6381
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
6382
+ env.stack.push({ value: value, dispose: dispose, async: async });
6383
+ }
6384
+ else if (async) {
6385
+ env.stack.push({ async: true });
6386
+ }
6387
+ return value;
6388
+ }
6389
+
6390
+ var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
6391
+ var e = new Error(message);
6392
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
6393
+ };
6394
+
6395
+ function __disposeResources(env) {
6396
+ function fail(e) {
6397
+ env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
6398
+ env.hasError = true;
6399
+ }
6400
+ function next() {
6401
+ while (env.stack.length) {
6402
+ var rec = env.stack.pop();
6403
+ try {
6404
+ var result = rec.dispose && rec.dispose.call(rec.value);
6405
+ if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
6406
+ }
6407
+ catch (e) {
6408
+ fail(e);
6409
+ }
6410
+ }
6411
+ if (env.hasError) throw env.error;
6412
+ }
6413
+ return next();
6414
+ }
6415
+
6367
6416
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({
6368
6417
  __extends,
6369
6418
  __assign,
@@ -6390,6 +6439,8 @@ function __classPrivateFieldIn(state, receiver) {
6390
6439
  __classPrivateFieldGet,
6391
6440
  __classPrivateFieldSet,
6392
6441
  __classPrivateFieldIn,
6442
+ __addDisposableResource,
6443
+ __disposeResources,
6393
6444
  });
6394
6445
 
6395
6446
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- export declare function proveAndVerify(jsonPath: string, witnessPath: string, crsPath: string, isRecursive: boolean): Promise<boolean>;
3
- export declare function prove(jsonPath: string, witnessPath: string, crsPath: string, isRecursive: boolean, outputPath: string): Promise<void>;
4
- export declare function gateCount(jsonPath: string): Promise<void>;
2
+ export declare function proveAndVerify(bytecodePath: string, witnessPath: string, crsPath: string, isRecursive: boolean): Promise<boolean>;
3
+ export declare function prove(bytecodePath: string, witnessPath: string, crsPath: string, isRecursive: boolean, outputPath: string): Promise<void>;
4
+ export declare function gateCount(bytecodePath: string): Promise<void>;
5
5
  export declare function verify(proofPath: string, isRecursive: boolean, vkPath: string): Promise<boolean>;
6
6
  export declare function contract(outputPath: string, vkPath: string): Promise<void>;
7
- export declare function writeVk(jsonPath: string, crsPath: string, outputPath: string): Promise<void>;
7
+ export declare function writeVk(bytecodePath: string, crsPath: string, outputPath: string): Promise<void>;
8
8
  export declare function proofAsFields(proofPath: string, numInnerPublicInputs: number, outputPath: string): Promise<void>;
9
9
  export declare function vkAsFields(vkPath: string, vkeyOutputPath: string): Promise<void>;
10
10
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AA0FA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,oBAehH;AAED,wBAAsB,KAAK,CACzB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,MAAM,iBAenB;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,iBAO/C;AAED,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAUnF;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAchE;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAkBlF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAgBtG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAatE"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";AA6EA,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,oBAepH;AAED,wBAAsB,KAAK,CACzB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,MAAM,iBAiBnB;AAED,wBAAsB,SAAS,CAAC,YAAY,EAAE,MAAM,iBAOnD;AAED,wBAAsB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAWnF;AAED,wBAAsB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAahE;AAED,wBAAsB,OAAO,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAiBtF;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAmBtG;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,iBAiBtE"}
package/dest/node/main.js CHANGED
@@ -8,26 +8,14 @@ createDebug.log = console.error.bind(console);
8
8
  const debug = createDebug('bb.js');
9
9
  // Maximum we support.
10
10
  const MAX_CIRCUIT_SIZE = 2 ** 19;
11
- function getJsonData(jsonPath) {
12
- const json = readFileSync(jsonPath, 'utf-8');
13
- const parsed = JSON.parse(json);
14
- return parsed;
15
- }
16
- function getBytecode(jsonPath) {
17
- const parsed = getJsonData(jsonPath);
18
- const buffer = Buffer.from(parsed.bytecode, 'base64');
11
+ function getBytecode(bytecodePath) {
12
+ const encodedCircuit = readFileSync(bytecodePath, 'utf-8');
13
+ const buffer = Buffer.from(encodedCircuit, 'base64');
19
14
  const decompressed = gunzipSync(buffer);
20
15
  return decompressed;
21
16
  }
22
- async function getGates(jsonPath, api) {
23
- const parsed = getJsonData(jsonPath);
24
- if (parsed.gates) {
25
- return +parsed.gates;
26
- }
27
- const { total } = await computeCircuitSize(jsonPath, api);
28
- const jsonData = getJsonData(jsonPath);
29
- jsonData.gates = total;
30
- writeFileSync(jsonPath, JSON.stringify(jsonData));
17
+ async function getGates(bytecodePath, api) {
18
+ const { total } = await computeCircuitSize(bytecodePath, api);
31
19
  return total;
32
20
  }
33
21
  function getWitness(witnessPath) {
@@ -35,15 +23,15 @@ function getWitness(witnessPath) {
35
23
  const decompressed = gunzipSync(data);
36
24
  return decompressed;
37
25
  }
38
- async function computeCircuitSize(jsonPath, api) {
26
+ async function computeCircuitSize(bytecodePath, api) {
39
27
  debug(`computing circuit size...`);
40
- const bytecode = getBytecode(jsonPath);
28
+ const bytecode = getBytecode(bytecodePath);
41
29
  const [exact, total, subgroup] = await api.acirGetCircuitSizes(bytecode);
42
30
  return { exact, total, subgroup };
43
31
  }
44
- async function init(jsonPath, crsPath) {
32
+ async function init(bytecodePath, crsPath) {
45
33
  const api = await newBarretenbergApiAsync();
46
- const circuitSize = await getGates(jsonPath, api);
34
+ const circuitSize = await getGates(bytecodePath, api);
47
35
  const subgroupSize = Math.pow(2, Math.ceil(Math.log2(circuitSize)));
48
36
  if (subgroupSize > MAX_CIRCUIT_SIZE) {
49
37
  throw new Error(`Circuit size of ${subgroupSize} exceeds max supported of ${MAX_CIRCUIT_SIZE}`);
@@ -56,7 +44,7 @@ async function init(jsonPath, crsPath) {
56
44
  // Important to init slab allocator as first thing, to ensure maximum memory efficiency.
57
45
  await api.commonInitSlabAllocator(subgroupSize);
58
46
  // Load CRS into wasm global CRS state.
59
- // TODO: Make RawBuffer be default behaviour, and have a specific Vector type for when wanting length prefixed.
47
+ // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed.
60
48
  await api.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data()));
61
49
  const acirComposer = await api.acirNewAcirComposer(subgroupSize);
62
50
  return { api, acirComposer, circuitSize: subgroupSize };
@@ -70,41 +58,42 @@ async function initLite() {
70
58
  const acirComposer = await api.acirNewAcirComposer(0);
71
59
  return { api, acirComposer };
72
60
  }
73
- export async function proveAndVerify(jsonPath, witnessPath, crsPath, isRecursive) {
74
- const { api, acirComposer } = await init(jsonPath, crsPath);
61
+ export async function proveAndVerify(bytecodePath, witnessPath, crsPath, isRecursive) {
62
+ const { api, acirComposer } = await init(bytecodePath, crsPath);
75
63
  try {
76
64
  debug(`creating proof...`);
77
- const bytecode = getBytecode(jsonPath);
65
+ const bytecode = getBytecode(bytecodePath);
78
66
  const witness = getWitness(witnessPath);
79
67
  const proof = await api.acirCreateProof(acirComposer, bytecode, witness, isRecursive);
80
68
  debug(`verifying...`);
81
69
  const verified = await api.acirVerifyProof(acirComposer, proof, isRecursive);
82
- console.log(`verified: ${verified}`);
70
+ process.stdout.write(`${verified}`);
83
71
  return verified;
84
72
  }
85
73
  finally {
86
74
  await api.destroy();
87
75
  }
88
76
  }
89
- export async function prove(jsonPath, witnessPath, crsPath, isRecursive, outputPath) {
90
- const { api, acirComposer } = await init(jsonPath, crsPath);
77
+ export async function prove(bytecodePath, witnessPath, crsPath, isRecursive, outputPath) {
78
+ const { api, acirComposer } = await init(bytecodePath, crsPath);
91
79
  try {
92
80
  debug(`creating proof...`);
93
- const bytecode = getBytecode(jsonPath);
81
+ const bytecode = getBytecode(bytecodePath);
94
82
  const witness = getWitness(witnessPath);
95
83
  const proof = await api.acirCreateProof(acirComposer, bytecode, witness, isRecursive);
96
84
  debug(`done.`);
85
+ process.stdout.write(proof);
97
86
  writeFileSync(outputPath, proof);
98
- console.log(`proof written to: ${outputPath}`);
87
+ debug(`proof written to: ${outputPath}`);
99
88
  }
100
89
  finally {
101
90
  await api.destroy();
102
91
  }
103
92
  }
104
- export async function gateCount(jsonPath) {
93
+ export async function gateCount(bytecodePath) {
105
94
  const api = await newBarretenbergApiAsync(1);
106
95
  try {
107
- console.log(`gates: ${await getGates(jsonPath, api)}`);
96
+ process.stdout.write(`${await getGates(bytecodePath, api)}`);
108
97
  }
109
98
  finally {
110
99
  await api.destroy();
@@ -115,7 +104,7 @@ export async function verify(proofPath, isRecursive, vkPath) {
115
104
  try {
116
105
  await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
117
106
  const verified = await api.acirVerifyProof(acirComposer, readFileSync(proofPath), isRecursive);
118
- console.log(`verified: ${verified}`);
107
+ process.stdout.write(`${verified}`);
119
108
  return verified;
120
109
  }
121
110
  finally {
@@ -127,33 +116,25 @@ export async function contract(outputPath, vkPath) {
127
116
  try {
128
117
  await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
129
118
  const contract = await api.acirGetSolidityVerifier(acirComposer);
130
- if (outputPath === '-') {
131
- console.log(contract);
132
- }
133
- else {
134
- writeFileSync(outputPath, contract);
135
- console.log(`contract written to: ${outputPath}`);
136
- }
119
+ process.stdout.write(contract);
120
+ writeFileSync(outputPath, contract);
121
+ debug(`contract written to: ${outputPath}`);
137
122
  }
138
123
  finally {
139
124
  await api.destroy();
140
125
  }
141
126
  }
142
- export async function writeVk(jsonPath, crsPath, outputPath) {
143
- const { api, acirComposer } = await init(jsonPath, crsPath);
127
+ export async function writeVk(bytecodePath, crsPath, outputPath) {
128
+ const { api, acirComposer } = await init(bytecodePath, crsPath);
144
129
  try {
145
130
  debug('initing proving key...');
146
- const bytecode = getBytecode(jsonPath);
131
+ const bytecode = getBytecode(bytecodePath);
147
132
  await api.acirInitProvingKey(acirComposer, bytecode);
148
133
  debug('initing verification key...');
149
134
  const vk = await api.acirGetVerificationKey(acirComposer);
150
- if (outputPath === '-') {
151
- process.stdout.write(vk);
152
- }
153
- else {
154
- writeFileSync(outputPath, vk);
155
- console.log(`vk written to: ${outputPath}`);
156
- }
135
+ process.stdout.write(vk);
136
+ writeFileSync(outputPath, vk);
137
+ debug(`vk written to: ${outputPath}`);
157
138
  }
158
139
  finally {
159
140
  await api.destroy();
@@ -164,7 +145,9 @@ export async function proofAsFields(proofPath, numInnerPublicInputs, outputPath)
164
145
  try {
165
146
  debug('serializing proof byte array into field elements');
166
147
  const proofAsFields = await api.acirSerializeProofIntoFields(acirComposer, readFileSync(proofPath), numInnerPublicInputs);
167
- writeFileSync(outputPath, JSON.stringify(proofAsFields.map(f => f.toString())));
148
+ const jsonProofAsFields = JSON.stringify(proofAsFields.map(f => f.toString()));
149
+ process.stdout.write(jsonProofAsFields);
150
+ writeFileSync(outputPath, jsonProofAsFields);
168
151
  debug('done.');
169
152
  }
170
153
  finally {
@@ -178,7 +161,9 @@ export async function vkAsFields(vkPath, vkeyOutputPath) {
178
161
  await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
179
162
  const [vkAsFields, vkHash] = await api.acirSerializeVerificationKeyIntoFields(acirComposer);
180
163
  const output = [vkHash, ...vkAsFields].map(f => f.toString());
181
- writeFileSync(vkeyOutputPath, JSON.stringify(output));
164
+ const jsonVKAsFields = JSON.stringify(output);
165
+ process.stdout.write(jsonVKAsFields);
166
+ writeFileSync(vkeyOutputPath, jsonVKAsFields);
182
167
  debug('done.');
183
168
  }
184
169
  finally {
@@ -196,32 +181,32 @@ function handleGlobalOptions() {
196
181
  program
197
182
  .command('prove_and_verify')
198
183
  .description('Generate a proof and verify it. Process exits with success or failure code.')
199
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
184
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
200
185
  .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.tr')
201
186
  .option('-r, --recursive', 'prove and verify using recursive prover and verifier', false)
202
- .action(async ({ jsonPath, witnessPath, recursive, crsPath }) => {
187
+ .action(async ({ bytecodePath, witnessPath, recursive, crsPath }) => {
203
188
  handleGlobalOptions();
204
- const result = await proveAndVerify(jsonPath, witnessPath, crsPath, recursive);
189
+ const result = await proveAndVerify(bytecodePath, witnessPath, crsPath, recursive);
205
190
  process.exit(result ? 0 : 1);
206
191
  });
207
192
  program
208
193
  .command('prove')
209
194
  .description('Generate a proof and write it to a file.')
210
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
195
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
211
196
  .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.tr')
212
197
  .option('-r, --recursive', 'prove using recursive prover', false)
213
198
  .option('-o, --output-path <path>', 'Specify the proof output path', './proofs/proof')
214
- .action(async ({ jsonPath, witnessPath, recursive, outputPath, crsPath }) => {
199
+ .action(async ({ bytecodePath, witnessPath, recursive, outputPath, crsPath }) => {
215
200
  handleGlobalOptions();
216
- await prove(jsonPath, witnessPath, crsPath, recursive, outputPath);
201
+ await prove(bytecodePath, witnessPath, crsPath, recursive, outputPath);
217
202
  });
218
203
  program
219
204
  .command('gates')
220
205
  .description('Print gate count to standard output.')
221
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
222
- .action(async ({ jsonPath }) => {
206
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
207
+ .action(async ({ bytecodePath: bytecodePath }) => {
223
208
  handleGlobalOptions();
224
- await gateCount(jsonPath);
209
+ await gateCount(bytecodePath);
225
210
  });
226
211
  program
227
212
  .command('verify')
@@ -237,7 +222,7 @@ program
237
222
  program
238
223
  .command('contract')
239
224
  .description('Output solidity verification key contract.')
240
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
225
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
241
226
  .option('-o, --output-path <path>', 'Specify the path to write the contract', '-')
242
227
  .requiredOption('-k, --vk <path>', 'path to a verification key. avoids recomputation.')
243
228
  .action(async ({ outputPath, vk }) => {
@@ -247,11 +232,11 @@ program
247
232
  program
248
233
  .command('write_vk')
249
234
  .description('Output verification key.')
250
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
235
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
251
236
  .requiredOption('-o, --output-path <path>', 'Specify the path to write the key')
252
- .action(async ({ jsonPath, outputPath, crsPath }) => {
237
+ .action(async ({ bytecodePath, outputPath, crsPath }) => {
253
238
  handleGlobalOptions();
254
- await writeVk(jsonPath, crsPath, outputPath);
239
+ await writeVk(bytecodePath, crsPath, outputPath);
255
240
  });
256
241
  program
257
242
  .command('proof_as_fields')
@@ -265,7 +250,7 @@ program
265
250
  });
266
251
  program
267
252
  .command('vk_as_fields')
268
- .description('Return the verifiation key represented as fields elements. Also return the verification key hash.')
253
+ .description('Return the verification key represented as fields elements. Also return the verification key hash.')
269
254
  .requiredOption('-i, --input-path <path>', 'Specifies the vk path (output from write_vk)')
270
255
  .requiredOption('-o, --output-path <path>', 'Specify the JSON path to write the verification key fields and key hash')
271
256
  .action(async ({ inputPath, outputPath }) => {
@@ -273,4 +258,4 @@ program
273
258
  await vkAsFields(inputPath, outputPath);
274
259
  });
275
260
  program.name('bb.js').parse(process.argv);
276
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsR0FBRyxFQUF3Qix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0YsT0FBTyxXQUFXLE1BQU0sT0FBTyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQyxXQUFXLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVuQyxzQkFBc0I7QUFDdEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0FBRWpDLFNBQVMsV0FBVyxDQUFDLFFBQWdCO0lBQ25DLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsUUFBZ0I7SUFDbkMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN0RCxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztB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
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsR0FBRyxFQUF3Qix1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0YsT0FBTyxXQUFXLE1BQU0sT0FBTyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwQyxXQUFXLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVuQyxzQkFBc0I7QUFDdEIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0FBRWpDLFNBQVMsV0FBVyxDQUFDLFlBQW9CO0lBQ3ZDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckQsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxLQUFLLFVBQVUsUUFBUSxDQUFDLFlBQW9CLEVBQUUsR0FBeUI7SUFDckUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sa0JBQWtCLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLFdBQW1C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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/bb.js",
3
- "version": "0.3.6",
3
+ "version": "0.4.2",
4
4
  "homepage": "https://github.com/AztecProtocol/aztec-packages/tree/master/circuits/cpp/barretenberg/ts",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -9,8 +9,10 @@
9
9
  "displayName": "bb.js",
10
10
  "tsconfig": "./tsconfig.json"
11
11
  },
12
- "main": "./dest/index.js",
13
- "bin": "./dest/main.js",
12
+ "main": "./dest/node/index.js",
13
+ "bin": {
14
+ "bb": "dest/node/main.js"
15
+ },
14
16
  "files": [
15
17
  "src/",
16
18
  "dest/",
@@ -66,6 +68,7 @@
66
68
  "ts-jest": "^29.1.0",
67
69
  "ts-loader": "^9.4.2",
68
70
  "tsconfig-paths-webpack-plugin": "^4.0.1",
71
+ "tslib": "^2.6.2",
69
72
  "typescript": "^5.0.4",
70
73
  "webpack": "^5.82.1",
71
74
  "webpack-cli": "^5.1.1",
package/src/main.ts CHANGED
@@ -11,28 +11,15 @@ const debug = createDebug('bb.js');
11
11
  // Maximum we support.
12
12
  const MAX_CIRCUIT_SIZE = 2 ** 19;
13
13
 
14
- function getJsonData(jsonPath: string) {
15
- const json = readFileSync(jsonPath, 'utf-8');
16
- const parsed = JSON.parse(json);
17
- return parsed;
18
- }
19
-
20
- function getBytecode(jsonPath: string) {
21
- const parsed = getJsonData(jsonPath);
22
- const buffer = Buffer.from(parsed.bytecode, 'base64');
14
+ function getBytecode(bytecodePath: string) {
15
+ const encodedCircuit = readFileSync(bytecodePath, 'utf-8');
16
+ const buffer = Buffer.from(encodedCircuit, 'base64');
23
17
  const decompressed = gunzipSync(buffer);
24
18
  return decompressed;
25
19
  }
26
20
 
27
- async function getGates(jsonPath: string, api: BarretenbergApiAsync) {
28
- const parsed = getJsonData(jsonPath);
29
- if (parsed.gates) {
30
- return +parsed.gates;
31
- }
32
- const { total } = await computeCircuitSize(jsonPath, api);
33
- const jsonData = getJsonData(jsonPath);
34
- jsonData.gates = total;
35
- writeFileSync(jsonPath, JSON.stringify(jsonData));
21
+ async function getGates(bytecodePath: string, api: BarretenbergApiAsync) {
22
+ const { total } = await computeCircuitSize(bytecodePath, api);
36
23
  return total;
37
24
  }
38
25
 
@@ -42,17 +29,17 @@ function getWitness(witnessPath: string) {
42
29
  return decompressed;
43
30
  }
44
31
 
45
- async function computeCircuitSize(jsonPath: string, api: BarretenbergApiAsync) {
32
+ async function computeCircuitSize(bytecodePath: string, api: BarretenbergApiAsync) {
46
33
  debug(`computing circuit size...`);
47
- const bytecode = getBytecode(jsonPath);
34
+ const bytecode = getBytecode(bytecodePath);
48
35
  const [exact, total, subgroup] = await api.acirGetCircuitSizes(bytecode);
49
36
  return { exact, total, subgroup };
50
37
  }
51
38
 
52
- async function init(jsonPath: string, crsPath: string) {
39
+ async function init(bytecodePath: string, crsPath: string) {
53
40
  const api = await newBarretenbergApiAsync();
54
41
 
55
- const circuitSize = await getGates(jsonPath, api);
42
+ const circuitSize = await getGates(bytecodePath, api);
56
43
  const subgroupSize = Math.pow(2, Math.ceil(Math.log2(circuitSize)));
57
44
  if (subgroupSize > MAX_CIRCUIT_SIZE) {
58
45
  throw new Error(`Circuit size of ${subgroupSize} exceeds max supported of ${MAX_CIRCUIT_SIZE}`);
@@ -68,7 +55,7 @@ async function init(jsonPath: string, crsPath: string) {
68
55
  await api.commonInitSlabAllocator(subgroupSize);
69
56
 
70
57
  // Load CRS into wasm global CRS state.
71
- // TODO: Make RawBuffer be default behaviour, and have a specific Vector type for when wanting length prefixed.
58
+ // TODO: Make RawBuffer be default behavior, and have a specific Vector type for when wanting length prefixed.
72
59
  await api.srsInitSrs(new RawBuffer(crs.getG1Data()), crs.numPoints, new RawBuffer(crs.getG2Data()));
73
60
 
74
61
  const acirComposer = await api.acirNewAcirComposer(subgroupSize);
@@ -88,17 +75,17 @@ async function initLite() {
88
75
  return { api, acirComposer };
89
76
  }
90
77
 
91
- export async function proveAndVerify(jsonPath: string, witnessPath: string, crsPath: string, isRecursive: boolean) {
92
- const { api, acirComposer } = await init(jsonPath, crsPath);
78
+ export async function proveAndVerify(bytecodePath: string, witnessPath: string, crsPath: string, isRecursive: boolean) {
79
+ const { api, acirComposer } = await init(bytecodePath, crsPath);
93
80
  try {
94
81
  debug(`creating proof...`);
95
- const bytecode = getBytecode(jsonPath);
82
+ const bytecode = getBytecode(bytecodePath);
96
83
  const witness = getWitness(witnessPath);
97
84
  const proof = await api.acirCreateProof(acirComposer, bytecode, witness, isRecursive);
98
85
 
99
86
  debug(`verifying...`);
100
87
  const verified = await api.acirVerifyProof(acirComposer, proof, isRecursive);
101
- console.log(`verified: ${verified}`);
88
+ process.stdout.write(`${verified}`);
102
89
  return verified;
103
90
  } finally {
104
91
  await api.destroy();
@@ -106,31 +93,33 @@ export async function proveAndVerify(jsonPath: string, witnessPath: string, crsP
106
93
  }
107
94
 
108
95
  export async function prove(
109
- jsonPath: string,
96
+ bytecodePath: string,
110
97
  witnessPath: string,
111
98
  crsPath: string,
112
99
  isRecursive: boolean,
113
100
  outputPath: string,
114
101
  ) {
115
- const { api, acirComposer } = await init(jsonPath, crsPath);
102
+ const { api, acirComposer } = await init(bytecodePath, crsPath);
116
103
  try {
117
104
  debug(`creating proof...`);
118
- const bytecode = getBytecode(jsonPath);
105
+ const bytecode = getBytecode(bytecodePath);
119
106
  const witness = getWitness(witnessPath);
120
107
  const proof = await api.acirCreateProof(acirComposer, bytecode, witness, isRecursive);
121
108
  debug(`done.`);
122
109
 
110
+ process.stdout.write(proof);
123
111
  writeFileSync(outputPath, proof);
124
- console.log(`proof written to: ${outputPath}`);
112
+
113
+ debug(`proof written to: ${outputPath}`);
125
114
  } finally {
126
115
  await api.destroy();
127
116
  }
128
117
  }
129
118
 
130
- export async function gateCount(jsonPath: string) {
119
+ export async function gateCount(bytecodePath: string) {
131
120
  const api = await newBarretenbergApiAsync(1);
132
121
  try {
133
- console.log(`gates: ${await getGates(jsonPath, api)}`);
122
+ process.stdout.write(`${await getGates(bytecodePath, api)}`);
134
123
  } finally {
135
124
  await api.destroy();
136
125
  }
@@ -141,7 +130,8 @@ export async function verify(proofPath: string, isRecursive: boolean, vkPath: st
141
130
  try {
142
131
  await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
143
132
  const verified = await api.acirVerifyProof(acirComposer, readFileSync(proofPath), isRecursive);
144
- console.log(`verified: ${verified}`);
133
+
134
+ process.stdout.write(`${verified}`);
145
135
  return verified;
146
136
  } finally {
147
137
  await api.destroy();
@@ -153,32 +143,30 @@ export async function contract(outputPath: string, vkPath: string) {
153
143
  try {
154
144
  await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
155
145
  const contract = await api.acirGetSolidityVerifier(acirComposer);
156
- if (outputPath === '-') {
157
- console.log(contract);
158
- } else {
159
- writeFileSync(outputPath, contract);
160
- console.log(`contract written to: ${outputPath}`);
161
- }
146
+
147
+ process.stdout.write(contract);
148
+ writeFileSync(outputPath, contract);
149
+
150
+ debug(`contract written to: ${outputPath}`);
162
151
  } finally {
163
152
  await api.destroy();
164
153
  }
165
154
  }
166
155
 
167
- export async function writeVk(jsonPath: string, crsPath: string, outputPath: string) {
168
- const { api, acirComposer } = await init(jsonPath, crsPath);
156
+ export async function writeVk(bytecodePath: string, crsPath: string, outputPath: string) {
157
+ const { api, acirComposer } = await init(bytecodePath, crsPath);
169
158
  try {
170
159
  debug('initing proving key...');
171
- const bytecode = getBytecode(jsonPath);
160
+ const bytecode = getBytecode(bytecodePath);
172
161
  await api.acirInitProvingKey(acirComposer, bytecode);
173
162
 
174
163
  debug('initing verification key...');
175
164
  const vk = await api.acirGetVerificationKey(acirComposer);
176
- if (outputPath === '-') {
177
- process.stdout.write(vk);
178
- } else {
179
- writeFileSync(outputPath, vk);
180
- console.log(`vk written to: ${outputPath}`);
181
- }
165
+
166
+ process.stdout.write(vk);
167
+ writeFileSync(outputPath, vk);
168
+
169
+ debug(`vk written to: ${outputPath}`);
182
170
  } finally {
183
171
  await api.destroy();
184
172
  }
@@ -194,8 +182,11 @@ export async function proofAsFields(proofPath: string, numInnerPublicInputs: num
194
182
  readFileSync(proofPath),
195
183
  numInnerPublicInputs,
196
184
  );
185
+ const jsonProofAsFields = JSON.stringify(proofAsFields.map(f => f.toString()));
186
+
187
+ process.stdout.write(jsonProofAsFields);
188
+ writeFileSync(outputPath, jsonProofAsFields);
197
189
 
198
- writeFileSync(outputPath, JSON.stringify(proofAsFields.map(f => f.toString())));
199
190
  debug('done.');
200
191
  } finally {
201
192
  await api.destroy();
@@ -210,7 +201,11 @@ export async function vkAsFields(vkPath: string, vkeyOutputPath: string) {
210
201
  await api.acirLoadVerificationKey(acirComposer, new RawBuffer(readFileSync(vkPath)));
211
202
  const [vkAsFields, vkHash] = await api.acirSerializeVerificationKeyIntoFields(acirComposer);
212
203
  const output = [vkHash, ...vkAsFields].map(f => f.toString());
213
- writeFileSync(vkeyOutputPath, JSON.stringify(output));
204
+ const jsonVKAsFields = JSON.stringify(output);
205
+
206
+ process.stdout.write(jsonVKAsFields);
207
+ writeFileSync(vkeyOutputPath, jsonVKAsFields);
208
+
214
209
  debug('done.');
215
210
  } finally {
216
211
  await api.destroy();
@@ -231,34 +226,34 @@ function handleGlobalOptions() {
231
226
  program
232
227
  .command('prove_and_verify')
233
228
  .description('Generate a proof and verify it. Process exits with success or failure code.')
234
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
229
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
235
230
  .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.tr')
236
231
  .option('-r, --recursive', 'prove and verify using recursive prover and verifier', false)
237
- .action(async ({ jsonPath, witnessPath, recursive, crsPath }) => {
232
+ .action(async ({ bytecodePath, witnessPath, recursive, crsPath }) => {
238
233
  handleGlobalOptions();
239
- const result = await proveAndVerify(jsonPath, witnessPath, crsPath, recursive);
234
+ const result = await proveAndVerify(bytecodePath, witnessPath, crsPath, recursive);
240
235
  process.exit(result ? 0 : 1);
241
236
  });
242
237
 
243
238
  program
244
239
  .command('prove')
245
240
  .description('Generate a proof and write it to a file.')
246
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
241
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
247
242
  .option('-w, --witness-path <path>', 'Specify the witness path', './target/witness.tr')
248
243
  .option('-r, --recursive', 'prove using recursive prover', false)
249
244
  .option('-o, --output-path <path>', 'Specify the proof output path', './proofs/proof')
250
- .action(async ({ jsonPath, witnessPath, recursive, outputPath, crsPath }) => {
245
+ .action(async ({ bytecodePath, witnessPath, recursive, outputPath, crsPath }) => {
251
246
  handleGlobalOptions();
252
- await prove(jsonPath, witnessPath, crsPath, recursive, outputPath);
247
+ await prove(bytecodePath, witnessPath, crsPath, recursive, outputPath);
253
248
  });
254
249
 
255
250
  program
256
251
  .command('gates')
257
252
  .description('Print gate count to standard output.')
258
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
259
- .action(async ({ jsonPath }) => {
253
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
254
+ .action(async ({ bytecodePath: bytecodePath }) => {
260
255
  handleGlobalOptions();
261
- await gateCount(jsonPath);
256
+ await gateCount(bytecodePath);
262
257
  });
263
258
 
264
259
  program
@@ -276,7 +271,7 @@ program
276
271
  program
277
272
  .command('contract')
278
273
  .description('Output solidity verification key contract.')
279
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
274
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
280
275
  .option('-o, --output-path <path>', 'Specify the path to write the contract', '-')
281
276
  .requiredOption('-k, --vk <path>', 'path to a verification key. avoids recomputation.')
282
277
  .action(async ({ outputPath, vk }) => {
@@ -287,11 +282,11 @@ program
287
282
  program
288
283
  .command('write_vk')
289
284
  .description('Output verification key.')
290
- .option('-j, --json-path <path>', 'Specify the JSON path', './target/main.json')
285
+ .option('-b, --bytecode-path <path>', 'Specify the bytecode path', './target/main.bytecode')
291
286
  .requiredOption('-o, --output-path <path>', 'Specify the path to write the key')
292
- .action(async ({ jsonPath, outputPath, crsPath }) => {
287
+ .action(async ({ bytecodePath, outputPath, crsPath }) => {
293
288
  handleGlobalOptions();
294
- await writeVk(jsonPath, crsPath, outputPath);
289
+ await writeVk(bytecodePath, crsPath, outputPath);
295
290
  });
296
291
 
297
292
  program
@@ -307,7 +302,7 @@ program
307
302
 
308
303
  program
309
304
  .command('vk_as_fields')
310
- .description('Return the verifiation key represented as fields elements. Also return the verification key hash.')
305
+ .description('Return the verification key represented as fields elements. Also return the verification key hash.')
311
306
  .requiredOption('-i, --input-path <path>', 'Specifies the vk path (output from write_vk)')
312
307
  .requiredOption('-o, --output-path <path>', 'Specify the JSON path to write the verification key fields and key hash')
313
308
  .action(async ({ inputPath, outputPath }) => {