@aztec/bb-prover 0.0.0-test.1 → 0.0.1-commit.03f7ef2
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 +143 -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 +133 -237
- 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 +336 -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 +24 -30
- 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 +224 -104
- package/src/bb/execute.ts +104 -251
- 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 +728 -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 +30 -25
- 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.03f7ef2",
|
|
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 && tsc
|
|
29
|
-
"build:dev": "tsc
|
|
28
|
+
"build": "yarn clean && ../scripts/tsc.sh",
|
|
29
|
+
"build:dev": "../scripts/tsc.sh --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.03f7ef2",
|
|
73
|
+
"@aztec/constants": "0.0.1-commit.03f7ef2",
|
|
74
|
+
"@aztec/foundation": "0.0.1-commit.03f7ef2",
|
|
75
|
+
"@aztec/noir-noirc_abi": "0.0.1-commit.03f7ef2",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.03f7ef2",
|
|
77
|
+
"@aztec/noir-types": "0.0.1-commit.03f7ef2",
|
|
78
|
+
"@aztec/simulator": "0.0.1-commit.03f7ef2",
|
|
79
|
+
"@aztec/stdlib": "0.0.1-commit.03f7ef2",
|
|
80
|
+
"@aztec/telemetry-client": "0.0.1-commit.03f7ef2",
|
|
81
|
+
"@aztec/world-state": "0.0.1-commit.03f7ef2",
|
|
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.
|
|
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.03f7ef2",
|
|
89
|
+
"@aztec/kv-store": "0.0.1-commit.03f7ef2",
|
|
90
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.03f7ef2",
|
|
91
|
+
"@aztec/noir-test-contracts.js": "0.0.1-commit.03f7ef2",
|
|
92
|
+
"@aztec/protocol-contracts": "0.0.1-commit.03f7ef2",
|
|
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, PublicSimulatorConfig } 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,269 @@ 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
|
-
|
|
91
|
+
// Config with collectHints enabled for proving tests
|
|
92
|
+
const provingConfig: PublicSimulatorConfig = PublicSimulatorConfig.from({
|
|
93
|
+
skipFeeEnforcement: false,
|
|
94
|
+
collectCallMetadata: true, // For results.
|
|
95
|
+
collectDebugLogs: false,
|
|
96
|
+
collectHints: true, // Required for proving!
|
|
97
|
+
collectPublicInputs: true, // Required for proving!
|
|
98
|
+
collectStatistics: false,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
export class AvmProvingTester extends PublicTxSimulationTester {
|
|
102
|
+
private bbWorkingDirectory: string = '';
|
|
103
|
+
|
|
109
104
|
constructor(
|
|
110
|
-
private
|
|
111
|
-
worldStateDB: WorldStateDB,
|
|
105
|
+
private checkCircuitOnly: boolean,
|
|
112
106
|
contractDataSource: SimpleContractDataSource,
|
|
113
107
|
merkleTrees: MerkleTreeWriteOperations,
|
|
108
|
+
globals?: GlobalVariables,
|
|
109
|
+
metrics?: TestExecutorMetrics,
|
|
114
110
|
) {
|
|
115
|
-
|
|
111
|
+
// simulator factory is undefined because for proving, we use the default C++ simulator
|
|
112
|
+
super(merkleTrees, contractDataSource, globals, metrics, /*simulatorFactory=*/ undefined, provingConfig);
|
|
116
113
|
}
|
|
117
114
|
|
|
118
|
-
static
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
static async new(
|
|
116
|
+
worldStateService: NativeWorldStateService, // make sure to close this later
|
|
117
|
+
checkCircuitOnly: boolean = false,
|
|
118
|
+
globals?: GlobalVariables,
|
|
119
|
+
metrics?: TestExecutorMetrics,
|
|
120
|
+
) {
|
|
121
121
|
const contractDataSource = new SimpleContractDataSource();
|
|
122
|
-
const merkleTrees = await
|
|
123
|
-
|
|
124
|
-
return new AvmProvingTesterV2(bbWorkingDirectory, worldStateDB, contractDataSource, merkleTrees);
|
|
122
|
+
const merkleTrees = await worldStateService.fork();
|
|
123
|
+
return new AvmProvingTester(checkCircuitOnly, contractDataSource, merkleTrees, globals, metrics);
|
|
125
124
|
}
|
|
126
125
|
|
|
127
|
-
async
|
|
126
|
+
async prove(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx'): Promise<BBResult> {
|
|
127
|
+
// We use a new working directory for each proof.
|
|
128
|
+
this.bbWorkingDirectory = await fs.mkdtemp(path.join(tmpdir(), 'bb-'));
|
|
129
|
+
|
|
130
|
+
const interceptingLogger = new InterceptingLogger(this.logger);
|
|
131
|
+
|
|
128
132
|
// Then we prove.
|
|
129
|
-
const proofRes = await
|
|
133
|
+
const proofRes = await generateAvmProof(
|
|
134
|
+
BB_PATH,
|
|
135
|
+
this.bbWorkingDirectory,
|
|
136
|
+
avmCircuitInputs,
|
|
137
|
+
interceptingLogger,
|
|
138
|
+
this.checkCircuitOnly,
|
|
139
|
+
);
|
|
130
140
|
if (proofRes.status === BB_RESULT.FAILURE) {
|
|
131
141
|
this.logger.error(`Proof generation failed: ${proofRes.reason}`);
|
|
132
142
|
}
|
|
133
143
|
expect(proofRes.status).toEqual(BB_RESULT.SUCCESS);
|
|
144
|
+
|
|
145
|
+
// Parse the logs into a structured format.
|
|
146
|
+
const logs = interceptingLogger.logs;
|
|
147
|
+
// const traceSizes: { name: string; size: number }[] = [];
|
|
148
|
+
// logs.forEach(log => {
|
|
149
|
+
// const match = log.match(/\b(\w+): (\d+) \(~2/);
|
|
150
|
+
// if (match) {
|
|
151
|
+
// traceSizes.push({
|
|
152
|
+
// name: match[1],
|
|
153
|
+
// size: parseInt(match[2]),
|
|
154
|
+
// });
|
|
155
|
+
// }
|
|
156
|
+
// });
|
|
157
|
+
const times: { [key: string]: number } = {};
|
|
158
|
+
logs.forEach(log => {
|
|
159
|
+
const match = log.match(/\b([\w/]+)_ms: (\d+)/);
|
|
160
|
+
if (match) {
|
|
161
|
+
times[match[1]] = parseInt(match[2]);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// Throw if logs did not contain any times.
|
|
166
|
+
if (Object.keys(times).length === 0) {
|
|
167
|
+
throw new Error('AVM stdout did not contain any proving times in the stats!');
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Hack to make labels match.
|
|
171
|
+
const txLabelWithCount = `${txLabel}/${this.txCount - 1}`;
|
|
172
|
+
// I need to cast because TS doesnt realize metrics is protected not private.
|
|
173
|
+
(this as any).metrics?.recordProverMetrics(txLabelWithCount, {
|
|
174
|
+
proverSimulationStepMs: times['simulation/all'],
|
|
175
|
+
proverProvingStepMs: times['proving/all'],
|
|
176
|
+
proverTraceGenerationStepMs: times['tracegen/all'],
|
|
177
|
+
traceGenerationInteractionsMs: times['tracegen/interactions'],
|
|
178
|
+
traceGenerationTracesMs: times['tracegen/traces'],
|
|
179
|
+
provingSumcheckMs: times['prove/sumcheck'],
|
|
180
|
+
provingPcsMs: times['prove/pcs_rounds'],
|
|
181
|
+
provingLogDerivativeInverseMs: times['prove/log_derivative_inverse_round'],
|
|
182
|
+
provingLogDerivativeInverseCommitmentsMs: times['prove/log_derivative_inverse_commitments_round'],
|
|
183
|
+
provingWireCommitmentsMs: times['prove/wire_commitments_round'],
|
|
184
|
+
});
|
|
185
|
+
|
|
134
186
|
return proofRes as BBSuccess;
|
|
135
187
|
}
|
|
136
188
|
|
|
137
|
-
async
|
|
138
|
-
|
|
139
|
-
|
|
189
|
+
async verify(proofRes: BBSuccess, publicInputs: AvmCircuitPublicInputs): Promise<BBResult> {
|
|
190
|
+
if (this.checkCircuitOnly) {
|
|
191
|
+
// Skip verification if we are only checking the circuit.
|
|
192
|
+
// Check-circuit does not generate a proof to verify.
|
|
193
|
+
return proofRes;
|
|
194
|
+
}
|
|
140
195
|
|
|
141
|
-
|
|
142
|
-
return await verifyAvmProofV2(
|
|
196
|
+
return await verifyAvmProof(
|
|
143
197
|
BB_PATH,
|
|
144
198
|
this.bbWorkingDirectory,
|
|
145
199
|
proofRes.proofPath!,
|
|
146
|
-
|
|
147
|
-
|
|
200
|
+
publicInputs,
|
|
201
|
+
path.join(proofRes.vkDirectoryPath!, VK_FILENAME),
|
|
148
202
|
this.logger,
|
|
149
203
|
);
|
|
150
204
|
}
|
|
151
205
|
|
|
152
|
-
public async
|
|
206
|
+
public async proveVerify(avmCircuitInputs: AvmCircuitInputs, txLabel: string = 'unlabeledTx') {
|
|
207
|
+
const provingRes = await this.prove(avmCircuitInputs, txLabel);
|
|
208
|
+
expect(provingRes.status).toEqual(BB_RESULT.SUCCESS);
|
|
209
|
+
|
|
210
|
+
const verificationRes = await this.verify(provingRes as BBSuccess, avmCircuitInputs.publicInputs);
|
|
211
|
+
expect(verificationRes.status).toBe(BB_RESULT.SUCCESS);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public async simProveVerify(
|
|
153
215
|
sender: AztecAddress,
|
|
154
216
|
setupCalls: TestEnqueuedCall[],
|
|
155
217
|
appCalls: TestEnqueuedCall[],
|
|
156
218
|
teardownCall: TestEnqueuedCall | undefined,
|
|
157
219
|
expectRevert: boolean | undefined,
|
|
158
220
|
feePayer = sender,
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
221
|
+
privateInsertions?: TestPrivateInsertions,
|
|
222
|
+
txLabel: string = 'unlabeledTx',
|
|
223
|
+
disableRevertCheck: boolean = false,
|
|
224
|
+
): Promise<PublicTxResult> {
|
|
225
|
+
const simTimer = new Timer();
|
|
226
|
+
const simRes = await this.simulateTx(
|
|
227
|
+
sender,
|
|
228
|
+
setupCalls,
|
|
229
|
+
appCalls,
|
|
230
|
+
teardownCall,
|
|
231
|
+
feePayer,
|
|
232
|
+
privateInsertions,
|
|
233
|
+
txLabel,
|
|
234
|
+
);
|
|
235
|
+
const simDuration = simTimer.ms();
|
|
236
|
+
this.logger.info(`Simulation took ${simDuration} ms for tx ${txLabel}`);
|
|
162
237
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
238
|
+
if (!disableRevertCheck) {
|
|
239
|
+
expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
|
|
240
|
+
}
|
|
166
241
|
|
|
167
|
-
const
|
|
168
|
-
|
|
242
|
+
const opString = this.checkCircuitOnly ? 'Check circuit' : 'Proving and verification';
|
|
243
|
+
|
|
244
|
+
const avmCircuitInputs = new AvmCircuitInputs(simRes.hints!, simRes.publicInputs!);
|
|
245
|
+
const timer = new Timer();
|
|
246
|
+
await this.proveVerify(avmCircuitInputs, txLabel);
|
|
247
|
+
this.logger.info(`${opString} took ${timer.ms()} ms for tx ${txLabel}`);
|
|
248
|
+
|
|
249
|
+
return simRes;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public override async executeTxWithLabel(
|
|
253
|
+
txLabel: string,
|
|
254
|
+
sender: AztecAddress,
|
|
255
|
+
setupCalls?: TestEnqueuedCall[],
|
|
256
|
+
appCalls?: TestEnqueuedCall[],
|
|
257
|
+
teardownCall?: TestEnqueuedCall,
|
|
258
|
+
feePayer?: AztecAddress,
|
|
259
|
+
privateInsertions?: TestPrivateInsertions,
|
|
260
|
+
) {
|
|
261
|
+
return await this.simProveVerify(
|
|
262
|
+
sender,
|
|
263
|
+
setupCalls ?? [],
|
|
264
|
+
appCalls ?? [],
|
|
265
|
+
teardownCall,
|
|
266
|
+
undefined,
|
|
267
|
+
feePayer,
|
|
268
|
+
privateInsertions,
|
|
269
|
+
txLabel,
|
|
270
|
+
true,
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
public async simProveVerifyAppLogic(
|
|
275
|
+
appCall: TestEnqueuedCall,
|
|
276
|
+
expectRevert?: boolean,
|
|
277
|
+
txLabel: string = 'unlabeledTx',
|
|
278
|
+
) {
|
|
279
|
+
await this.simProveVerify(
|
|
280
|
+
/*sender=*/ AztecAddress.fromNumber(42),
|
|
281
|
+
/*setupCalls=*/ [],
|
|
282
|
+
[appCall],
|
|
283
|
+
undefined,
|
|
284
|
+
expectRevert,
|
|
285
|
+
/*feePayer=*/ undefined,
|
|
286
|
+
/*privateInsertions=*/ undefined,
|
|
287
|
+
txLabel,
|
|
288
|
+
);
|
|
169
289
|
}
|
|
170
290
|
}
|