@aztec/bb-prover 0.0.0-test.1 → 0.0.1-commit.21caa21

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.
Files changed (109) hide show
  1. package/dest/avm_proving_tests/avm_proving_tester.d.ts +14 -18
  2. package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
  3. package/dest/avm_proving_tests/avm_proving_tester.js +130 -79
  4. package/dest/bb/cli.d.ts +1 -1
  5. package/dest/bb/execute.d.ts +14 -47
  6. package/dest/bb/execute.d.ts.map +1 -1
  7. package/dest/bb/execute.js +132 -236
  8. package/dest/bb/index.d.ts +1 -1
  9. package/dest/config.d.ts +3 -1
  10. package/dest/config.d.ts.map +1 -1
  11. package/dest/honk.d.ts +3 -3
  12. package/dest/honk.d.ts.map +1 -1
  13. package/dest/honk.js +3 -2
  14. package/dest/index.d.ts +2 -1
  15. package/dest/index.d.ts.map +1 -1
  16. package/dest/index.js +1 -0
  17. package/dest/instrumentation.d.ts +3 -3
  18. package/dest/instrumentation.d.ts.map +1 -1
  19. package/dest/instrumentation.js +2 -4
  20. package/dest/prover/client/bb_private_kernel_prover.d.ts +32 -0
  21. package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -0
  22. package/dest/prover/{bb_private_kernel_prover.js → client/bb_private_kernel_prover.js} +42 -20
  23. package/dest/prover/client/bundle.d.ts +6 -0
  24. package/dest/prover/client/bundle.d.ts.map +1 -0
  25. package/dest/prover/client/bundle.js +8 -0
  26. package/dest/prover/client/lazy.d.ts +6 -0
  27. package/dest/prover/client/lazy.d.ts.map +1 -0
  28. package/dest/prover/client/lazy.js +8 -0
  29. package/dest/prover/index.d.ts +3 -4
  30. package/dest/prover/index.d.ts.map +1 -1
  31. package/dest/prover/index.js +2 -3
  32. package/dest/prover/proof_utils.d.ts +19 -0
  33. package/dest/prover/proof_utils.d.ts.map +1 -0
  34. package/dest/prover/proof_utils.js +72 -0
  35. package/dest/prover/server/bb_prover.d.ts +100 -0
  36. package/dest/prover/server/bb_prover.d.ts.map +1 -0
  37. package/dest/prover/server/bb_prover.js +339 -0
  38. package/dest/test/delay_values.d.ts +1 -1
  39. package/dest/test/delay_values.d.ts.map +1 -1
  40. package/dest/test/delay_values.js +33 -21
  41. package/dest/test/index.d.ts +1 -1
  42. package/dest/test/test_circuit_prover.d.ts +25 -34
  43. package/dest/test/test_circuit_prover.d.ts.map +1 -1
  44. package/dest/test/test_circuit_prover.js +85 -59
  45. package/dest/test/test_verifier.d.ts +6 -3
  46. package/dest/test/test_verifier.d.ts.map +1 -1
  47. package/dest/test/test_verifier.js +23 -1
  48. package/dest/verification_key/verification_key_data.d.ts +7 -1
  49. package/dest/verification_key/verification_key_data.d.ts.map +1 -1
  50. package/dest/verification_key/verification_key_data.js +23 -29
  51. package/dest/verifier/bb_verifier.d.ts +6 -5
  52. package/dest/verifier/bb_verifier.d.ts.map +1 -1
  53. package/dest/verifier/bb_verifier.js +46 -25
  54. package/dest/verifier/index.d.ts +2 -1
  55. package/dest/verifier/index.d.ts.map +1 -1
  56. package/dest/verifier/index.js +1 -0
  57. package/dest/verifier/queued_chonk_verifier.d.ts +15 -0
  58. package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -0
  59. package/dest/verifier/queued_chonk_verifier.js +132 -0
  60. package/package.json +35 -33
  61. package/src/avm_proving_tests/avm_proving_tester.ts +210 -104
  62. package/src/bb/execute.ts +103 -250
  63. package/src/config.ts +2 -0
  64. package/src/honk.ts +3 -2
  65. package/src/index.ts +1 -0
  66. package/src/instrumentation.ts +2 -4
  67. package/src/prover/{bb_private_kernel_prover.ts → client/bb_private_kernel_prover.ts} +78 -30
  68. package/src/prover/client/bundle.ts +11 -0
  69. package/src/prover/client/lazy.ts +11 -0
  70. package/src/prover/index.ts +2 -3
  71. package/src/prover/proof_utils.ts +115 -0
  72. package/src/prover/server/bb_prover.ts +733 -0
  73. package/src/test/delay_values.ts +33 -21
  74. package/src/test/test_circuit_prover.ts +260 -147
  75. package/src/test/test_verifier.ts +15 -3
  76. package/src/verification_key/verification_key_data.ts +29 -24
  77. package/src/verifier/bb_verifier.ts +63 -32
  78. package/src/verifier/index.ts +1 -0
  79. package/src/verifier/queued_chonk_verifier.ts +140 -0
  80. package/dest/prover/bb_native_private_kernel_prover.d.ts +0 -25
  81. package/dest/prover/bb_native_private_kernel_prover.d.ts.map +0 -1
  82. package/dest/prover/bb_native_private_kernel_prover.js +0 -69
  83. package/dest/prover/bb_private_kernel_prover.d.ts +0 -32
  84. package/dest/prover/bb_private_kernel_prover.d.ts.map +0 -1
  85. package/dest/prover/bb_prover.d.ts +0 -120
  86. package/dest/prover/bb_prover.d.ts.map +0 -1
  87. package/dest/prover/bb_prover.js +0 -423
  88. package/dest/prover/client_ivc_proof_utils.d.ts +0 -25
  89. package/dest/prover/client_ivc_proof_utils.d.ts.map +0 -1
  90. package/dest/prover/client_ivc_proof_utils.js +0 -43
  91. package/dest/stats.d.ts +0 -5
  92. package/dest/stats.d.ts.map +0 -1
  93. package/dest/stats.js +0 -62
  94. package/dest/wasm/bb_wasm_private_kernel_prover.d.ts +0 -17
  95. package/dest/wasm/bb_wasm_private_kernel_prover.d.ts.map +0 -1
  96. package/dest/wasm/bb_wasm_private_kernel_prover.js +0 -46
  97. package/dest/wasm/bundle.d.ts +0 -6
  98. package/dest/wasm/bundle.d.ts.map +0 -1
  99. package/dest/wasm/bundle.js +0 -8
  100. package/dest/wasm/lazy.d.ts +0 -6
  101. package/dest/wasm/lazy.d.ts.map +0 -1
  102. package/dest/wasm/lazy.js +0 -8
  103. package/src/prover/bb_native_private_kernel_prover.ts +0 -119
  104. package/src/prover/bb_prover.ts +0 -781
  105. package/src/prover/client_ivc_proof_utils.ts +0 -42
  106. package/src/stats.ts +0 -64
  107. package/src/wasm/bb_wasm_private_kernel_prover.ts +0 -55
  108. package/src/wasm/bundle.ts +0 -11
  109. package/src/wasm/lazy.ts +0 -11
@@ -0,0 +1,132 @@
1
+ import { createLogger } from '@aztec/foundation/log';
2
+ import { SerialQueue } from '@aztec/foundation/queue';
3
+ import { Attributes, Metrics, ValueType, getTelemetryClient } from '@aztec/telemetry-client';
4
+ import { createHistogram } from 'node:perf_hooks';
5
+ class IVCVerifierMetrics {
6
+ ivcVerificationHistogram;
7
+ ivcTotalVerificationHistogram;
8
+ ivcFailureCount;
9
+ localHistogramOk = createHistogram({
10
+ min: 1,
11
+ max: 5 * 60 * 1000
12
+ });
13
+ localHistogramFails = createHistogram({
14
+ min: 1,
15
+ max: 5 * 60 * 1000
16
+ });
17
+ aggDurationMetrics;
18
+ constructor(client, name = 'QueuedIVCVerifier'){
19
+ const meter = client.getMeter(name);
20
+ this.ivcVerificationHistogram = meter.createHistogram(Metrics.IVC_VERIFIER_TIME, {
21
+ unit: 'ms',
22
+ description: 'Duration to verify chonk proofs',
23
+ valueType: ValueType.INT
24
+ });
25
+ this.ivcTotalVerificationHistogram = meter.createHistogram(Metrics.IVC_VERIFIER_TOTAL_TIME, {
26
+ unit: 'ms',
27
+ description: 'Total duration to verify chonk proofs, including serde',
28
+ valueType: ValueType.INT
29
+ });
30
+ this.ivcFailureCount = meter.createUpDownCounter(Metrics.IVC_VERIFIER_FAILURE_COUNT, {
31
+ description: 'Count of failed IVC proof verifications',
32
+ valueType: ValueType.INT
33
+ });
34
+ this.aggDurationMetrics = {
35
+ avg: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_AVG, {
36
+ valueType: ValueType.DOUBLE,
37
+ description: 'AVG ivc verification',
38
+ unit: 'ms'
39
+ }),
40
+ max: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_MAX, {
41
+ valueType: ValueType.DOUBLE,
42
+ description: 'MAX ivc verification',
43
+ unit: 'ms'
44
+ }),
45
+ min: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_MIN, {
46
+ valueType: ValueType.DOUBLE,
47
+ description: 'MIN ivc verification',
48
+ unit: 'ms'
49
+ }),
50
+ p50: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_P50, {
51
+ valueType: ValueType.DOUBLE,
52
+ description: 'P50 ivc verification',
53
+ unit: 'ms'
54
+ }),
55
+ p90: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_P90, {
56
+ valueType: ValueType.DOUBLE,
57
+ description: 'P90 ivc verification',
58
+ unit: 'ms'
59
+ })
60
+ };
61
+ meter.addBatchObservableCallback(this.aggregate, Object.values(this.aggDurationMetrics));
62
+ }
63
+ recordIVCVerification(result) {
64
+ this.ivcVerificationHistogram.record(Math.ceil(result.durationMs), {
65
+ [Attributes.OK]: result.valid
66
+ });
67
+ this.ivcTotalVerificationHistogram.record(Math.ceil(result.totalDurationMs), {
68
+ [Attributes.OK]: result.valid
69
+ });
70
+ if (!result.valid) {
71
+ this.ivcFailureCount.add(1);
72
+ this.localHistogramFails.record(Math.max(Math.ceil(result.durationMs), 1));
73
+ } else {
74
+ this.localHistogramOk.record(Math.max(Math.ceil(result.durationMs), 1));
75
+ }
76
+ }
77
+ aggregate = (res)=>{
78
+ for (const [histogram, ok] of [
79
+ [
80
+ this.localHistogramOk,
81
+ true
82
+ ],
83
+ [
84
+ this.localHistogramFails,
85
+ false
86
+ ]
87
+ ]){
88
+ if (histogram.count === 0) {
89
+ continue;
90
+ }
91
+ res.observe(this.aggDurationMetrics.avg, histogram.mean, {
92
+ [Attributes.OK]: ok
93
+ });
94
+ res.observe(this.aggDurationMetrics.max, histogram.max, {
95
+ [Attributes.OK]: ok
96
+ });
97
+ res.observe(this.aggDurationMetrics.min, histogram.min, {
98
+ [Attributes.OK]: ok
99
+ });
100
+ res.observe(this.aggDurationMetrics.p50, histogram.percentile(50), {
101
+ [Attributes.OK]: ok
102
+ });
103
+ res.observe(this.aggDurationMetrics.p90, histogram.percentile(90), {
104
+ [Attributes.OK]: ok
105
+ });
106
+ }
107
+ };
108
+ }
109
+ export class QueuedIVCVerifier {
110
+ verifier;
111
+ telemetry;
112
+ logger;
113
+ queue;
114
+ metrics;
115
+ constructor(config, verifier, telemetry = getTelemetryClient(), logger = createLogger('bb-prover:queued_chonk_verifier')){
116
+ this.verifier = verifier;
117
+ this.telemetry = telemetry;
118
+ this.logger = logger;
119
+ this.metrics = new IVCVerifierMetrics(this.telemetry, 'QueuedIVCVerifier');
120
+ this.queue = new SerialQueue();
121
+ this.logger.info(`Starting QueuedIVCVerifier with ${config.numConcurrentIVCVerifiers} concurrent verifiers`);
122
+ this.queue.start(config.numConcurrentIVCVerifiers);
123
+ }
124
+ async verifyProof(tx) {
125
+ const result = await this.queue.put(()=>this.verifier.verifyProof(tx));
126
+ this.metrics.recordIVCVerification(result);
127
+ return result;
128
+ }
129
+ stop() {
130
+ return this.queue.end();
131
+ }
132
+ }
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@aztec/bb-prover",
3
- "version": "0.0.0-test.1",
3
+ "version": "0.0.1-commit.21caa21",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
7
- "./wasm/bundle": "./dest/wasm/bundle.js",
8
- "./wasm/lazy": "./dest/wasm/lazy.js",
9
- "./prover": "./dest/prover/index.js",
7
+ "./client/bundle": "./dest/prover/client/bundle.js",
8
+ "./client/lazy": "./dest/prover/client/lazy.js",
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
12
  "./config": "./dest/config.js"
@@ -25,11 +25,9 @@
25
25
  "../package.common.json"
26
26
  ],
27
27
  "scripts": {
28
- "build": "yarn clean && tsc -b",
29
- "build:dev": "tsc -b --watch",
28
+ "build": "yarn clean && tsgo -b",
29
+ "build:dev": "tsgo -b --watch",
30
30
  "clean": "rm -rf ./dest .tsbuildinfo",
31
- "formatting": "run -T prettier --check ./src && run -T eslint ./src",
32
- "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src",
33
31
  "bb": "node --no-warnings ./dest/bb/index.js",
34
32
  "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests --maxWorkers=${JEST_MAX_WORKERS:-8}"
35
33
  },
@@ -64,40 +62,44 @@
64
62
  "testTimeout": 120000,
65
63
  "setupFiles": [
66
64
  "../../foundation/src/jest/setup.mjs"
65
+ ],
66
+ "testEnvironment": "../../foundation/src/jest/env.mjs",
67
+ "setupFilesAfterEnv": [
68
+ "../../foundation/src/jest/setupAfterEnv.mjs"
67
69
  ]
68
70
  },
69
71
  "dependencies": {
70
- "@aztec/bb.js": "0.0.0-test.1",
71
- "@aztec/constants": "0.0.0-test.1",
72
- "@aztec/foundation": "0.0.0-test.1",
73
- "@aztec/noir-protocol-circuits-types": "0.0.0-test.1",
74
- "@aztec/simulator": "0.0.0-test.1",
75
- "@aztec/stdlib": "0.0.0-test.1",
76
- "@aztec/telemetry-client": "0.0.0-test.1",
77
- "@aztec/world-state": "0.0.0-test.1",
78
- "@msgpack/msgpack": "^3.0.0-beta2",
72
+ "@aztec/bb.js": "0.0.1-commit.21caa21",
73
+ "@aztec/constants": "0.0.1-commit.21caa21",
74
+ "@aztec/foundation": "0.0.1-commit.21caa21",
75
+ "@aztec/noir-noirc_abi": "0.0.1-commit.21caa21",
76
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.21caa21",
77
+ "@aztec/noir-types": "0.0.1-commit.21caa21",
78
+ "@aztec/simulator": "0.0.1-commit.21caa21",
79
+ "@aztec/stdlib": "0.0.1-commit.21caa21",
80
+ "@aztec/telemetry-client": "0.0.1-commit.21caa21",
81
+ "@aztec/world-state": "0.0.1-commit.21caa21",
79
82
  "commander": "^12.1.0",
80
83
  "pako": "^2.1.0",
81
84
  "source-map-support": "^0.5.21",
82
- "tslib": "^2.4.0",
83
- "@aztec/noir-noirc_abi": "0.0.0-test.1",
84
- "@aztec/noir-types": "0.0.0-test.1"
85
+ "tslib": "^2.4.0"
85
86
  },
86
87
  "devDependencies": {
87
- "@aztec/ethereum": "0.0.0-test.1",
88
- "@aztec/kv-store": "0.0.0-test.1",
89
- "@aztec/noir-contracts.js": "0.0.0-test.1",
90
- "@aztec/protocol-contracts": "0.0.0-test.1",
91
- "@jest/globals": "^29.5.0",
92
- "@types/jest": "^29.5.0",
93
- "@types/memdown": "^3.0.0",
94
- "@types/node": "^18.7.23",
88
+ "@aztec/ethereum": "0.0.1-commit.21caa21",
89
+ "@aztec/kv-store": "0.0.1-commit.21caa21",
90
+ "@aztec/noir-contracts.js": "0.0.1-commit.21caa21",
91
+ "@aztec/noir-test-contracts.js": "0.0.1-commit.21caa21",
92
+ "@aztec/protocol-contracts": "0.0.1-commit.21caa21",
93
+ "@jest/globals": "^30.0.0",
94
+ "@types/jest": "^30.0.0",
95
+ "@types/node": "^22.15.17",
95
96
  "@types/source-map-support": "^0.5.10",
96
- "jest": "^29.5.0",
97
- "jest-mock-extended": "^3.0.3",
97
+ "@typescript/native-preview": "7.0.0-dev.20251126.1",
98
+ "jest": "^30.0.0",
99
+ "jest-mock-extended": "^4.0.0",
98
100
  "ts-node": "^10.9.1",
99
- "typescript": "^5.0.4",
100
- "viem": "2.22.8"
101
+ "typescript": "^5.3.3",
102
+ "viem": "npm:@aztec/viem@2.38.2"
101
103
  },
102
104
  "files": [
103
105
  "dest",
@@ -106,6 +108,6 @@
106
108
  ],
107
109
  "types": "./dest/index.d.ts",
108
110
  "engines": {
109
- "node": ">=18"
111
+ "node": ">=20.10"
110
112
  }
111
113
  }
@@ -1,10 +1,17 @@
1
- import { PublicTxSimulationTester, type TestEnqueuedCall } from '@aztec/simulator/public/fixtures';
2
- import { SimpleContractDataSource, WorldStateDB } from '@aztec/simulator/server';
3
- import type { AvmCircuitInputs } from '@aztec/stdlib/avm';
1
+ import type { LogFn, LogLevel, Logger } from '@aztec/foundation/log';
2
+ import { Timer } from '@aztec/foundation/timer';
3
+ import {
4
+ PublicTxSimulationTester,
5
+ SimpleContractDataSource,
6
+ type TestEnqueuedCall,
7
+ type TestExecutorMetrics,
8
+ type TestPrivateInsertions,
9
+ } from '@aztec/simulator/public/fixtures';
10
+ import type { PublicTxResult } from '@aztec/simulator/server';
11
+ import { AvmCircuitInputs, AvmCircuitPublicInputs } from '@aztec/stdlib/avm';
4
12
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
13
  import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
6
- import { makeAvmCircuitInputs } from '@aztec/stdlib/testing';
7
- import { VerificationKeyData } from '@aztec/stdlib/vks';
14
+ import type { GlobalVariables } from '@aztec/stdlib/tx';
8
15
  import { NativeWorldStateService } from '@aztec/world-state';
9
16
 
10
17
  import fs from 'node:fs/promises';
@@ -15,156 +22,255 @@ import {
15
22
  type BBResult,
16
23
  type BBSuccess,
17
24
  BB_RESULT,
25
+ VK_FILENAME,
18
26
  generateAvmProof,
19
- generateAvmProofV2,
20
27
  verifyAvmProof,
21
- verifyAvmProofV2,
22
28
  } from '../bb/execute.js';
23
- import { extractAvmVkData } from '../verification_key/verification_key_data.js';
24
29
 
25
- const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb');
30
+ const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb-avm');
26
31
 
27
- export class AvmProvingTester extends PublicTxSimulationTester {
28
- constructor(
29
- private bbWorkingDirectory: string,
30
- private checkCircuitOnly: boolean,
31
- worldStateDB: WorldStateDB,
32
- contractDataSource: SimpleContractDataSource,
33
- merkleTrees: MerkleTreeWriteOperations,
34
- ) {
35
- super(worldStateDB, contractDataSource, merkleTrees);
36
- }
32
+ // An InterceptingLogger that records all log messages and forwards them to a wrapped logger.
33
+ class InterceptingLogger implements Logger {
34
+ public readonly logs: string[] = [];
35
+ public level: LogLevel;
36
+ public module: string;
37
37
 
38
- static override async create(checkCircuitOnly: boolean = false) {
39
- const bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
38
+ private logger: Logger;
40
39
 
41
- const contractDataSource = new SimpleContractDataSource();
42
- const merkleTrees = await (await NativeWorldStateService.tmp()).fork();
43
- const worldStateDB = new WorldStateDB(merkleTrees, contractDataSource);
44
- return new AvmProvingTester(bbWorkingDirectory, checkCircuitOnly, worldStateDB, contractDataSource, merkleTrees);
40
+ constructor(logger: Logger) {
41
+ this.logger = logger;
42
+ this.level = logger.level;
43
+ this.module = logger.module;
45
44
  }
46
45
 
47
- async prove(avmCircuitInputs: AvmCircuitInputs): Promise<BBResult> {
48
- // Then we prove.
49
- const proofRes = await generateAvmProof(
50
- BB_PATH,
51
- this.bbWorkingDirectory,
52
- avmCircuitInputs,
53
- this.logger,
54
- this.checkCircuitOnly,
55
- );
56
- if (proofRes.status === BB_RESULT.FAILURE) {
57
- this.logger.error(`Proof generation failed: ${proofRes.reason}`);
58
- }
59
- return proofRes;
46
+ isLevelEnabled(level: LogLevel): boolean {
47
+ return this.logger.isLevelEnabled(level);
60
48
  }
61
49
 
62
- async verify(proofRes: BBSuccess): Promise<BBResult> {
63
- if (this.checkCircuitOnly) {
64
- // Skip verification if we're only checking the circuit.
65
- // Check-circuit doesn't generate a proof to verify.
66
- return proofRes;
67
- }
68
- // Then we test VK extraction and serialization.
69
- const succeededRes = proofRes as BBSuccess;
70
- const vkData = await extractAvmVkData(succeededRes.vkPath!);
71
- VerificationKeyData.fromBuffer(vkData.toBuffer());
72
-
73
- // Then we verify.
74
- const rawVkPath = path.join(succeededRes.vkPath!, 'vk');
75
- return await verifyAvmProof(BB_PATH, succeededRes.proofPath!, rawVkPath, this.logger);
50
+ createChild(_childModule: string): Logger {
51
+ throw new Error('Not implemented');
76
52
  }
77
53
 
78
- public async simProveVerify(
79
- sender: AztecAddress,
80
- setupCalls: TestEnqueuedCall[],
81
- appCalls: TestEnqueuedCall[],
82
- teardownCall: TestEnqueuedCall | undefined,
83
- expectRevert: boolean | undefined,
84
- feePayer = sender,
85
- ) {
86
- const simRes = await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer);
87
- expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
88
- const avmCircuitInputs = simRes.avmProvingRequest.inputs;
89
- const provingRes = await this.prove(avmCircuitInputs);
90
- expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
91
- const verificationRes = await this.verify(provingRes as BBSuccess);
92
- expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
54
+ private intercept(level: LogLevel, msg: string, ...args: any[]) {
55
+ this.logs.push(...msg.split('\n'));
56
+ // Forward to the wrapped logger
57
+ (this.logger[level] as LogFn)(msg, ...args);
93
58
  }
94
59
 
95
- public async simProveVerifyAppLogic(appCall: TestEnqueuedCall, expectRevert?: boolean) {
96
- const simRes = await this.simulateTx(/*sender=*/ AztecAddress.fromNumber(42), /*setupCalls=*/ [], [appCall]);
97
- expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
98
-
99
- const avmCircuitInputs = simRes.avmProvingRequest.inputs;
100
- const provingRes = await this.prove(avmCircuitInputs);
101
- expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
60
+ // Log methods for each level
61
+ silent(msg: string, ...args: any[]) {
62
+ this.intercept('silent', msg, ...args);
63
+ }
64
+ fatal(msg: string, ...args: any[]) {
65
+ this.intercept('fatal', msg, ...args);
66
+ }
67
+ warn(msg: string, ...args: any[]) {
68
+ this.intercept('warn', msg, ...args);
69
+ }
70
+ info(msg: string, ...args: any[]) {
71
+ this.intercept('info', msg, ...args);
72
+ }
73
+ verbose(msg: string, ...args: any[]) {
74
+ this.intercept('verbose', msg, ...args);
75
+ }
76
+ debug(msg: string, ...args: any[]) {
77
+ this.intercept('debug', msg, ...args);
78
+ }
79
+ trace(msg: string, ...args: any[]) {
80
+ this.intercept('trace', msg, ...args);
81
+ }
102
82
 
103
- const verificationRes = await this.verify(provingRes as BBSuccess);
104
- expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
83
+ // Error log function can be string or Error
84
+ error(err: Error | string, ...args: any[]) {
85
+ const msg = typeof err === 'string' ? err : err.message;
86
+ this.logs.push(msg);
87
+ this.logger.error(msg, err, ...args);
105
88
  }
106
89
  }
107
90
 
108
- export class AvmProvingTesterV2 extends PublicTxSimulationTester {
91
+ export class AvmProvingTester extends PublicTxSimulationTester {
92
+ private bbWorkingDirectory: string = '';
93
+
109
94
  constructor(
110
- private bbWorkingDirectory: string,
111
- worldStateDB: WorldStateDB,
95
+ private checkCircuitOnly: boolean,
112
96
  contractDataSource: SimpleContractDataSource,
113
97
  merkleTrees: MerkleTreeWriteOperations,
98
+ globals?: GlobalVariables,
99
+ metrics?: TestExecutorMetrics,
114
100
  ) {
115
- super(worldStateDB, contractDataSource, merkleTrees);
101
+ super(merkleTrees, contractDataSource, globals, metrics);
116
102
  }
117
103
 
118
- static override async create() {
119
- const bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
120
-
104
+ static async new(
105
+ worldStateService: NativeWorldStateService, // make sure to close this later
106
+ checkCircuitOnly: boolean = false,
107
+ globals?: GlobalVariables,
108
+ metrics?: TestExecutorMetrics,
109
+ ) {
121
110
  const contractDataSource = new SimpleContractDataSource();
122
- const merkleTrees = await (await NativeWorldStateService.tmp()).fork();
123
- const worldStateDB = new WorldStateDB(merkleTrees, contractDataSource);
124
- return new AvmProvingTesterV2(bbWorkingDirectory, worldStateDB, contractDataSource, merkleTrees);
111
+ const merkleTrees = await worldStateService.fork();
112
+ return new AvmProvingTester(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics);
125
113
  }
126
114
 
127
- async proveV2(avmCircuitInputs: AvmCircuitInputs): Promise<BBResult> {
115
+ async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<BBResult> {
116
+ // We use a new working directory for each proof.
117
+ this.bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
118
+
119
+ const interceptingLogger = new InterceptingLogger(this.logger);
120
+
128
121
  // Then we prove.
129
- const proofRes = await generateAvmProofV2(BB_PATH, this.bbWorkingDirectory, avmCircuitInputs, this.logger);
122
+ const proofRes = await generateAvmProof(
123
+ BB_PATH,
124
+ this.bbWorkingDirectory,
125
+ avmCircuitInputs,
126
+ interceptingLogger,
127
+ this.checkCircuitOnly,
128
+ );
130
129
  if (proofRes.status === BB_RESULT.FAILURE) {
131
130
  this.logger.error(`Proof generation failed: ${proofRes.reason}`);
132
131
  }
133
132
  expect(proofRes.status).toEqual(BB_RESULT.SUCCESS);
133
+
134
+ // Parse the logs into a structured format.
135
+ const logs = interceptingLogger.logs;
136
+ // const traceSizes: { name: string; size: number }[] = [];
137
+ // logs.forEach(log => {
138
+ // const match = log.match(/\b(\w+): (\d+) \(~2/);
139
+ // if (match) {
140
+ // traceSizes.push({
141
+ // name: match[1],
142
+ // size: parseInt(match[2]),
143
+ // });
144
+ // }
145
+ // });
146
+ const times: { [key: string]: number } = {};
147
+ logs.forEach(log => {
148
+ const match = log.match(/\b([\w/]+)_ms: (\d+)/);
149
+ if (match) {
150
+ times[match[1]] = parseInt(match[2]);
151
+ }
152
+ });
153
+
154
+ // Throw if logs did not contain any times.
155
+ if (Object.keys(times).length === 0) {
156
+ throw new Error('AVM stdout did not contain any proving times in the stats!');
157
+ }
158
+
159
+ // Hack to make labels match.
160
+ const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
161
+ // I need to cast because TS doesnt realize metrics is protected not private.
162
+ (this as any).metrics?.recordProverMetrics(txLabelWithCount, {
163
+ proverSimulationStepMs: times['simulation/all'],
164
+ proverProvingStepMs: times['proving/all'],
165
+ proverTraceGenerationStepMs: times['tracegen/all'],
166
+ traceGenerationInteractionsMs: times['tracegen/interactions'],
167
+ traceGenerationTracesMs: times['tracegen/traces'],
168
+ provingSumcheckMs: times['prove/sumcheck'],
169
+ provingPcsMs: times['prove/pcs_rounds'],
170
+ provingLogDerivativeInverseMs: times['prove/log_derivative_inverse_round'],
171
+ provingLogDerivativeInverseCommitmentsMs: times['prove/log_derivative_inverse_commitments_round'],
172
+ provingWireCommitmentsMs: times['prove/wire_commitments_round'],
173
+ });
174
+
134
175
  return proofRes as BBSuccess;
135
176
  }
136
177
 
137
- async verifyV2(proofRes: BBSuccess): Promise<BBResult> {
138
- // TODO: Placeholder for now. They get ignored in C++.
139
- const inputs = await makeAvmCircuitInputs();
178
+ async verify(proofRes: BBSuccess, publicInputs: AvmCircuitPublicInputs): Promise<BBResult> {
179
+ if (this.checkCircuitOnly) {
180
+ // Skip verification if we are only checking the circuit.
181
+ // Check-circuit does not generate a proof to verify.
182
+ return proofRes;
183
+ }
140
184
 
141
- const rawVkPath = path.join(proofRes.vkPath!, 'vk');
142
- return await verifyAvmProofV2(
185
+ return await verifyAvmProof(
143
186
  BB_PATH,
144
187
  this.bbWorkingDirectory,
145
188
  proofRes.proofPath!,
146
- inputs.publicInputs,
147
- rawVkPath,
189
+ publicInputs,
190
+ path.join(proofRes.vkDirectoryPath!, VK_FILENAME),
148
191
  this.logger,
149
192
  );
150
193
  }
151
194
 
152
- public async simProveVerifyV2(
195
+ public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
196
+ const provingRes = await this.prove(avmCircuitInputs, txLabel);
197
+ expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
198
+
199
+ const verificationRes = await this.verify(provingRes as BBSuccess, avmCircuitInputs.publicInputs);
200
+ expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
201
+ }
202
+
203
+ public async simProveVerify(
153
204
  sender: AztecAddress,
154
205
  setupCalls: TestEnqueuedCall[],
155
206
  appCalls: TestEnqueuedCall[],
156
207
  teardownCall: TestEnqueuedCall | undefined,
157
208
  expectRevert: boolean | undefined,
158
209
  feePayer = sender,
159
- ) {
160
- const simRes = await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer);
161
- expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
210
+ privateInsertions?: TestPrivateInsertions,
211
+ txLabel: string = 'unlabeledTx',
212
+ disableRevertCheck: boolean = false,
213
+ ): Promise<PublicTxResult> {
214
+ const simRes = await this.simulateTx(
215
+ sender,
216
+ setupCalls,
217
+ appCalls,
218
+ teardownCall,
219
+ feePayer,
220
+ privateInsertions,
221
+ txLabel,
222
+ );
162
223
 
163
- const avmCircuitInputs = simRes.avmProvingRequest.inputs;
164
- const provingRes = await this.proveV2(avmCircuitInputs);
165
- expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
224
+ if (!disableRevertCheck) {
225
+ expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
226
+ }
166
227
 
167
- const verificationRes = await this.verifyV2(provingRes as BBSuccess);
168
- expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
228
+ const opString = this.checkCircuitOnly ? 'Check circuit' : 'Proving and verification';
229
+
230
+ const avmCircuitInputs = new AvmCircuitInputs(simRes.hints!, simRes.publicInputs);
231
+ const timer = new Timer();
232
+ await this.proveVerify(avmCircuitInputs, txLabel);
233
+ this.logger.info(`${opString} took ${timer.ms()} ms for tx ${txLabel}`);
234
+
235
+ return simRes;
236
+ }
237
+
238
+ public override async executeTxWithLabel(
239
+ txLabel: string,
240
+ sender: AztecAddress,
241
+ setupCalls?: TestEnqueuedCall[],
242
+ appCalls?: TestEnqueuedCall[],
243
+ teardownCall?: TestEnqueuedCall,
244
+ feePayer?: AztecAddress,
245
+ privateInsertions?: TestPrivateInsertions,
246
+ ) {
247
+ return await this.simProveVerify(
248
+ sender,
249
+ setupCalls ?? [],
250
+ appCalls ?? [],
251
+ teardownCall,
252
+ undefined,
253
+ feePayer,
254
+ privateInsertions,
255
+ txLabel,
256
+ true,
257
+ );
258
+ }
259
+
260
+ public async simProveVerifyAppLogic(
261
+ appCall: TestEnqueuedCall,
262
+ expectRevert?: boolean,
263
+ txLabel: string = 'unlabeledTx',
264
+ ) {
265
+ await this.simProveVerify(
266
+ /*sender=*/ AztecAddress.fromNumber(42),
267
+ /*setupCalls=*/ [],
268
+ [appCall],
269
+ undefined,
270
+ expectRevert,
271
+ /*feePayer=*/ undefined,
272
+ /*privateInsertions=*/ undefined,
273
+ txLabel,
274
+ );
169
275
  }
170
276
  }