@aztec/bb-prover 0.0.1-commit.a072138 → 0.0.1-commit.a4600f49
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 +178 -114
- 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 +12 -4
- package/dest/prover/client/bb_private_kernel_prover.d.ts +21 -5
- package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -1
- package/dest/prover/client/bb_private_kernel_prover.js +79 -15
- 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 +24 -1
- package/dest/prover/server/bb_prover.d.ts +6 -7
- package/dest/prover/server/bb_prover.d.ts.map +1 -1
- package/dest/prover/server/bb_prover.js +206 -79
- package/dest/test/test_circuit_prover.d.ts +3 -3
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +2 -2
- package/dest/verification_key/verification_key_data.js +1 -1
- 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 -45
- 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 +6 -5
- package/package.json +19 -17
- package/src/avm_proving_tests/avm_proving_tester.ts +85 -130
- 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 +12 -4
- package/src/prover/client/bb_private_kernel_prover.ts +242 -21
- package/src/prover/proof_utils.ts +41 -1
- package/src/prover/server/bb_prover.ts +126 -141
- package/src/test/test_circuit_prover.ts +3 -5
- package/src/verification_key/verification_key_data.ts +1 -1
- package/src/verifier/batch_chonk_verifier.ts +415 -0
- package/src/verifier/bb_verifier.ts +66 -76
- package/src/verifier/index.ts +1 -0
- package/src/verifier/queued_chonk_verifier.ts +6 -7
- package/dest/bb/execute.d.ts +0 -107
- package/dest/bb/execute.d.ts.map +0 -1
- package/dest/bb/execute.js +0 -647
- package/src/bb/execute.ts +0 -678
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import type { ClientProtocolCircuitVerifier, IVCProofVerificationResult } from '@aztec/stdlib/interfaces/server';
|
|
2
2
|
import type { Tx } from '@aztec/stdlib/tx';
|
|
3
3
|
import { type TelemetryClient } from '@aztec/telemetry-client';
|
|
4
|
-
import type { BBConfig } from '../config.js';
|
|
5
4
|
export declare class QueuedIVCVerifier implements ClientProtocolCircuitVerifier {
|
|
6
5
|
private verifier;
|
|
7
6
|
private telemetry;
|
|
8
7
|
private logger;
|
|
9
8
|
private queue;
|
|
10
9
|
private metrics;
|
|
11
|
-
constructor(
|
|
10
|
+
constructor(verifier: ClientProtocolCircuitVerifier, concurrency: number, telemetry?: TelemetryClient, logger?: import("@aztec/foundation/log").Logger);
|
|
12
11
|
verifyProof(tx: Tx): Promise<IVCProofVerificationResult>;
|
|
13
12
|
stop(): Promise<void>;
|
|
14
13
|
}
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVldWVkX2Nob25rX3ZlcmlmaWVyLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVyaWZpZXIvcXVldWVkX2Nob25rX3ZlcmlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sS0FBSyxFQUFFLDZCQUE2QixFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakgsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQU1MLEtBQUssZUFBZSxFQUlyQixNQUFNLHlCQUF5QixDQUFDO0FBbUVqQyxxQkFBYSxpQkFBa0IsWUFBVyw2QkFBNkI7SUFLbkUsT0FBTyxDQUFDLFFBQVE7SUFFaEIsT0FBTyxDQUFDLFNBQVM7SUFDakIsT0FBTyxDQUFDLE1BQU07SUFQaEIsT0FBTyxDQUFDLEtBQUssQ0FBYztJQUMzQixPQUFPLENBQUMsT0FBTyxDQUFxQjtJQUVwQyxZQUNVLFFBQVEsRUFBRSw2QkFBNkIsRUFDL0MsV0FBVyxFQUFFLE1BQU0sRUFDWCxTQUFTLEdBQUUsZUFBc0MsRUFDakQsTUFBTSx5Q0FBa0QsRUFNakU7SUFFWSxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FJcEU7SUFFSyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUcxQjtDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queued_chonk_verifier.d.ts","sourceRoot":"","sources":["../../src/verifier/queued_chonk_verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AACjH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAML,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"queued_chonk_verifier.d.ts","sourceRoot":"","sources":["../../src/verifier/queued_chonk_verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,6BAA6B,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AACjH,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAML,KAAK,eAAe,EAIrB,MAAM,yBAAyB,CAAC;AAmEjC,qBAAa,iBAAkB,YAAW,6BAA6B;IAKnE,OAAO,CAAC,QAAQ;IAEhB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IAPhB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAqB;IAEpC,YACU,QAAQ,EAAE,6BAA6B,EAC/C,WAAW,EAAE,MAAM,EACX,SAAS,GAAE,eAAsC,EACjD,MAAM,yCAAkD,EAMjE;IAEY,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAIpE;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAG1B;CACF"}
|
|
@@ -81,21 +81,22 @@ export class QueuedIVCVerifier {
|
|
|
81
81
|
logger;
|
|
82
82
|
queue;
|
|
83
83
|
metrics;
|
|
84
|
-
constructor(
|
|
84
|
+
constructor(verifier, concurrency, telemetry = getTelemetryClient(), logger = createLogger('bb-prover:queued_chonk_verifier')){
|
|
85
85
|
this.verifier = verifier;
|
|
86
86
|
this.telemetry = telemetry;
|
|
87
87
|
this.logger = logger;
|
|
88
88
|
this.metrics = new IVCVerifierMetrics(this.telemetry, 'QueuedIVCVerifier');
|
|
89
89
|
this.queue = new SerialQueue();
|
|
90
|
-
this.logger.info(`Starting QueuedIVCVerifier with ${
|
|
91
|
-
this.queue.start(
|
|
90
|
+
this.logger.info(`Starting QueuedIVCVerifier with ${concurrency} concurrent verifiers`);
|
|
91
|
+
this.queue.start(concurrency);
|
|
92
92
|
}
|
|
93
93
|
async verifyProof(tx) {
|
|
94
94
|
const result = await this.queue.put(()=>this.verifier.verifyProof(tx));
|
|
95
95
|
this.metrics.recordIVCVerification(result);
|
|
96
96
|
return result;
|
|
97
97
|
}
|
|
98
|
-
stop() {
|
|
99
|
-
|
|
98
|
+
async stop() {
|
|
99
|
+
await this.queue.end();
|
|
100
|
+
await this.verifier.stop();
|
|
100
101
|
}
|
|
101
102
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/bb-prover",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.a4600f49",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"./client": "./dest/prover/client/bb_private_kernel_prover.js",
|
|
10
10
|
"./verifier": "./dest/verifier/index.js",
|
|
11
11
|
"./test": "./dest/test/index.js",
|
|
12
|
-
"./config": "./dest/config.js"
|
|
12
|
+
"./config": "./dest/config.js",
|
|
13
|
+
"./debug": "./dest/bb/bb_js_debug.js"
|
|
13
14
|
},
|
|
14
15
|
"bin": {
|
|
15
16
|
"bb-cli": "./dest/bb/index.js"
|
|
@@ -69,27 +70,28 @@
|
|
|
69
70
|
]
|
|
70
71
|
},
|
|
71
72
|
"dependencies": {
|
|
72
|
-
"@aztec/bb.js": "0.0.1-commit.
|
|
73
|
-
"@aztec/constants": "0.0.1-commit.
|
|
74
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
75
|
-
"@aztec/noir-noirc_abi": "0.0.1-commit.
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
77
|
-
"@aztec/noir-types": "0.0.1-commit.
|
|
78
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
79
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
80
|
-
"@aztec/telemetry-client": "0.0.1-commit.
|
|
81
|
-
"@aztec/world-state": "0.0.1-commit.
|
|
73
|
+
"@aztec/bb.js": "0.0.1-commit.a4600f49",
|
|
74
|
+
"@aztec/constants": "0.0.1-commit.a4600f49",
|
|
75
|
+
"@aztec/foundation": "0.0.1-commit.a4600f49",
|
|
76
|
+
"@aztec/noir-noirc_abi": "0.0.1-commit.a4600f49",
|
|
77
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.a4600f49",
|
|
78
|
+
"@aztec/noir-types": "0.0.1-commit.a4600f49",
|
|
79
|
+
"@aztec/simulator": "0.0.1-commit.a4600f49",
|
|
80
|
+
"@aztec/stdlib": "0.0.1-commit.a4600f49",
|
|
81
|
+
"@aztec/telemetry-client": "0.0.1-commit.a4600f49",
|
|
82
|
+
"@aztec/world-state": "0.0.1-commit.a4600f49",
|
|
82
83
|
"commander": "^12.1.0",
|
|
84
|
+
"msgpackr": "^1.11.2",
|
|
83
85
|
"pako": "^2.1.0",
|
|
84
86
|
"source-map-support": "^0.5.21",
|
|
85
87
|
"tslib": "^2.4.0"
|
|
86
88
|
},
|
|
87
89
|
"devDependencies": {
|
|
88
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
89
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
90
|
-
"@aztec/noir-contracts.js": "0.0.1-commit.
|
|
91
|
-
"@aztec/noir-test-contracts.js": "0.0.1-commit.
|
|
92
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
90
|
+
"@aztec/ethereum": "0.0.1-commit.a4600f49",
|
|
91
|
+
"@aztec/kv-store": "0.0.1-commit.a4600f49",
|
|
92
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.a4600f49",
|
|
93
|
+
"@aztec/noir-test-contracts.js": "0.0.1-commit.a4600f49",
|
|
94
|
+
"@aztec/protocol-contracts": "0.0.1-commit.a4600f49",
|
|
93
95
|
"@jest/globals": "^30.0.0",
|
|
94
96
|
"@types/jest": "^30.0.0",
|
|
95
97
|
"@types/node": "^22.15.17",
|
|
@@ -1,90 +1,29 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AvmStat } from '@aztec/bb.js';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
3
|
import { Timer } from '@aztec/foundation/timer';
|
|
3
4
|
import {
|
|
5
|
+
type MeasuredSimulatorFactory,
|
|
4
6
|
PublicTxSimulationTester,
|
|
5
7
|
SimpleContractDataSource,
|
|
6
8
|
type TestEnqueuedCall,
|
|
7
9
|
type TestExecutorMetrics,
|
|
8
10
|
type TestPrivateInsertions,
|
|
9
11
|
} from '@aztec/simulator/public/fixtures';
|
|
12
|
+
import { AvmSimulatorPool, MeasuredPublicTxSimulator } from '@aztec/simulator/server';
|
|
10
13
|
import type { PublicTxResult } from '@aztec/simulator/server';
|
|
11
14
|
import { AvmCircuitInputs, AvmCircuitPublicInputs, PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
12
15
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
16
|
+
import type { Gas } from '@aztec/stdlib/gas';
|
|
13
17
|
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
14
18
|
import type { GlobalVariables } from '@aztec/stdlib/tx';
|
|
15
19
|
import { NativeWorldStateService } from '@aztec/world-state';
|
|
16
20
|
|
|
17
|
-
import fs from 'node:fs/promises';
|
|
18
|
-
import { tmpdir } from 'node:os';
|
|
19
21
|
import path from 'path';
|
|
20
22
|
|
|
21
|
-
import {
|
|
23
|
+
import { BBJsFactory } from '../bb/bb_js_backend.js';
|
|
22
24
|
|
|
23
25
|
const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb-avm');
|
|
24
26
|
|
|
25
|
-
// An InterceptingLogger that records all log messages and forwards them to a wrapped logger.
|
|
26
|
-
class InterceptingLogger implements Logger {
|
|
27
|
-
public readonly logs: string[] = [];
|
|
28
|
-
public level: LogLevel;
|
|
29
|
-
public module: string;
|
|
30
|
-
|
|
31
|
-
private logger: Logger;
|
|
32
|
-
|
|
33
|
-
constructor(logger: Logger) {
|
|
34
|
-
this.logger = logger;
|
|
35
|
-
this.level = logger.level;
|
|
36
|
-
this.module = logger.module;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
isLevelEnabled(level: LogLevel): boolean {
|
|
40
|
-
return this.logger.isLevelEnabled(level);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
createChild(_childModule: string): Logger {
|
|
44
|
-
throw new Error('Not implemented');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
getBindings() {
|
|
48
|
-
return this.logger.getBindings();
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
private intercept(level: LogLevel, msg: string, ...args: any[]) {
|
|
52
|
-
this.logs.push(...msg.split('\n'));
|
|
53
|
-
// Forward to the wrapped logger
|
|
54
|
-
(this.logger[level] as LogFn)(msg, ...args);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Log methods for each level
|
|
58
|
-
silent(msg: string, ...args: any[]) {
|
|
59
|
-
this.intercept('silent', msg, ...args);
|
|
60
|
-
}
|
|
61
|
-
fatal(msg: string, ...args: any[]) {
|
|
62
|
-
this.intercept('fatal', msg, ...args);
|
|
63
|
-
}
|
|
64
|
-
warn(msg: string, ...args: any[]) {
|
|
65
|
-
this.intercept('warn', msg, ...args);
|
|
66
|
-
}
|
|
67
|
-
info(msg: string, ...args: any[]) {
|
|
68
|
-
this.intercept('info', msg, ...args);
|
|
69
|
-
}
|
|
70
|
-
verbose(msg: string, ...args: any[]) {
|
|
71
|
-
this.intercept('verbose', msg, ...args);
|
|
72
|
-
}
|
|
73
|
-
debug(msg: string, ...args: any[]) {
|
|
74
|
-
this.intercept('debug', msg, ...args);
|
|
75
|
-
}
|
|
76
|
-
trace(msg: string, ...args: any[]) {
|
|
77
|
-
this.intercept('trace', msg, ...args);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Error log function can be string or Error
|
|
81
|
-
error(err: Error | string, ...args: any[]) {
|
|
82
|
-
const msg = typeof err === 'string' ? err : err.message;
|
|
83
|
-
this.logs.push(msg);
|
|
84
|
-
this.logger.error(msg, err, ...args);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
27
|
// Config with collectHints enabled for proving tests
|
|
89
28
|
const provingConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
|
|
90
29
|
skipFeeEnforcement: false,
|
|
@@ -96,7 +35,10 @@ const provingConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
|
|
|
96
35
|
});
|
|
97
36
|
|
|
98
37
|
export class AvmProvingTester extends PublicTxSimulationTester {
|
|
99
|
-
private
|
|
38
|
+
private readonly bbJsFactory = new BBJsFactory(BB_PATH, {
|
|
39
|
+
debugDir: process.env.BB_DEBUG_OUTPUT_DIR,
|
|
40
|
+
logger: createLogger('bb-prover:avm-proving-tester'),
|
|
41
|
+
});
|
|
100
42
|
|
|
101
43
|
constructor(
|
|
102
44
|
private checkCircuitOnly: boolean,
|
|
@@ -104,9 +46,9 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
104
46
|
merkleTrees: MerkleTreeWriteOperations,
|
|
105
47
|
globals?: GlobalVariables,
|
|
106
48
|
metrics?: TestExecutorMetrics,
|
|
49
|
+
simulatorFactory?: MeasuredSimulatorFactory,
|
|
107
50
|
) {
|
|
108
|
-
|
|
109
|
-
super(merkleTrees, contractDataSource, globals, metrics, /*simulatorFactory=*/ undefined, provingConfig);
|
|
51
|
+
super(merkleTrees, contractDataSource, globals, metrics, simulatorFactory, provingConfig);
|
|
110
52
|
}
|
|
111
53
|
|
|
112
54
|
static async new(
|
|
@@ -117,56 +59,82 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
117
59
|
) {
|
|
118
60
|
const contractDataSource = new SimpleContractDataSource();
|
|
119
61
|
const merkleTrees = await worldStateService.fork();
|
|
120
|
-
|
|
62
|
+
|
|
63
|
+
const avmSimulator = await AvmSimulatorPool.spawn({ wsdbIpcPath: worldStateService.getIpcPath() });
|
|
64
|
+
const simulatorFactory: MeasuredSimulatorFactory = (mt, cdb, g, m, c) =>
|
|
65
|
+
new MeasuredPublicTxSimulator(avmSimulator, g, cdb, mt.getRevision().forkId, m, c, undefined);
|
|
66
|
+
|
|
67
|
+
const tester = new AvmProvingTester(
|
|
68
|
+
checkCircuitOnly,
|
|
69
|
+
contractDataSource,
|
|
70
|
+
merkleTrees,
|
|
71
|
+
globals,
|
|
72
|
+
metrics,
|
|
73
|
+
simulatorFactory,
|
|
74
|
+
);
|
|
75
|
+
tester.avmSimulator = avmSimulator;
|
|
76
|
+
return tester;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public override async close(): Promise<void> {
|
|
80
|
+
const results = await Promise.allSettled([super.close(), this.bbJsFactory.destroy()]);
|
|
81
|
+
const errors = results.flatMap(result => (result.status === 'rejected' ? [result.reason] : []));
|
|
82
|
+
if (errors.length > 0) {
|
|
83
|
+
throw new AggregateError(errors, `Failed to close AVM proving tester`);
|
|
84
|
+
}
|
|
121
85
|
}
|
|
122
86
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Generate an AVM proof (or run check-circuit if configured). Records per-stage timings in the test metrics.
|
|
89
|
+
* Returns the in-memory proof fields on success; throws via jest expect() on failure.
|
|
90
|
+
*/
|
|
91
|
+
async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<Uint8Array[]> {
|
|
92
|
+
const inputsBuffer = avmCircuitInputs.serializeWithMessagePack();
|
|
126
93
|
|
|
127
|
-
|
|
94
|
+
if (this.checkCircuitOnly) {
|
|
95
|
+
await using instance = await this.bbJsFactory.getInstance();
|
|
96
|
+
const { passed, stats } = await instance.checkAvmCircuit(inputsBuffer);
|
|
97
|
+
this.recordProverMetrics(stats, txLabel);
|
|
98
|
+
expect(passed).toBe(true);
|
|
99
|
+
return [];
|
|
100
|
+
}
|
|
128
101
|
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
|
|
102
|
+
await using instance = await this.bbJsFactory.getInstance();
|
|
103
|
+
const { proof, stats } = await instance.generateAvmProof(inputsBuffer);
|
|
104
|
+
this.recordProverMetrics(stats, txLabel);
|
|
105
|
+
return proof;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async verify(proof: Uint8Array[], publicInputs: AvmCircuitPublicInputs): Promise<void> {
|
|
109
|
+
if (this.checkCircuitOnly) {
|
|
110
|
+
// Check-circuit did not generate a proof; nothing to verify.
|
|
111
|
+
return;
|
|
139
112
|
}
|
|
140
|
-
|
|
113
|
+
const piBuffer = publicInputs.serializeWithMessagePack();
|
|
114
|
+
await using instance = await this.bbJsFactory.getInstance();
|
|
115
|
+
const { verified } = await instance.verifyAvmProof(proof, piBuffer);
|
|
116
|
+
expect(verified).toBe(true);
|
|
117
|
+
}
|
|
141
118
|
|
|
142
|
-
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
// const match = log.match(/\b(\w+): (\d+) \(~2/);
|
|
147
|
-
// if (match) {
|
|
148
|
-
// traceSizes.push({
|
|
149
|
-
// name: match[1],
|
|
150
|
-
// size: parseInt(match[2]),
|
|
151
|
-
// });
|
|
152
|
-
// }
|
|
153
|
-
// });
|
|
154
|
-
const times: { [key: string]: number } = {};
|
|
155
|
-
logs.forEach(log => {
|
|
156
|
-
const match = log.match(/\b([\w/]+)_ms: (\d+)/);
|
|
157
|
-
if (match) {
|
|
158
|
-
times[match[1]] = parseInt(match[2]);
|
|
159
|
-
}
|
|
160
|
-
});
|
|
119
|
+
public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
|
|
120
|
+
const proof = await this.prove(avmCircuitInputs, txLabel);
|
|
121
|
+
await this.verify(proof, avmCircuitInputs.publicInputs);
|
|
122
|
+
}
|
|
161
123
|
|
|
162
|
-
|
|
124
|
+
private recordProverMetrics(stats: AvmStat[], txLabel: string) {
|
|
125
|
+
// Build a lookup keyed on the stage name with the `_ms` suffix stripped, matching the legacy
|
|
126
|
+
// stdout-scraped shape. bb::avm2::Stats::time() stores keys with `_ms` appended.
|
|
127
|
+
const times: { [key: string]: number } = {};
|
|
128
|
+
for (const { name, valueMs } of stats) {
|
|
129
|
+
const key = name.endsWith('_ms') ? name.slice(0, -'_ms'.length) : name;
|
|
130
|
+
times[key] = valueMs;
|
|
131
|
+
}
|
|
163
132
|
if (Object.keys(times).length === 0) {
|
|
164
|
-
throw new Error('AVM
|
|
133
|
+
throw new Error('AVM response did not contain any proving-stage timings!');
|
|
165
134
|
}
|
|
166
|
-
|
|
167
135
|
// Hack to make labels match.
|
|
168
136
|
const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
|
|
169
|
-
//
|
|
137
|
+
// Cast because TS doesn't realize `metrics` is protected, not private on the parent class.
|
|
170
138
|
(this as any).metrics?.recordProverMetrics(txLabelWithCount, {
|
|
171
139
|
proverSimulationStepMs: times['simulation/all'],
|
|
172
140
|
proverProvingStepMs: times['proving/all'],
|
|
@@ -179,26 +147,6 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
179
147
|
provingLogDerivativeInverseCommitmentsMs: times['prove/log_derivative_inverse_commitments_round'],
|
|
180
148
|
provingWireCommitmentsMs: times['prove/wire_commitments_round'],
|
|
181
149
|
});
|
|
182
|
-
|
|
183
|
-
return proofRes as BBSuccess;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
async verify(proofRes: BBSuccess, publicInputs: AvmCircuitPublicInputs): Promise<BBResult> {
|
|
187
|
-
if (this.checkCircuitOnly) {
|
|
188
|
-
// Skip verification if we are only checking the circuit.
|
|
189
|
-
// Check-circuit does not generate a proof to verify.
|
|
190
|
-
return proofRes;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return await verifyAvmProof(BB_PATH, this.bbWorkingDirectory, proofRes.proofPath!, publicInputs, this.logger);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
|
|
197
|
-
const provingRes = await this.prove(avmCircuitInputs, txLabel);
|
|
198
|
-
expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
|
|
199
|
-
|
|
200
|
-
const verificationRes = await this.verify(provingRes as BBSuccess, avmCircuitInputs.publicInputs);
|
|
201
|
-
expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
|
|
202
150
|
}
|
|
203
151
|
|
|
204
152
|
public async simProveVerify(
|
|
@@ -211,6 +159,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
211
159
|
privateInsertions?: TestPrivateInsertions,
|
|
212
160
|
txLabel: string = 'unlabeledTx',
|
|
213
161
|
disableRevertCheck: boolean = false,
|
|
162
|
+
gasLimits?: Gas,
|
|
214
163
|
): Promise<PublicTxResult> {
|
|
215
164
|
const simTimer = new Timer();
|
|
216
165
|
const simRes = await this.simulateTx(
|
|
@@ -221,6 +170,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
221
170
|
feePayer,
|
|
222
171
|
privateInsertions,
|
|
223
172
|
txLabel,
|
|
173
|
+
gasLimits,
|
|
224
174
|
);
|
|
225
175
|
const simDuration = simTimer.ms();
|
|
226
176
|
this.logger.info(`Simulation took ${simDuration} ms for tx ${txLabel}`);
|
|
@@ -247,6 +197,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
247
197
|
teardownCall?: TestEnqueuedCall,
|
|
248
198
|
feePayer?: AztecAddress,
|
|
249
199
|
privateInsertions?: TestPrivateInsertions,
|
|
200
|
+
gasLimits?: Gas,
|
|
250
201
|
) {
|
|
251
202
|
return await this.simProveVerify(
|
|
252
203
|
sender,
|
|
@@ -258,6 +209,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
258
209
|
privateInsertions,
|
|
259
210
|
txLabel,
|
|
260
211
|
true,
|
|
212
|
+
gasLimits,
|
|
261
213
|
);
|
|
262
214
|
}
|
|
263
215
|
|
|
@@ -265,9 +217,10 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
265
217
|
appCall: TestEnqueuedCall,
|
|
266
218
|
expectRevert?: boolean,
|
|
267
219
|
txLabel: string = 'unlabeledTx',
|
|
220
|
+
gasLimits?: Gas,
|
|
268
221
|
) {
|
|
269
222
|
await this.simProveVerify(
|
|
270
|
-
/*sender=*/ AztecAddress.
|
|
223
|
+
/*sender=*/ AztecAddress.fromNumberUnsafe(42),
|
|
271
224
|
/*setupCalls=*/ [],
|
|
272
225
|
[appCall],
|
|
273
226
|
undefined,
|
|
@@ -275,6 +228,8 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
275
228
|
/*feePayer=*/ undefined,
|
|
276
229
|
/*privateInsertions=*/ undefined,
|
|
277
230
|
txLabel,
|
|
231
|
+
/*disableRevertCheck=*/ false,
|
|
232
|
+
gasLimits,
|
|
278
233
|
);
|
|
279
234
|
}
|
|
280
235
|
}
|