@aztec-labs/simulator 6.0.0-nightly.20260829
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/README.md +57 -0
- package/dest/client.d.ts +6 -0
- package/dest/client.d.ts.map +1 -0
- package/dest/client.js +3 -0
- package/dest/common/errors.d.ts +51 -0
- package/dest/common/errors.d.ts.map +1 -0
- package/dest/common/errors.js +154 -0
- package/dest/common/index.d.ts +3 -0
- package/dest/common/index.d.ts.map +1 -0
- package/dest/common/index.js +2 -0
- package/dest/common/stats/index.d.ts +2 -0
- package/dest/common/stats/index.d.ts.map +1 -0
- package/dest/common/stats/index.js +1 -0
- package/dest/common/stats/stats.d.ts +4 -0
- package/dest/common/stats/stats.d.ts.map +1 -0
- package/dest/common/stats/stats.js +10 -0
- package/dest/private/acvm/acvm.d.ts +43 -0
- package/dest/private/acvm/acvm.d.ts.map +1 -0
- package/dest/private/acvm/acvm.js +65 -0
- package/dest/private/acvm/acvm_types.d.ts +10 -0
- package/dest/private/acvm/acvm_types.d.ts.map +1 -0
- package/dest/private/acvm/acvm_types.js +3 -0
- package/dest/private/acvm/deserialize.d.ts +35 -0
- package/dest/private/acvm/deserialize.d.ts.map +1 -0
- package/dest/private/acvm/deserialize.js +50 -0
- package/dest/private/acvm/index.d.ts +5 -0
- package/dest/private/acvm/index.d.ts.map +1 -0
- package/dest/private/acvm/index.js +4 -0
- package/dest/private/acvm/serialize.d.ts +41 -0
- package/dest/private/acvm/serialize.d.ts.map +1 -0
- package/dest/private/acvm/serialize.js +99 -0
- package/dest/private/acvm_native.d.ts +41 -0
- package/dest/private/acvm_native.d.ts.map +1 -0
- package/dest/private/acvm_native.js +147 -0
- package/dest/private/acvm_wasm.d.ts +16 -0
- package/dest/private/acvm_wasm.d.ts.map +1 -0
- package/dest/private/acvm_wasm.js +67 -0
- package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
- package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
- package/dest/private/acvm_wasm_with_blobs.js +35 -0
- package/dest/private/circuit_simulator.d.ts +35 -0
- package/dest/private/circuit_simulator.d.ts.map +1 -0
- package/dest/private/circuit_simulator.js +43 -0
- package/dest/private/factory.d.ts +12 -0
- package/dest/private/factory.d.ts.map +1 -0
- package/dest/private/factory.js +30 -0
- package/dest/public/avm/testing/account_proof_fetcher.d.ts +2 -0
- package/dest/public/avm/testing/account_proof_fetcher.d.ts.map +1 -0
- package/dest/public/avm/testing/account_proof_fetcher.js +152 -0
- package/dest/public/avm/testing/base_avm_simulation_tester.d.ts +39 -0
- package/dest/public/avm/testing/base_avm_simulation_tester.d.ts.map +1 -0
- package/dest/public/avm/testing/base_avm_simulation_tester.js +121 -0
- package/dest/public/avm/testing/utils.d.ts +32 -0
- package/dest/public/avm/testing/utils.d.ts.map +1 -0
- package/dest/public/avm/testing/utils.js +66 -0
- package/dest/public/avm_simulator.d.ts +28 -0
- package/dest/public/avm_simulator.d.ts.map +1 -0
- package/dest/public/avm_simulator.js +4 -0
- package/dest/public/avm_simulator_pool.d.ts +84 -0
- package/dest/public/avm_simulator_pool.d.ts.map +1 -0
- package/dest/public/avm_simulator_pool.js +311 -0
- package/dest/public/cdb_ipc_server.d.ts +40 -0
- package/dest/public/cdb_ipc_server.d.ts.map +1 -0
- package/dest/public/cdb_ipc_server.js +153 -0
- package/dest/public/contracts_db_checkpoint.d.ts +16 -0
- package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
- package/dest/public/contracts_db_checkpoint.js +30 -0
- package/dest/public/db_interfaces.d.ts +68 -0
- package/dest/public/db_interfaces.d.ts.map +1 -0
- package/dest/public/db_interfaces.js +3 -0
- package/dest/public/executor_metrics.d.ts +21 -0
- package/dest/public/executor_metrics.d.ts.map +1 -0
- package/dest/public/executor_metrics.js +64 -0
- package/dest/public/executor_metrics_interface.d.ts +10 -0
- package/dest/public/executor_metrics_interface.d.ts.map +1 -0
- package/dest/public/executor_metrics_interface.js +1 -0
- package/dest/public/fixtures/amm_test.d.ts +10 -0
- package/dest/public/fixtures/amm_test.d.ts.map +1 -0
- package/dest/public/fixtures/amm_test.js +213 -0
- package/dest/public/fixtures/bulk_test.d.ts +6 -0
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
- package/dest/public/fixtures/bulk_test.js +289 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
- package/dest/public/fixtures/index.d.ts +10 -0
- package/dest/public/fixtures/index.d.ts.map +1 -0
- package/dest/public/fixtures/index.js +9 -0
- package/dest/public/fixtures/public_processor_test_env.d.ts +30 -0
- package/dest/public/fixtures/public_processor_test_env.d.ts.map +1 -0
- package/dest/public/fixtures/public_processor_test_env.js +73 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +77 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -0
- package/dest/public/fixtures/public_tx_simulation_tester.js +176 -0
- package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
- package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
- package/dest/public/fixtures/simple_contract_data_source.js +95 -0
- package/dest/public/fixtures/token_test.d.ts +12 -0
- package/dest/public/fixtures/token_test.d.ts.map +1 -0
- package/dest/public/fixtures/token_test.js +96 -0
- package/dest/public/fixtures/utils.d.ts +26 -0
- package/dest/public/fixtures/utils.d.ts.map +1 -0
- package/dest/public/fixtures/utils.js +170 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +65 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.js +181 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_simulator_bin.js +108 -0
- package/dest/public/index.d.ts +10 -0
- package/dest/public/index.d.ts.map +1 -0
- package/dest/public/index.js +6 -0
- package/dest/public/public_db_sources.d.ts +83 -0
- package/dest/public/public_db_sources.d.ts.map +1 -0
- package/dest/public/public_db_sources.js +297 -0
- package/dest/public/public_errors.d.ts +12 -0
- package/dest/public/public_errors.d.ts.map +1 -0
- package/dest/public/public_errors.js +13 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +52 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
- package/dest/public/public_processor/guarded_merkle_tree.js +116 -0
- package/dest/public/public_processor/public_processor.d.ts +71 -0
- package/dest/public/public_processor/public_processor.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor.js +858 -0
- package/dest/public/public_processor/public_processor_metrics.d.ts +30 -0
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor_metrics.js +116 -0
- package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts +17 -0
- package/dest/public/public_tx_simulator/dumping_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/dumping_public_tx_simulator.js +39 -0
- package/dest/public/public_tx_simulator/factories.d.ts +14 -0
- package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/factories.js +28 -0
- package/dest/public/public_tx_simulator/index.d.ts +6 -0
- package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/index.js +3 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +53 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.js +127 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts +24 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_base.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_base.js +31 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
- package/dest/public/side_effect_errors.d.ts +44 -0
- package/dest/public/side_effect_errors.d.ts.map +1 -0
- package/dest/public/side_effect_errors.js +75 -0
- package/dest/public/test_executor_metrics.d.ts +56 -0
- package/dest/public/test_executor_metrics.d.ts.map +1 -0
- package/dest/public/test_executor_metrics.js +305 -0
- package/dest/public/unique_class_ids.d.ts +37 -0
- package/dest/public/unique_class_ids.d.ts.map +1 -0
- package/dest/public/unique_class_ids.js +61 -0
- package/dest/public/utils.d.ts +3 -0
- package/dest/public/utils.d.ts.map +1 -0
- package/dest/public/utils.js +18 -0
- package/dest/server.d.ts +7 -0
- package/dest/server.d.ts.map +1 -0
- package/dest/server.js +5 -0
- package/package.json +109 -0
- package/src/client.ts +5 -0
- package/src/common/errors.ts +219 -0
- package/src/common/index.ts +2 -0
- package/src/common/stats/index.ts +1 -0
- package/src/common/stats/stats.ts +20 -0
- package/src/private/acvm/acvm.ts +114 -0
- package/src/private/acvm/acvm_types.ts +11 -0
- package/src/private/acvm/deserialize.ts +58 -0
- package/src/private/acvm/index.ts +4 -0
- package/src/private/acvm/serialize.ts +123 -0
- package/src/private/acvm_native.ts +200 -0
- package/src/private/acvm_wasm.ts +80 -0
- package/src/private/acvm_wasm_with_blobs.ts +55 -0
- package/src/private/circuit_simulator.ts +91 -0
- package/src/private/factory.ts +40 -0
- package/src/public/avm/testing/account_proof.json +553 -0
- package/src/public/avm/testing/account_proof_fetcher.ts +166 -0
- package/src/public/avm/testing/base_avm_simulation_tester.ts +162 -0
- package/src/public/avm/testing/utils.ts +114 -0
- package/src/public/avm_simulator.ts +29 -0
- package/src/public/avm_simulator_pool.ts +355 -0
- package/src/public/cdb_ipc_server.ts +198 -0
- package/src/public/contracts_db_checkpoint.ts +41 -0
- package/src/public/db_interfaces.ts +76 -0
- package/src/public/executor_metrics.ts +102 -0
- package/src/public/executor_metrics_interface.ts +20 -0
- package/src/public/fixtures/amm_test.ts +331 -0
- package/src/public/fixtures/bulk_test.ts +194 -0
- package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
- package/src/public/fixtures/index.ts +13 -0
- package/src/public/fixtures/public_processor_test_env.ts +88 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +315 -0
- package/src/public/fixtures/simple_contract_data_source.ts +122 -0
- package/src/public/fixtures/token_test.ts +148 -0
- package/src/public/fixtures/utils.ts +269 -0
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +302 -0
- package/src/public/fuzzing/avm_simulator_bin.ts +156 -0
- package/src/public/index.ts +16 -0
- package/src/public/public_db_sources.ts +405 -0
- package/src/public/public_errors.ts +14 -0
- package/src/public/public_processor/guarded_merkle_tree.ts +161 -0
- package/src/public/public_processor/public_processor.ts +657 -0
- package/src/public/public_processor/public_processor_metrics.ts +138 -0
- package/src/public/public_tx_simulator/dumping_public_tx_simulator.ts +66 -0
- package/src/public/public_tx_simulator/factories.ts +61 -0
- package/src/public/public_tx_simulator/index.ts +8 -0
- package/src/public/public_tx_simulator/public_tx_simulator.ts +190 -0
- package/src/public/public_tx_simulator/public_tx_simulator_base.ts +37 -0
- package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
- package/src/public/side_effect_errors.ts +96 -0
- package/src/public/test_executor_metrics.ts +399 -0
- package/src/public/unique_class_ids.ts +79 -0
- package/src/public/utils.ts +16 -0
- package/src/server.ts +6 -0
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec-labs/foundation/log';
|
|
2
|
+
import { Timer } from '@aztec-labs/foundation/timer';
|
|
3
|
+
import type { RevertCode } from '@aztec-labs/stdlib/avm';
|
|
4
|
+
import type { GasUsed } from '@aztec-labs/stdlib/gas';
|
|
5
|
+
import { strict as assert } from 'assert';
|
|
6
|
+
|
|
7
|
+
import type { ExecutorMetricsInterface } from './executor_metrics_interface.js';
|
|
8
|
+
|
|
9
|
+
export interface PublicEnqueuedCallMetrics {
|
|
10
|
+
fnName: string;
|
|
11
|
+
durationMs: number;
|
|
12
|
+
manaUsed: number;
|
|
13
|
+
totalInstructionsExecuted: number;
|
|
14
|
+
reverted: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface PublicTxMetrics {
|
|
18
|
+
// TS simulation
|
|
19
|
+
totalDurationMs: number;
|
|
20
|
+
manaUsed: number | undefined;
|
|
21
|
+
totalInstructionsExecuted: number;
|
|
22
|
+
nonRevertiblePrivateInsertionsUs: number | undefined;
|
|
23
|
+
revertiblePrivateInsertionsUs: number | undefined;
|
|
24
|
+
enqueuedCalls: PublicEnqueuedCallMetrics[];
|
|
25
|
+
revertedCode: RevertCode | undefined;
|
|
26
|
+
// Proving
|
|
27
|
+
proverSimulationStepMs: number | undefined;
|
|
28
|
+
proverProvingStepMs: number | undefined;
|
|
29
|
+
proverTraceGenerationStepMs: number | undefined;
|
|
30
|
+
// Proving (detail)
|
|
31
|
+
traceGenerationInteractionsMs: number | undefined;
|
|
32
|
+
traceGenerationTracesMs: number | undefined;
|
|
33
|
+
provingSumcheckMs: number | undefined;
|
|
34
|
+
provingPcsMs: number | undefined;
|
|
35
|
+
provingLogDerivativeInverseMs: number | undefined;
|
|
36
|
+
provingLogDerivativeInverseCommitmentsMs: number | undefined;
|
|
37
|
+
provingWireCommitmentsMs: number | undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const NUM_SPACES = 4;
|
|
41
|
+
const H1 = '# ';
|
|
42
|
+
const H2 = '\n## ';
|
|
43
|
+
const INDENT = ' '.repeat(NUM_SPACES);
|
|
44
|
+
const INDENT0 = '- ';
|
|
45
|
+
const INDENT1 = INDENT + '- ';
|
|
46
|
+
const INDENT2 = INDENT + INDENT + '- ';
|
|
47
|
+
const H_LINE = '\n---------------------------------------------------------------------';
|
|
48
|
+
|
|
49
|
+
export enum PublicTxMetricsFilter {
|
|
50
|
+
ALL,
|
|
51
|
+
TOTALS,
|
|
52
|
+
DURATIONS,
|
|
53
|
+
INSTRUCTIONS,
|
|
54
|
+
PROVING,
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function createEmptyTxMetrics(): PublicTxMetrics {
|
|
58
|
+
return {
|
|
59
|
+
// TS simulation
|
|
60
|
+
totalDurationMs: 0,
|
|
61
|
+
manaUsed: 0,
|
|
62
|
+
totalInstructionsExecuted: 0,
|
|
63
|
+
nonRevertiblePrivateInsertionsUs: undefined,
|
|
64
|
+
revertiblePrivateInsertionsUs: undefined,
|
|
65
|
+
enqueuedCalls: [],
|
|
66
|
+
revertedCode: undefined,
|
|
67
|
+
// Proving
|
|
68
|
+
proverSimulationStepMs: undefined,
|
|
69
|
+
proverProvingStepMs: undefined,
|
|
70
|
+
proverTraceGenerationStepMs: undefined,
|
|
71
|
+
// Proving (detail)
|
|
72
|
+
traceGenerationInteractionsMs: undefined,
|
|
73
|
+
traceGenerationTracesMs: undefined,
|
|
74
|
+
provingSumcheckMs: undefined,
|
|
75
|
+
provingPcsMs: undefined,
|
|
76
|
+
provingLogDerivativeInverseMs: undefined,
|
|
77
|
+
provingLogDerivativeInverseCommitmentsMs: undefined,
|
|
78
|
+
provingWireCommitmentsMs: undefined,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export class TestExecutorMetrics implements ExecutorMetricsInterface {
|
|
83
|
+
private logger: Logger;
|
|
84
|
+
// tx label -> tx metrics
|
|
85
|
+
private txMetrics: Map<string, PublicTxMetrics> = new Map();
|
|
86
|
+
private currentTxLabel: string | undefined;
|
|
87
|
+
private txTimer: Timer | undefined;
|
|
88
|
+
|
|
89
|
+
constructor(bindings?: LoggerBindings) {
|
|
90
|
+
this.logger = createLogger(`simulator:test_executor_metrics`, bindings);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
startRecordingTxSimulation(txLabel: string) {
|
|
94
|
+
assert(!this.currentTxLabel, 'Cannot start recording tx simulation when another is live');
|
|
95
|
+
assert(!this.txMetrics.has(txLabel), 'Cannot start recording metrics for tx with duplicate label');
|
|
96
|
+
this.txMetrics.set(txLabel, createEmptyTxMetrics());
|
|
97
|
+
this.currentTxLabel = txLabel;
|
|
98
|
+
this.txTimer = new Timer();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
stopRecordingTxSimulation(
|
|
102
|
+
txLabel: string,
|
|
103
|
+
gasUsed?: GasUsed,
|
|
104
|
+
revertedCode?: RevertCode,
|
|
105
|
+
stats?: Record<string, string>,
|
|
106
|
+
) {
|
|
107
|
+
assert(this.currentTxLabel === txLabel, 'Cannot stop recording metrics for tx when another is live');
|
|
108
|
+
|
|
109
|
+
const txMetrics = this.txMetrics.get(txLabel)!;
|
|
110
|
+
|
|
111
|
+
// total duration of tx
|
|
112
|
+
txMetrics.totalDurationMs = this.txTimer!.ms();
|
|
113
|
+
this.logger.debug(`Public TX simulation of ${txLabel} took ${txMetrics.totalDurationMs}ms`);
|
|
114
|
+
|
|
115
|
+
// manaUsed and totalInstructionsExecuted are tx-level totals reported by the simulator.
|
|
116
|
+
txMetrics.manaUsed = gasUsed?.publicGas.l2Gas;
|
|
117
|
+
txMetrics.totalInstructionsExecuted = Number(stats?.['total_instructions_executed'] ?? 0);
|
|
118
|
+
txMetrics.revertedCode = revertedCode;
|
|
119
|
+
|
|
120
|
+
this.currentTxLabel = undefined;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
recordEnqueuedCallSimulation(
|
|
124
|
+
fnName: string,
|
|
125
|
+
durationMs: number,
|
|
126
|
+
manaUsed: number,
|
|
127
|
+
totalInstructionsExecuted: number,
|
|
128
|
+
) {
|
|
129
|
+
this.#recordEnqueuedCallSimulation(fnName, durationMs, manaUsed, totalInstructionsExecuted, false);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
recordEnqueuedCallSimulationFailure(
|
|
133
|
+
fnName: string,
|
|
134
|
+
durationMs: number,
|
|
135
|
+
manaUsed: number,
|
|
136
|
+
totalInstructionsExecuted: number,
|
|
137
|
+
) {
|
|
138
|
+
this.#recordEnqueuedCallSimulation(fnName, durationMs, manaUsed, totalInstructionsExecuted, true);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
#recordEnqueuedCallSimulation(
|
|
142
|
+
fnName: string,
|
|
143
|
+
durationMs: number,
|
|
144
|
+
manaUsed: number,
|
|
145
|
+
totalInstructionsExecuted: number,
|
|
146
|
+
reverted: boolean,
|
|
147
|
+
) {
|
|
148
|
+
assert(this.currentTxLabel, 'Cannot record enqueued call simulation when no tx is live');
|
|
149
|
+
const txMetrics = this.txMetrics.get(this.currentTxLabel)!;
|
|
150
|
+
txMetrics.enqueuedCalls.push({
|
|
151
|
+
fnName,
|
|
152
|
+
durationMs,
|
|
153
|
+
manaUsed,
|
|
154
|
+
totalInstructionsExecuted: totalInstructionsExecuted,
|
|
155
|
+
reverted,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
recordPrivateEffectsInsertion(durationUs: number, type: 'revertible' | 'non-revertible') {
|
|
160
|
+
assert(this.currentTxLabel, 'Cannot record private effects insertion when no tx is live');
|
|
161
|
+
const txMetrics = this.txMetrics.get(this.currentTxLabel)!;
|
|
162
|
+
if (type === 'revertible') {
|
|
163
|
+
assert(
|
|
164
|
+
txMetrics.revertiblePrivateInsertionsUs === undefined,
|
|
165
|
+
'Cannot RE-record revertible insertions of private effects',
|
|
166
|
+
);
|
|
167
|
+
txMetrics.revertiblePrivateInsertionsUs = durationUs;
|
|
168
|
+
} else {
|
|
169
|
+
assert(
|
|
170
|
+
txMetrics.nonRevertiblePrivateInsertionsUs === undefined,
|
|
171
|
+
'Cannot RE-record non-revertible insertions of private effects',
|
|
172
|
+
);
|
|
173
|
+
txMetrics.nonRevertiblePrivateInsertionsUs = durationUs;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
recordProverMetrics(txLabel: string, metrics: Partial<PublicTxMetrics>) {
|
|
178
|
+
if (!this.txMetrics.has(txLabel)) {
|
|
179
|
+
this.txMetrics.set(txLabel, createEmptyTxMetrics());
|
|
180
|
+
}
|
|
181
|
+
const txMetrics = this.txMetrics.get(txLabel)!;
|
|
182
|
+
for (const [key, value] of Object.entries(metrics)) {
|
|
183
|
+
if (key in txMetrics) {
|
|
184
|
+
txMetrics[key as keyof PublicTxMetrics] = value as any;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
prettyPrint(filter: PublicTxMetricsFilter = PublicTxMetricsFilter.ALL) {
|
|
190
|
+
this.logger.info(this.toPrettyString(filter));
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
toPrettyString(filter: PublicTxMetricsFilter = PublicTxMetricsFilter.ALL) {
|
|
194
|
+
let pretty = '';
|
|
195
|
+
//pretty += H_LINE + '\n';
|
|
196
|
+
pretty += `${H1}Public TX Simulation Metrics (${PublicTxMetricsFilter[filter]})\n`;
|
|
197
|
+
for (const [txLabel, txMetrics] of this.txMetrics.entries()) {
|
|
198
|
+
//pretty += H_LINE + '\n';
|
|
199
|
+
pretty += `${H2}TX Label: ${txLabel}\n`;
|
|
200
|
+
if (
|
|
201
|
+
filter == PublicTxMetricsFilter.DURATIONS ||
|
|
202
|
+
filter === PublicTxMetricsFilter.TOTALS ||
|
|
203
|
+
filter === PublicTxMetricsFilter.ALL
|
|
204
|
+
) {
|
|
205
|
+
pretty += `${INDENT0}Total duration: ${fmtNum(txMetrics.totalDurationMs, 'ms')}\n`;
|
|
206
|
+
}
|
|
207
|
+
if (filter === PublicTxMetricsFilter.TOTALS || filter === PublicTxMetricsFilter.ALL) {
|
|
208
|
+
const manaUsed = txMetrics.manaUsed || 0;
|
|
209
|
+
pretty += `${INDENT0}Total mana used: ${fmtNum(manaUsed)}\n`;
|
|
210
|
+
const manaPerSecond = Math.round((manaUsed * 1000) / txMetrics.totalDurationMs);
|
|
211
|
+
pretty += `${INDENT0}Mana per second: ${fmtNum(manaPerSecond)}\n`;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (
|
|
215
|
+
filter === PublicTxMetricsFilter.INSTRUCTIONS ||
|
|
216
|
+
filter === PublicTxMetricsFilter.TOTALS ||
|
|
217
|
+
filter === PublicTxMetricsFilter.ALL
|
|
218
|
+
) {
|
|
219
|
+
pretty += `${INDENT0}Total instructions executed: ${fmtNum(txMetrics.totalInstructionsExecuted)}\n`;
|
|
220
|
+
}
|
|
221
|
+
if (filter === PublicTxMetricsFilter.DURATIONS || filter === PublicTxMetricsFilter.ALL) {
|
|
222
|
+
pretty += `${INDENT0}Private insertions:\n`;
|
|
223
|
+
pretty += `${INDENT1}Non-revertible: ${fmtNum(txMetrics.nonRevertiblePrivateInsertionsUs! / 1_000, 'ms')}\n`;
|
|
224
|
+
pretty += `${INDENT1}Revertible: ${fmtNum(txMetrics.revertiblePrivateInsertionsUs! / 1_000, 'ms')}\n`;
|
|
225
|
+
}
|
|
226
|
+
if (filter === PublicTxMetricsFilter.PROVING || filter === PublicTxMetricsFilter.ALL) {
|
|
227
|
+
let provingPretty = '';
|
|
228
|
+
if (txMetrics.proverSimulationStepMs !== undefined) {
|
|
229
|
+
provingPretty += `${INDENT1}Simulation (all): ${fmtNum(txMetrics.proverSimulationStepMs, 'ms')}\n`;
|
|
230
|
+
}
|
|
231
|
+
if (txMetrics.proverProvingStepMs !== undefined) {
|
|
232
|
+
provingPretty += `${INDENT1}Proving (all): ${fmtNum(txMetrics.proverProvingStepMs, 'ms')}\n`;
|
|
233
|
+
}
|
|
234
|
+
if (txMetrics.proverTraceGenerationStepMs !== undefined) {
|
|
235
|
+
provingPretty += `${INDENT1}Trace generation (all): ${fmtNum(txMetrics.proverTraceGenerationStepMs, 'ms')}\n`;
|
|
236
|
+
}
|
|
237
|
+
if (txMetrics.traceGenerationInteractionsMs !== undefined) {
|
|
238
|
+
provingPretty += `${INDENT1}Trace generation interactions: ${fmtNum(txMetrics.traceGenerationInteractionsMs, 'ms')}\n`;
|
|
239
|
+
}
|
|
240
|
+
if (txMetrics.traceGenerationTracesMs !== undefined) {
|
|
241
|
+
provingPretty += `${INDENT1}Trace generation traces: ${fmtNum(txMetrics.traceGenerationTracesMs, 'ms')}\n`;
|
|
242
|
+
}
|
|
243
|
+
if (txMetrics.provingSumcheckMs !== undefined) {
|
|
244
|
+
provingPretty += `${INDENT1}Sumcheck: ${fmtNum(txMetrics.provingSumcheckMs, 'ms')}\n`;
|
|
245
|
+
}
|
|
246
|
+
if (txMetrics.provingPcsMs !== undefined) {
|
|
247
|
+
provingPretty += `${INDENT1}PCS: ${fmtNum(txMetrics.provingPcsMs, 'ms')}\n`;
|
|
248
|
+
}
|
|
249
|
+
if (txMetrics.provingLogDerivativeInverseMs !== undefined) {
|
|
250
|
+
provingPretty += `${INDENT1}Log derivative inverse: ${fmtNum(txMetrics.provingLogDerivativeInverseMs, 'ms')}\n`;
|
|
251
|
+
}
|
|
252
|
+
if (txMetrics.provingLogDerivativeInverseCommitmentsMs !== undefined) {
|
|
253
|
+
provingPretty += `${INDENT1}Log derivative inverse commitments: ${fmtNum(txMetrics.provingLogDerivativeInverseCommitmentsMs, 'ms')}\n`;
|
|
254
|
+
}
|
|
255
|
+
if (txMetrics.provingWireCommitmentsMs !== undefined) {
|
|
256
|
+
provingPretty += `${INDENT1}Wire commitments: ${fmtNum(txMetrics.provingWireCommitmentsMs, 'ms')}\n`;
|
|
257
|
+
}
|
|
258
|
+
if (provingPretty.length > 0) {
|
|
259
|
+
pretty += `${INDENT0}Proving:\n${provingPretty}`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (filter !== PublicTxMetricsFilter.TOTALS) {
|
|
263
|
+
// totals exclude enqueued calls
|
|
264
|
+
pretty += this.#enqueuedCallsToPrettyString(txMetrics, filter);
|
|
265
|
+
}
|
|
266
|
+
if (txMetrics.revertedCode !== undefined && !txMetrics.revertedCode.isOK()) {
|
|
267
|
+
pretty += `${INDENT0}Reverted code: ${txMetrics.revertedCode?.getDescription()}\n`;
|
|
268
|
+
}
|
|
269
|
+
pretty += H_LINE + '\n';
|
|
270
|
+
}
|
|
271
|
+
return pretty;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
#enqueuedCallsToPrettyString(txMetrics: PublicTxMetrics, filter: PublicTxMetricsFilter) {
|
|
275
|
+
let pretty = '';
|
|
276
|
+
pretty += `${INDENT0}Enqueued public calls:\n`;
|
|
277
|
+
for (const enqueuedCall of txMetrics.enqueuedCalls) {
|
|
278
|
+
pretty += `${INDENT1}**Fn: ${enqueuedCall.fnName}**\n`;
|
|
279
|
+
if (filter === PublicTxMetricsFilter.DURATIONS || filter === PublicTxMetricsFilter.ALL) {
|
|
280
|
+
pretty += `${INDENT2}Duration: ${fmtNum(enqueuedCall.durationMs, 'ms')}\n`;
|
|
281
|
+
}
|
|
282
|
+
if (filter === PublicTxMetricsFilter.ALL) {
|
|
283
|
+
pretty += `${INDENT2}Mana used: ${fmtNum(enqueuedCall.manaUsed)}\n`;
|
|
284
|
+
const manaPerSecond = Math.round((enqueuedCall.manaUsed * 1000) / enqueuedCall.durationMs);
|
|
285
|
+
pretty += `${INDENT2}Mana per second: ${fmtNum(manaPerSecond)}\n`;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
if (filter === PublicTxMetricsFilter.INSTRUCTIONS || filter === PublicTxMetricsFilter.ALL) {
|
|
289
|
+
pretty += `${INDENT2}Instructions executed: ${fmtNum(enqueuedCall.totalInstructionsExecuted)}\n`;
|
|
290
|
+
}
|
|
291
|
+
if (enqueuedCall.reverted) {
|
|
292
|
+
pretty += `${INDENT2}Reverted!\n`;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return pretty;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
toJSON(indent = 2) {
|
|
299
|
+
return JSON.stringify(Object.fromEntries(this.txMetrics.entries()), null, indent);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
toGithubActionBenchmarkJSON(indent = 2) {
|
|
303
|
+
const metricsInfo = {
|
|
304
|
+
totalInstructionsExecuted: {
|
|
305
|
+
name: 'totalInstructionsExecuted',
|
|
306
|
+
unit: '#instructions',
|
|
307
|
+
category: PublicTxMetricsFilter.INSTRUCTIONS,
|
|
308
|
+
},
|
|
309
|
+
totalDurationMs: {
|
|
310
|
+
name: 'totalDurationMs',
|
|
311
|
+
unit: 'ms',
|
|
312
|
+
category: PublicTxMetricsFilter.DURATIONS,
|
|
313
|
+
},
|
|
314
|
+
manaUsed: {
|
|
315
|
+
name: 'manaUsed',
|
|
316
|
+
unit: 'mana',
|
|
317
|
+
category: PublicTxMetricsFilter.TOTALS,
|
|
318
|
+
},
|
|
319
|
+
nonRevertiblePrivateInsertionsUs: {
|
|
320
|
+
name: 'nonRevertiblePrivateInsertionsUs',
|
|
321
|
+
unit: 'us',
|
|
322
|
+
category: PublicTxMetricsFilter.DURATIONS,
|
|
323
|
+
},
|
|
324
|
+
revertiblePrivateInsertionsUs: {
|
|
325
|
+
name: 'revertiblePrivateInsertionsUs',
|
|
326
|
+
unit: 'us',
|
|
327
|
+
category: PublicTxMetricsFilter.DURATIONS,
|
|
328
|
+
},
|
|
329
|
+
proverSimulationStepMs: {
|
|
330
|
+
name: 'proverSimulationStepMs',
|
|
331
|
+
unit: 'ms',
|
|
332
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
333
|
+
},
|
|
334
|
+
proverProvingStepMs: {
|
|
335
|
+
name: 'proverProvingStepMs',
|
|
336
|
+
unit: 'ms',
|
|
337
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
338
|
+
},
|
|
339
|
+
proverTraceGenerationStepMs: {
|
|
340
|
+
name: 'proverTraceGenerationStepMs',
|
|
341
|
+
unit: 'ms',
|
|
342
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
343
|
+
},
|
|
344
|
+
traceGenerationInteractionsMs: {
|
|
345
|
+
name: 'traceGenerationInteractionsMs',
|
|
346
|
+
unit: 'ms',
|
|
347
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
348
|
+
},
|
|
349
|
+
traceGenerationTracesMs: {
|
|
350
|
+
name: 'traceGenerationTracesMs',
|
|
351
|
+
unit: 'ms',
|
|
352
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
353
|
+
},
|
|
354
|
+
provingSumcheckMs: {
|
|
355
|
+
name: 'provingSumcheckMs',
|
|
356
|
+
unit: 'ms',
|
|
357
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
358
|
+
},
|
|
359
|
+
provingPcsMs: {
|
|
360
|
+
name: 'provingPcsMs',
|
|
361
|
+
unit: 'ms',
|
|
362
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
363
|
+
},
|
|
364
|
+
provingLogDerivativeInverseMs: {
|
|
365
|
+
name: 'provingLogDerivativeInverseMs',
|
|
366
|
+
unit: 'ms',
|
|
367
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
368
|
+
},
|
|
369
|
+
provingLogDerivativeInverseCommitmentsMs: {
|
|
370
|
+
name: 'provingLogDerivativeInverseCommitmentsMs',
|
|
371
|
+
unit: 'ms',
|
|
372
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
373
|
+
},
|
|
374
|
+
provingWireCommitmentsMs: {
|
|
375
|
+
name: 'provingWireCommitmentsMs',
|
|
376
|
+
unit: 'ms',
|
|
377
|
+
category: PublicTxMetricsFilter.PROVING,
|
|
378
|
+
},
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
const data = [];
|
|
382
|
+
for (const [txLabel, txMetrics] of this.txMetrics.entries()) {
|
|
383
|
+
for (const [key, value] of Object.entries(txMetrics)) {
|
|
384
|
+
if (value !== undefined && key in metricsInfo) {
|
|
385
|
+
data.push({
|
|
386
|
+
name: `${txLabel}/${metricsInfo[key as keyof typeof metricsInfo].name}`,
|
|
387
|
+
value: value,
|
|
388
|
+
unit: metricsInfo[key as keyof typeof metricsInfo].unit,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return JSON.stringify(data, null, indent);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function fmtNum(num: number, unit?: string) {
|
|
398
|
+
return `\`${num.toLocaleString()}${unit ? ` ${unit}` : ''}\``;
|
|
399
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS } from '@aztec-labs/constants';
|
|
2
|
+
import { strict as assert } from 'assert';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A class manage a de-duplicated set of class IDs that errors if you try to add a duplicate.
|
|
6
|
+
* Useful for bytecode retrieval hints to avoid duplicates in parent trace & grandparent trace....
|
|
7
|
+
*/
|
|
8
|
+
export class UniqueClassIds {
|
|
9
|
+
private readonly classIds: Set<string> = new Set();
|
|
10
|
+
|
|
11
|
+
constructor(private readonly parent?: UniqueClassIds) {}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Create a fork that references this one as its parent
|
|
15
|
+
*/
|
|
16
|
+
public fork() {
|
|
17
|
+
return new UniqueClassIds(/*parent=*/ this);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check for a class ID here or in parent's (recursively).
|
|
22
|
+
*
|
|
23
|
+
* @param classId - the contract class ID (as a string) to check
|
|
24
|
+
* @returns boolean: whether the class ID is here
|
|
25
|
+
*/
|
|
26
|
+
public has(classId: string): boolean {
|
|
27
|
+
// First try check this' classIds
|
|
28
|
+
let here = this.classIds.has(classId);
|
|
29
|
+
// Then try parent's
|
|
30
|
+
if (!here && this.parent) {
|
|
31
|
+
// Note: this will recurse to grandparent/etc until we reach top or find it
|
|
32
|
+
here = this.parent.has(classId);
|
|
33
|
+
}
|
|
34
|
+
return here;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Get the total number of classIds
|
|
39
|
+
*/
|
|
40
|
+
public size(): number {
|
|
41
|
+
return this.classIds.size + (this.parent ? this.parent.size() : 0);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Add a class ID (if not already present) to the set.
|
|
46
|
+
*
|
|
47
|
+
* @param classId - the contract class ID (as a string)
|
|
48
|
+
*/
|
|
49
|
+
public add(classId: string) {
|
|
50
|
+
assert(!this.has(classId), `Bug! Tried to add duplicate classId ${classId} to set of unique classIds.`);
|
|
51
|
+
if (!this.has(classId)) {
|
|
52
|
+
this.classIds.add(classId);
|
|
53
|
+
assert(
|
|
54
|
+
this.size() <= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS,
|
|
55
|
+
`Bug! Surpassed limit (${MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS}) of unique contract class IDs used for bytecode retrievals.`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Merge in another set of unique class IDs into this one, but fail on duplicates.
|
|
62
|
+
*
|
|
63
|
+
* @param incoming: other unique class IDs
|
|
64
|
+
*/
|
|
65
|
+
public acceptAndMerge(incoming: UniqueClassIds) {
|
|
66
|
+
for (const classId of incoming.classIds.keys()) {
|
|
67
|
+
assert(
|
|
68
|
+
!this.has(classId),
|
|
69
|
+
`Bug! Cannot merge classId ${classId} into set of unique classIds as it already exists.`,
|
|
70
|
+
);
|
|
71
|
+
this.classIds.add(classId);
|
|
72
|
+
}
|
|
73
|
+
// since set() has an assertion, and size() always checks parent, this should be impossible
|
|
74
|
+
assert(
|
|
75
|
+
this.size() <= MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS,
|
|
76
|
+
`Bug! Merging unique class Ids should never exceed the limit of ${MAX_PUBLIC_CALLS_TO_UNIQUE_CONTRACT_CLASS_IDS}.`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PublicCallRequestWithCalldata, type Tx, TxExecutionPhase } from '@aztec-labs/stdlib/tx';
|
|
2
|
+
|
|
3
|
+
export function getCallRequestsWithCalldataByPhase(tx: Tx, phase: TxExecutionPhase): PublicCallRequestWithCalldata[] {
|
|
4
|
+
switch (phase) {
|
|
5
|
+
case TxExecutionPhase.SETUP:
|
|
6
|
+
return tx.getNonRevertiblePublicCallRequestsWithCalldata();
|
|
7
|
+
case TxExecutionPhase.APP_LOGIC:
|
|
8
|
+
return tx.getRevertiblePublicCallRequestsWithCalldata();
|
|
9
|
+
case TxExecutionPhase.TEARDOWN: {
|
|
10
|
+
const request = tx.getTeardownPublicCallRequestWithCalldata();
|
|
11
|
+
return request ? [request] : [];
|
|
12
|
+
}
|
|
13
|
+
default:
|
|
14
|
+
throw new Error(`Unknown phase: ${phase}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/server.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './public/index.js';
|
|
2
|
+
export * from './private/acvm/index.js';
|
|
3
|
+
export { WASMSimulatorWithBlobs } from './private/acvm_wasm_with_blobs.js';
|
|
4
|
+
export { NativeACVMSimulator } from './private/acvm_native.js';
|
|
5
|
+
export { type CircuitSimulator, type DecodedError } from './private/circuit_simulator.js';
|
|
6
|
+
export * from './common/index.js';
|