@aztec/simulator 0.0.1-commit.2ed92850 → 0.0.1-commit.3100065
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 +4 -4
- package/dest/client.d.ts +1 -3
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +0 -2
- package/dest/private/acvm/acvm.d.ts +4 -2
- package/dest/private/acvm/acvm.d.ts.map +1 -1
- package/dest/private/acvm/acvm.js +4 -3
- package/dest/private/acvm_native.d.ts +5 -3
- package/dest/private/acvm_native.d.ts.map +1 -1
- package/dest/private/acvm_native.js +8 -6
- package/dest/private/acvm_wasm.d.ts +4 -3
- package/dest/private/acvm_wasm.d.ts.map +1 -1
- package/dest/private/acvm_wasm.js +7 -5
- package/dest/private/circuit_recording/circuit_recorder.d.ts +39 -25
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.js +70 -72
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts +9 -20
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/file_circuit_recorder.js +39 -43
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.js +11 -14
- package/dest/private/factory.d.ts +3 -3
- package/dest/private/factory.d.ts.map +1 -1
- package/dest/private/factory.js +7 -4
- package/dest/public/avm/avm_gas.js +3 -3
- package/dest/public/avm/avm_simulator.js +1 -1
- package/dest/public/avm/calldata.d.ts +1 -1
- package/dest/public/avm/calldata.d.ts.map +1 -1
- package/dest/public/avm/calldata.js +3 -2
- package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
- package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
- package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +2 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +18 -3
- package/dest/public/avm/fixtures/utils.d.ts +1 -1
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
- package/dest/public/avm/fixtures/utils.js +4 -1
- package/dest/public/avm/opcodes/accrued_substate.d.ts +4 -5
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +11 -16
- package/dest/public/avm/opcodes/contract.d.ts +3 -2
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +5 -1
- package/dest/public/avm/opcodes/ec_add.d.ts +2 -4
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +13 -27
- package/dest/public/avm/serialization/bytecode_serialization.js +3 -3
- package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.js +1 -1
- package/dest/public/contracts_db_checkpoint.d.ts +2 -2
- package/dest/public/contracts_db_checkpoint.d.ts.map +1 -1
- package/dest/public/contracts_db_checkpoint.js +1 -1
- package/dest/public/executor_metrics.d.ts +1 -1
- package/dest/public/executor_metrics.d.ts.map +1 -1
- package/dest/public/executor_metrics.js +7 -2
- package/dest/public/fixtures/amm_test.js +4 -4
- package/dest/public/fixtures/bulk_test.d.ts +1 -1
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
- package/dest/public/fixtures/bulk_test.js +33 -6
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +1 -1
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tester.js +2 -2
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +8 -1
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tests.js +91 -2
- package/dest/public/fixtures/opcode_spammer.d.ts +3 -4
- package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
- package/dest/public/fixtures/opcode_spammer.js +18 -66
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +6 -5
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +38 -9
- package/dest/public/fixtures/token_test.js +3 -3
- package/dest/public/fixtures/utils.d.ts +2 -2
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +21 -20
- package/dest/public/hinting_db_sources.d.ts +5 -5
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +8 -7
- package/dest/public/public_db_sources.d.ts +9 -5
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +20 -14
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +5 -5
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
- package/dest/public/public_processor/guarded_merkle_tree.js +5 -5
- package/dest/public/public_processor/public_processor.d.ts +11 -6
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +125 -68
- package/dest/public/public_processor/public_processor_metrics.d.ts +5 -2
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor_metrics.js +28 -4
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -2
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +7 -6
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +5 -5
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +10 -11
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +4 -4
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +7 -7
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +4 -4
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +6 -6
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +3 -2
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +2 -2
- package/dest/public/public_tx_simulator/factories.d.ts +3 -2
- package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/factories.js +4 -4
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +10 -5
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +16 -18
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +9 -4
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +19 -12
- package/dest/public/side_effect_trace.d.ts +4 -4
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +3 -3
- package/dest/public/state_manager/state_manager.d.ts +10 -4
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +13 -6
- package/dest/public/test_executor_metrics.d.ts +8 -2
- package/dest/public/test_executor_metrics.d.ts.map +1 -1
- package/dest/public/test_executor_metrics.js +24 -2
- package/package.json +16 -16
- package/src/client.ts +0 -2
- package/src/private/acvm/acvm.ts +4 -3
- package/src/private/acvm_native.ts +11 -5
- package/src/private/acvm_wasm.ts +11 -4
- package/src/private/circuit_recording/circuit_recorder.ts +89 -81
- package/src/private/circuit_recording/file_circuit_recorder.ts +45 -50
- package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
- package/src/private/circuit_recording/simulator_recorder_wrapper.ts +9 -15
- package/src/private/factory.ts +7 -4
- package/src/public/avm/avm_gas.ts +2 -2
- package/src/public/avm/avm_simulator.ts +1 -1
- package/src/public/avm/calldata.ts +3 -2
- package/src/public/avm/fixtures/account_proof.json +553 -0
- package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +23 -3
- package/src/public/avm/fixtures/utils.ts +4 -1
- package/src/public/avm/opcodes/accrued_substate.ts +10 -19
- package/src/public/avm/opcodes/contract.ts +5 -1
- package/src/public/avm/opcodes/ec_add.ts +12 -31
- package/src/public/avm/opcodes/external_calls.ts +1 -1
- package/src/public/avm/serialization/bytecode_serialization.ts +2 -2
- package/src/public/avm/serialization/instruction_serialization.ts +1 -1
- package/src/public/contracts_db_checkpoint.ts +1 -1
- package/src/public/executor_metrics.ts +4 -1
- package/src/public/fixtures/amm_test.ts +4 -4
- package/src/public/fixtures/bulk_test.ts +31 -6
- package/src/public/fixtures/custom_bytecode_tester.ts +2 -2
- package/src/public/fixtures/custom_bytecode_tests.ts +209 -2
- package/src/public/fixtures/opcode_spammer.ts +22 -63
- package/src/public/fixtures/public_tx_simulation_tester.ts +45 -5
- package/src/public/fixtures/token_test.ts +3 -3
- package/src/public/fixtures/utils.ts +23 -24
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +1 -1
- package/src/public/hinting_db_sources.ts +10 -7
- package/src/public/public_db_sources.ts +36 -19
- package/src/public/public_processor/guarded_merkle_tree.ts +6 -6
- package/src/public/public_processor/public_processor.ts +173 -90
- package/src/public/public_processor/public_processor_metrics.ts +22 -4
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +11 -7
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +10 -8
- package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +7 -5
- package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +7 -5
- package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +3 -1
- package/src/public/public_tx_simulator/factories.ts +6 -3
- package/src/public/public_tx_simulator/public_tx_context.ts +21 -16
- package/src/public/public_tx_simulator/public_tx_simulator.ts +20 -12
- package/src/public/side_effect_trace.ts +5 -2
- package/src/public/state_manager/state_manager.ts +28 -5
- package/src/public/test_executor_metrics.ts +27 -3
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
MAX_NOTE_HASHES_PER_TX,
|
|
3
|
+
MAX_NULLIFIERS_PER_TX,
|
|
4
|
+
MAX_TX_BLOB_DATA_SIZE_IN_FIELDS,
|
|
5
|
+
NULLIFIER_SUBTREE_HEIGHT,
|
|
6
|
+
} from '@aztec/constants';
|
|
2
7
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
8
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
9
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
5
10
|
import { sleep } from '@aztec/foundation/sleep';
|
|
6
|
-
import { DateProvider, Timer, elapsed,
|
|
11
|
+
import { DateProvider, Timer, elapsed, execWithSignal } from '@aztec/foundation/timer';
|
|
7
12
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
8
13
|
import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
|
|
9
14
|
import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
@@ -25,6 +30,7 @@ import type {
|
|
|
25
30
|
PublicProcessorValidator,
|
|
26
31
|
SequencerConfig,
|
|
27
32
|
} from '@aztec/stdlib/interfaces/server';
|
|
33
|
+
import { type DebugLog, type DebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs';
|
|
28
34
|
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
29
35
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
30
36
|
import {
|
|
@@ -62,25 +68,28 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
|
|
|
62
68
|
* Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
|
|
63
69
|
*/
|
|
64
70
|
export class PublicProcessorFactory {
|
|
71
|
+
private log: Logger;
|
|
65
72
|
constructor(
|
|
66
73
|
private contractDataSource: ContractDataSource,
|
|
67
74
|
private dateProvider: DateProvider = new DateProvider(),
|
|
68
75
|
protected telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
69
|
-
|
|
76
|
+
bindings?: LoggerBindings,
|
|
77
|
+
) {
|
|
78
|
+
this.log = createLogger('simulator:public-processor-factory', bindings);
|
|
79
|
+
}
|
|
70
80
|
|
|
71
81
|
/**
|
|
72
82
|
* Creates a new instance of a PublicProcessor.
|
|
73
83
|
* @param globalVariables - The global variables for the block being processed.
|
|
74
|
-
* @param
|
|
84
|
+
* @param contractsDB - Optional pre-populated contracts DB; a fresh one is constructed if omitted.
|
|
75
85
|
* @returns A new instance of a PublicProcessor.
|
|
76
86
|
*/
|
|
77
87
|
public create(
|
|
78
88
|
merkleTree: MerkleTreeWriteOperations,
|
|
79
89
|
globalVariables: GlobalVariables,
|
|
80
90
|
config: PublicSimulatorConfig,
|
|
91
|
+
contractsDB: PublicContractsDB = new PublicContractsDB(this.contractDataSource, this.log.getBindings()),
|
|
81
92
|
): PublicProcessor {
|
|
82
|
-
const contractsDB = new PublicContractsDB(this.contractDataSource);
|
|
83
|
-
|
|
84
93
|
const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
|
|
85
94
|
const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
|
|
86
95
|
|
|
@@ -91,6 +100,7 @@ export class PublicProcessorFactory {
|
|
|
91
100
|
publicTxSimulator,
|
|
92
101
|
this.dateProvider,
|
|
93
102
|
this.telemetryClient,
|
|
103
|
+
createLogger('simulator:public-processor', this.log.getBindings()),
|
|
94
104
|
);
|
|
95
105
|
}
|
|
96
106
|
|
|
@@ -100,7 +110,14 @@ export class PublicProcessorFactory {
|
|
|
100
110
|
globalVariables: GlobalVariables,
|
|
101
111
|
config?: Partial<PublicTxSimulatorConfig>,
|
|
102
112
|
): PublicTxSimulatorInterface {
|
|
103
|
-
return new TelemetryCppPublicTxSimulator(
|
|
113
|
+
return new TelemetryCppPublicTxSimulator(
|
|
114
|
+
merkleTree,
|
|
115
|
+
contractsDB,
|
|
116
|
+
globalVariables,
|
|
117
|
+
this.telemetryClient,
|
|
118
|
+
config,
|
|
119
|
+
this.log.getBindings(),
|
|
120
|
+
);
|
|
104
121
|
}
|
|
105
122
|
}
|
|
106
123
|
|
|
@@ -111,13 +128,23 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
111
128
|
}
|
|
112
129
|
}
|
|
113
130
|
|
|
131
|
+
class PublicProcessorAbortError extends Error {
|
|
132
|
+
constructor(message: string = 'Aborted while processing tx') {
|
|
133
|
+
super(message);
|
|
134
|
+
this.name = 'PublicProcessorAbortError';
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function isPublicProcessorInterruptError(err: any) {
|
|
139
|
+
return err?.name === 'PublicProcessorTimeoutError' || err?.name === 'PublicProcessorAbortError';
|
|
140
|
+
}
|
|
141
|
+
|
|
114
142
|
/**
|
|
115
143
|
* Converts Txs lifted from the P2P module into ProcessedTx objects by executing
|
|
116
144
|
* any public function calls in them. Txs with private calls only are unaffected.
|
|
117
145
|
*/
|
|
118
146
|
export class PublicProcessor implements Traceable {
|
|
119
147
|
private metrics: PublicProcessorMetrics;
|
|
120
|
-
|
|
121
148
|
constructor(
|
|
122
149
|
protected globalVariables: GlobalVariables,
|
|
123
150
|
private guardedMerkleTree: GuardedMerkleTreeOperations,
|
|
@@ -125,8 +152,9 @@ export class PublicProcessor implements Traceable {
|
|
|
125
152
|
protected publicTxSimulator: PublicTxSimulatorInterface,
|
|
126
153
|
private dateProvider: DateProvider,
|
|
127
154
|
telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
128
|
-
private log
|
|
155
|
+
private log: Logger,
|
|
129
156
|
private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
|
|
157
|
+
private debugLogStore: DebugLogStore = new NullDebugLogStore(),
|
|
130
158
|
) {
|
|
131
159
|
this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
|
|
132
160
|
}
|
|
@@ -146,12 +174,13 @@ export class PublicProcessor implements Traceable {
|
|
|
146
174
|
txs: Iterable<Tx> | AsyncIterable<Tx>,
|
|
147
175
|
limits: PublicProcessorLimits = {},
|
|
148
176
|
validator: PublicProcessorValidator = {},
|
|
149
|
-
): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[],
|
|
150
|
-
const { maxTransactions,
|
|
177
|
+
): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], DebugLog[]]> {
|
|
178
|
+
const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal, signal } = limits;
|
|
151
179
|
const { preprocessValidator, nullifierCache } = validator;
|
|
152
180
|
const result: ProcessedTx[] = [];
|
|
153
181
|
const usedTxs: Tx[] = [];
|
|
154
182
|
const failed: FailedTx[] = [];
|
|
183
|
+
const debugLogs: DebugLog[] = [];
|
|
155
184
|
const timer = new Timer();
|
|
156
185
|
|
|
157
186
|
let totalSizeInBytes = 0;
|
|
@@ -159,6 +188,8 @@ export class PublicProcessor implements Traceable {
|
|
|
159
188
|
let totalPublicGas = new Gas(0, 0);
|
|
160
189
|
let totalBlockGas = new Gas(0, 0);
|
|
161
190
|
let totalBlobFields = 0;
|
|
191
|
+
let silentlySkippedCount = 0;
|
|
192
|
+
let totalSilentlySkippedDurationMs = 0;
|
|
162
193
|
|
|
163
194
|
for await (const tx of txs) {
|
|
164
195
|
// Only process up to the max tx limit
|
|
@@ -167,28 +198,33 @@ export class PublicProcessor implements Traceable {
|
|
|
167
198
|
break;
|
|
168
199
|
}
|
|
169
200
|
|
|
170
|
-
// Bail if we've hit the deadline
|
|
201
|
+
// Bail if we've hit the deadline or have been interrupted.
|
|
171
202
|
if (deadline && this.dateProvider.now() > +deadline) {
|
|
172
203
|
this.log.warn(`Stopping tx processing due to timeout.`);
|
|
173
204
|
break;
|
|
174
205
|
}
|
|
206
|
+
if (signal?.aborted) {
|
|
207
|
+
this.log.warn(`Stopping tx processing due to abort signal.`);
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
175
210
|
|
|
176
|
-
// Skip this tx if it'd exceed max block size
|
|
177
211
|
const txHash = tx.getTxHash().toString();
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
212
|
+
|
|
213
|
+
// Skip this tx if its estimated blob fields would exceed the limit.
|
|
214
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
215
|
+
const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
|
|
216
|
+
if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
217
|
+
this.log.warn(
|
|
218
|
+
`Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`,
|
|
219
|
+
{ txHash, txBlobFields, totalBlobFields, maxBlobFields },
|
|
220
|
+
);
|
|
186
221
|
continue;
|
|
187
222
|
}
|
|
188
223
|
|
|
189
|
-
// Skip this tx if its gas limit would exceed the block gas limit
|
|
224
|
+
// Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
|
|
225
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
190
226
|
const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
|
|
191
|
-
if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
|
|
227
|
+
if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
|
|
192
228
|
this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
|
|
193
229
|
txHash,
|
|
194
230
|
txGasLimit,
|
|
@@ -208,11 +244,6 @@ export class PublicProcessor implements Traceable {
|
|
|
208
244
|
failed.push({ tx, error: new Error(`Tx failed preprocess validation: ${reason}`) });
|
|
209
245
|
returns.push(new NestedProcessReturnValues([]));
|
|
210
246
|
continue;
|
|
211
|
-
} else if (result.result === 'skipped') {
|
|
212
|
-
const reason = result.reason.join(', ');
|
|
213
|
-
this.log.debug(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
|
|
214
|
-
returns.push(new NestedProcessReturnValues([]));
|
|
215
|
-
continue;
|
|
216
247
|
} else {
|
|
217
248
|
this.log.trace(`Tx ${txHash.toString()} is valid before processing.`);
|
|
218
249
|
}
|
|
@@ -228,7 +259,9 @@ export class PublicProcessor implements Traceable {
|
|
|
228
259
|
this.contractsDB.createCheckpoint();
|
|
229
260
|
|
|
230
261
|
try {
|
|
231
|
-
const [processedTx, returnValues] = await
|
|
262
|
+
const [txProcessingTimeMs, [processedTx, returnValues, txDebugLogs]] = await elapsed(() =>
|
|
263
|
+
this.processTx(tx, deadline, signal),
|
|
264
|
+
);
|
|
232
265
|
|
|
233
266
|
// Inject a fake processing failure after N txs if requested
|
|
234
267
|
const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
|
|
@@ -237,23 +270,25 @@ export class PublicProcessor implements Traceable {
|
|
|
237
270
|
}
|
|
238
271
|
|
|
239
272
|
const txBlobFields = processedTx.txEffect.getNumBlobFields();
|
|
240
|
-
|
|
241
|
-
// If the actual size of this tx would exceed block size, skip it
|
|
242
273
|
const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
274
|
+
|
|
275
|
+
// A single tx's effects must fit within the per-tx blob encoding: the rollup circuit encodes each
|
|
276
|
+
// tx into a fixed [Field; MAX_TX_BLOB_DATA_SIZE_IN_FIELDS] array, so a larger tx effect cannot be
|
|
277
|
+
// proven. The per-category side-effect limits already guarantee this upstream, so reaching here means
|
|
278
|
+
// the tx is malformed; reject it as invalid rather than letting it poison proving.
|
|
279
|
+
if (txBlobFields > MAX_TX_BLOB_DATA_SIZE_IN_FIELDS) {
|
|
280
|
+
const error = new Error(
|
|
281
|
+
`Tx ${txHash} produced ${txBlobFields} blob fields, exceeding the per-tx maximum of ${MAX_TX_BLOB_DATA_SIZE_IN_FIELDS}`,
|
|
282
|
+
);
|
|
283
|
+
this.log.error(error.message, { txHash, txBlobFields });
|
|
251
284
|
await checkpoint.revert();
|
|
252
285
|
this.contractsDB.revertCheckpoint();
|
|
286
|
+
failed.push({ tx, error });
|
|
287
|
+
returns.push(new NestedProcessReturnValues([]));
|
|
253
288
|
continue;
|
|
254
289
|
}
|
|
255
290
|
|
|
256
|
-
// If the actual blob fields of this tx would exceed the limit, skip it
|
|
291
|
+
// If the actual blob fields of this tx would exceed the limit, skip it.
|
|
257
292
|
// Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
|
|
258
293
|
if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
259
294
|
this.log.debug(
|
|
@@ -263,35 +298,60 @@ export class PublicProcessor implements Traceable {
|
|
|
263
298
|
txBlobFields,
|
|
264
299
|
totalBlobFields,
|
|
265
300
|
maxBlobFields,
|
|
301
|
+
txProcessingTimeMs,
|
|
266
302
|
},
|
|
267
303
|
);
|
|
304
|
+
silentlySkippedCount += 1;
|
|
305
|
+
totalSilentlySkippedDurationMs += txProcessingTimeMs;
|
|
306
|
+
this.metrics.recordSilentlySkipped(txProcessingTimeMs);
|
|
268
307
|
// Need to revert the checkpoint here and don't go any further
|
|
269
308
|
await checkpoint.revert();
|
|
270
309
|
this.contractsDB.revertCheckpoint();
|
|
271
310
|
continue;
|
|
272
311
|
}
|
|
273
312
|
|
|
313
|
+
// During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
|
|
314
|
+
// Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
|
|
315
|
+
// this uses actual gas and stops processing when the limit is exceeded.
|
|
316
|
+
if (
|
|
317
|
+
!isBuildingProposal &&
|
|
318
|
+
maxBlockGas !== undefined &&
|
|
319
|
+
totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)
|
|
320
|
+
) {
|
|
321
|
+
this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
|
|
322
|
+
txHash,
|
|
323
|
+
txGas: processedTx.gasUsed.totalGas,
|
|
324
|
+
totalBlockGas,
|
|
325
|
+
maxBlockGas,
|
|
326
|
+
});
|
|
327
|
+
await checkpoint.revert();
|
|
328
|
+
this.contractsDB.revertCheckpoint();
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
|
|
274
332
|
// FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
|
|
275
333
|
// I'd rather pass the validators the processedTx as well and let them deal with it.
|
|
276
334
|
nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map(n => n.toBuffer()));
|
|
277
335
|
result.push(processedTx);
|
|
278
336
|
usedTxs.push(tx);
|
|
279
337
|
returns = returns.concat(returnValues);
|
|
338
|
+
debugLogs.push(...txDebugLogs);
|
|
339
|
+
|
|
340
|
+
this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
|
|
280
341
|
|
|
281
342
|
totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
|
|
282
343
|
totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
|
|
283
344
|
totalSizeInBytes += txSize;
|
|
284
345
|
totalBlobFields += txBlobFields;
|
|
346
|
+
|
|
347
|
+
// Commit the tx-level contracts checkpoint on success
|
|
348
|
+
this.contractsDB.commitCheckpoint();
|
|
285
349
|
} catch (err: any) {
|
|
286
|
-
if (err
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
//
|
|
290
|
-
// Signal cancellation AND WAIT for the simulation to actually stop.
|
|
291
|
-
// This is critical because C++ might be in the middle of a slow operation (e.g., pad_trees)
|
|
292
|
-
// and won't check the cancellation flag until that operation completes.
|
|
293
|
-
// Without waiting, we'd proceed to revert checkpoints while C++ is still writing to state.
|
|
294
|
-
// Wait for C++ to stop gracefully.
|
|
350
|
+
if (isPublicProcessorInterruptError(err)) {
|
|
351
|
+
const interruptReason = err.name === 'PublicProcessorTimeoutError' ? 'timeout' : 'abort signal';
|
|
352
|
+
this.log.warn(`Stopping tx processing due to ${interruptReason}.`);
|
|
353
|
+
// The tx may still be executing on a worker thread (C++ via NAPI).
|
|
354
|
+
// Signal cancellation AND WAIT for the simulation to actually stop before touching fork checkpoints.
|
|
295
355
|
await this.publicTxSimulator.cancel?.();
|
|
296
356
|
|
|
297
357
|
// Now stop the guarded fork to prevent any further TS-side access to the world state.
|
|
@@ -301,14 +361,10 @@ export class PublicProcessor implements Traceable {
|
|
|
301
361
|
// 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
|
|
302
362
|
// 2. Possible state updates on that checkpoint or any others created during execution.
|
|
303
363
|
|
|
304
|
-
//
|
|
305
|
-
//
|
|
306
|
-
//
|
|
307
|
-
await checkpoint.
|
|
308
|
-
|
|
309
|
-
// Now we want to revert any/all remaining checkpoints, destroying any outstanding state updates.
|
|
310
|
-
// This needs to be done directly on the underlying fork as the guarded fork has been stopped.
|
|
311
|
-
await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
|
|
364
|
+
// Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
|
|
365
|
+
// updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
|
|
366
|
+
// created by callers below our depth.
|
|
367
|
+
await checkpoint.revertToCheckpoint();
|
|
312
368
|
|
|
313
369
|
// Revert any contracts added to the DB for the tx.
|
|
314
370
|
this.contractsDB.revertCheckpoint();
|
|
@@ -320,9 +376,9 @@ export class PublicProcessor implements Traceable {
|
|
|
320
376
|
break;
|
|
321
377
|
}
|
|
322
378
|
|
|
323
|
-
// Roll back state to start of TX before proceeding to next TX
|
|
324
|
-
|
|
325
|
-
await
|
|
379
|
+
// Roll back state to start of TX before proceeding to next TX.
|
|
380
|
+
// Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
|
|
381
|
+
await checkpoint.revertToCheckpoint();
|
|
326
382
|
this.contractsDB.revertCheckpoint();
|
|
327
383
|
const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
|
|
328
384
|
this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
|
|
@@ -334,7 +390,6 @@ export class PublicProcessor implements Traceable {
|
|
|
334
390
|
} finally {
|
|
335
391
|
// Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
|
|
336
392
|
await checkpoint.commit();
|
|
337
|
-
this.contractsDB.commitCheckpointOkIfNone();
|
|
338
393
|
}
|
|
339
394
|
}
|
|
340
395
|
|
|
@@ -342,15 +397,26 @@ export class PublicProcessor implements Traceable {
|
|
|
342
397
|
const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
|
|
343
398
|
this.metrics.recordAllTxs(totalPublicGas, rate);
|
|
344
399
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
400
|
+
const silentlySkippedDurationMs = Math.round(totalSilentlySkippedDurationMs);
|
|
401
|
+
this.log.info(
|
|
402
|
+
`Processed ${result.length} successful txs and ${failed.length} failed txs ` +
|
|
403
|
+
`(${silentlySkippedCount} silently skipped, ${silentlySkippedDurationMs}ms wasted) ` +
|
|
404
|
+
`in ${duration}s`,
|
|
405
|
+
{
|
|
406
|
+
blockNumber: this.globalVariables.blockNumber,
|
|
407
|
+
successfulCount: result.length,
|
|
408
|
+
failedCount: failed.length,
|
|
409
|
+
duration,
|
|
410
|
+
rate,
|
|
411
|
+
totalPublicGas,
|
|
412
|
+
totalBlockGas,
|
|
413
|
+
totalSizeInBytes,
|
|
414
|
+
silentlySkippedCount,
|
|
415
|
+
silentlySkippedDurationMs,
|
|
416
|
+
},
|
|
417
|
+
);
|
|
352
418
|
|
|
353
|
-
return [result, failed, usedTxs, returns,
|
|
419
|
+
return [result, failed, usedTxs, returns, debugLogs];
|
|
354
420
|
}
|
|
355
421
|
|
|
356
422
|
private async checkWorldStateUnchanged(
|
|
@@ -370,8 +436,14 @@ export class PublicProcessor implements Traceable {
|
|
|
370
436
|
}
|
|
371
437
|
|
|
372
438
|
@trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() }))
|
|
373
|
-
private async processTx(
|
|
374
|
-
|
|
439
|
+
private async processTx(
|
|
440
|
+
tx: Tx,
|
|
441
|
+
deadline: Date | undefined,
|
|
442
|
+
signal: AbortSignal | undefined,
|
|
443
|
+
): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
|
|
444
|
+
const [time, [processedTx, returnValues, debugLogs]] = await elapsed(() =>
|
|
445
|
+
this.processTxWithinDeadline(tx, deadline, signal),
|
|
446
|
+
);
|
|
375
447
|
|
|
376
448
|
this.log.verbose(
|
|
377
449
|
!tx.hasPublicCalls()
|
|
@@ -394,7 +466,7 @@ export class PublicProcessor implements Traceable {
|
|
|
394
466
|
},
|
|
395
467
|
);
|
|
396
468
|
|
|
397
|
-
return [processedTx, returnValues ?? []];
|
|
469
|
+
return [processedTx, returnValues ?? [], debugLogs];
|
|
398
470
|
}
|
|
399
471
|
|
|
400
472
|
private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise<void> {
|
|
@@ -424,14 +496,14 @@ export class PublicProcessor implements Traceable {
|
|
|
424
496
|
this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
|
|
425
497
|
}
|
|
426
498
|
|
|
427
|
-
/** Processes the given tx within deadline
|
|
499
|
+
/** Processes the given tx within deadline or until the signal is aborted. */
|
|
428
500
|
private async processTxWithinDeadline(
|
|
429
501
|
tx: Tx,
|
|
430
502
|
deadline: Date | undefined,
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
: () => this.processPrivateOnlyTx(tx);
|
|
503
|
+
signal: AbortSignal | undefined,
|
|
504
|
+
): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> {
|
|
505
|
+
const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> =
|
|
506
|
+
tx.hasPublicCalls() ? () => this.processTxWithPublicCalls(tx) : () => this.processPrivateOnlyTx(tx);
|
|
435
507
|
|
|
436
508
|
// Fake a delay per tx if instructed (used for tests)
|
|
437
509
|
const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
|
|
@@ -445,27 +517,38 @@ export class PublicProcessor implements Traceable {
|
|
|
445
517
|
}
|
|
446
518
|
: innerProcessFn;
|
|
447
519
|
|
|
448
|
-
|
|
520
|
+
const processingSignal = this.getProcessingSignal(tx, deadline, signal);
|
|
521
|
+
if (!processingSignal) {
|
|
449
522
|
return await processFn();
|
|
450
523
|
}
|
|
451
524
|
|
|
452
|
-
|
|
525
|
+
return await execWithSignal(
|
|
526
|
+
() => processFn(),
|
|
527
|
+
processingSignal,
|
|
528
|
+
signal =>
|
|
529
|
+
signal.reason?.name === 'TimeoutError' ? new PublicProcessorTimeoutError() : new PublicProcessorAbortError(),
|
|
530
|
+
);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
private getProcessingSignal(tx: Tx, deadline: Date | undefined, signal: AbortSignal | undefined) {
|
|
534
|
+
if (!deadline) {
|
|
535
|
+
return signal;
|
|
536
|
+
}
|
|
537
|
+
|
|
453
538
|
const timeout = +deadline - this.dateProvider.now();
|
|
454
539
|
if (timeout <= 0) {
|
|
455
540
|
throw new PublicProcessorTimeoutError();
|
|
456
541
|
}
|
|
457
542
|
|
|
543
|
+
const txHash = tx.getTxHash();
|
|
458
544
|
this.log.debug(`Processing tx ${txHash.toString()} within ${timeout}ms`, {
|
|
459
545
|
deadline: deadline.toISOString(),
|
|
460
546
|
now: new Date(this.dateProvider.now()).toISOString(),
|
|
461
547
|
txHash,
|
|
462
548
|
});
|
|
463
549
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
timeout,
|
|
467
|
-
() => new PublicProcessorTimeoutError(),
|
|
468
|
-
);
|
|
550
|
+
const timeoutSignal = AbortSignal.timeout(timeout);
|
|
551
|
+
return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
469
552
|
}
|
|
470
553
|
|
|
471
554
|
/**
|
|
@@ -499,7 +582,7 @@ export class PublicProcessor implements Traceable {
|
|
|
499
582
|
@trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({
|
|
500
583
|
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
501
584
|
}))
|
|
502
|
-
private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> {
|
|
585
|
+
private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined, DebugLog[]]> {
|
|
503
586
|
const gasFees = this.globalVariables.gasFees;
|
|
504
587
|
const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
|
|
505
588
|
|
|
@@ -522,15 +605,15 @@ export class PublicProcessor implements Traceable {
|
|
|
522
605
|
// Fee payment insertion has already been done. Do the rest.
|
|
523
606
|
await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
|
|
524
607
|
|
|
525
|
-
|
|
608
|
+
this.contractsDB.addNewContracts(tx);
|
|
526
609
|
|
|
527
|
-
return [processedTx, undefined];
|
|
610
|
+
return [processedTx, undefined, []];
|
|
528
611
|
}
|
|
529
612
|
|
|
530
613
|
@trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({
|
|
531
614
|
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
532
615
|
}))
|
|
533
|
-
private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
|
|
616
|
+
private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
|
|
534
617
|
const timer = new Timer();
|
|
535
618
|
|
|
536
619
|
const result = await this.publicTxSimulator.simulate(tx);
|
|
@@ -568,7 +651,7 @@ export class PublicProcessor implements Traceable {
|
|
|
568
651
|
revertReason,
|
|
569
652
|
);
|
|
570
653
|
|
|
571
|
-
return [processedTx, appLogicReturnValues];
|
|
654
|
+
return [processedTx, appLogicReturnValues, result.logs ?? []];
|
|
572
655
|
}
|
|
573
656
|
|
|
574
657
|
/**
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
|
|
2
2
|
import type { Gas } from '@aztec/stdlib/gas';
|
|
3
|
-
import
|
|
3
|
+
import { TxExecutionPhase } from '@aztec/stdlib/tx';
|
|
4
4
|
import {
|
|
5
5
|
Attributes,
|
|
6
6
|
type Gauge,
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
type TelemetryClient,
|
|
10
10
|
type Tracer,
|
|
11
11
|
type UpDownCounter,
|
|
12
|
+
createUpDownCounterWithDefault,
|
|
12
13
|
} from '@aztec/telemetry-client';
|
|
13
14
|
|
|
14
15
|
export class PublicProcessorMetrics {
|
|
@@ -29,19 +30,27 @@ export class PublicProcessorMetrics {
|
|
|
29
30
|
|
|
30
31
|
private treeInsertionDuration: Histogram;
|
|
31
32
|
|
|
33
|
+
private silentlySkippedCount: UpDownCounter;
|
|
34
|
+
private silentlySkippedDuration: Histogram;
|
|
35
|
+
|
|
32
36
|
constructor(client: TelemetryClient, name = 'PublicProcessor') {
|
|
33
37
|
this.tracer = client.getTracer(name);
|
|
34
38
|
const meter = client.getMeter(name);
|
|
35
39
|
|
|
36
40
|
this.txDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TX_DURATION);
|
|
37
41
|
|
|
38
|
-
this.txCount = meter
|
|
42
|
+
this.txCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_COUNT, {
|
|
43
|
+
[Attributes.OK]: [true, false],
|
|
44
|
+
});
|
|
39
45
|
|
|
40
|
-
this.txPhaseCount = meter
|
|
46
|
+
this.txPhaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_PHASE_COUNT);
|
|
41
47
|
|
|
42
48
|
this.phaseDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_PHASE_DURATION);
|
|
43
49
|
|
|
44
|
-
this.phaseCount = meter
|
|
50
|
+
this.phaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_PHASE_COUNT, {
|
|
51
|
+
[Attributes.TX_PHASE_NAME]: [TxExecutionPhase.SETUP, TxExecutionPhase.APP_LOGIC, TxExecutionPhase.TEARDOWN],
|
|
52
|
+
[Attributes.OK]: [true, false],
|
|
53
|
+
});
|
|
45
54
|
|
|
46
55
|
this.bytecodeDeployed = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_DEPLOY_BYTECODE_SIZE);
|
|
47
56
|
|
|
@@ -54,6 +63,10 @@ export class PublicProcessorMetrics {
|
|
|
54
63
|
this.gasRate = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_GAS_RATE);
|
|
55
64
|
|
|
56
65
|
this.treeInsertionDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TREE_INSERTION);
|
|
66
|
+
|
|
67
|
+
this.silentlySkippedCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_SILENTLY_SKIPPED_COUNT);
|
|
68
|
+
|
|
69
|
+
this.silentlySkippedDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_SILENTLY_SKIPPED_DURATION);
|
|
57
70
|
}
|
|
58
71
|
|
|
59
72
|
recordPhaseDuration(phaseName: TxExecutionPhase, durationMs: number) {
|
|
@@ -117,4 +130,9 @@ export class PublicProcessorMetrics {
|
|
|
117
130
|
recordTreeInsertions(durationUs: number) {
|
|
118
131
|
this.treeInsertionDuration.record(Math.ceil(durationUs));
|
|
119
132
|
}
|
|
133
|
+
|
|
134
|
+
recordSilentlySkipped(durationMs: number) {
|
|
135
|
+
this.silentlySkippedCount.add(1);
|
|
136
|
+
this.silentlySkippedDuration.record(Math.ceil(durationMs));
|
|
137
|
+
}
|
|
120
138
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
-
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
3
3
|
import type { ContractProvider } from '@aztec/native';
|
|
4
4
|
import { FunctionSelector } from '@aztec/stdlib/abi';
|
|
5
5
|
import { deserializeFromMessagePack, serializeWithMessagePack } from '@aztec/stdlib/avm';
|
|
@@ -10,17 +10,20 @@ import type { GlobalVariables } from '@aztec/stdlib/tx';
|
|
|
10
10
|
import type { PublicContractsDB } from '../public_db_sources.js';
|
|
11
11
|
|
|
12
12
|
export class ContractProviderForCpp implements ContractProvider {
|
|
13
|
-
private log: Logger
|
|
13
|
+
private log: Logger;
|
|
14
14
|
|
|
15
15
|
constructor(
|
|
16
16
|
private contractsDB: PublicContractsDB,
|
|
17
17
|
private globalVariables: GlobalVariables,
|
|
18
|
-
|
|
18
|
+
bindings?: LoggerBindings,
|
|
19
|
+
) {
|
|
20
|
+
this.log = createLogger('simulator:contract_provider_for_cpp', bindings);
|
|
21
|
+
}
|
|
19
22
|
|
|
20
23
|
public getContractInstance = async (address: string): Promise<Buffer | undefined> => {
|
|
21
24
|
this.log.trace(`Contract provider callback: getContractInstance(${address})`);
|
|
22
25
|
|
|
23
|
-
const aztecAddr = AztecAddress.
|
|
26
|
+
const aztecAddr = AztecAddress.fromStringUnsafe(address);
|
|
24
27
|
|
|
25
28
|
const instance = await this.contractsDB.getContractInstance(aztecAddr, this.globalVariables.timestamp);
|
|
26
29
|
|
|
@@ -49,6 +52,7 @@ export class ContractProviderForCpp implements ContractProvider {
|
|
|
49
52
|
return serializeWithMessagePack(contractClass);
|
|
50
53
|
};
|
|
51
54
|
|
|
55
|
+
// eslint-disable-next-line require-await
|
|
52
56
|
public addContracts = async (contractDeploymentDataBuffer: Buffer): Promise<void> => {
|
|
53
57
|
this.log.trace(`Contract provider callback: addContracts`);
|
|
54
58
|
|
|
@@ -58,8 +62,8 @@ export class ContractProviderForCpp implements ContractProvider {
|
|
|
58
62
|
const contractDeploymentData = ContractDeploymentData.fromPlainObject(rawData);
|
|
59
63
|
|
|
60
64
|
// Add contracts to the contracts DB
|
|
61
|
-
this.log.trace(`Calling contractsDB.
|
|
62
|
-
|
|
65
|
+
this.log.trace(`Calling contractsDB.addContractsFromLogs`);
|
|
66
|
+
this.contractsDB.addContractsFromLogs(contractDeploymentData);
|
|
63
67
|
};
|
|
64
68
|
|
|
65
69
|
public getBytecodeCommitment = async (classId: string): Promise<Buffer | undefined> => {
|
|
@@ -84,7 +88,7 @@ export class ContractProviderForCpp implements ContractProvider {
|
|
|
84
88
|
this.log.trace(`Contract provider callback: getDebugFunctionName(${address}, ${selector})`);
|
|
85
89
|
|
|
86
90
|
// Parse address and selector strings
|
|
87
|
-
const aztecAddr = AztecAddress.
|
|
91
|
+
const aztecAddr = AztecAddress.fromStringUnsafe(address);
|
|
88
92
|
const selectorFr = Fr.fromString(selector);
|
|
89
93
|
const functionSelector = FunctionSelector.fromFieldOrUndefined(selectorFr);
|
|
90
94
|
|