@aztec/bb-prover 0.0.1-commit.d3ec352c → 0.0.1-commit.d58ff9d0
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/dest/avm_proving_tests/avm_proving_tester.d.ts +16 -10
- package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
- package/dest/avm_proving_tests/avm_proving_tester.js +182 -111
- package/dest/bb/bb_js_backend.d.ts +196 -0
- package/dest/bb/bb_js_backend.d.ts.map +1 -0
- package/dest/bb/bb_js_backend.js +379 -0
- package/dest/bb/bb_js_debug.d.ts +52 -0
- package/dest/bb/bb_js_debug.d.ts.map +1 -0
- package/dest/bb/bb_js_debug.js +176 -0
- package/dest/bb/file_names.d.ts +4 -0
- package/dest/bb/file_names.d.ts.map +1 -0
- package/dest/bb/file_names.js +5 -0
- package/dest/config.d.ts +17 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/index.d.ts +3 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/instrumentation.d.ts +1 -1
- package/dest/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation.js +21 -43
- package/dest/prover/client/bb_private_kernel_prover.d.ts +29 -7
- package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -1
- package/dest/prover/client/bb_private_kernel_prover.js +90 -16
- package/dest/prover/client/bundle.d.ts +3 -3
- package/dest/prover/client/bundle.d.ts.map +1 -1
- package/dest/prover/client/bundle.js +2 -3
- package/dest/prover/client/lazy.d.ts +3 -3
- package/dest/prover/client/lazy.d.ts.map +1 -1
- package/dest/prover/client/lazy.js +2 -3
- package/dest/prover/proof_utils.d.ts +11 -1
- package/dest/prover/proof_utils.d.ts.map +1 -1
- package/dest/prover/proof_utils.js +25 -2
- package/dest/prover/server/bb_prover.d.ts +9 -13
- package/dest/prover/server/bb_prover.d.ts.map +1 -1
- package/dest/prover/server/bb_prover.js +613 -113
- package/dest/test/delay_values.d.ts +1 -1
- package/dest/test/delay_values.d.ts.map +1 -1
- package/dest/test/delay_values.js +28 -26
- package/dest/test/index.d.ts +2 -1
- package/dest/test/index.d.ts.map +1 -1
- package/dest/test/index.js +1 -0
- package/dest/test/test_circuit_prover.d.ts +5 -5
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +462 -59
- package/dest/verification_key/verification_key_data.d.ts +1 -8
- package/dest/verification_key/verification_key_data.d.ts.map +1 -1
- package/dest/verification_key/verification_key_data.js +2 -21
- package/dest/verifier/batch_chonk_verifier.d.ts +56 -0
- package/dest/verifier/batch_chonk_verifier.d.ts.map +1 -0
- package/dest/verifier/batch_chonk_verifier.js +384 -0
- package/dest/verifier/bb_verifier.d.ts +4 -1
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +134 -48
- package/dest/verifier/index.d.ts +2 -1
- package/dest/verifier/index.d.ts.map +1 -1
- package/dest/verifier/index.js +1 -0
- package/dest/verifier/queued_chonk_verifier.d.ts +2 -3
- package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -1
- package/dest/verifier/queued_chonk_verifier.js +15 -45
- package/package.json +20 -18
- package/src/avm_proving_tests/avm_proving_tester.ts +91 -142
- package/src/bb/bb_js_backend.ts +435 -0
- package/src/bb/bb_js_debug.ts +227 -0
- package/src/bb/file_names.ts +6 -0
- package/src/config.ts +16 -0
- package/src/index.ts +2 -1
- package/src/instrumentation.ts +20 -43
- package/src/prover/client/bb_private_kernel_prover.ts +259 -25
- package/src/prover/client/bundle.ts +3 -4
- package/src/prover/client/lazy.ts +3 -4
- package/src/prover/proof_utils.ts +42 -2
- package/src/prover/server/bb_prover.ts +132 -162
- package/src/test/delay_values.ts +30 -26
- package/src/test/index.ts +1 -0
- package/src/test/test_circuit_prover.ts +11 -16
- package/src/verification_key/verification_key_data.ts +2 -27
- package/src/verifier/batch_chonk_verifier.ts +415 -0
- package/src/verifier/bb_verifier.ts +66 -80
- package/src/verifier/index.ts +1 -0
- package/src/verifier/queued_chonk_verifier.ts +15 -47
- package/dest/bb/execute.d.ts +0 -107
- package/dest/bb/execute.d.ts.map +0 -1
- package/dest/bb/execute.js +0 -676
- package/src/bb/execute.ts +0 -706
|
@@ -1,21 +1,27 @@
|
|
|
1
|
-
import { PublicTxSimulationTester, SimpleContractDataSource, type TestEnqueuedCall, type TestExecutorMetrics, type TestPrivateInsertions } from '@aztec/simulator/public/fixtures';
|
|
1
|
+
import { type MeasuredSimulatorFactory, PublicTxSimulationTester, SimpleContractDataSource, type TestEnqueuedCall, type TestExecutorMetrics, type TestPrivateInsertions } from '@aztec/simulator/public/fixtures';
|
|
2
2
|
import type { PublicTxResult } from '@aztec/simulator/server';
|
|
3
3
|
import { AvmCircuitInputs, AvmCircuitPublicInputs } from '@aztec/stdlib/avm';
|
|
4
4
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
import type { Gas } from '@aztec/stdlib/gas';
|
|
5
6
|
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
6
7
|
import type { GlobalVariables } from '@aztec/stdlib/tx';
|
|
7
8
|
import { NativeWorldStateService } from '@aztec/world-state';
|
|
8
|
-
import { type BBResult, type BBSuccess } from '../bb/execute.js';
|
|
9
9
|
export declare class AvmProvingTester extends PublicTxSimulationTester {
|
|
10
10
|
private checkCircuitOnly;
|
|
11
|
-
private
|
|
12
|
-
constructor(checkCircuitOnly: boolean, contractDataSource: SimpleContractDataSource, merkleTrees: MerkleTreeWriteOperations, globals?: GlobalVariables, metrics?: TestExecutorMetrics);
|
|
11
|
+
private readonly bbJsFactory;
|
|
12
|
+
constructor(checkCircuitOnly: boolean, contractDataSource: SimpleContractDataSource, merkleTrees: MerkleTreeWriteOperations, globals?: GlobalVariables, metrics?: TestExecutorMetrics, simulatorFactory?: MeasuredSimulatorFactory);
|
|
13
13
|
static new(worldStateService: NativeWorldStateService, checkCircuitOnly?: boolean, globals?: GlobalVariables, metrics?: TestExecutorMetrics): Promise<AvmProvingTester>;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Generate an AVM proof (or run check-circuit if configured). Records per-stage timings in the test metrics.
|
|
17
|
+
* Returns the in-memory proof fields on success; throws via jest expect() on failure.
|
|
18
|
+
*/
|
|
19
|
+
prove(avmCircuitInputs: AvmCircuitInputs, txLabel?: string): Promise<Uint8Array[]>;
|
|
20
|
+
verify(proof: Uint8Array[], publicInputs: AvmCircuitPublicInputs): Promise<void>;
|
|
16
21
|
proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel?: string): Promise<void>;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
private recordProverMetrics;
|
|
23
|
+
simProveVerify(sender: AztecAddress, setupCalls: TestEnqueuedCall[], appCalls: TestEnqueuedCall[], teardownCall: TestEnqueuedCall | undefined, expectRevert: boolean | undefined, feePayer?: AztecAddress, privateInsertions?: TestPrivateInsertions, txLabel?: string, disableRevertCheck?: boolean, gasLimits?: Gas): Promise<PublicTxResult>;
|
|
24
|
+
executeTxWithLabel(txLabel: string, sender: AztecAddress, setupCalls?: TestEnqueuedCall[], appCalls?: TestEnqueuedCall[], teardownCall?: TestEnqueuedCall, feePayer?: AztecAddress, privateInsertions?: TestPrivateInsertions, gasLimits?: Gas): Promise<PublicTxResult>;
|
|
25
|
+
simProveVerifyAppLogic(appCall: TestEnqueuedCall, expectRevert?: boolean, txLabel?: string, gasLimits?: Gas): Promise<void>;
|
|
20
26
|
}
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX3Byb3ZpbmdfdGVzdGVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXZtX3Byb3ZpbmdfdGVzdHMvYXZtX3Byb3ZpbmdfdGVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFDTCxLQUFLLHdCQUF3QixFQUM3Qix3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUssbUJBQW1CLEVBQ3hCLEtBQUsscUJBQXFCLEVBQzNCLE1BQU0sa0NBQWtDLENBQUM7QUFFMUMsT0FBTyxLQUFLLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLHNCQUFzQixFQUF5QixNQUFNLG1CQUFtQixDQUFDO0FBQ3BHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBa0I3RCxxQkFBYSxnQkFBaUIsU0FBUSx3QkFBd0I7SUFPMUQsT0FBTyxDQUFDLGdCQUFnQjtJQU4xQixPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FHekI7SUFFSCxZQUNVLGdCQUFnQixFQUFFLE9BQU8sRUFDakMsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQzVDLFdBQVcsRUFBRSx5QkFBeUIsRUFDdEMsT0FBTyxDQUFDLEVBQUUsZUFBZSxFQUN6QixPQUFPLENBQUMsRUFBRSxtQkFBbUIsRUFDN0IsZ0JBQWdCLENBQUMsRUFBRSx3QkFBd0IsRUFHNUM7SUFFRCxPQUFhLEdBQUcsQ0FDZCxpQkFBaUIsRUFBRSx1QkFBdUIsRUFDMUMsZ0JBQWdCLEdBQUUsT0FBZSxFQUNqQyxPQUFPLENBQUMsRUFBRSxlQUFlLEVBQ3pCLE9BQU8sQ0FBQyxFQUFFLG1CQUFtQiw2QkFtQjlCO0lBRXFCLEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBTTNDO0lBRUQ7OztPQUdHO0lBQ0csS0FBSyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE9BQU8sR0FBRSxNQUFzQixHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQWV0RztJQUVLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FTckY7SUFFWSxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxHQUFFLE1BQXNCLGlCQUczRjtJQUVELE9BQU8sQ0FBQyxtQkFBbUI7SUE0QmQsY0FBYyxDQUN6QixNQUFNLEVBQUUsWUFBWSxFQUNwQixVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsRUFDOUIsUUFBUSxFQUFFLGdCQUFnQixFQUFFLEVBQzVCLFlBQVksRUFBRSxnQkFBZ0IsR0FBRyxTQUFTLEVBQzFDLFlBQVksRUFBRSxPQUFPLEdBQUcsU0FBUyxFQUNqQyxRQUFRLGVBQVMsRUFDakIsaUJBQWlCLENBQUMsRUFBRSxxQkFBcUIsRUFDekMsT0FBTyxHQUFFLE1BQXNCLEVBQy9CLGtCQUFrQixHQUFFLE9BQWUsRUFDbkMsU0FBUyxDQUFDLEVBQUUsR0FBRyxHQUNkLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0EyQnpCO0lBRXFCLGtCQUFrQixDQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUNmLE1BQU0sRUFBRSxZQUFZLEVBQ3BCLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEVBQy9CLFFBQVEsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEVBQzdCLFlBQVksQ0FBQyxFQUFFLGdCQUFnQixFQUMvQixRQUFRLENBQUMsRUFBRSxZQUFZLEVBQ3ZCLGlCQUFpQixDQUFDLEVBQUUscUJBQXFCLEVBQ3pDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsMkJBY2hCO0lBRVksc0JBQXNCLENBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFDekIsWUFBWSxDQUFDLEVBQUUsT0FBTyxFQUN0QixPQUFPLEdBQUUsTUFBc0IsRUFDL0IsU0FBUyxDQUFDLEVBQUUsR0FBRyxpQkFjaEI7Q0FDRiJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avm_proving_tester.d.ts","sourceRoot":"","sources":["../../src/avm_proving_tests/avm_proving_tester.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"avm_proving_tester.d.ts","sourceRoot":"","sources":["../../src/avm_proving_tests/avm_proving_tester.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,wBAAwB,EAC7B,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAyB,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAkB7D,qBAAa,gBAAiB,SAAQ,wBAAwB;IAO1D,OAAO,CAAC,gBAAgB;IAN1B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGzB;IAEH,YACU,gBAAgB,EAAE,OAAO,EACjC,kBAAkB,EAAE,wBAAwB,EAC5C,WAAW,EAAE,yBAAyB,EACtC,OAAO,CAAC,EAAE,eAAe,EACzB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,gBAAgB,CAAC,EAAE,wBAAwB,EAG5C;IAED,OAAa,GAAG,CACd,iBAAiB,EAAE,uBAAuB,EAC1C,gBAAgB,GAAE,OAAe,EACjC,OAAO,CAAC,EAAE,eAAe,EACzB,OAAO,CAAC,EAAE,mBAAmB,6BAmB9B;IAEqB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAM3C;IAED;;;OAGG;IACG,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAetG;IAEK,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CASrF;IAEY,WAAW,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,GAAE,MAAsB,iBAG3F;IAED,OAAO,CAAC,mBAAmB;IA4Bd,cAAc,CACzB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,gBAAgB,EAAE,EAC9B,QAAQ,EAAE,gBAAgB,EAAE,EAC5B,YAAY,EAAE,gBAAgB,GAAG,SAAS,EAC1C,YAAY,EAAE,OAAO,GAAG,SAAS,EACjC,QAAQ,eAAS,EACjB,iBAAiB,CAAC,EAAE,qBAAqB,EACzC,OAAO,GAAE,MAAsB,EAC/B,kBAAkB,GAAE,OAAe,EACnC,SAAS,CAAC,EAAE,GAAG,GACd,OAAO,CAAC,cAAc,CAAC,CA2BzB;IAEqB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,CAAC,EAAE,gBAAgB,EAAE,EAC7B,YAAY,CAAC,EAAE,gBAAgB,EAC/B,QAAQ,CAAC,EAAE,YAAY,EACvB,iBAAiB,CAAC,EAAE,qBAAqB,EACzC,SAAS,CAAC,EAAE,GAAG,2BAchB;IAEY,sBAAsB,CACjC,OAAO,EAAE,gBAAgB,EACzB,YAAY,CAAC,EAAE,OAAO,EACtB,OAAO,GAAE,MAAsB,EAC/B,SAAS,CAAC,EAAE,GAAG,iBAchB;CACF"}
|
|
@@ -1,119 +1,202 @@
|
|
|
1
|
+
function _ts_add_disposable_resource(env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() {
|
|
16
|
+
try {
|
|
17
|
+
inner.call(this);
|
|
18
|
+
} catch (e) {
|
|
19
|
+
return Promise.reject(e);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
env.stack.push({
|
|
23
|
+
value: value,
|
|
24
|
+
dispose: dispose,
|
|
25
|
+
async: async
|
|
26
|
+
});
|
|
27
|
+
} else if (async) {
|
|
28
|
+
env.stack.push({
|
|
29
|
+
async: true
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function _ts_dispose_resources(env) {
|
|
35
|
+
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
36
|
+
var e = new Error(message);
|
|
37
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
38
|
+
};
|
|
39
|
+
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
40
|
+
function fail(e) {
|
|
41
|
+
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
42
|
+
env.hasError = true;
|
|
43
|
+
}
|
|
44
|
+
var r, s = 0;
|
|
45
|
+
function next() {
|
|
46
|
+
while(r = env.stack.pop()){
|
|
47
|
+
try {
|
|
48
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
49
|
+
if (r.dispose) {
|
|
50
|
+
var result = r.dispose.call(r.value);
|
|
51
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
52
|
+
fail(e);
|
|
53
|
+
return next();
|
|
54
|
+
});
|
|
55
|
+
} else s |= 1;
|
|
56
|
+
} catch (e) {
|
|
57
|
+
fail(e);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
61
|
+
if (env.hasError) throw env.error;
|
|
62
|
+
}
|
|
63
|
+
return next();
|
|
64
|
+
})(env);
|
|
65
|
+
}
|
|
66
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
1
67
|
import { Timer } from '@aztec/foundation/timer';
|
|
2
68
|
import { PublicTxSimulationTester, SimpleContractDataSource } from '@aztec/simulator/public/fixtures';
|
|
69
|
+
import { AvmSimulatorPool, MeasuredPublicTxSimulator } from '@aztec/simulator/server';
|
|
3
70
|
import { AvmCircuitInputs, PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
4
71
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
-
import fs from 'node:fs/promises';
|
|
6
|
-
import { tmpdir } from 'node:os';
|
|
7
72
|
import path from 'path';
|
|
8
|
-
import {
|
|
73
|
+
import { BBJsFactory } from '../bb/bb_js_backend.js';
|
|
9
74
|
const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb-avm');
|
|
10
|
-
// An InterceptingLogger that records all log messages and forwards them to a wrapped logger.
|
|
11
|
-
class InterceptingLogger {
|
|
12
|
-
logs = [];
|
|
13
|
-
level;
|
|
14
|
-
module;
|
|
15
|
-
logger;
|
|
16
|
-
constructor(logger){
|
|
17
|
-
this.logger = logger;
|
|
18
|
-
this.level = logger.level;
|
|
19
|
-
this.module = logger.module;
|
|
20
|
-
}
|
|
21
|
-
isLevelEnabled(level) {
|
|
22
|
-
return this.logger.isLevelEnabled(level);
|
|
23
|
-
}
|
|
24
|
-
createChild(_childModule) {
|
|
25
|
-
throw new Error('Not implemented');
|
|
26
|
-
}
|
|
27
|
-
intercept(level, msg, ...args) {
|
|
28
|
-
this.logs.push(...msg.split('\n'));
|
|
29
|
-
// Forward to the wrapped logger
|
|
30
|
-
this.logger[level](msg, ...args);
|
|
31
|
-
}
|
|
32
|
-
// Log methods for each level
|
|
33
|
-
silent(msg, ...args) {
|
|
34
|
-
this.intercept('silent', msg, ...args);
|
|
35
|
-
}
|
|
36
|
-
fatal(msg, ...args) {
|
|
37
|
-
this.intercept('fatal', msg, ...args);
|
|
38
|
-
}
|
|
39
|
-
warn(msg, ...args) {
|
|
40
|
-
this.intercept('warn', msg, ...args);
|
|
41
|
-
}
|
|
42
|
-
info(msg, ...args) {
|
|
43
|
-
this.intercept('info', msg, ...args);
|
|
44
|
-
}
|
|
45
|
-
verbose(msg, ...args) {
|
|
46
|
-
this.intercept('verbose', msg, ...args);
|
|
47
|
-
}
|
|
48
|
-
debug(msg, ...args) {
|
|
49
|
-
this.intercept('debug', msg, ...args);
|
|
50
|
-
}
|
|
51
|
-
trace(msg, ...args) {
|
|
52
|
-
this.intercept('trace', msg, ...args);
|
|
53
|
-
}
|
|
54
|
-
// Error log function can be string or Error
|
|
55
|
-
error(err, ...args) {
|
|
56
|
-
const msg = typeof err === 'string' ? err : err.message;
|
|
57
|
-
this.logs.push(msg);
|
|
58
|
-
this.logger.error(msg, err, ...args);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
75
|
// Config with collectHints enabled for proving tests
|
|
62
76
|
const provingConfig = PublicSimulatorConfig.from({
|
|
63
77
|
skipFeeEnforcement: false,
|
|
64
78
|
collectCallMetadata: true,
|
|
65
79
|
collectDebugLogs: false,
|
|
66
80
|
collectHints: true,
|
|
81
|
+
collectPublicInputs: true,
|
|
67
82
|
collectStatistics: false
|
|
68
83
|
});
|
|
69
84
|
export class AvmProvingTester extends PublicTxSimulationTester {
|
|
70
85
|
checkCircuitOnly;
|
|
71
|
-
|
|
72
|
-
constructor(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics){
|
|
73
|
-
|
|
74
|
-
|
|
86
|
+
bbJsFactory;
|
|
87
|
+
constructor(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics, simulatorFactory){
|
|
88
|
+
super(merkleTrees, contractDataSource, globals, metrics, simulatorFactory, provingConfig), this.checkCircuitOnly = checkCircuitOnly, this.bbJsFactory = new BBJsFactory(BB_PATH, {
|
|
89
|
+
debugDir: process.env.BB_DEBUG_OUTPUT_DIR,
|
|
90
|
+
logger: createLogger('bb-prover:avm-proving-tester')
|
|
91
|
+
});
|
|
75
92
|
}
|
|
76
93
|
static async new(worldStateService, checkCircuitOnly = false, globals, metrics) {
|
|
77
94
|
const contractDataSource = new SimpleContractDataSource();
|
|
78
95
|
const merkleTrees = await worldStateService.fork();
|
|
79
|
-
|
|
96
|
+
const avmSimulator = await AvmSimulatorPool.spawn({
|
|
97
|
+
wsdbIpcPath: worldStateService.getIpcPath()
|
|
98
|
+
});
|
|
99
|
+
const simulatorFactory = (mt, cdb, g, m, c)=>new MeasuredPublicTxSimulator(avmSimulator, g, cdb, mt.getRevision().forkId, m, c, undefined);
|
|
100
|
+
const tester = new AvmProvingTester(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics, simulatorFactory);
|
|
101
|
+
tester.avmSimulator = avmSimulator;
|
|
102
|
+
return tester;
|
|
103
|
+
}
|
|
104
|
+
async close() {
|
|
105
|
+
const results = await Promise.allSettled([
|
|
106
|
+
super.close(),
|
|
107
|
+
this.bbJsFactory.destroy()
|
|
108
|
+
]);
|
|
109
|
+
const errors = results.flatMap((result)=>result.status === 'rejected' ? [
|
|
110
|
+
result.reason
|
|
111
|
+
] : []);
|
|
112
|
+
if (errors.length > 0) {
|
|
113
|
+
throw new AggregateError(errors, `Failed to close AVM proving tester`);
|
|
114
|
+
}
|
|
80
115
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
116
|
+
/**
|
|
117
|
+
* Generate an AVM proof (or run check-circuit if configured). Records per-stage timings in the test metrics.
|
|
118
|
+
* Returns the in-memory proof fields on success; throws via jest expect() on failure.
|
|
119
|
+
*/ async prove(avmCircuitInputs, txLabel = 'unlabeledTx') {
|
|
120
|
+
const env = {
|
|
121
|
+
stack: [],
|
|
122
|
+
error: void 0,
|
|
123
|
+
hasError: false
|
|
124
|
+
};
|
|
125
|
+
try {
|
|
126
|
+
const inputsBuffer = avmCircuitInputs.serializeWithMessagePack();
|
|
127
|
+
if (this.checkCircuitOnly) {
|
|
128
|
+
const env = {
|
|
129
|
+
stack: [],
|
|
130
|
+
error: void 0,
|
|
131
|
+
hasError: false
|
|
132
|
+
};
|
|
133
|
+
try {
|
|
134
|
+
const instance = _ts_add_disposable_resource(env, await this.bbJsFactory.getInstance(), true);
|
|
135
|
+
const { passed, stats } = await instance.checkAvmCircuit(inputsBuffer);
|
|
136
|
+
this.recordProverMetrics(stats, txLabel);
|
|
137
|
+
expect(passed).toBe(true);
|
|
138
|
+
return [];
|
|
139
|
+
} catch (e) {
|
|
140
|
+
env.error = e;
|
|
141
|
+
env.hasError = true;
|
|
142
|
+
} finally{
|
|
143
|
+
const result = _ts_dispose_resources(env);
|
|
144
|
+
if (result) await result;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const instance = _ts_add_disposable_resource(env, await this.bbJsFactory.getInstance(), true);
|
|
148
|
+
const { proof, stats } = await instance.generateAvmProof(inputsBuffer);
|
|
149
|
+
this.recordProverMetrics(stats, txLabel);
|
|
150
|
+
return proof;
|
|
151
|
+
} catch (e) {
|
|
152
|
+
env.error = e;
|
|
153
|
+
env.hasError = true;
|
|
154
|
+
} finally{
|
|
155
|
+
const result = _ts_dispose_resources(env);
|
|
156
|
+
if (result) await result;
|
|
89
157
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
// }
|
|
102
|
-
// });
|
|
103
|
-
const times = {};
|
|
104
|
-
logs.forEach((log)=>{
|
|
105
|
-
const match = log.match(/\b([\w/]+)_ms: (\d+)/);
|
|
106
|
-
if (match) {
|
|
107
|
-
times[match[1]] = parseInt(match[2]);
|
|
158
|
+
}
|
|
159
|
+
async verify(proof, publicInputs) {
|
|
160
|
+
const env = {
|
|
161
|
+
stack: [],
|
|
162
|
+
error: void 0,
|
|
163
|
+
hasError: false
|
|
164
|
+
};
|
|
165
|
+
try {
|
|
166
|
+
if (this.checkCircuitOnly) {
|
|
167
|
+
// Check-circuit did not generate a proof; nothing to verify.
|
|
168
|
+
return;
|
|
108
169
|
}
|
|
109
|
-
|
|
110
|
-
|
|
170
|
+
const piBuffer = publicInputs.serializeWithMessagePack();
|
|
171
|
+
const instance = _ts_add_disposable_resource(env, await this.bbJsFactory.getInstance(), true);
|
|
172
|
+
const { verified } = await instance.verifyAvmProof(proof, piBuffer);
|
|
173
|
+
expect(verified).toBe(true);
|
|
174
|
+
} catch (e) {
|
|
175
|
+
env.error = e;
|
|
176
|
+
env.hasError = true;
|
|
177
|
+
} finally{
|
|
178
|
+
const result = _ts_dispose_resources(env);
|
|
179
|
+
if (result) await result;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async proveVerify(avmCircuitInputs, txLabel = 'unlabeledTx') {
|
|
183
|
+
const proof = await this.prove(avmCircuitInputs, txLabel);
|
|
184
|
+
await this.verify(proof, avmCircuitInputs.publicInputs);
|
|
185
|
+
}
|
|
186
|
+
recordProverMetrics(stats, txLabel) {
|
|
187
|
+
// Build a lookup keyed on the stage name with the `_ms` suffix stripped, matching the legacy
|
|
188
|
+
// stdout-scraped shape. bb::avm2::Stats::time() stores keys with `_ms` appended.
|
|
189
|
+
const times = {};
|
|
190
|
+
for (const { name, valueMs } of stats){
|
|
191
|
+
const key = name.endsWith('_ms') ? name.slice(0, -'_ms'.length) : name;
|
|
192
|
+
times[key] = valueMs;
|
|
193
|
+
}
|
|
111
194
|
if (Object.keys(times).length === 0) {
|
|
112
|
-
throw new Error('AVM
|
|
195
|
+
throw new Error('AVM response did not contain any proving-stage timings!');
|
|
113
196
|
}
|
|
114
197
|
// Hack to make labels match.
|
|
115
198
|
const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
|
|
116
|
-
//
|
|
199
|
+
// Cast because TS doesn't realize `metrics` is protected, not private on the parent class.
|
|
117
200
|
this.metrics?.recordProverMetrics(txLabelWithCount, {
|
|
118
201
|
proverSimulationStepMs: times['simulation/all'],
|
|
119
202
|
proverProvingStepMs: times['proving/all'],
|
|
@@ -126,24 +209,12 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
126
209
|
provingLogDerivativeInverseCommitmentsMs: times['prove/log_derivative_inverse_commitments_round'],
|
|
127
210
|
provingWireCommitmentsMs: times['prove/wire_commitments_round']
|
|
128
211
|
});
|
|
129
|
-
return proofRes;
|
|
130
|
-
}
|
|
131
|
-
async verify(proofRes, publicInputs) {
|
|
132
|
-
if (this.checkCircuitOnly) {
|
|
133
|
-
// Skip verification if we are only checking the circuit.
|
|
134
|
-
// Check-circuit does not generate a proof to verify.
|
|
135
|
-
return proofRes;
|
|
136
|
-
}
|
|
137
|
-
return await verifyAvmProof(BB_PATH, this.bbWorkingDirectory, proofRes.proofPath, publicInputs, path.join(proofRes.vkDirectoryPath, VK_FILENAME), this.logger);
|
|
138
|
-
}
|
|
139
|
-
async proveVerify(avmCircuitInputs, txLabel = 'unlabeledTx') {
|
|
140
|
-
const provingRes = await this.prove(avmCircuitInputs, txLabel);
|
|
141
|
-
expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
|
|
142
|
-
const verificationRes = await this.verify(provingRes, avmCircuitInputs.publicInputs);
|
|
143
|
-
expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
|
|
144
212
|
}
|
|
145
|
-
async simProveVerify(sender, setupCalls, appCalls, teardownCall, expectRevert, feePayer = sender, privateInsertions, txLabel = 'unlabeledTx', disableRevertCheck = false) {
|
|
146
|
-
const
|
|
213
|
+
async simProveVerify(sender, setupCalls, appCalls, teardownCall, expectRevert, feePayer = sender, privateInsertions, txLabel = 'unlabeledTx', disableRevertCheck = false, gasLimits) {
|
|
214
|
+
const simTimer = new Timer();
|
|
215
|
+
const simRes = await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer, privateInsertions, txLabel, gasLimits);
|
|
216
|
+
const simDuration = simTimer.ms();
|
|
217
|
+
this.logger.info(`Simulation took ${simDuration} ms for tx ${txLabel}`);
|
|
147
218
|
if (!disableRevertCheck) {
|
|
148
219
|
expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
|
|
149
220
|
}
|
|
@@ -154,12 +225,12 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
154
225
|
this.logger.info(`${opString} took ${timer.ms()} ms for tx ${txLabel}`);
|
|
155
226
|
return simRes;
|
|
156
227
|
}
|
|
157
|
-
async executeTxWithLabel(txLabel, sender, setupCalls, appCalls, teardownCall, feePayer, privateInsertions) {
|
|
158
|
-
return await this.simProveVerify(sender, setupCalls ?? [], appCalls ?? [], teardownCall, undefined, feePayer, privateInsertions, txLabel, true);
|
|
228
|
+
async executeTxWithLabel(txLabel, sender, setupCalls, appCalls, teardownCall, feePayer, privateInsertions, gasLimits) {
|
|
229
|
+
return await this.simProveVerify(sender, setupCalls ?? [], appCalls ?? [], teardownCall, undefined, feePayer, privateInsertions, txLabel, true, gasLimits);
|
|
159
230
|
}
|
|
160
|
-
async simProveVerifyAppLogic(appCall, expectRevert, txLabel = 'unlabeledTx') {
|
|
161
|
-
await this.simProveVerify(/*sender=*/ AztecAddress.
|
|
231
|
+
async simProveVerifyAppLogic(appCall, expectRevert, txLabel = 'unlabeledTx', gasLimits) {
|
|
232
|
+
await this.simProveVerify(/*sender=*/ AztecAddress.fromNumberUnsafe(42), /*setupCalls=*/ [], [
|
|
162
233
|
appCall
|
|
163
|
-
], undefined, expectRevert, /*feePayer=*/ undefined, /*privateInsertions=*/ undefined, txLabel);
|
|
234
|
+
], undefined, expectRevert, /*feePayer=*/ undefined, /*privateInsertions=*/ undefined, txLabel, /*disableRevertCheck=*/ false, gasLimits);
|
|
164
235
|
}
|
|
165
236
|
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { type AvmStat } from '@aztec/bb.js';
|
|
2
|
+
import type { LogFn, Logger } from '@aztec/foundation/log';
|
|
3
|
+
import type { UltraHonkFlavor } from '../honk.js';
|
|
4
|
+
/** Result of a successful proof generation via bb.js. */
|
|
5
|
+
export type BBJsProofResult = {
|
|
6
|
+
/** Proof fields as 32-byte Uint8Arrays. */
|
|
7
|
+
proofFields: Uint8Array[];
|
|
8
|
+
/** Public input fields as 32-byte Uint8Arrays. */
|
|
9
|
+
publicInputFields: Uint8Array[];
|
|
10
|
+
/** Duration of the proving operation in ms. */
|
|
11
|
+
durationMs: number;
|
|
12
|
+
};
|
|
13
|
+
/** Public API surface of a bb.js instance, used by the factory and debug wrapper. */
|
|
14
|
+
export interface BBJsApi {
|
|
15
|
+
generateProof(circuitName: string, bytecode: Uint8Array, verificationKey: Uint8Array, witness: Uint8Array, flavor: UltraHonkFlavor): Promise<BBJsProofResult>;
|
|
16
|
+
verifyProof(proofFields: Uint8Array[], verificationKey: Uint8Array, publicInputFields: Uint8Array[], flavor: UltraHonkFlavor): Promise<{
|
|
17
|
+
verified: boolean;
|
|
18
|
+
durationMs: number;
|
|
19
|
+
}>;
|
|
20
|
+
verifyChonkProof(fieldsWithPublicInputs: Uint8Array[], verificationKey: Uint8Array): Promise<{
|
|
21
|
+
verified: boolean;
|
|
22
|
+
durationMs: number;
|
|
23
|
+
}>;
|
|
24
|
+
computeGateCount(circuitName: string, bytecode: Uint8Array, flavor: UltraHonkFlavor | 'mega_honk'): Promise<{
|
|
25
|
+
circuitSize: number;
|
|
26
|
+
durationMs: number;
|
|
27
|
+
}>;
|
|
28
|
+
generateContract(verificationKey: Uint8Array): Promise<{
|
|
29
|
+
solidityCode: string;
|
|
30
|
+
durationMs: number;
|
|
31
|
+
}>;
|
|
32
|
+
/** Generate an AVM proof from serialized inputs. Callers should call verifyAvmProof separately. */
|
|
33
|
+
generateAvmProof(inputs: Uint8Array): Promise<{
|
|
34
|
+
proof: Uint8Array[];
|
|
35
|
+
stats: AvmStat[];
|
|
36
|
+
durationMs: number;
|
|
37
|
+
}>;
|
|
38
|
+
/** Verify an AVM proof against serialized public inputs. */
|
|
39
|
+
verifyAvmProof(proof: Uint8Array[], publicInputs: Uint8Array): Promise<{
|
|
40
|
+
verified: boolean;
|
|
41
|
+
durationMs: number;
|
|
42
|
+
}>;
|
|
43
|
+
/** Check the AVM circuit from serialized inputs. Returns pass/fail and per-stage timings. */
|
|
44
|
+
checkAvmCircuit(inputs: Uint8Array): Promise<{
|
|
45
|
+
passed: boolean;
|
|
46
|
+
stats: AvmStat[];
|
|
47
|
+
durationMs: number;
|
|
48
|
+
}>;
|
|
49
|
+
destroy(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Thin wrapper around a single Barretenberg instance.
|
|
53
|
+
* Each instance spawns its own bb process via the NativeUnixSocket backend.
|
|
54
|
+
*/
|
|
55
|
+
export declare class BBJsInstance implements BBJsApi {
|
|
56
|
+
private api;
|
|
57
|
+
private constructor();
|
|
58
|
+
/** Creates a new Barretenberg instance connected to a fresh bb process. */
|
|
59
|
+
static create(bbPath: string, logger?: LogFn, threads?: number): Promise<BBJsInstance>;
|
|
60
|
+
/**
|
|
61
|
+
* Generate an UltraHonk proof for a circuit.
|
|
62
|
+
* @param circuitName - Identifier for the circuit (used by bb internally).
|
|
63
|
+
* @param bytecode - Uncompressed ACIR bytecode.
|
|
64
|
+
* @param verificationKey - The circuit's verification key bytes.
|
|
65
|
+
* @param witness - Uncompressed witness bytes.
|
|
66
|
+
* @param flavor - The UltraHonk flavor to use.
|
|
67
|
+
*/
|
|
68
|
+
generateProof(circuitName: string, bytecode: Uint8Array, verificationKey: Uint8Array, witness: Uint8Array, flavor: UltraHonkFlavor): Promise<BBJsProofResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Verify an UltraHonk proof.
|
|
71
|
+
* @param proofFields - Proof fields as 32-byte Uint8Arrays.
|
|
72
|
+
* @param verificationKey - The VK bytes.
|
|
73
|
+
* @param publicInputFields - Public input fields as 32-byte Uint8Arrays.
|
|
74
|
+
* @param flavor - The UltraHonk flavor.
|
|
75
|
+
* @returns Whether the proof is valid.
|
|
76
|
+
*/
|
|
77
|
+
verifyProof(proofFields: Uint8Array[], verificationKey: Uint8Array, publicInputFields: Uint8Array[], flavor: UltraHonkFlavor): Promise<{
|
|
78
|
+
verified: boolean;
|
|
79
|
+
durationMs: number;
|
|
80
|
+
}>;
|
|
81
|
+
/**
|
|
82
|
+
* Compute circuit gate count / circuit size.
|
|
83
|
+
* @param circuitName - Identifier for the circuit.
|
|
84
|
+
* @param bytecode - Uncompressed ACIR bytecode.
|
|
85
|
+
* @param flavor - 'mega_honk' for chonk circuits, or an UltraHonk flavor.
|
|
86
|
+
* @returns The dyadic circuit size (next power of 2 of gate count).
|
|
87
|
+
*/
|
|
88
|
+
computeGateCount(circuitName: string, bytecode: Uint8Array, flavor: UltraHonkFlavor | 'mega_honk'): Promise<{
|
|
89
|
+
circuitSize: number;
|
|
90
|
+
durationMs: number;
|
|
91
|
+
}>;
|
|
92
|
+
/**
|
|
93
|
+
* Generate a Solidity verifier contract from a verification key.
|
|
94
|
+
* @param verificationKey - The VK bytes.
|
|
95
|
+
* @returns The Solidity source code.
|
|
96
|
+
*/
|
|
97
|
+
generateContract(verificationKey: Uint8Array): Promise<{
|
|
98
|
+
solidityCode: string;
|
|
99
|
+
durationMs: number;
|
|
100
|
+
}>;
|
|
101
|
+
/**
|
|
102
|
+
* Verify a Chonk (IVC) proof passed as flat field elements (with public inputs prepended).
|
|
103
|
+
* The split into structured sub-proofs happens server-side in `ChonkProof::from_field_elements`,
|
|
104
|
+
* so this layer doesn't need to know per-component sub-proof sizes.
|
|
105
|
+
* @param fieldsWithPublicInputs - Flat proof fields as 32-byte Uint8Arrays (public inputs prepended).
|
|
106
|
+
* @param verificationKey - The VK bytes.
|
|
107
|
+
*/
|
|
108
|
+
verifyChonkProof(fieldsWithPublicInputs: Uint8Array[], verificationKey: Uint8Array): Promise<{
|
|
109
|
+
verified: boolean;
|
|
110
|
+
durationMs: number;
|
|
111
|
+
}>;
|
|
112
|
+
/** Generate an AVM proof from serialized inputs. */
|
|
113
|
+
generateAvmProof(inputs: Uint8Array): Promise<{
|
|
114
|
+
proof: Uint8Array[];
|
|
115
|
+
stats: AvmStat[];
|
|
116
|
+
durationMs: number;
|
|
117
|
+
}>;
|
|
118
|
+
/** Verify an AVM proof against serialized public inputs. */
|
|
119
|
+
verifyAvmProof(proof: Uint8Array[], publicInputs: Uint8Array): Promise<{
|
|
120
|
+
verified: boolean;
|
|
121
|
+
durationMs: number;
|
|
122
|
+
}>;
|
|
123
|
+
/** Check the AVM circuit from serialized inputs. */
|
|
124
|
+
checkAvmCircuit(inputs: Uint8Array): Promise<{
|
|
125
|
+
passed: boolean;
|
|
126
|
+
stats: AvmStat[];
|
|
127
|
+
durationMs: number;
|
|
128
|
+
}>;
|
|
129
|
+
/** Destroy this instance and kill the underlying bb process. */
|
|
130
|
+
destroy(): Promise<void>;
|
|
131
|
+
}
|
|
132
|
+
/** Options for {@link BBJsFactory}. */
|
|
133
|
+
export interface BBJsFactoryOptions {
|
|
134
|
+
/**
|
|
135
|
+
* Number of long-lived bb processes to keep in the pool.
|
|
136
|
+
* If omitted, every `getInstance()` call spawns a fresh bb that is destroyed on dispose.
|
|
137
|
+
*/
|
|
138
|
+
poolSize?: number;
|
|
139
|
+
logger?: Logger;
|
|
140
|
+
threads?: number;
|
|
141
|
+
debugDir?: string;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Manages bb.js instance lifecycle. By default every `getInstance()` call spawns a fresh
|
|
145
|
+
* bb process that is destroyed when the borrow is disposed. Pass `poolSize` to keep a fixed
|
|
146
|
+
* set of long-lived bb processes that are reused across calls — useful when the per-call
|
|
147
|
+
* bb startup cost dominates the workload (e.g. high-rate IVC verification).
|
|
148
|
+
*
|
|
149
|
+
* Idiomatic usage:
|
|
150
|
+
* ```
|
|
151
|
+
* await using inst = await factory.getInstance();
|
|
152
|
+
* await inst.someMethod(...);
|
|
153
|
+
* // disposed automatically when `inst` goes out of scope
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare class BBJsFactory {
|
|
157
|
+
private bbPath;
|
|
158
|
+
private readonly poolSize?;
|
|
159
|
+
private readonly logger?;
|
|
160
|
+
private readonly threads?;
|
|
161
|
+
private readonly debugDir?;
|
|
162
|
+
/** Available pooled instances when poolSize is set; otherwise undefined. */
|
|
163
|
+
private pool?;
|
|
164
|
+
/** Lazily-resolved on first `getInstance()` call to prevent racing pool initialization. */
|
|
165
|
+
private initPromise?;
|
|
166
|
+
private destroyed;
|
|
167
|
+
constructor(bbPath: string, options?: BBJsFactoryOptions);
|
|
168
|
+
/**
|
|
169
|
+
* Acquire a bb instance. The returned object implements `BBJsApi` and `AsyncDisposable`.
|
|
170
|
+
* With no pool: spawns a fresh bb that is destroyed on dispose. With a pool: borrows from
|
|
171
|
+
* the pool and returns to it on dispose.
|
|
172
|
+
*/
|
|
173
|
+
getInstance(): Promise<BBJsApi & AsyncDisposable>;
|
|
174
|
+
/**
|
|
175
|
+
* Tear down all pooled instances. Idempotent. No-op when no pool is configured (fresh-per-call
|
|
176
|
+
* instances are destroyed by their own dispose callbacks). Instances currently held by an
|
|
177
|
+
* in-flight pooled borrow are destroyed by their dispose callback when released.
|
|
178
|
+
*/
|
|
179
|
+
destroy(): Promise<void>;
|
|
180
|
+
private initPool;
|
|
181
|
+
private createInstance;
|
|
182
|
+
private maybeWrapDebug;
|
|
183
|
+
/**
|
|
184
|
+
* Wrap a fresh instance with an `AsyncDisposable` that destroys it on dispose. Used when no
|
|
185
|
+
* pool is configured. Destroy errors are propagated so that a teardown failure (e.g. a bb child
|
|
186
|
+
* that didn't shut down cleanly) surfaces instead of being silently swallowed.
|
|
187
|
+
*/
|
|
188
|
+
private makeOwned;
|
|
189
|
+
/**
|
|
190
|
+
* Wrap a pooled instance with an `AsyncDisposable` that returns it to the pool (or destroys it
|
|
191
|
+
* if the factory was destroyed in the meantime). Destroy errors are propagated.
|
|
192
|
+
*/
|
|
193
|
+
private makeBorrowed;
|
|
194
|
+
private makeDisposable;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmJfanNfYmFja2VuZC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JiL2JiX2pzX2JhY2tlbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssT0FBTyxFQUFrRCxNQUFNLGNBQWMsQ0FBQztBQUM1RixPQUFPLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJM0QsT0FBTyxLQUFLLEVBQUUsZUFBZSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBb0JsRCx5REFBeUQ7QUFDekQsTUFBTSxNQUFNLGVBQWUsR0FBRztJQUM1QiwyQ0FBMkM7SUFDM0MsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzFCLGtEQUFrRDtJQUNsRCxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUNoQywrQ0FBK0M7SUFDL0MsVUFBVSxFQUFFLE1BQU0sQ0FBQztDQUNwQixDQUFDO0FBRUYscUZBQXFGO0FBQ3JGLE1BQU0sV0FBVyxPQUFPO0lBQ3RCLGFBQWEsQ0FDWCxXQUFXLEVBQUUsTUFBTSxFQUNuQixRQUFRLEVBQUUsVUFBVSxFQUNwQixlQUFlLEVBQUUsVUFBVSxFQUMzQixPQUFPLEVBQUUsVUFBVSxFQUNuQixNQUFNLEVBQUUsZUFBZSxHQUN0QixPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUIsV0FBVyxDQUNULFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFDekIsZUFBZSxFQUFFLFVBQVUsRUFDM0IsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEVBQy9CLE1BQU0sRUFBRSxlQUFlLEdBQ3RCLE9BQU8sQ0FBQztRQUFFLFFBQVEsRUFBRSxPQUFPLENBQUM7UUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQUFDO0lBQ3RELGdCQUFnQixDQUNkLHNCQUFzQixFQUFFLFVBQVUsRUFBRSxFQUNwQyxlQUFlLEVBQUUsVUFBVSxHQUMxQixPQUFPLENBQUM7UUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FBQztJQUN0RCxnQkFBZ0IsQ0FDZCxXQUFXLEVBQUUsTUFBTSxFQUNuQixRQUFRLEVBQUUsVUFBVSxFQUNwQixNQUFNLEVBQUUsZUFBZSxHQUFHLFdBQVcsR0FDcEMsT0FBTyxDQUFDO1FBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUFDLFVBQVUsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBQUM7SUFDeEQsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDO1FBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FBQztJQUNyRyxtR0FBbUc7SUFDbkcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQUFDO0lBQzdHLDREQUE0RDtJQUM1RCxjQUFjLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLFlBQVksRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDO1FBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztRQUFDLFVBQVUsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBQUM7SUFDbEgsNkZBQTZGO0lBQzdGLGVBQWUsQ0FBQyxNQUFNLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7UUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQUFDO0lBQ3hHLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDMUI7QUFFRDs7O0dBR0c7QUFDSCxxQkFBYSxZQUFhLFlBQVcsT0FBTztJQUN0QixPQUFPLENBQUMsR0FBRztJQUEvQixPQUFPLGVBQTBDO0lBRWpELDJFQUEyRTtJQUMzRSxPQUFhLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQVczRjtJQUVEOzs7Ozs7O09BT0c7SUFDRyxhQUFhLENBQ2pCLFdBQVcsRUFBRSxNQUFNLEVBQ25CLFFBQVEsRUFBRSxVQUFVLEVBQ3BCLGVBQWUsRUFBRSxVQUFVLEVBQzNCLE9BQU8sRUFBRSxVQUFVLEVBQ25CLE1BQU0sRUFBRSxlQUFlLEdBQ3RCLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FnQjFCO0lBRUQ7Ozs7Ozs7T0FPRztJQUNHLFdBQVcsQ0FDZixXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQ3pCLGVBQWUsRUFBRSxVQUFVLEVBQzNCLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxFQUMvQixNQUFNLEVBQUUsZUFBZSxHQUN0QixPQUFPLENBQUM7UUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDO1FBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FTcEQ7SUFFRDs7Ozs7O09BTUc7SUFDRyxnQkFBZ0IsQ0FDcEIsV0FBVyxFQUFFLE1BQU0sRUFDbkIsUUFBUSxFQUFFLFVBQVUsRUFDcEIsTUFBTSxFQUFFLGVBQWUsR0FBRyxXQUFXLEdBQ3BDLE9BQU8sQ0FBQztRQUFFLFdBQVcsRUFBRSxNQUFNLENBQUM7UUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQWV0RDtJQUVEOzs7O09BSUc7SUFDRyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUFFLFlBQVksRUFBRSxNQUFNLENBQUM7UUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQVl6RztJQUVEOzs7Ozs7T0FNRztJQUNHLGdCQUFnQixDQUNwQixzQkFBc0IsRUFBRSxVQUFVLEVBQUUsRUFDcEMsZUFBZSxFQUFFLFVBQVUsR0FDMUIsT0FBTyxDQUFDO1FBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztRQUFDLFVBQVUsRUFBRSxNQUFNLENBQUE7S0FBRSxDQUFDLENBSXBEO0lBRUQsb0RBQW9EO0lBQzlDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDO1FBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxDQUFDO1FBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FJakg7SUFFRCw0REFBNEQ7SUFDdEQsY0FBYyxDQUNsQixLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQ25CLFlBQVksRUFBRSxVQUFVLEdBQ3ZCLE9BQU8sQ0FBQztRQUFFLFFBQVEsRUFBRSxPQUFPLENBQUM7UUFBQyxVQUFVLEVBQUUsTUFBTSxDQUFBO0tBQUUsQ0FBQyxDQUlwRDtJQUVELG9EQUFvRDtJQUM5QyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxPQUFPLENBQUM7UUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO1FBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQTtLQUFFLENBQUMsQ0FJNUc7SUFFRCxnRUFBZ0U7SUFDMUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFN0I7Q0FDRjtBQUVELHVDQUF1QztBQUN2QyxNQUFNLFdBQVcsa0JBQWtCO0lBQ2pDOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNsQixNQUFNLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDaEIsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ2pCLFFBQVEsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNuQjtBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHFCQUFhLFdBQVc7SUFhcEIsT0FBTyxDQUFDLE1BQU07SUFaaEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBUztJQUNuQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFTO0lBQ2pDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQVM7SUFDbEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBUztJQUVuQyw0RUFBNEU7SUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUEyQjtJQUN4QywyRkFBMkY7SUFDM0YsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFnQjtJQUNwQyxPQUFPLENBQUMsU0FBUyxDQUFTO0lBRTFCLFlBQ1UsTUFBTSxFQUFFLE1BQU0sRUFDdEIsT0FBTyxHQUFFLGtCQUF1QixFQVNqQztJQUVEOzs7O09BSUc7SUFDRyxXQUFXLElBQUksT0FBTyxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsQ0FzQnREO0lBRUQ7Ozs7T0FJRztJQUNHLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBd0I3QjtZQUVhLFFBQVE7WUE0QlIsY0FBYztZQU9kLGNBQWM7SUFRNUI7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxTQUFTO0lBSWpCOzs7T0FHRztJQUNILE9BQU8sQ0FBQyxZQUFZO0lBV3BCLE9BQU8sQ0FBQyxjQUFjO0NBa0J2QiJ9
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bb_js_backend.d.ts","sourceRoot":"","sources":["../../src/bb/bb_js_backend.ts"],"names":[],"mappings":"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"}
|