@aztec/bb-prover 0.0.0-test.0 → 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.
- package/dest/avm_proving_tests/avm_proving_tester.d.ts +14 -18
- package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
- package/dest/avm_proving_tests/avm_proving_tester.js +130 -79
- package/dest/bb/cli.d.ts +1 -1
- package/dest/bb/execute.d.ts +14 -47
- package/dest/bb/execute.d.ts.map +1 -1
- package/dest/bb/execute.js +132 -236
- package/dest/bb/index.d.ts +1 -1
- package/dest/config.d.ts +3 -1
- package/dest/config.d.ts.map +1 -1
- package/dest/honk.d.ts +3 -3
- package/dest/honk.d.ts.map +1 -1
- package/dest/honk.js +3 -2
- package/dest/index.d.ts +2 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/instrumentation.d.ts +3 -3
- package/dest/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation.js +2 -4
- package/dest/prover/client/bb_private_kernel_prover.d.ts +32 -0
- package/dest/prover/client/bb_private_kernel_prover.d.ts.map +1 -0
- package/dest/prover/{bb_private_kernel_prover.js → client/bb_private_kernel_prover.js} +42 -20
- package/dest/prover/client/bundle.d.ts +6 -0
- package/dest/prover/client/bundle.d.ts.map +1 -0
- package/dest/prover/client/bundle.js +8 -0
- package/dest/prover/client/lazy.d.ts +6 -0
- package/dest/prover/client/lazy.d.ts.map +1 -0
- package/dest/prover/client/lazy.js +8 -0
- package/dest/prover/index.d.ts +3 -4
- package/dest/prover/index.d.ts.map +1 -1
- package/dest/prover/index.js +2 -3
- package/dest/prover/proof_utils.d.ts +19 -0
- package/dest/prover/proof_utils.d.ts.map +1 -0
- package/dest/prover/proof_utils.js +72 -0
- package/dest/prover/server/bb_prover.d.ts +100 -0
- package/dest/prover/server/bb_prover.d.ts.map +1 -0
- package/dest/prover/server/bb_prover.js +339 -0
- 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 +33 -21
- package/dest/test/index.d.ts +1 -1
- package/dest/test/test_circuit_prover.d.ts +25 -34
- package/dest/test/test_circuit_prover.d.ts.map +1 -1
- package/dest/test/test_circuit_prover.js +85 -59
- package/dest/test/test_verifier.d.ts +6 -3
- package/dest/test/test_verifier.d.ts.map +1 -1
- package/dest/test/test_verifier.js +23 -1
- package/dest/verification_key/verification_key_data.d.ts +7 -1
- package/dest/verification_key/verification_key_data.d.ts.map +1 -1
- package/dest/verification_key/verification_key_data.js +23 -29
- package/dest/verifier/bb_verifier.d.ts +6 -5
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +46 -25
- 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 +15 -0
- package/dest/verifier/queued_chonk_verifier.d.ts.map +1 -0
- package/dest/verifier/queued_chonk_verifier.js +132 -0
- package/package.json +35 -33
- package/src/avm_proving_tests/avm_proving_tester.ts +210 -104
- package/src/bb/execute.ts +103 -250
- package/src/config.ts +2 -0
- package/src/honk.ts +3 -2
- package/src/index.ts +1 -0
- package/src/instrumentation.ts +2 -4
- package/src/prover/{bb_private_kernel_prover.ts → client/bb_private_kernel_prover.ts} +78 -30
- package/src/prover/client/bundle.ts +11 -0
- package/src/prover/client/lazy.ts +11 -0
- package/src/prover/index.ts +2 -3
- package/src/prover/proof_utils.ts +115 -0
- package/src/prover/server/bb_prover.ts +733 -0
- package/src/test/delay_values.ts +33 -21
- package/src/test/test_circuit_prover.ts +260 -147
- package/src/test/test_verifier.ts +15 -3
- package/src/verification_key/verification_key_data.ts +29 -24
- package/src/verifier/bb_verifier.ts +63 -32
- package/src/verifier/index.ts +1 -0
- package/src/verifier/queued_chonk_verifier.ts +140 -0
- package/dest/prover/bb_native_private_kernel_prover.d.ts +0 -25
- package/dest/prover/bb_native_private_kernel_prover.d.ts.map +0 -1
- package/dest/prover/bb_native_private_kernel_prover.js +0 -69
- package/dest/prover/bb_private_kernel_prover.d.ts +0 -32
- package/dest/prover/bb_private_kernel_prover.d.ts.map +0 -1
- package/dest/prover/bb_prover.d.ts +0 -120
- package/dest/prover/bb_prover.d.ts.map +0 -1
- package/dest/prover/bb_prover.js +0 -423
- package/dest/prover/client_ivc_proof_utils.d.ts +0 -25
- package/dest/prover/client_ivc_proof_utils.d.ts.map +0 -1
- package/dest/prover/client_ivc_proof_utils.js +0 -43
- package/dest/stats.d.ts +0 -5
- package/dest/stats.d.ts.map +0 -1
- package/dest/stats.js +0 -62
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts +0 -17
- package/dest/wasm/bb_wasm_private_kernel_prover.d.ts.map +0 -1
- package/dest/wasm/bb_wasm_private_kernel_prover.js +0 -46
- package/dest/wasm/bundle.d.ts +0 -6
- package/dest/wasm/bundle.d.ts.map +0 -1
- package/dest/wasm/bundle.js +0 -8
- package/dest/wasm/lazy.d.ts +0 -6
- package/dest/wasm/lazy.d.ts.map +0 -1
- package/dest/wasm/lazy.js +0 -8
- package/src/prover/bb_native_private_kernel_prover.ts +0 -119
- package/src/prover/bb_prover.ts +0 -781
- package/src/prover/client_ivc_proof_utils.ts +0 -42
- package/src/stats.ts +0 -64
- package/src/wasm/bb_wasm_private_kernel_prover.ts +0 -55
- package/src/wasm/bundle.ts +0 -11
- 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.
|
|
3
|
+
"version": "0.0.1-commit.21caa21",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
|
-
"./
|
|
8
|
-
"./
|
|
9
|
-
"./
|
|
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 &&
|
|
29
|
-
"build:dev": "
|
|
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.
|
|
71
|
-
"@aztec/constants": "0.0.
|
|
72
|
-
"@aztec/foundation": "0.0.
|
|
73
|
-
"@aztec/noir-
|
|
74
|
-
"@aztec/
|
|
75
|
-
"@aztec/
|
|
76
|
-
"@aztec/
|
|
77
|
-
"@aztec/
|
|
78
|
-
"@
|
|
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.0",
|
|
84
|
-
"@aztec/noir-types": "0.0.0-test.0"
|
|
85
|
+
"tslib": "^2.4.0"
|
|
85
86
|
},
|
|
86
87
|
"devDependencies": {
|
|
87
|
-
"@aztec/ethereum": "0.0.
|
|
88
|
-
"@aztec/kv-store": "0.0.
|
|
89
|
-
"@aztec/noir-contracts.js": "0.0.
|
|
90
|
-
"@aztec/
|
|
91
|
-
"@
|
|
92
|
-
"@
|
|
93
|
-
"@types/
|
|
94
|
-
"@types/node": "^
|
|
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
|
-
"
|
|
97
|
-
"jest
|
|
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.
|
|
100
|
-
"viem": "2.
|
|
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": ">=
|
|
111
|
+
"node": ">=20.10"
|
|
110
112
|
}
|
|
111
113
|
}
|
|
@@ -1,10 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
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 {
|
|
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
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
39
|
-
const bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
|
|
38
|
+
private logger: Logger;
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
constructor(logger: Logger) {
|
|
41
|
+
this.logger = logger;
|
|
42
|
+
this.level = logger.level;
|
|
43
|
+
this.module = logger.module;
|
|
45
44
|
}
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
104
|
-
|
|
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
|
|
91
|
+
export class AvmProvingTester extends PublicTxSimulationTester {
|
|
92
|
+
private bbWorkingDirectory: string = '';
|
|
93
|
+
|
|
109
94
|
constructor(
|
|
110
|
-
private
|
|
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(
|
|
101
|
+
super(merkleTrees, contractDataSource, globals, metrics);
|
|
116
102
|
}
|
|
117
103
|
|
|
118
|
-
static
|
|
119
|
-
|
|
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
|
|
123
|
-
|
|
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
|
|
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
|
|
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
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
142
|
-
return await verifyAvmProofV2(
|
|
185
|
+
return await verifyAvmProof(
|
|
143
186
|
BB_PATH,
|
|
144
187
|
this.bbWorkingDirectory,
|
|
145
188
|
proofRes.proofPath!,
|
|
146
|
-
|
|
147
|
-
|
|
189
|
+
publicInputs,
|
|
190
|
+
path.join(proofRes.vkDirectoryPath!, VK_FILENAME),
|
|
148
191
|
this.logger,
|
|
149
192
|
);
|
|
150
193
|
}
|
|
151
194
|
|
|
152
|
-
public async
|
|
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
|
-
|
|
161
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
224
|
+
if (!disableRevertCheck) {
|
|
225
|
+
expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
|
|
226
|
+
}
|
|
166
227
|
|
|
167
|
-
const
|
|
168
|
-
|
|
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
|
}
|