@aztec/bb-prover 3.0.3 → 4.0.0-devnet.1-patch.0
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 +1 -1
- package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
- package/dest/avm_proving_tests/avm_proving_tester.js +5 -2
- package/dest/bb/execute.d.ts +6 -6
- package/dest/bb/execute.d.ts.map +1 -1
- package/dest/bb/execute.js +46 -75
- package/dest/instrumentation.d.ts +1 -1
- package/dest/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation.js +9 -39
- package/dest/prover/client/bb_private_kernel_prover.d.ts +9 -3
- package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -1
- package/dest/prover/client/bb_private_kernel_prover.js +16 -4
- 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/server/bb_prover.d.ts +6 -9
- package/dest/prover/server/bb_prover.d.ts.map +1 -1
- package/dest/prover/server/bb_prover.js +415 -42
- 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 +27 -25
- 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 +4 -4
- 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 +0 -19
- package/dest/verifier/bb_verifier.d.ts +1 -1
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +1 -4
- package/dest/verifier/queued_chonk_verifier.d.ts +1 -1
- package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -1
- package/dest/verifier/queued_chonk_verifier.js +9 -40
- package/package.json +17 -17
- package/src/avm_proving_tests/avm_proving_tester.ts +6 -16
- package/src/bb/execute.ts +31 -59
- package/src/instrumentation.ts +8 -39
- package/src/prover/client/bb_private_kernel_prover.ts +20 -6
- package/src/prover/client/bundle.ts +3 -4
- package/src/prover/client/lazy.ts +3 -4
- package/src/prover/server/bb_prover.ts +22 -37
- package/src/test/delay_values.ts +28 -24
- package/src/test/index.ts +1 -0
- package/src/test/test_circuit_prover.ts +10 -13
- package/src/verification_key/verification_key_data.ts +0 -25
- package/src/verifier/bb_verifier.ts +1 -5
- package/src/verifier/queued_chonk_verifier.ts +9 -40
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createLogger } from '@aztec/foundation/log';
|
|
2
2
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
3
|
-
import { Attributes, Metrics,
|
|
3
|
+
import { Attributes, Metrics, createUpDownCounterWithDefault, getTelemetryClient } from '@aztec/telemetry-client';
|
|
4
4
|
import { createHistogram } from 'node:perf_hooks';
|
|
5
5
|
class IVCVerifierMetrics {
|
|
6
6
|
ivcVerificationHistogram;
|
|
@@ -17,46 +17,15 @@ class IVCVerifierMetrics {
|
|
|
17
17
|
aggDurationMetrics;
|
|
18
18
|
constructor(client, name = 'QueuedIVCVerifier'){
|
|
19
19
|
const meter = client.getMeter(name);
|
|
20
|
-
this.ivcVerificationHistogram = meter.createHistogram(Metrics.IVC_VERIFIER_TIME
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
});
|
|
20
|
+
this.ivcVerificationHistogram = meter.createHistogram(Metrics.IVC_VERIFIER_TIME);
|
|
21
|
+
this.ivcTotalVerificationHistogram = meter.createHistogram(Metrics.IVC_VERIFIER_TOTAL_TIME);
|
|
22
|
+
this.ivcFailureCount = createUpDownCounterWithDefault(meter, Metrics.IVC_VERIFIER_FAILURE_COUNT);
|
|
34
23
|
this.aggDurationMetrics = {
|
|
35
|
-
avg: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_AVG,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
})
|
|
24
|
+
avg: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_AVG),
|
|
25
|
+
max: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_MAX),
|
|
26
|
+
min: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_MIN),
|
|
27
|
+
p50: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_P50),
|
|
28
|
+
p90: meter.createObservableGauge(Metrics.IVC_VERIFIER_AGG_DURATION_P90)
|
|
60
29
|
};
|
|
61
30
|
meter.addBatchObservableCallback(this.aggregate, Object.values(this.aggDurationMetrics));
|
|
62
31
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/bb-prover",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0-devnet.1-patch.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -69,32 +69,32 @@
|
|
|
69
69
|
]
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
|
-
"@aztec/bb.js": "
|
|
73
|
-
"@aztec/constants": "
|
|
74
|
-
"@aztec/foundation": "
|
|
75
|
-
"@aztec/noir-noirc_abi": "
|
|
76
|
-
"@aztec/noir-protocol-circuits-types": "
|
|
77
|
-
"@aztec/noir-types": "
|
|
78
|
-
"@aztec/simulator": "
|
|
79
|
-
"@aztec/stdlib": "
|
|
80
|
-
"@aztec/telemetry-client": "
|
|
81
|
-
"@aztec/world-state": "
|
|
72
|
+
"@aztec/bb.js": "4.0.0-devnet.1-patch.0",
|
|
73
|
+
"@aztec/constants": "4.0.0-devnet.1-patch.0",
|
|
74
|
+
"@aztec/foundation": "4.0.0-devnet.1-patch.0",
|
|
75
|
+
"@aztec/noir-noirc_abi": "4.0.0-devnet.1-patch.0",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "4.0.0-devnet.1-patch.0",
|
|
77
|
+
"@aztec/noir-types": "4.0.0-devnet.1-patch.0",
|
|
78
|
+
"@aztec/simulator": "4.0.0-devnet.1-patch.0",
|
|
79
|
+
"@aztec/stdlib": "4.0.0-devnet.1-patch.0",
|
|
80
|
+
"@aztec/telemetry-client": "4.0.0-devnet.1-patch.0",
|
|
81
|
+
"@aztec/world-state": "4.0.0-devnet.1-patch.0",
|
|
82
82
|
"commander": "^12.1.0",
|
|
83
83
|
"pako": "^2.1.0",
|
|
84
84
|
"source-map-support": "^0.5.21",
|
|
85
85
|
"tslib": "^2.4.0"
|
|
86
86
|
},
|
|
87
87
|
"devDependencies": {
|
|
88
|
-
"@aztec/ethereum": "
|
|
89
|
-
"@aztec/kv-store": "
|
|
90
|
-
"@aztec/noir-contracts.js": "
|
|
91
|
-
"@aztec/noir-test-contracts.js": "
|
|
92
|
-
"@aztec/protocol-contracts": "
|
|
88
|
+
"@aztec/ethereum": "4.0.0-devnet.1-patch.0",
|
|
89
|
+
"@aztec/kv-store": "4.0.0-devnet.1-patch.0",
|
|
90
|
+
"@aztec/noir-contracts.js": "4.0.0-devnet.1-patch.0",
|
|
91
|
+
"@aztec/noir-test-contracts.js": "4.0.0-devnet.1-patch.0",
|
|
92
|
+
"@aztec/protocol-contracts": "4.0.0-devnet.1-patch.0",
|
|
93
93
|
"@jest/globals": "^30.0.0",
|
|
94
94
|
"@types/jest": "^30.0.0",
|
|
95
95
|
"@types/node": "^22.15.17",
|
|
96
96
|
"@types/source-map-support": "^0.5.10",
|
|
97
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
97
|
+
"@typescript/native-preview": "7.0.0-dev.20260113.1",
|
|
98
98
|
"jest": "^30.0.0",
|
|
99
99
|
"jest-mock-extended": "^4.0.0",
|
|
100
100
|
"ts-node": "^10.9.1",
|
|
@@ -18,14 +18,7 @@ import fs from 'node:fs/promises';
|
|
|
18
18
|
import { tmpdir } from 'node:os';
|
|
19
19
|
import path from 'path';
|
|
20
20
|
|
|
21
|
-
import {
|
|
22
|
-
type BBResult,
|
|
23
|
-
type BBSuccess,
|
|
24
|
-
BB_RESULT,
|
|
25
|
-
VK_FILENAME,
|
|
26
|
-
generateAvmProof,
|
|
27
|
-
verifyAvmProof,
|
|
28
|
-
} from '../bb/execute.js';
|
|
21
|
+
import { type BBResult, type BBSuccess, BB_RESULT, generateAvmProof, verifyAvmProof } from '../bb/execute.js';
|
|
29
22
|
|
|
30
23
|
const BB_PATH = path.resolve('../../barretenberg/cpp/build/bin/bb-avm');
|
|
31
24
|
|
|
@@ -51,6 +44,10 @@ class InterceptingLogger implements Logger {
|
|
|
51
44
|
throw new Error('Not implemented');
|
|
52
45
|
}
|
|
53
46
|
|
|
47
|
+
getBindings() {
|
|
48
|
+
return this.logger.getBindings();
|
|
49
|
+
}
|
|
50
|
+
|
|
54
51
|
private intercept(level: LogLevel, msg: string, ...args: any[]) {
|
|
55
52
|
this.logs.push(...msg.split('\n'));
|
|
56
53
|
// Forward to the wrapped logger
|
|
@@ -193,14 +190,7 @@ export class AvmProvingTester extends PublicTxSimulationTester {
|
|
|
193
190
|
return proofRes;
|
|
194
191
|
}
|
|
195
192
|
|
|
196
|
-
return await verifyAvmProof(
|
|
197
|
-
BB_PATH,
|
|
198
|
-
this.bbWorkingDirectory,
|
|
199
|
-
proofRes.proofPath!,
|
|
200
|
-
publicInputs,
|
|
201
|
-
path.join(proofRes.vkDirectoryPath!, VK_FILENAME),
|
|
202
|
-
this.logger,
|
|
203
|
-
);
|
|
193
|
+
return await verifyAvmProof(BB_PATH, this.bbWorkingDirectory, proofRes.proofPath!, publicInputs, this.logger);
|
|
204
194
|
}
|
|
205
195
|
|
|
206
196
|
public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
|
package/src/bb/execute.ts
CHANGED
|
@@ -353,7 +353,7 @@ export async function generateAvmProof(
|
|
|
353
353
|
durationMs: duration,
|
|
354
354
|
proofPath: join(outputPath, PROOF_FILENAME),
|
|
355
355
|
pkPath: undefined,
|
|
356
|
-
vkDirectoryPath:
|
|
356
|
+
vkDirectoryPath: undefined, // AVM VK is fixed in the binary.
|
|
357
357
|
};
|
|
358
358
|
}
|
|
359
359
|
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
@@ -372,7 +372,7 @@ export async function generateAvmProof(
|
|
|
372
372
|
* @param pathToBB - The full path to the bb binary
|
|
373
373
|
* @param proofFullPath - The full path to the proof to be verified
|
|
374
374
|
* @param verificationKeyPath - The full path to the circuit verification key
|
|
375
|
-
* @param
|
|
375
|
+
* @param logger - A logger
|
|
376
376
|
* @returns An object containing a result indication and duration taken
|
|
377
377
|
*/
|
|
378
378
|
export async function verifyProof(
|
|
@@ -380,16 +380,25 @@ export async function verifyProof(
|
|
|
380
380
|
proofFullPath: string,
|
|
381
381
|
verificationKeyPath: string,
|
|
382
382
|
ultraHonkFlavor: UltraHonkFlavor,
|
|
383
|
-
|
|
383
|
+
logger: Logger,
|
|
384
384
|
): Promise<BBFailure | BBSuccess> {
|
|
385
|
-
|
|
386
|
-
|
|
385
|
+
// Specify the public inputs path in the case of UH verification.
|
|
386
|
+
// Take proofFullPath and remove the suffix past the / to get the directory.
|
|
387
|
+
const proofDir = proofFullPath.substring(0, proofFullPath.lastIndexOf('/'));
|
|
388
|
+
const publicInputsFullPath = join(proofDir, '/public_inputs');
|
|
389
|
+
logger.debug(`public inputs path: ${publicInputsFullPath}`);
|
|
390
|
+
|
|
391
|
+
const args = [
|
|
392
|
+
'-p',
|
|
387
393
|
proofFullPath,
|
|
394
|
+
'-k',
|
|
388
395
|
verificationKeyPath,
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
396
|
+
'-i',
|
|
397
|
+
publicInputsFullPath,
|
|
398
|
+
'--disable_zk',
|
|
399
|
+
...getArgs(ultraHonkFlavor),
|
|
400
|
+
];
|
|
401
|
+
return await verifyProofInternal(pathToBB, `verify`, args, logger);
|
|
393
402
|
}
|
|
394
403
|
|
|
395
404
|
export async function verifyAvmProof(
|
|
@@ -397,7 +406,6 @@ export async function verifyAvmProof(
|
|
|
397
406
|
workingDirectory: string,
|
|
398
407
|
proofFullPath: string,
|
|
399
408
|
publicInputs: AvmCircuitPublicInputs,
|
|
400
|
-
verificationKeyPath: string,
|
|
401
409
|
logger: Logger,
|
|
402
410
|
): Promise<BBFailure | BBSuccess> {
|
|
403
411
|
const inputsBuffer = publicInputs.serializeWithMessagePack();
|
|
@@ -414,10 +422,8 @@ export async function verifyAvmProof(
|
|
|
414
422
|
return { status: BB_RESULT.FAILURE, reason: `Could not write avm inputs to ${avmInputsPath}` };
|
|
415
423
|
}
|
|
416
424
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
avmInputsPath,
|
|
420
|
-
]);
|
|
425
|
+
const args = ['-p', proofFullPath, '--avm-public-inputs', avmInputsPath];
|
|
426
|
+
return await verifyProofInternal(pathToBB, 'avm_verify', args, logger);
|
|
421
427
|
}
|
|
422
428
|
|
|
423
429
|
/**
|
|
@@ -425,7 +431,7 @@ export async function verifyAvmProof(
|
|
|
425
431
|
* TODO(#7370) The verification keys should be supplied separately
|
|
426
432
|
* @param pathToBB - The full path to the bb binary
|
|
427
433
|
* @param targetPath - The path to the folder with the proof, accumulator, and verification keys
|
|
428
|
-
* @param
|
|
434
|
+
* @param logger - A logger
|
|
429
435
|
* @param concurrency - The number of threads to use for the verification
|
|
430
436
|
* @returns An object containing a result indication and duration taken
|
|
431
437
|
*/
|
|
@@ -433,7 +439,7 @@ export async function verifyChonkProof(
|
|
|
433
439
|
pathToBB: string,
|
|
434
440
|
proofPath: string,
|
|
435
441
|
keyPath: string,
|
|
436
|
-
|
|
442
|
+
logger: Logger,
|
|
437
443
|
concurrency = 1,
|
|
438
444
|
): Promise<BBFailure | BBSuccess> {
|
|
439
445
|
const binaryPresent = await fs
|
|
@@ -444,43 +450,25 @@ export async function verifyChonkProof(
|
|
|
444
450
|
return { status: BB_RESULT.FAILURE, reason: `Failed to find bb binary at ${pathToBB}` };
|
|
445
451
|
}
|
|
446
452
|
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
const timer = new Timer();
|
|
450
|
-
const command = 'verify';
|
|
451
|
-
|
|
452
|
-
const result = await executeBB(pathToBB, command, args, log, concurrency);
|
|
453
|
-
const duration = timer.ms();
|
|
454
|
-
if (result.status == BB_RESULT.SUCCESS) {
|
|
455
|
-
return { status: BB_RESULT.SUCCESS, durationMs: duration };
|
|
456
|
-
}
|
|
457
|
-
// Not a great error message here but it is difficult to decipher what comes from bb
|
|
458
|
-
return {
|
|
459
|
-
status: BB_RESULT.FAILURE,
|
|
460
|
-
reason: `Failed to verify proof. Exit code ${result.exitCode}. Signal ${result.signal}.`,
|
|
461
|
-
retry: !!result.signal,
|
|
462
|
-
};
|
|
463
|
-
} catch (error) {
|
|
464
|
-
return { status: BB_RESULT.FAILURE, reason: `${error}` };
|
|
465
|
-
}
|
|
453
|
+
const args = ['--scheme', 'chonk', '-p', proofPath, '-k', keyPath, '-v'];
|
|
454
|
+
return await verifyProofInternal(pathToBB, 'verify', args, logger, concurrency);
|
|
466
455
|
}
|
|
467
456
|
|
|
468
457
|
/**
|
|
469
458
|
* Used for verifying proofs with BB
|
|
470
459
|
* @param pathToBB - The full path to the bb binary
|
|
471
|
-
* @param proofFullPath - The full path to the proof to be verified
|
|
472
|
-
* @param verificationKeyPath - The full path to the circuit verification key
|
|
473
460
|
* @param command - The BB command to execute (verify/avm_verify)
|
|
474
|
-
* @param
|
|
461
|
+
* @param args - The arguments to pass to the command
|
|
462
|
+
* @param logger - A logger
|
|
463
|
+
* @param concurrency - The number of threads to use for the verification
|
|
475
464
|
* @returns An object containing a result indication and duration taken
|
|
476
465
|
*/
|
|
477
466
|
async function verifyProofInternal(
|
|
478
467
|
pathToBB: string,
|
|
479
|
-
proofFullPath: string,
|
|
480
|
-
verificationKeyPath: string,
|
|
481
468
|
command: 'verify' | 'avm_verify',
|
|
469
|
+
args: string[],
|
|
482
470
|
logger: Logger,
|
|
483
|
-
|
|
471
|
+
concurrency?: number,
|
|
484
472
|
): Promise<BBFailure | BBSuccess> {
|
|
485
473
|
const binaryPresent = await fs
|
|
486
474
|
.access(pathToBB, fs.constants.R_OK)
|
|
@@ -495,28 +483,12 @@ async function verifyProofInternal(
|
|
|
495
483
|
};
|
|
496
484
|
|
|
497
485
|
try {
|
|
498
|
-
let args;
|
|
499
|
-
|
|
500
|
-
if (command == 'verify') {
|
|
501
|
-
// Specify the public inputs path in the case of UH verification.
|
|
502
|
-
// Take proofFullPath and remove the suffix past the / to get the directory.
|
|
503
|
-
const proofDir = proofFullPath.substring(0, proofFullPath.lastIndexOf('/'));
|
|
504
|
-
const publicInputsFullPath = join(proofDir, '/public_inputs');
|
|
505
|
-
logger.debug(`public inputs path: ${publicInputsFullPath}`);
|
|
506
|
-
|
|
507
|
-
args = ['-p', proofFullPath, '-k', verificationKeyPath, '-i', publicInputsFullPath, '--disable_zk', ...extraArgs];
|
|
508
|
-
} else {
|
|
509
|
-
args = ['-p', proofFullPath, '-k', verificationKeyPath, ...extraArgs];
|
|
510
|
-
}
|
|
511
|
-
|
|
512
486
|
const loggingArg =
|
|
513
487
|
logger.level === 'debug' || logger.level === 'trace' ? '-d' : logger.level === 'verbose' ? '-v' : '';
|
|
514
|
-
|
|
515
|
-
args.push(loggingArg);
|
|
516
|
-
}
|
|
488
|
+
const finalArgs = loggingArg !== '' ? [...args, loggingArg] : args;
|
|
517
489
|
|
|
518
490
|
const timer = new Timer();
|
|
519
|
-
const result = await executeBB(pathToBB, command,
|
|
491
|
+
const result = await executeBB(pathToBB, command, finalArgs, logFunction, concurrency);
|
|
520
492
|
const duration = timer.ms();
|
|
521
493
|
if (result.status == BB_RESULT.SUCCESS) {
|
|
522
494
|
return { status: BB_RESULT.SUCCESS, durationMs: duration };
|
package/src/instrumentation.ts
CHANGED
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
Metrics,
|
|
8
8
|
type TelemetryClient,
|
|
9
9
|
type Tracer,
|
|
10
|
-
ValueType,
|
|
11
10
|
} from '@aztec/telemetry-client';
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -31,51 +30,21 @@ export class ProverInstrumentation {
|
|
|
31
30
|
this.tracer = telemetry.getTracer(name);
|
|
32
31
|
const meter = telemetry.getMeter(name);
|
|
33
32
|
|
|
34
|
-
this.simulationDuration = meter.createHistogram(Metrics.CIRCUIT_SIMULATION_DURATION
|
|
35
|
-
description: 'Records how long it takes to simulate a circuit',
|
|
36
|
-
unit: 'ms',
|
|
37
|
-
valueType: ValueType.INT,
|
|
38
|
-
});
|
|
33
|
+
this.simulationDuration = meter.createHistogram(Metrics.CIRCUIT_SIMULATION_DURATION);
|
|
39
34
|
|
|
40
|
-
this.witGenDuration = meter.createHistogram(Metrics.CIRCUIT_WITNESS_GEN_DURATION
|
|
41
|
-
description: 'Records how long it takes to generate the partial witness for a circuit',
|
|
42
|
-
unit: 's',
|
|
43
|
-
valueType: ValueType.DOUBLE,
|
|
44
|
-
});
|
|
35
|
+
this.witGenDuration = meter.createHistogram(Metrics.CIRCUIT_WITNESS_GEN_DURATION);
|
|
45
36
|
|
|
46
|
-
this.provingDuration = meter.createHistogram(Metrics.CIRCUIT_PROVING_DURATION
|
|
47
|
-
unit: 's',
|
|
48
|
-
description: 'Records how long it takes to prove a circuit',
|
|
49
|
-
valueType: ValueType.DOUBLE,
|
|
50
|
-
});
|
|
37
|
+
this.provingDuration = meter.createHistogram(Metrics.CIRCUIT_PROVING_DURATION);
|
|
51
38
|
|
|
52
|
-
this.witGenInputSize = meter.createGauge(Metrics.CIRCUIT_WITNESS_GEN_INPUT_SIZE
|
|
53
|
-
unit: 'By',
|
|
54
|
-
description: 'Records the size of the input to the witness generation',
|
|
55
|
-
valueType: ValueType.INT,
|
|
56
|
-
});
|
|
39
|
+
this.witGenInputSize = meter.createGauge(Metrics.CIRCUIT_WITNESS_GEN_INPUT_SIZE);
|
|
57
40
|
|
|
58
|
-
this.witGenOutputSize = meter.createGauge(Metrics.CIRCUIT_WITNESS_GEN_OUTPUT_SIZE
|
|
59
|
-
unit: 'By',
|
|
60
|
-
description: 'Records the size of the output of the witness generation',
|
|
61
|
-
valueType: ValueType.INT,
|
|
62
|
-
});
|
|
41
|
+
this.witGenOutputSize = meter.createGauge(Metrics.CIRCUIT_WITNESS_GEN_OUTPUT_SIZE);
|
|
63
42
|
|
|
64
|
-
this.proofSize = meter.createGauge(Metrics.CIRCUIT_PROVING_PROOF_SIZE
|
|
65
|
-
unit: 'By',
|
|
66
|
-
description: 'Records the size of the proof generated for a circuit',
|
|
67
|
-
valueType: ValueType.INT,
|
|
68
|
-
});
|
|
43
|
+
this.proofSize = meter.createGauge(Metrics.CIRCUIT_PROVING_PROOF_SIZE);
|
|
69
44
|
|
|
70
|
-
this.circuitPublicInputCount = meter.createGauge(Metrics.CIRCUIT_PUBLIC_INPUTS_COUNT
|
|
71
|
-
description: 'Records the number of public inputs in a circuit',
|
|
72
|
-
valueType: ValueType.INT,
|
|
73
|
-
});
|
|
45
|
+
this.circuitPublicInputCount = meter.createGauge(Metrics.CIRCUIT_PUBLIC_INPUTS_COUNT);
|
|
74
46
|
|
|
75
|
-
this.circuitSize = meter.createGauge(Metrics.CIRCUIT_SIZE
|
|
76
|
-
description: 'Records the size of the circuit in gates',
|
|
77
|
-
valueType: ValueType.INT,
|
|
78
|
-
});
|
|
47
|
+
this.circuitSize = meter.createGauge(Metrics.CIRCUIT_SIZE);
|
|
79
48
|
}
|
|
80
49
|
|
|
81
50
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AztecClientBackend, Barretenberg } from '@aztec/bb.js';
|
|
2
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
1
|
+
import { AztecClientBackend, type BackendOptions, Barretenberg } from '@aztec/bb.js';
|
|
2
|
+
import { type LogLevel, type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import { Timer } from '@aztec/foundation/timer';
|
|
4
4
|
import { serializeWitness } from '@aztec/noir-noirc_abi';
|
|
5
5
|
import {
|
|
@@ -45,12 +45,17 @@ import type { CircuitSimulationStats, CircuitWitnessGenerationStats } from '@azt
|
|
|
45
45
|
|
|
46
46
|
import { ungzip } from 'pako';
|
|
47
47
|
|
|
48
|
+
export type BBPrivateKernelProverOptions = Omit<BackendOptions, 'logger'> & { logger?: Logger };
|
|
48
49
|
export abstract class BBPrivateKernelProver implements PrivateKernelProver {
|
|
50
|
+
private log: Logger;
|
|
51
|
+
|
|
49
52
|
constructor(
|
|
50
53
|
protected artifactProvider: ArtifactProvider,
|
|
51
54
|
protected simulator: CircuitSimulator,
|
|
52
|
-
protected
|
|
53
|
-
) {
|
|
55
|
+
protected options: BBPrivateKernelProverOptions = {},
|
|
56
|
+
) {
|
|
57
|
+
this.log = options.logger || createLogger('bb-prover:private-kernel');
|
|
58
|
+
}
|
|
54
59
|
|
|
55
60
|
public async generateInitOutput(
|
|
56
61
|
inputs: PrivateKernelInitCircuitPrivateInputs,
|
|
@@ -271,9 +276,14 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
|
|
|
271
276
|
public async createChonkProof(executionSteps: PrivateExecutionStep[]): Promise<ChonkProofWithPublicInputs> {
|
|
272
277
|
const timer = new Timer();
|
|
273
278
|
this.log.info(`Generating ClientIVC proof...`);
|
|
279
|
+
const barretenberg = await Barretenberg.initSingleton({
|
|
280
|
+
...this.options,
|
|
281
|
+
logger: this.options.logger?.[(process.env.LOG_LEVEL as LogLevel) || 'verbose'],
|
|
282
|
+
});
|
|
274
283
|
const backend = new AztecClientBackend(
|
|
275
284
|
executionSteps.map(step => ungzip(step.bytecode)),
|
|
276
|
-
|
|
285
|
+
barretenberg,
|
|
286
|
+
executionSteps.map(step => step.functionName),
|
|
277
287
|
);
|
|
278
288
|
|
|
279
289
|
const [proof] = await backend.prove(
|
|
@@ -290,7 +300,11 @@ export abstract class BBPrivateKernelProver implements PrivateKernelProver {
|
|
|
290
300
|
|
|
291
301
|
public async computeGateCountForCircuit(_bytecode: Buffer, _circuitName: string): Promise<number> {
|
|
292
302
|
// Note we do not pass the vk to the backend. This is unneeded for gate counts.
|
|
293
|
-
const
|
|
303
|
+
const barretenberg = await Barretenberg.initSingleton({
|
|
304
|
+
...this.options,
|
|
305
|
+
logger: this.options.logger?.[(process.env.LOG_LEVEL as LogLevel) || 'verbose'],
|
|
306
|
+
});
|
|
307
|
+
const backend = new AztecClientBackend([ungzip(_bytecode)], barretenberg, [_circuitName]);
|
|
294
308
|
const gateCount = await backend.gates();
|
|
295
309
|
return gateCount[0];
|
|
296
310
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
2
1
|
import { BundleArtifactProvider } from '@aztec/noir-protocol-circuits-types/client/bundle';
|
|
3
2
|
import type { CircuitSimulator } from '@aztec/simulator/client';
|
|
4
3
|
|
|
5
|
-
import { BBPrivateKernelProver } from './bb_private_kernel_prover.js';
|
|
4
|
+
import { BBPrivateKernelProver, type BBPrivateKernelProverOptions } from './bb_private_kernel_prover.js';
|
|
6
5
|
|
|
7
6
|
export class BBBundlePrivateKernelProver extends BBPrivateKernelProver {
|
|
8
|
-
constructor(simulator: CircuitSimulator,
|
|
9
|
-
super(new BundleArtifactProvider(), simulator,
|
|
7
|
+
constructor(simulator: CircuitSimulator, options: BBPrivateKernelProverOptions = {}) {
|
|
8
|
+
super(new BundleArtifactProvider(), simulator, options);
|
|
10
9
|
}
|
|
11
10
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
2
1
|
import { LazyArtifactProvider } from '@aztec/noir-protocol-circuits-types/client/lazy';
|
|
3
2
|
import type { CircuitSimulator } from '@aztec/simulator/client';
|
|
4
3
|
|
|
5
|
-
import { BBPrivateKernelProver } from './bb_private_kernel_prover.js';
|
|
4
|
+
import { BBPrivateKernelProver, type BBPrivateKernelProverOptions } from './bb_private_kernel_prover.js';
|
|
6
5
|
|
|
7
6
|
export class BBLazyPrivateKernelProver extends BBPrivateKernelProver {
|
|
8
|
-
constructor(simulator: CircuitSimulator,
|
|
9
|
-
super(new LazyArtifactProvider(), simulator,
|
|
7
|
+
constructor(simulator: CircuitSimulator, options: BBPrivateKernelProverOptions = {}) {
|
|
8
|
+
super(new LazyArtifactProvider(), simulator, options);
|
|
10
9
|
}
|
|
11
10
|
}
|
|
@@ -55,10 +55,8 @@ import { NativeACVMSimulator } from '@aztec/simulator/server';
|
|
|
55
55
|
import type { AvmCircuitInputs, AvmCircuitPublicInputs } from '@aztec/stdlib/avm';
|
|
56
56
|
import { ProvingError } from '@aztec/stdlib/errors';
|
|
57
57
|
import {
|
|
58
|
-
type ProofAndVerificationKey,
|
|
59
58
|
type PublicInputsAndRecursiveProof,
|
|
60
59
|
type ServerCircuitProver,
|
|
61
|
-
makeProofAndVerificationKey,
|
|
62
60
|
makePublicInputsAndRecursiveProof,
|
|
63
61
|
} from '@aztec/stdlib/interfaces/server';
|
|
64
62
|
import type { ParityBasePrivateInputs, ParityPublicInputs, ParityRootPrivateInputs } from '@aztec/stdlib/parity';
|
|
@@ -84,10 +82,9 @@ import {
|
|
|
84
82
|
type RootRollupPublicInputs,
|
|
85
83
|
type TxMergeRollupPrivateInputs,
|
|
86
84
|
type TxRollupPublicInputs,
|
|
87
|
-
enhanceProofWithPiValidationFlag,
|
|
88
85
|
} from '@aztec/stdlib/rollup';
|
|
89
86
|
import type { CircuitProvingStats, CircuitWitnessGenerationStats } from '@aztec/stdlib/stats';
|
|
90
|
-
import
|
|
87
|
+
import { VerificationKeyData } from '@aztec/stdlib/vks';
|
|
91
88
|
import { Attributes, type TelemetryClient, getTelemetryClient, trackSpan } from '@aztec/telemetry-client';
|
|
92
89
|
|
|
93
90
|
import { promises as fs } from 'fs';
|
|
@@ -106,9 +103,8 @@ import {
|
|
|
106
103
|
verifyProof,
|
|
107
104
|
} from '../../bb/execute.js';
|
|
108
105
|
import type { ACVMConfig, BBConfig } from '../../config.js';
|
|
109
|
-
import {
|
|
106
|
+
import { getUltraHonkFlavorForCircuit } from '../../honk.js';
|
|
110
107
|
import { ProverInstrumentation } from '../../instrumentation.js';
|
|
111
|
-
import { extractAvmVkData } from '../../verification_key/verification_key_data.js';
|
|
112
108
|
import { readProofsFromOutputDirectory } from '../proof_utils.js';
|
|
113
109
|
|
|
114
110
|
const logger = createLogger('bb-prover');
|
|
@@ -192,14 +188,10 @@ export class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
192
188
|
}))
|
|
193
189
|
public async getAvmProof(
|
|
194
190
|
inputs: AvmCircuitInputs,
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
// TODO(#14234)[Unconditional PIs validation]: remove next lines and directly return proofAndVk
|
|
201
|
-
proofAndVk.proof.proof = enhanceProofWithPiValidationFlag(proofAndVk.proof.proof, skipPublicInputsValidation);
|
|
202
|
-
return proofAndVk;
|
|
191
|
+
): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>> {
|
|
192
|
+
const proof = await this.createAvmProof(inputs);
|
|
193
|
+
await this.verifyAvmProof(proof.binaryProof, inputs.publicInputs);
|
|
194
|
+
return proof;
|
|
203
195
|
}
|
|
204
196
|
|
|
205
197
|
public async getPublicChonkVerifierProof(
|
|
@@ -471,6 +463,7 @@ export class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
471
463
|
this.config.acvmWorkingDirectory,
|
|
472
464
|
this.config.acvmBinaryPath,
|
|
473
465
|
outputWitnessFile,
|
|
466
|
+
logger,
|
|
474
467
|
);
|
|
475
468
|
|
|
476
469
|
const artifact = getServerCircuitArtifact(circuitType);
|
|
@@ -535,11 +528,10 @@ export class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
535
528
|
|
|
536
529
|
private async createAvmProof(
|
|
537
530
|
input: AvmCircuitInputs,
|
|
538
|
-
): Promise<
|
|
531
|
+
): Promise<RecursiveProof<typeof AVM_V2_PROOF_LENGTH_IN_FIELDS_PADDED>> {
|
|
539
532
|
const operation = async (bbWorkingDirectory: string) => {
|
|
540
533
|
const provingResult = await this.generateAvmProofWithBB(input, bbWorkingDirectory);
|
|
541
534
|
|
|
542
|
-
const avmVK = await extractAvmVkData(provingResult.vkDirectoryPath!);
|
|
543
535
|
const avmProof = await this.readAvmProofAsFields(provingResult.proofPath!);
|
|
544
536
|
|
|
545
537
|
const circuitType = 'avm-circuit' as const;
|
|
@@ -562,7 +554,7 @@ export class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
562
554
|
} satisfies CircuitProvingStats,
|
|
563
555
|
);
|
|
564
556
|
|
|
565
|
-
return
|
|
557
|
+
return avmProof;
|
|
566
558
|
};
|
|
567
559
|
return await this.runInDirectory(operation);
|
|
568
560
|
}
|
|
@@ -636,28 +628,19 @@ export class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
636
628
|
*/
|
|
637
629
|
public async verifyProof(circuitType: ServerProtocolArtifact, proof: Proof) {
|
|
638
630
|
const verificationKey = this.getVerificationKeyDataForCircuit(circuitType);
|
|
639
|
-
return await this.
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
public async verifyAvmProof(
|
|
643
|
-
proof: Proof,
|
|
644
|
-
verificationKey: VerificationKeyData,
|
|
645
|
-
publicInputs: AvmCircuitPublicInputs,
|
|
646
|
-
) {
|
|
647
|
-
return await this.verifyWithKeyInternal(proof, verificationKey, (proofPath, vkPath) =>
|
|
648
|
-
verifyAvmProof(this.config.bbBinaryPath, this.config.bbWorkingDirectory, proofPath, publicInputs, vkPath, logger),
|
|
631
|
+
return await this.verifyInternal(proof, verificationKey, (proofPath, vkPath) =>
|
|
632
|
+
verifyProof(this.config.bbBinaryPath, proofPath, vkPath, getUltraHonkFlavorForCircuit(circuitType), logger),
|
|
649
633
|
);
|
|
650
634
|
}
|
|
651
635
|
|
|
652
|
-
public async
|
|
653
|
-
return await this.
|
|
654
|
-
|
|
636
|
+
public async verifyAvmProof(proof: Proof, publicInputs: AvmCircuitPublicInputs) {
|
|
637
|
+
return await this.verifyInternal(proof, /*verificationKey=*/ undefined, (proofPath, /*unused*/ _vkPath) =>
|
|
638
|
+
verifyAvmProof(this.config.bbBinaryPath, this.config.bbWorkingDirectory, proofPath, publicInputs, logger),
|
|
655
639
|
);
|
|
656
640
|
}
|
|
657
|
-
|
|
658
|
-
private async verifyWithKeyInternal(
|
|
641
|
+
private async verifyInternal(
|
|
659
642
|
proof: Proof,
|
|
660
|
-
verificationKey: { keyAsBytes: Buffer },
|
|
643
|
+
verificationKey: { keyAsBytes: Buffer } | undefined,
|
|
661
644
|
verificationFunction: (proofPath: string, vkPath: string) => Promise<BBFailure | BBSuccess>,
|
|
662
645
|
) {
|
|
663
646
|
const operation = async (bbWorkingDirectory: string) => {
|
|
@@ -665,11 +648,13 @@ export class BBNativeRollupProver implements ServerCircuitProver {
|
|
|
665
648
|
const proofFileName = path.join(bbWorkingDirectory, PROOF_FILENAME);
|
|
666
649
|
const verificationKeyPath = path.join(bbWorkingDirectory, VK_FILENAME);
|
|
667
650
|
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/13189): Put this proof parsing logic in the proof class.
|
|
668
|
-
await fs.writeFile(publicInputsFileName, proof.buffer.
|
|
669
|
-
await fs.writeFile(proofFileName, proof.buffer.
|
|
670
|
-
|
|
651
|
+
await fs.writeFile(publicInputsFileName, proof.buffer.subarray(0, proof.numPublicInputs * 32));
|
|
652
|
+
await fs.writeFile(proofFileName, proof.buffer.subarray(proof.numPublicInputs * 32));
|
|
653
|
+
if (verificationKey !== undefined) {
|
|
654
|
+
await fs.writeFile(verificationKeyPath, verificationKey.keyAsBytes);
|
|
655
|
+
}
|
|
671
656
|
|
|
672
|
-
const result = await verificationFunction(proofFileName, verificationKeyPath
|
|
657
|
+
const result = await verificationFunction(proofFileName, verificationKeyPath);
|
|
673
658
|
|
|
674
659
|
if (result.status === BB_RESULT.FAILURE) {
|
|
675
660
|
const errorMessage = `Failed to verify proof from key!`;
|