@aztec/simulator 0.0.1-commit.29c6b1a3 → 0.0.1-commit.2c0ee1788
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/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 +4 -4
- package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.js +7 -5
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
- 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/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/opcodes/accrued_substate.d.ts +2 -2
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +3 -4
- 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 +2 -2
- 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 +4 -4
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +3 -1
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tests.js +61 -1
- package/dest/public/fixtures/opcode_spammer.d.ts +1 -1
- package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
- package/dest/public/fixtures/opcode_spammer.js +6 -6
- 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 +37 -10
- 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 +10 -10
- 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 +7 -6
- package/dest/public/public_db_sources.d.ts +6 -5
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +14 -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 +8 -4
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +75 -50
- 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 +4 -3
- 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 +4 -4
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +5 -5
- 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 +15 -16
- package/src/private/acvm/acvm.ts +4 -3
- package/src/private/acvm_native.ts +11 -5
- package/src/private/acvm_wasm.ts +7 -3
- package/src/private/circuit_recording/circuit_recorder.ts +7 -5
- package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
- package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
- 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/opcodes/accrued_substate.ts +3 -4
- 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 +2 -2
- package/src/public/fixtures/bulk_test.ts +2 -4
- package/src/public/fixtures/custom_bytecode_tests.ts +139 -1
- package/src/public/fixtures/opcode_spammer.ts +6 -10
- package/src/public/fixtures/public_tx_simulation_tester.ts +47 -6
- package/src/public/fixtures/utils.ts +17 -12
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +1 -1
- package/src/public/hinting_db_sources.ts +9 -7
- package/src/public/public_db_sources.ts +27 -19
- package/src/public/public_processor/guarded_merkle_tree.ts +6 -6
- package/src/public/public_processor/public_processor.ts +112 -67
- package/src/public/public_processor/public_processor_metrics.ts +22 -4
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +8 -4
- 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 +19 -4
- package/src/public/test_executor_metrics.ts +27 -3
|
@@ -2,10 +2,8 @@ import {
|
|
|
2
2
|
CONTRACT_CLASS_PUBLISHED_MAGIC_VALUE,
|
|
3
3
|
CONTRACT_CLASS_REGISTRY_CONTRACT_ADDRESS,
|
|
4
4
|
CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS,
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
DEFAULT_TEARDOWN_DA_GAS_LIMIT,
|
|
8
|
-
DEFAULT_TEARDOWN_L2_GAS_LIMIT,
|
|
5
|
+
MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT,
|
|
6
|
+
MAX_PROCESSABLE_L2_GAS,
|
|
9
7
|
PRIVATE_LOG_SIZE_IN_FIELDS,
|
|
10
8
|
} from '@aztec/constants';
|
|
11
9
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
@@ -14,7 +12,13 @@ import { CONTRACT_INSTANCE_PUBLISHED_EVENT_TAG } from '@aztec/protocol-contracts
|
|
|
14
12
|
import { bufferAsFields } from '@aztec/stdlib/abi';
|
|
15
13
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
16
14
|
import type { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
17
|
-
import {
|
|
15
|
+
import {
|
|
16
|
+
FALLBACK_TEARDOWN_DA_GAS_LIMIT,
|
|
17
|
+
FALLBACK_TEARDOWN_L2_GAS_LIMIT,
|
|
18
|
+
Gas,
|
|
19
|
+
GasFees,
|
|
20
|
+
GasSettings,
|
|
21
|
+
} from '@aztec/stdlib/gas';
|
|
18
22
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
19
23
|
import {
|
|
20
24
|
LogHash,
|
|
@@ -62,13 +66,14 @@ export async function createTxForPublicCalls(
|
|
|
62
66
|
feePayer = AztecAddress.zero(),
|
|
63
67
|
gasUsedByPrivate: Gas = Gas.empty(),
|
|
64
68
|
globals: GlobalVariables = GlobalVariables.empty(),
|
|
69
|
+
gasLimits?: Gas,
|
|
65
70
|
): Promise<Tx> {
|
|
66
71
|
assert(
|
|
67
72
|
setupCallRequests.length > 0 || appCallRequests.length > 0 || teardownCallRequest !== undefined,
|
|
68
73
|
"Can't create public tx with no enqueued calls",
|
|
69
74
|
);
|
|
70
75
|
// use max limits
|
|
71
|
-
|
|
76
|
+
gasLimits = gasLimits ?? new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
|
|
72
77
|
|
|
73
78
|
const forPublic = PartialPrivateTailPublicInputsForPublic.empty();
|
|
74
79
|
|
|
@@ -128,19 +133,19 @@ export async function createTxForPublicCalls(
|
|
|
128
133
|
|
|
129
134
|
const maxFeesPerGas = feePayer.isZero() ? GasFees.empty() : new GasFees(10, 10);
|
|
130
135
|
const teardownGasLimits = teardownCallRequest
|
|
131
|
-
? new Gas(
|
|
136
|
+
? new Gas(FALLBACK_TEARDOWN_DA_GAS_LIMIT, FALLBACK_TEARDOWN_L2_GAS_LIMIT)
|
|
132
137
|
: Gas.empty();
|
|
133
138
|
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, maxFeesPerGas, GasFees.empty());
|
|
134
139
|
const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
|
|
135
140
|
const header = BlockHeader.empty({ globalVariables: globals });
|
|
136
141
|
const constantData = new TxConstantData(header, txContext, Fr.zero(), Fr.zero());
|
|
137
|
-
const
|
|
142
|
+
const expirationTimestamp = 0n; // Not used in the simulator.
|
|
138
143
|
|
|
139
144
|
const txData = new PrivateKernelTailCircuitPublicInputs(
|
|
140
145
|
constantData,
|
|
141
146
|
/*gasUsed=*/ gasUsedByPrivate,
|
|
142
147
|
feePayer,
|
|
143
|
-
|
|
148
|
+
expirationTimestamp,
|
|
144
149
|
forPublic,
|
|
145
150
|
);
|
|
146
151
|
|
|
@@ -163,7 +168,7 @@ export async function createTxForPrivateOnly(
|
|
|
163
168
|
gasUsedByPrivate: Gas = new Gas(10, 10),
|
|
164
169
|
): Promise<Tx> {
|
|
165
170
|
// use max limits
|
|
166
|
-
const gasLimits = new Gas(
|
|
171
|
+
const gasLimits = new Gas(MAX_PROCESSABLE_DA_GAS_PER_CHECKPOINT, MAX_PROCESSABLE_L2_GAS);
|
|
167
172
|
|
|
168
173
|
const forRollup = PartialPrivateTailPublicInputsForRollup.empty();
|
|
169
174
|
|
|
@@ -171,13 +176,13 @@ export async function createTxForPrivateOnly(
|
|
|
171
176
|
const gasSettings = new GasSettings(gasLimits, Gas.empty(), maxFeesPerGas, GasFees.empty());
|
|
172
177
|
const txContext = new TxContext(Fr.zero(), Fr.zero(), gasSettings);
|
|
173
178
|
const constantData = new TxConstantData(BlockHeader.empty(), txContext, Fr.zero(), Fr.zero());
|
|
174
|
-
const
|
|
179
|
+
const expirationTimestamp = 0n; // Not used in the simulator.
|
|
175
180
|
|
|
176
181
|
const txData = new PrivateKernelTailCircuitPublicInputs(
|
|
177
182
|
constantData,
|
|
178
183
|
/*gasUsed=*/ gasUsedByPrivate,
|
|
179
184
|
feePayer,
|
|
180
|
-
|
|
185
|
+
expirationTimestamp,
|
|
181
186
|
/*forPublic=*/ undefined,
|
|
182
187
|
forRollup,
|
|
183
188
|
);
|
|
@@ -146,7 +146,7 @@ async function createTxFromHint(cppTx: AvmTxHint): Promise<Tx> {
|
|
|
146
146
|
constants,
|
|
147
147
|
cppTx.gasUsedByPrivate,
|
|
148
148
|
cppTx.feePayer,
|
|
149
|
-
0n, //
|
|
149
|
+
0n, // expirationTimestamp
|
|
150
150
|
forPublic,
|
|
151
151
|
undefined, // forRollup - not needed for public simulation
|
|
152
152
|
);
|
|
@@ -410,12 +410,12 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
|
|
|
410
410
|
}
|
|
411
411
|
}
|
|
412
412
|
|
|
413
|
-
public async createCheckpoint(): Promise<
|
|
413
|
+
public async createCheckpoint(): Promise<number> {
|
|
414
414
|
const actionCounter = this.checkpointActionCounter++;
|
|
415
415
|
const oldCheckpointId = this.getCurrentCheckpointId();
|
|
416
416
|
const treesStateHash = await this.getTreesStateHash();
|
|
417
417
|
|
|
418
|
-
await this.db.createCheckpoint();
|
|
418
|
+
const depth = await this.db.createCheckpoint();
|
|
419
419
|
this.checkpointStack.push(this.nextCheckpointId++);
|
|
420
420
|
const newCheckpointId = this.getCurrentCheckpointId();
|
|
421
421
|
|
|
@@ -424,14 +424,16 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
|
|
|
424
424
|
HintingMerkleWriteOperations.log.trace(
|
|
425
425
|
`[createCheckpoint:${actionCounter}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId} at trees state ${treesStateHash}.`,
|
|
426
426
|
);
|
|
427
|
+
|
|
428
|
+
return depth;
|
|
427
429
|
}
|
|
428
430
|
|
|
429
|
-
public
|
|
430
|
-
throw new Error('
|
|
431
|
+
public commitAllCheckpointsTo(_depth: number): Promise<void> {
|
|
432
|
+
throw new Error('commitAllCheckpointsTo is not supported in HintingMerkleWriteOperations.');
|
|
431
433
|
}
|
|
432
434
|
|
|
433
|
-
public
|
|
434
|
-
throw new Error('
|
|
435
|
+
public revertAllCheckpointsTo(_depth: number): Promise<void> {
|
|
436
|
+
throw new Error('revertAllCheckpointsTo is not supported in HintingMerkleWriteOperations.');
|
|
435
437
|
}
|
|
436
438
|
|
|
437
439
|
public async commitCheckpoint(): Promise<void> {
|
|
@@ -572,7 +574,7 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
|
|
|
572
574
|
return await this.db.close();
|
|
573
575
|
}
|
|
574
576
|
|
|
575
|
-
async [Symbol.
|
|
577
|
+
async [Symbol.asyncDispose](): Promise<void> {
|
|
576
578
|
await this.close();
|
|
577
579
|
}
|
|
578
580
|
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
PUBLIC_DATA_SUBTREE_HEIGHT,
|
|
6
6
|
} from '@aztec/constants';
|
|
7
7
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
8
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
8
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
9
9
|
import { Timer } from '@aztec/foundation/timer';
|
|
10
10
|
import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
|
|
11
11
|
import { ContractInstancePublishedEvent } from '@aztec/protocol-contracts/instance-registry';
|
|
@@ -46,14 +46,19 @@ import { L1ToL2MessageIndexOutOfRangeError, NoteHashIndexOutOfRangeError } from
|
|
|
46
46
|
export class PublicContractsDB implements PublicContractsDBInterface {
|
|
47
47
|
private contractStateStack: ContractsDbCheckpoint[] = [new ContractsDbCheckpoint()];
|
|
48
48
|
|
|
49
|
-
private log
|
|
49
|
+
private log: Logger;
|
|
50
50
|
|
|
51
|
-
constructor(
|
|
51
|
+
constructor(
|
|
52
|
+
private dataSource: ContractDataSource,
|
|
53
|
+
bindings?: LoggerBindings,
|
|
54
|
+
) {
|
|
55
|
+
this.log = createLogger('simulator:contracts-data-source', bindings);
|
|
56
|
+
}
|
|
52
57
|
|
|
53
|
-
public
|
|
58
|
+
public addContracts(contractDeploymentData: ContractDeploymentData): void {
|
|
54
59
|
const currentState = this.getCurrentState();
|
|
55
60
|
|
|
56
|
-
|
|
61
|
+
this.addContractClassesFromEvents(
|
|
57
62
|
ContractClassPublishedEvent.extractContractClassEvents(contractDeploymentData.getContractClassLogs()),
|
|
58
63
|
currentState,
|
|
59
64
|
);
|
|
@@ -64,10 +69,10 @@ export class PublicContractsDB implements PublicContractsDBInterface {
|
|
|
64
69
|
);
|
|
65
70
|
}
|
|
66
71
|
|
|
67
|
-
public
|
|
72
|
+
public addNewContracts(tx: Tx): void {
|
|
68
73
|
const contractDeploymentData = AllContractDeploymentData.fromTx(tx);
|
|
69
|
-
|
|
70
|
-
|
|
74
|
+
this.addContracts(contractDeploymentData.getNonRevertibleContractDeploymentData());
|
|
75
|
+
this.addContracts(contractDeploymentData.getRevertibleContractDeploymentData());
|
|
71
76
|
}
|
|
72
77
|
|
|
73
78
|
/**
|
|
@@ -76,7 +81,7 @@ export class PublicContractsDB implements PublicContractsDBInterface {
|
|
|
76
81
|
*/
|
|
77
82
|
public createCheckpoint(): void {
|
|
78
83
|
const currentState = this.getCurrentState();
|
|
79
|
-
const newState = currentState.
|
|
84
|
+
const newState = currentState.fork();
|
|
80
85
|
this.contractStateStack.push(newState);
|
|
81
86
|
}
|
|
82
87
|
|
|
@@ -169,17 +174,15 @@ export class PublicContractsDB implements PublicContractsDBInterface {
|
|
|
169
174
|
return await this.dataSource.getDebugFunctionName(address, selector);
|
|
170
175
|
}
|
|
171
176
|
|
|
172
|
-
private
|
|
177
|
+
private addContractClassesFromEvents(
|
|
173
178
|
contractClassEvents: ContractClassPublishedEvent[],
|
|
174
179
|
state: ContractsDbCheckpoint,
|
|
175
180
|
) {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
}),
|
|
182
|
-
);
|
|
181
|
+
for (const event of contractClassEvents) {
|
|
182
|
+
this.log.debug(`Adding class ${event.contractClassId.toString()} to contract state`);
|
|
183
|
+
const contractClass = event.toContractClassPublic();
|
|
184
|
+
state.addClass(event.contractClassId, contractClass);
|
|
185
|
+
}
|
|
183
186
|
}
|
|
184
187
|
|
|
185
188
|
private addContractInstancesFromEvents(
|
|
@@ -208,9 +211,14 @@ export class PublicContractsDB implements PublicContractsDBInterface {
|
|
|
208
211
|
* to decide whether to use hints or not (same with tracing, etc).
|
|
209
212
|
*/
|
|
210
213
|
export class PublicTreesDB implements PublicStateDBInterface {
|
|
211
|
-
private logger
|
|
214
|
+
private logger: Logger;
|
|
212
215
|
|
|
213
|
-
constructor(
|
|
216
|
+
constructor(
|
|
217
|
+
private readonly db: MerkleTreeWriteOperations,
|
|
218
|
+
bindings?: LoggerBindings,
|
|
219
|
+
) {
|
|
220
|
+
this.logger = createLogger('simulator:public-trees-db', bindings);
|
|
221
|
+
}
|
|
214
222
|
|
|
215
223
|
public async storageRead(contract: AztecAddress, slot: Fr): Promise<Fr> {
|
|
216
224
|
const timer = new Timer();
|
|
@@ -82,7 +82,7 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
|
|
|
82
82
|
return this.guardAndPush(() => this.target.close());
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
async [Symbol.
|
|
85
|
+
async [Symbol.asyncDispose](): Promise<void> {
|
|
86
86
|
await this.close();
|
|
87
87
|
}
|
|
88
88
|
getTreeInfo(treeId: MerkleTreeId): Promise<TreeInfo> {
|
|
@@ -134,7 +134,7 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
|
|
|
134
134
|
): Promise<(BlockNumber | undefined)[]> {
|
|
135
135
|
return this.guardAndPush(() => this.target.getBlockNumbersForLeafIndices(treeId, leafIndices));
|
|
136
136
|
}
|
|
137
|
-
createCheckpoint(): Promise<
|
|
137
|
+
createCheckpoint(): Promise<number> {
|
|
138
138
|
return this.guardAndPush(() => this.target.createCheckpoint());
|
|
139
139
|
}
|
|
140
140
|
commitCheckpoint(): Promise<void> {
|
|
@@ -143,11 +143,11 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
|
|
|
143
143
|
revertCheckpoint(): Promise<void> {
|
|
144
144
|
return this.guardAndPush(() => this.target.revertCheckpoint());
|
|
145
145
|
}
|
|
146
|
-
|
|
147
|
-
return this.guardAndPush(() => this.target.
|
|
146
|
+
commitAllCheckpointsTo(depth: number): Promise<void> {
|
|
147
|
+
return this.guardAndPush(() => this.target.commitAllCheckpointsTo(depth));
|
|
148
148
|
}
|
|
149
|
-
|
|
150
|
-
return this.guardAndPush(() => this.target.
|
|
149
|
+
revertAllCheckpointsTo(depth: number): Promise<void> {
|
|
150
|
+
return this.guardAndPush(() => this.target.revertAllCheckpointsTo(depth));
|
|
151
151
|
}
|
|
152
152
|
findSiblingPaths<ID extends MerkleTreeId>(
|
|
153
153
|
treeId: ID,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
|
|
2
2
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
5
5
|
import { sleep } from '@aztec/foundation/sleep';
|
|
6
6
|
import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
|
|
7
7
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
@@ -25,6 +25,7 @@ import type {
|
|
|
25
25
|
PublicProcessorValidator,
|
|
26
26
|
SequencerConfig,
|
|
27
27
|
} from '@aztec/stdlib/interfaces/server';
|
|
28
|
+
import { type DebugLog, type DebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs';
|
|
28
29
|
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
29
30
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
30
31
|
import {
|
|
@@ -62,11 +63,15 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
|
|
|
62
63
|
* Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
|
|
63
64
|
*/
|
|
64
65
|
export class PublicProcessorFactory {
|
|
66
|
+
private log: Logger;
|
|
65
67
|
constructor(
|
|
66
68
|
private contractDataSource: ContractDataSource,
|
|
67
69
|
private dateProvider: DateProvider = new DateProvider(),
|
|
68
70
|
protected telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
69
|
-
|
|
71
|
+
bindings?: LoggerBindings,
|
|
72
|
+
) {
|
|
73
|
+
this.log = createLogger('simulator:public-processor-factory', bindings);
|
|
74
|
+
}
|
|
70
75
|
|
|
71
76
|
/**
|
|
72
77
|
* Creates a new instance of a PublicProcessor.
|
|
@@ -79,7 +84,8 @@ export class PublicProcessorFactory {
|
|
|
79
84
|
globalVariables: GlobalVariables,
|
|
80
85
|
config: PublicSimulatorConfig,
|
|
81
86
|
): PublicProcessor {
|
|
82
|
-
const
|
|
87
|
+
const bindings = this.log.getBindings();
|
|
88
|
+
const contractsDB = new PublicContractsDB(this.contractDataSource, bindings);
|
|
83
89
|
|
|
84
90
|
const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
|
|
85
91
|
const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
|
|
@@ -91,6 +97,7 @@ export class PublicProcessorFactory {
|
|
|
91
97
|
publicTxSimulator,
|
|
92
98
|
this.dateProvider,
|
|
93
99
|
this.telemetryClient,
|
|
100
|
+
createLogger('simulator:public-processor', bindings),
|
|
94
101
|
);
|
|
95
102
|
}
|
|
96
103
|
|
|
@@ -100,7 +107,14 @@ export class PublicProcessorFactory {
|
|
|
100
107
|
globalVariables: GlobalVariables,
|
|
101
108
|
config?: Partial<PublicTxSimulatorConfig>,
|
|
102
109
|
): PublicTxSimulatorInterface {
|
|
103
|
-
return new TelemetryCppPublicTxSimulator(
|
|
110
|
+
return new TelemetryCppPublicTxSimulator(
|
|
111
|
+
merkleTree,
|
|
112
|
+
contractsDB,
|
|
113
|
+
globalVariables,
|
|
114
|
+
this.telemetryClient,
|
|
115
|
+
config,
|
|
116
|
+
this.log.getBindings(),
|
|
117
|
+
);
|
|
104
118
|
}
|
|
105
119
|
}
|
|
106
120
|
|
|
@@ -117,7 +131,6 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
117
131
|
*/
|
|
118
132
|
export class PublicProcessor implements Traceable {
|
|
119
133
|
private metrics: PublicProcessorMetrics;
|
|
120
|
-
|
|
121
134
|
constructor(
|
|
122
135
|
protected globalVariables: GlobalVariables,
|
|
123
136
|
private guardedMerkleTree: GuardedMerkleTreeOperations,
|
|
@@ -125,8 +138,9 @@ export class PublicProcessor implements Traceable {
|
|
|
125
138
|
protected publicTxSimulator: PublicTxSimulatorInterface,
|
|
126
139
|
private dateProvider: DateProvider,
|
|
127
140
|
telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
128
|
-
private log
|
|
141
|
+
private log: Logger,
|
|
129
142
|
private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
|
|
143
|
+
private debugLogStore: DebugLogStore = new NullDebugLogStore(),
|
|
130
144
|
) {
|
|
131
145
|
this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
|
|
132
146
|
}
|
|
@@ -146,12 +160,13 @@ export class PublicProcessor implements Traceable {
|
|
|
146
160
|
txs: Iterable<Tx> | AsyncIterable<Tx>,
|
|
147
161
|
limits: PublicProcessorLimits = {},
|
|
148
162
|
validator: PublicProcessorValidator = {},
|
|
149
|
-
): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[],
|
|
150
|
-
const { maxTransactions,
|
|
163
|
+
): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], DebugLog[]]> {
|
|
164
|
+
const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal } = limits;
|
|
151
165
|
const { preprocessValidator, nullifierCache } = validator;
|
|
152
166
|
const result: ProcessedTx[] = [];
|
|
153
167
|
const usedTxs: Tx[] = [];
|
|
154
168
|
const failed: FailedTx[] = [];
|
|
169
|
+
const debugLogs: DebugLog[] = [];
|
|
155
170
|
const timer = new Timer();
|
|
156
171
|
|
|
157
172
|
let totalSizeInBytes = 0;
|
|
@@ -159,6 +174,8 @@ export class PublicProcessor implements Traceable {
|
|
|
159
174
|
let totalPublicGas = new Gas(0, 0);
|
|
160
175
|
let totalBlockGas = new Gas(0, 0);
|
|
161
176
|
let totalBlobFields = 0;
|
|
177
|
+
let silentlySkippedCount = 0;
|
|
178
|
+
let totalSilentlySkippedDurationMs = 0;
|
|
162
179
|
|
|
163
180
|
for await (const tx of txs) {
|
|
164
181
|
// Only process up to the max tx limit
|
|
@@ -173,22 +190,23 @@ export class PublicProcessor implements Traceable {
|
|
|
173
190
|
break;
|
|
174
191
|
}
|
|
175
192
|
|
|
176
|
-
// Skip this tx if it'd exceed max block size
|
|
177
193
|
const txHash = tx.getTxHash().toString();
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
194
|
+
|
|
195
|
+
// Skip this tx if its estimated blob fields would exceed the limit.
|
|
196
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
197
|
+
const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
|
|
198
|
+
if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
199
|
+
this.log.warn(
|
|
200
|
+
`Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`,
|
|
201
|
+
{ txHash, txBlobFields, totalBlobFields, maxBlobFields },
|
|
202
|
+
);
|
|
186
203
|
continue;
|
|
187
204
|
}
|
|
188
205
|
|
|
189
|
-
// Skip this tx if its gas limit would exceed the block gas limit
|
|
206
|
+
// Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
|
|
207
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
190
208
|
const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
|
|
191
|
-
if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
|
|
209
|
+
if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
|
|
192
210
|
this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
|
|
193
211
|
txHash,
|
|
194
212
|
txGasLimit,
|
|
@@ -228,7 +246,9 @@ export class PublicProcessor implements Traceable {
|
|
|
228
246
|
this.contractsDB.createCheckpoint();
|
|
229
247
|
|
|
230
248
|
try {
|
|
231
|
-
const [processedTx, returnValues] = await
|
|
249
|
+
const [txProcessingTimeMs, [processedTx, returnValues, txDebugLogs]] = await elapsed(() =>
|
|
250
|
+
this.processTx(tx, deadline),
|
|
251
|
+
);
|
|
232
252
|
|
|
233
253
|
// Inject a fake processing failure after N txs if requested
|
|
234
254
|
const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
|
|
@@ -237,23 +257,9 @@ export class PublicProcessor implements Traceable {
|
|
|
237
257
|
}
|
|
238
258
|
|
|
239
259
|
const txBlobFields = processedTx.txEffect.getNumBlobFields();
|
|
240
|
-
|
|
241
|
-
// If the actual size of this tx would exceed block size, skip it
|
|
242
260
|
const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
|
|
243
|
-
if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
|
|
244
|
-
this.log.debug(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
|
|
245
|
-
txHash,
|
|
246
|
-
sizeInBytes: txSize,
|
|
247
|
-
totalSizeInBytes,
|
|
248
|
-
maxBlockSize,
|
|
249
|
-
});
|
|
250
|
-
// Need to revert the checkpoint here and don't go any further
|
|
251
|
-
await checkpoint.revert();
|
|
252
|
-
this.contractsDB.revertCheckpoint();
|
|
253
|
-
continue;
|
|
254
|
-
}
|
|
255
261
|
|
|
256
|
-
// If the actual blob fields of this tx would exceed the limit, skip it
|
|
262
|
+
// If the actual blob fields of this tx would exceed the limit, skip it.
|
|
257
263
|
// Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
|
|
258
264
|
if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
259
265
|
this.log.debug(
|
|
@@ -263,25 +269,54 @@ export class PublicProcessor implements Traceable {
|
|
|
263
269
|
txBlobFields,
|
|
264
270
|
totalBlobFields,
|
|
265
271
|
maxBlobFields,
|
|
272
|
+
txProcessingTimeMs,
|
|
266
273
|
},
|
|
267
274
|
);
|
|
275
|
+
silentlySkippedCount += 1;
|
|
276
|
+
totalSilentlySkippedDurationMs += txProcessingTimeMs;
|
|
277
|
+
this.metrics.recordSilentlySkipped(txProcessingTimeMs);
|
|
268
278
|
// Need to revert the checkpoint here and don't go any further
|
|
269
279
|
await checkpoint.revert();
|
|
270
280
|
this.contractsDB.revertCheckpoint();
|
|
271
281
|
continue;
|
|
272
282
|
}
|
|
273
283
|
|
|
284
|
+
// During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
|
|
285
|
+
// Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
|
|
286
|
+
// this uses actual gas and stops processing when the limit is exceeded.
|
|
287
|
+
if (
|
|
288
|
+
!isBuildingProposal &&
|
|
289
|
+
maxBlockGas !== undefined &&
|
|
290
|
+
totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)
|
|
291
|
+
) {
|
|
292
|
+
this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
|
|
293
|
+
txHash,
|
|
294
|
+
txGas: processedTx.gasUsed.totalGas,
|
|
295
|
+
totalBlockGas,
|
|
296
|
+
maxBlockGas,
|
|
297
|
+
});
|
|
298
|
+
await checkpoint.revert();
|
|
299
|
+
this.contractsDB.revertCheckpoint();
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
|
|
274
303
|
// FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
|
|
275
304
|
// I'd rather pass the validators the processedTx as well and let them deal with it.
|
|
276
305
|
nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map(n => n.toBuffer()));
|
|
277
306
|
result.push(processedTx);
|
|
278
307
|
usedTxs.push(tx);
|
|
279
308
|
returns = returns.concat(returnValues);
|
|
309
|
+
debugLogs.push(...txDebugLogs);
|
|
310
|
+
|
|
311
|
+
this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
|
|
280
312
|
|
|
281
313
|
totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
|
|
282
314
|
totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
|
|
283
315
|
totalSizeInBytes += txSize;
|
|
284
316
|
totalBlobFields += txBlobFields;
|
|
317
|
+
|
|
318
|
+
// Commit the tx-level contracts checkpoint on success
|
|
319
|
+
this.contractsDB.commitCheckpoint();
|
|
285
320
|
} catch (err: any) {
|
|
286
321
|
if (err?.name === 'PublicProcessorTimeoutError') {
|
|
287
322
|
this.log.warn(`Stopping tx processing due to timeout.`);
|
|
@@ -301,14 +336,10 @@ export class PublicProcessor implements Traceable {
|
|
|
301
336
|
// 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
|
|
302
337
|
// 2. Possible state updates on that checkpoint or any others created during execution.
|
|
303
338
|
|
|
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();
|
|
339
|
+
// Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
|
|
340
|
+
// updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
|
|
341
|
+
// created by callers below our depth.
|
|
342
|
+
await checkpoint.revertToCheckpoint();
|
|
312
343
|
|
|
313
344
|
// Revert any contracts added to the DB for the tx.
|
|
314
345
|
this.contractsDB.revertCheckpoint();
|
|
@@ -320,9 +351,9 @@ export class PublicProcessor implements Traceable {
|
|
|
320
351
|
break;
|
|
321
352
|
}
|
|
322
353
|
|
|
323
|
-
// Roll back state to start of TX before proceeding to next TX
|
|
324
|
-
|
|
325
|
-
await
|
|
354
|
+
// Roll back state to start of TX before proceeding to next TX.
|
|
355
|
+
// Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
|
|
356
|
+
await checkpoint.revertToCheckpoint();
|
|
326
357
|
this.contractsDB.revertCheckpoint();
|
|
327
358
|
const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
|
|
328
359
|
this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
|
|
@@ -334,7 +365,6 @@ export class PublicProcessor implements Traceable {
|
|
|
334
365
|
} finally {
|
|
335
366
|
// Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
|
|
336
367
|
await checkpoint.commit();
|
|
337
|
-
this.contractsDB.commitCheckpointOkIfNone();
|
|
338
368
|
}
|
|
339
369
|
}
|
|
340
370
|
|
|
@@ -342,15 +372,26 @@ export class PublicProcessor implements Traceable {
|
|
|
342
372
|
const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
|
|
343
373
|
this.metrics.recordAllTxs(totalPublicGas, rate);
|
|
344
374
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
375
|
+
const silentlySkippedDurationMs = Math.round(totalSilentlySkippedDurationMs);
|
|
376
|
+
this.log.info(
|
|
377
|
+
`Processed ${result.length} successful txs and ${failed.length} failed txs ` +
|
|
378
|
+
`(${silentlySkippedCount} silently skipped, ${silentlySkippedDurationMs}ms wasted) ` +
|
|
379
|
+
`in ${duration}s`,
|
|
380
|
+
{
|
|
381
|
+
blockNumber: this.globalVariables.blockNumber,
|
|
382
|
+
successfulCount: result.length,
|
|
383
|
+
failedCount: failed.length,
|
|
384
|
+
duration,
|
|
385
|
+
rate,
|
|
386
|
+
totalPublicGas,
|
|
387
|
+
totalBlockGas,
|
|
388
|
+
totalSizeInBytes,
|
|
389
|
+
silentlySkippedCount,
|
|
390
|
+
silentlySkippedDurationMs,
|
|
391
|
+
},
|
|
392
|
+
);
|
|
352
393
|
|
|
353
|
-
return [result, failed, usedTxs, returns,
|
|
394
|
+
return [result, failed, usedTxs, returns, debugLogs];
|
|
354
395
|
}
|
|
355
396
|
|
|
356
397
|
private async checkWorldStateUnchanged(
|
|
@@ -370,8 +411,13 @@ export class PublicProcessor implements Traceable {
|
|
|
370
411
|
}
|
|
371
412
|
|
|
372
413
|
@trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() }))
|
|
373
|
-
private async processTx(
|
|
374
|
-
|
|
414
|
+
private async processTx(
|
|
415
|
+
tx: Tx,
|
|
416
|
+
deadline: Date | undefined,
|
|
417
|
+
): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
|
|
418
|
+
const [time, [processedTx, returnValues, debugLogs]] = await elapsed(() =>
|
|
419
|
+
this.processTxWithinDeadline(tx, deadline),
|
|
420
|
+
);
|
|
375
421
|
|
|
376
422
|
this.log.verbose(
|
|
377
423
|
!tx.hasPublicCalls()
|
|
@@ -394,7 +440,7 @@ export class PublicProcessor implements Traceable {
|
|
|
394
440
|
},
|
|
395
441
|
);
|
|
396
442
|
|
|
397
|
-
return [processedTx, returnValues ?? []];
|
|
443
|
+
return [processedTx, returnValues ?? [], debugLogs];
|
|
398
444
|
}
|
|
399
445
|
|
|
400
446
|
private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise<void> {
|
|
@@ -428,10 +474,9 @@ export class PublicProcessor implements Traceable {
|
|
|
428
474
|
private async processTxWithinDeadline(
|
|
429
475
|
tx: Tx,
|
|
430
476
|
deadline: Date | undefined,
|
|
431
|
-
): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> {
|
|
432
|
-
const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> =
|
|
433
|
-
? () => this.processTxWithPublicCalls(tx)
|
|
434
|
-
: () => this.processPrivateOnlyTx(tx);
|
|
477
|
+
): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> {
|
|
478
|
+
const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> =
|
|
479
|
+
tx.hasPublicCalls() ? () => this.processTxWithPublicCalls(tx) : () => this.processPrivateOnlyTx(tx);
|
|
435
480
|
|
|
436
481
|
// Fake a delay per tx if instructed (used for tests)
|
|
437
482
|
const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
|
|
@@ -499,7 +544,7 @@ export class PublicProcessor implements Traceable {
|
|
|
499
544
|
@trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({
|
|
500
545
|
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
501
546
|
}))
|
|
502
|
-
private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> {
|
|
547
|
+
private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined, DebugLog[]]> {
|
|
503
548
|
const gasFees = this.globalVariables.gasFees;
|
|
504
549
|
const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
|
|
505
550
|
|
|
@@ -522,15 +567,15 @@ export class PublicProcessor implements Traceable {
|
|
|
522
567
|
// Fee payment insertion has already been done. Do the rest.
|
|
523
568
|
await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
|
|
524
569
|
|
|
525
|
-
|
|
570
|
+
this.contractsDB.addNewContracts(tx);
|
|
526
571
|
|
|
527
|
-
return [processedTx, undefined];
|
|
572
|
+
return [processedTx, undefined, []];
|
|
528
573
|
}
|
|
529
574
|
|
|
530
575
|
@trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({
|
|
531
576
|
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
532
577
|
}))
|
|
533
|
-
private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
|
|
578
|
+
private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
|
|
534
579
|
const timer = new Timer();
|
|
535
580
|
|
|
536
581
|
const result = await this.publicTxSimulator.simulate(tx);
|
|
@@ -568,7 +613,7 @@ export class PublicProcessor implements Traceable {
|
|
|
568
613
|
revertReason,
|
|
569
614
|
);
|
|
570
615
|
|
|
571
|
-
return [processedTx, appLogicReturnValues];
|
|
616
|
+
return [processedTx, appLogicReturnValues, result.logs ?? []];
|
|
572
617
|
}
|
|
573
618
|
|
|
574
619
|
/**
|