@aztec/bb-prover 0.0.0-test.0 → 0.0.1-commit.24de95ac
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 -17
- package/dest/avm_proving_tests/avm_proving_tester.d.ts.map +1 -1
- package/dest/avm_proving_tests/avm_proving_tester.js +128 -78
- package/dest/bb/execute.d.ts +13 -46
- package/dest/bb/execute.d.ts.map +1 -1
- package/dest/bb/execute.js +120 -228
- package/dest/config.d.ts +2 -0
- package/dest/config.d.ts.map +1 -1
- package/dest/honk.d.ts +2 -2
- package/dest/honk.d.ts.map +1 -1
- package/dest/honk.js +3 -2
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -0
- package/dest/instrumentation.d.ts +2 -2
- package/dest/instrumentation.d.ts.map +1 -1
- package/dest/instrumentation.js +2 -4
- package/dest/prover/{bb_private_kernel_prover.d.ts → client/bb_private_kernel_prover.d.ts} +10 -10
- 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} +21 -18
- package/dest/prover/client/native/bb_native_private_kernel_prover.d.ts +23 -0
- package/dest/prover/client/native/bb_native_private_kernel_prover.d.ts.map +1 -0
- package/dest/prover/{bb_native_private_kernel_prover.js → client/native/bb_native_private_kernel_prover.js} +19 -22
- package/dest/prover/client/wasm/bb_wasm_private_kernel_prover.d.ts +15 -0
- package/dest/prover/client/wasm/bb_wasm_private_kernel_prover.d.ts.map +1 -0
- package/dest/prover/client/wasm/bb_wasm_private_kernel_prover.js +46 -0
- package/dest/prover/client/wasm/bundle.d.ts +6 -0
- package/dest/prover/client/wasm/bundle.d.ts.map +1 -0
- package/dest/{wasm → prover/client/wasm}/bundle.js +2 -2
- package/dest/prover/client/wasm/lazy.d.ts +6 -0
- package/dest/prover/client/wasm/lazy.d.ts.map +1 -0
- package/dest/{wasm → prover/client/wasm}/lazy.js +2 -2
- package/dest/prover/index.d.ts +2 -3
- 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 +109 -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.map +1 -1
- package/dest/test/delay_values.js +30 -18
- package/dest/test/test_circuit_prover.d.ts +24 -33
- 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 +3 -2
- package/dest/test/test_verifier.d.ts.map +1 -1
- package/dest/test/test_verifier.js +8 -1
- package/dest/verification_key/verification_key_data.d.ts +6 -0
- 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 +5 -4
- package/dest/verifier/bb_verifier.d.ts.map +1 -1
- package/dest/verifier/bb_verifier.js +43 -25
- package/dest/verifier/index.d.ts +1 -0
- 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 +32 -31
- package/src/avm_proving_tests/avm_proving_tester.ts +209 -103
- package/src/bb/execute.ts +98 -242
- 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} +53 -29
- package/src/prover/{bb_native_private_kernel_prover.ts → client/native/bb_native_private_kernel_prover.ts} +23 -37
- package/src/{wasm → prover/client/wasm}/bb_wasm_private_kernel_prover.ts +18 -15
- package/src/{wasm → prover/client/wasm}/bundle.ts +3 -3
- package/src/{wasm → prover/client/wasm}/lazy.ts +3 -3
- 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 +30 -18
- package/src/test/test_circuit_prover.ts +260 -147
- package/src/test/test_verifier.ts +7 -3
- package/src/verification_key/verification_key_data.ts +29 -24
- package/src/verifier/bb_verifier.ts +60 -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_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/lazy.d.ts +0 -6
- package/dest/wasm/lazy.d.ts.map +0 -1
- package/src/prover/bb_prover.ts +0 -781
- package/src/prover/client_ivc_proof_utils.ts +0 -42
- package/src/stats.ts +0 -64
|
@@ -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.24de95ac",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
7
|
-
"./wasm/bundle": "./dest/wasm/bundle.js",
|
|
8
|
-
"./wasm/lazy": "./dest/wasm/lazy.js",
|
|
9
|
-
"./
|
|
7
|
+
"./client/wasm/bundle": "./dest/prover/client/wasm/bundle.js",
|
|
8
|
+
"./client/wasm/lazy": "./dest/prover/client/wasm/lazy.js",
|
|
9
|
+
"./client/native": "./dest/prover/client/native/bb_native_private_kernel_prover.js",
|
|
10
10
|
"./verifier": "./dest/verifier/index.js",
|
|
11
11
|
"./test": "./dest/test/index.js",
|
|
12
12
|
"./config": "./dest/config.js"
|
|
@@ -28,8 +28,6 @@
|
|
|
28
28
|
"build": "yarn clean && tsc -b",
|
|
29
29
|
"build:dev": "tsc -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,43 @@
|
|
|
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.24de95ac",
|
|
73
|
+
"@aztec/constants": "0.0.1-commit.24de95ac",
|
|
74
|
+
"@aztec/foundation": "0.0.1-commit.24de95ac",
|
|
75
|
+
"@aztec/noir-noirc_abi": "0.0.1-commit.24de95ac",
|
|
76
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.24de95ac",
|
|
77
|
+
"@aztec/noir-types": "0.0.1-commit.24de95ac",
|
|
78
|
+
"@aztec/simulator": "0.0.1-commit.24de95ac",
|
|
79
|
+
"@aztec/stdlib": "0.0.1-commit.24de95ac",
|
|
80
|
+
"@aztec/telemetry-client": "0.0.1-commit.24de95ac",
|
|
81
|
+
"@aztec/world-state": "0.0.1-commit.24de95ac",
|
|
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.24de95ac",
|
|
89
|
+
"@aztec/kv-store": "0.0.1-commit.24de95ac",
|
|
90
|
+
"@aztec/noir-contracts.js": "0.0.1-commit.24de95ac",
|
|
91
|
+
"@aztec/noir-test-contracts.js": "0.0.1-commit.24de95ac",
|
|
92
|
+
"@aztec/protocol-contracts": "0.0.1-commit.24de95ac",
|
|
93
|
+
"@jest/globals": "^30.0.0",
|
|
94
|
+
"@types/jest": "^30.0.0",
|
|
95
|
+
"@types/node": "^22.15.17",
|
|
95
96
|
"@types/source-map-support": "^0.5.10",
|
|
96
|
-
"jest": "^
|
|
97
|
-
"jest-mock-extended": "^
|
|
97
|
+
"jest": "^30.0.0",
|
|
98
|
+
"jest-mock-extended": "^4.0.0",
|
|
98
99
|
"ts-node": "^10.9.1",
|
|
99
|
-
"typescript": "^5.
|
|
100
|
-
"viem": "2.
|
|
100
|
+
"typescript": "^5.3.3",
|
|
101
|
+
"viem": "npm:@spalladino/viem@2.38.2-eip7594.0"
|
|
101
102
|
},
|
|
102
103
|
"files": [
|
|
103
104
|
"dest",
|
|
@@ -106,6 +107,6 @@
|
|
|
106
107
|
],
|
|
107
108
|
"types": "./dest/index.d.ts",
|
|
108
109
|
"engines": {
|
|
109
|
-
"node": ">=
|
|
110
|
+
"node": ">=20.10"
|
|
110
111
|
}
|
|
111
112
|
}
|
|
@@ -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 { type 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
|
+
);
|
|
223
|
+
|
|
224
|
+
if (!disableRevertCheck) {
|
|
225
|
+
expect(simRes.revertCode.isOK()).toBe(expectRevert ? false : true);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
const opString = this.checkCircuitOnly ? 'Check circuit' : 'Proving and verification';
|
|
162
229
|
|
|
163
230
|
const avmCircuitInputs = simRes.avmProvingRequest.inputs;
|
|
164
|
-
const
|
|
165
|
-
|
|
231
|
+
const timer = new Timer();
|
|
232
|
+
await this.proveVerify(avmCircuitInputs, txLabel);
|
|
233
|
+
this.logger.info(`${opString} took ${timer.ms()} ms for tx ${txLabel}`);
|
|
166
234
|
|
|
167
|
-
|
|
168
|
-
|
|
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
|
}
|